summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2017-03-17 09:52:09 +0100
committerLukas Rytz <lukas.rytz@gmail.com>2017-03-17 10:11:39 +0100
commit954ea7e2e94b211a0769747a2e03f48609eddb4d (patch)
treefe921bf2bcee5ce3b893f809e668e9d5a3b5394c /src
parent6048c661f7312be9bbfdde1edac963336d956c0e (diff)
downloadscala-954ea7e2e94b211a0769747a2e03f48609eddb4d.tar.gz
scala-954ea7e2e94b211a0769747a2e03f48609eddb4d.tar.bz2
scala-954ea7e2e94b211a0769747a2e03f48609eddb4d.zip
SI-10231 Skip outer parameter when classfile parsing java param names
Nested java classes have a synthetic outer parameter, which the classfile parser skips for the constructor symbol. When assigning parameter names from the MethodParameters classfile attribute, we also need to skip the first name in this case.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 9129478b41..95f34c1719 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -553,6 +553,7 @@ abstract class ClassfileParser {
val name = readName()
val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition, sflags)
var info = pool.getType(sym, u2)
+ var removedOuterParameter = false
if (name == nme.CONSTRUCTOR)
info match {
case MethodType(params, restpe) =>
@@ -567,6 +568,7 @@ abstract class ClassfileParser {
* ClassfileParser for 1 executes, and clazz.owner is the package.
*/
assert(params.head.tpe.typeSymbol == clazz.owner || clazz.owner.hasPackageFlag, params.head.tpe.typeSymbol + ": " + clazz.owner)
+ removedOuterParameter = true
params.tail
case _ =>
params
@@ -586,7 +588,7 @@ abstract class ClassfileParser {
// parsed from SignatureATTR
sym setInfo info
propagatePackageBoundary(jflags, sym)
- parseAttributes(sym, info)
+ parseAttributes(sym, info, removedOuterParameter)
if (jflags.isVarargs)
sym modifyInfo arrayToRepeated
@@ -769,7 +771,7 @@ abstract class ClassfileParser {
GenPolyType(ownTypeParams, tpe)
} // sigToType
- def parseAttributes(sym: Symbol, symtype: Type) {
+ def parseAttributes(sym: Symbol, symtype: Type, removedOuterParameter: Boolean = false) {
def convertTo(c: Constant, pt: Type): Constant = {
if (pt.typeSymbol == BooleanClass && c.tag == IntTag)
Constant(c.value != 0)
@@ -804,16 +806,24 @@ abstract class ClassfileParser {
else devWarning(s"failure to convert $c to $symtype")
case tpnme.MethodParametersATTR =>
def readParamNames(): Unit = {
- import tools.asm.Opcodes.ACC_SYNTHETIC
+ import scala.tools.asm.Opcodes.ACC_SYNTHETIC
val paramCount = u1
var i = 0
+ if (removedOuterParameter && i < paramCount) {
+ in.skip(4)
+ i += 1
+ }
+ var remainingParams = sym.paramss.head // Java only has exactly one parameter list
while (i < paramCount) {
val name = pool.getName(u2)
val access = u2
- if ((access & ACC_SYNTHETIC) != ACC_SYNTHETIC) { // name not synthetic
- val params = sym.paramss.head // Java only has exactly one parameter list
- params(i).name = name.encode
- params(i).resetFlag(SYNTHETIC)
+ if (remainingParams.nonEmpty) {
+ val param = remainingParams.head
+ remainingParams = remainingParams.tail
+ if ((access & ACC_SYNTHETIC) != ACC_SYNTHETIC) { // name not synthetic
+ param.name = name.encode
+ param.resetFlag(SYNTHETIC)
+ }
}
i += 1
}