@@ -631,7 +631,13 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
631
631
case checkedType : NamedType if ! prefixIsElidable(checkedType) =>
632
632
ref(checkedType).withSpan(tree.span)
633
633
case _ =>
634
- tree.withType(checkedType)
634
+ def isScalaModuleRef = checkedType match
635
+ case moduleRef : TypeRef if moduleRef.symbol.is(ModuleClass , butNot = JavaDefined ) => true
636
+ case _ => false
637
+ if ctx.isJava && isScalaModuleRef then
638
+ cpy.Ident (tree)(tree.name.unmangleClassName).withType(checkedType)
639
+ else
640
+ tree.withType(checkedType)
635
641
val tree2 = toNotNullTermRef(tree1, pt)
636
642
checkLegalValue(tree2, pt)
637
643
tree2
@@ -688,11 +694,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
688
694
report.error(StableIdentPattern (tree, pt), tree.srcPos)
689
695
690
696
def typedSelect (tree0 : untpd.Select , pt : Type , qual : Tree )(using Context ): Tree =
691
- val selName =
692
- if ctx.isJava && tree0.name.isTypeName && tree0.name.endsWith(StdNames .str.MODULE_SUFFIX ) then
693
- tree0.name.stripModuleClassSuffix.moduleClassName
694
- else
695
- tree0.name
697
+ val selName = tree0.name
696
698
val tree = cpy.Select (tree0)(qual, selName)
697
699
val superAccess = qual.isInstanceOf [Super ]
698
700
val rawType = selectionType(tree, qual)
@@ -769,26 +771,30 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
769
771
770
772
def typeSelectOnTerm (using Context ): Tree =
771
773
val qual = typedExpr(tree.qualifier, shallowSelectionProto(tree.name, pt, this , tree.nameSpan))
772
- typedSelect(tree, pt, qual).withSpan(tree.span).computeNullable()
773
-
774
- def javaSelectOnType (qual : Tree )(using Context ) =
775
- // semantic name conversion for `O$` in java code
776
- if ! qual.symbol.is(JavaDefined ) then
777
- val tree2 = untpd.cpy.Select (tree)(qual, tree.name.unmangleClassName)
778
- assignType(tree2, qual)
774
+ if ctx.isJava then
775
+ javaSelection(qual)
779
776
else
780
- assignType(cpy.Select (tree)(qual, tree.name), qual)
777
+ typedSelect(tree, pt, qual).withSpan(tree.span).computeNullable()
778
+
779
+ def javaSelection (qual : Tree )(using Context ) =
780
+ val tree1 = assignType(cpy.Select (tree)(qual, tree.name), qual)
781
+ tree1.tpe match
782
+ case moduleRef : TypeRef if moduleRef.symbol.is(ModuleClass , butNot = JavaDefined ) =>
783
+ // handle unmangling of module names (Foo$ -> Foo[ModuleClass])
784
+ cpy.Select (tree)(qual, tree.name.unmangleClassName).withType(moduleRef)
785
+ case _ =>
786
+ tree1
781
787
782
788
def tryJavaSelectOnType (using Context ): Tree = tree.qualifier match {
783
789
case sel @ Select (qual, name) =>
784
790
val qual1 = untpd.cpy.Select (sel)(qual, name.toTypeName)
785
791
val qual2 = typedType(qual1, WildcardType )
786
- javaSelectOnType (qual2)
792
+ javaSelection (qual2)
787
793
788
794
case id @ Ident (name) =>
789
795
val qual1 = untpd.cpy.Ident (id)(name.toTypeName)
790
796
val qual2 = typedType(qual1, WildcardType )
791
- javaSelectOnType (qual2)
797
+ javaSelection (qual2)
792
798
793
799
case _ =>
794
800
errorTree(tree, em " cannot convert to type selection " ) // will never be printed due to fallback
0 commit comments