Skip to content

Commit 14395cf

Browse files
committed
Fix #10868: Handle semantic name in Java source code
1 parent 72f1fcf commit 14395cf

File tree

4 files changed

+24
-6
lines changed

4 files changed

+24
-6
lines changed

compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import dotty.tools.dotc.core.Constants.Constant
66
import dotty.tools.dotc.core.Flags
77
import dotty.tools.dotc.core.Flags.FlagSet
88

9-
109
import JavaTokens._
1110
import JavaScanners._
1211
import Scanners.Offset

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -596,13 +596,30 @@ class Typer extends Namer
596596
.withSpan(tree.span)
597597
.computeNullable()
598598

599-
def typeSelectOnType(qual: untpd.Tree)(using Context) =
600-
typedSelect(untpd.cpy.Select(tree)(qual, tree.name.toTypeName), pt)
599+
def javaSelectOnType(qual: Tree)(using Context) =
600+
// semantic name conversion for `O$` in java code
601+
if !qual.symbol.is(JavaDefined) && tree.name.endsWith("$")
602+
then
603+
val nameOrig = tree.name.asSimpleName
604+
val nameSemantic = nameOrig.slice(0, nameOrig.length - 1).moduleClassName
605+
val tree2 = untpd.cpy.Select(tree)(qual, nameSemantic)
606+
assignType(tree2, qual)
607+
else
608+
assignType(cpy.Select(tree)(qual, tree.name), qual)
601609

602610
def tryJavaSelectOnType(using Context): Tree = tree.qualifier match {
603-
case Select(qual, name) => typeSelectOnType(untpd.Select(qual, name.toTypeName))
604-
case Ident(name) => typeSelectOnType(untpd.Ident(name.toTypeName))
605-
case _ => errorTree(tree, "cannot convert to type selection") // will never be printed due to fallback
611+
case sel @ Select(qual, name) =>
612+
val qual1 = untpd.cpy.Select(sel)(qual, name.toTypeName)
613+
val qual2 = typedType(qual1, WildcardType)
614+
javaSelectOnType(qual2)
615+
616+
case id @ Ident(name) =>
617+
val qual1 = untpd.cpy.Ident(id)(name.toTypeName)
618+
val qual2 = typedType(qual1, WildcardType)
619+
javaSelectOnType(qual2)
620+
621+
case _ =>
622+
errorTree(tree, "cannot convert to type selection") // will never be printed due to fallback
606623
}
607624

608625
def selectWithFallback(fallBack: Context ?=> Tree) =

tests/pos-java-interop/i10868/J.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class J { T.O$ o; }

tests/pos-java-interop/i10868/T.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
trait T { object O }

0 commit comments

Comments
 (0)