From 9adc6d22c960c1b20c7cff88091c9aaecaaf9053 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 16 Oct 2010 14:44:56 +0000 Subject: Closes #3567. Review by milessabin. --- src/compiler/scala/tools/nsc/javac/JavaParsers.scala | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala index 8c0e5585be..1f071e2288 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala @@ -226,7 +226,7 @@ trait JavaParsers extends JavaScanners { Ident(name.toTypeName).setPos(tree.pos) case Select(qual, name) => Select(qual, name.toTypeName).setPos(tree.pos) - case AppliedTypeTree(_, _) | ExistentialTypeTree(_, _) => + case AppliedTypeTree(_, _) | ExistentialTypeTree(_, _) | SelectFromTypeTree(_, _) => tree case _ => syntaxError(tree.pos, "identifier expected", false) @@ -272,9 +272,18 @@ trait JavaParsers extends JavaScanners { if (in.token == FINAL) in.nextToken if (in.token == IDENTIFIER) { var t = typeArgs(atPos(in.currentPos)(Ident(ident()))) + // typeSelect generates Select nodes is the lhs is an Ident or Select, + // SelectFromTypeTree otherwise. See #3567. + // Select nodes can be later + // converted in the typechecker to SelectFromTypeTree if the class + // turns out to be an instance ionner class instead of a static inner class. + def typeSelect(t: Tree, name: Name) = t match { + case Ident(_) | Select(_, _) => Select(t, name) + case _ => SelectFromTypeTree(t, name) + } while (in.token == DOT) { in.nextToken - t = typeArgs(atPos(in.currentPos)(Select(t, ident()))) + t = typeArgs(atPos(in.currentPos)(typeSelect(t, ident()))) } convertToTypeId(t) } else { -- cgit v1.2.3