Skip to content

Commit 4ec8cde

Browse files
liufengyunsmarter
andcommitted
Fix #10888: Avoid A.this.B for Java inner classes
For Java inner classes, we should use `A#B` instead of `A.this.B`. Co-authored-by: Guillaume Martres <[email protected]>
1 parent c9bf740 commit 4ec8cde

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -349,12 +349,15 @@ class ClassfileParser(
349349
val tag = sig(index); index += 1
350350
(tag: @switch) match {
351351
case 'L' =>
352-
def processInner(tp: Type): Type = tp match {
353-
case tp: TypeRef if !tp.symbol.owner.is(Flags.ModuleClass) =>
354-
TypeRef(processInner(tp.prefix.widen), tp.symbol.asType)
355-
case _ =>
356-
tp
357-
}
352+
/** Inner class references of A.this.B into A#B, do the same transformation recursively on `A` */
353+
def innerType(symbol: Symbol): Type =
354+
if symbol.is(Flags.Package) then
355+
ThisType.raw(TypeRef(NoPrefix, symbol.asType))
356+
else if symbol.isType then
357+
TypeRef(innerType(symbol.owner), symbol)
358+
else
359+
throw new RuntimeException("unexpected term symbol " + symbol)
360+
358361
def processClassType(tp: Type): Type = tp match {
359362
case tp: TypeRef =>
360363
if (sig(index) == '<') {
@@ -388,13 +391,13 @@ class ClassfileParser(
388391
}
389392

390393
val classSym = classNameToSymbol(subName(c => c == ';' || c == '<'))
391-
val classTpe = if (classSym eq defn.ObjectClass) defn.FromJavaObjectType else classSym.typeRef
392-
var tpe = processClassType(processInner(classTpe))
394+
val classTpe = if (classSym eq defn.ObjectClass) defn.FromJavaObjectType else innerType(classSym)
395+
var tpe = processClassType(classTpe)
393396
while (sig(index) == '.') {
394397
accept('.')
395398
val name = subName(c => c == ';' || c == '<' || c == '.').toTypeName
396399
val clazz = tpe.member(name).symbol
397-
tpe = processClassType(processInner(TypeRef(tpe, clazz)))
400+
tpe = processClassType(innerType(clazz))
398401
}
399402
accept(';')
400403
tpe

0 commit comments

Comments
 (0)