@@ -349,12 +349,18 @@ class ClassfileParser(
349
349
val tag = sig(index); index += 1
350
350
(tag : @ switch) match {
351
351
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 reachableType (symbol : Symbol ): Type =
354
+ if symbol.is(Flags .Package ) then
355
+ ThisType .raw(TypeRef (NoPrefix , symbol.asType))
356
+ else if symbol.isType then
357
+ ThisType .raw(TypeRef (reachableType(symbol.owner), symbol.asType))
358
+ else
359
+ throw new RuntimeException (" unexpected term symbol " + symbol)
360
+
361
+ def innerType (symbol : Symbol ): Type =
362
+ TypeRef (reachableType(symbol.owner), symbol)
363
+
358
364
def processClassType (tp : Type ): Type = tp match {
359
365
case tp : TypeRef =>
360
366
if (sig(index) == '<' ) {
@@ -388,13 +394,13 @@ class ClassfileParser(
388
394
}
389
395
390
396
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) )
397
+ val classTpe = if (classSym eq defn.ObjectClass ) defn.FromJavaObjectType else innerType( classSym)
398
+ var tpe = processClassType(classTpe)
393
399
while (sig(index) == '.' ) {
394
400
accept('.' )
395
401
val name = subName(c => c == ';' || c == '<' || c == '.' ).toTypeName
396
402
val clazz = tpe.member(name).symbol
397
- tpe = processClassType(processInner( TypeRef (tpe, clazz) ))
403
+ tpe = processClassType(innerType( clazz))
398
404
}
399
405
accept(';' )
400
406
tpe
0 commit comments