@@ -631,7 +631,13 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
631631 case checkedType : NamedType if ! prefixIsElidable(checkedType) =>
632632 ref(checkedType).withSpan(tree.span)
633633 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)
635641 val tree2 = toNotNullTermRef(tree1, pt)
636642 checkLegalValue(tree2, pt)
637643 tree2
@@ -688,11 +694,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
688694 report.error(StableIdentPattern (tree, pt), tree.srcPos)
689695
690696 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
696698 val tree = cpy.Select (tree0)(qual, selName)
697699 val superAccess = qual.isInstanceOf [Super ]
698700 val rawType = selectionType(tree, qual)
@@ -769,26 +771,30 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
769771
770772 def typeSelectOnTerm (using Context ): Tree =
771773 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)
779776 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
781787
782788 def tryJavaSelectOnType (using Context ): Tree = tree.qualifier match {
783789 case sel @ Select (qual, name) =>
784790 val qual1 = untpd.cpy.Select (sel)(qual, name.toTypeName)
785791 val qual2 = typedType(qual1, WildcardType )
786- javaSelectOnType (qual2)
792+ javaSelection (qual2)
787793
788794 case id @ Ident (name) =>
789795 val qual1 = untpd.cpy.Ident (id)(name.toTypeName)
790796 val qual2 = typedType(qual1, WildcardType )
791- javaSelectOnType (qual2)
797+ javaSelection (qual2)
792798
793799 case _ =>
794800 errorTree(tree, em " cannot convert to type selection " ) // will never be printed due to fallback
0 commit comments