Skip to content

Commit 373e8e9

Browse files
committed
fix name of Ident and Select trees for module class from java
1 parent a4a379f commit 373e8e9

File tree

4 files changed

+55
-35
lines changed

4 files changed

+55
-35
lines changed

compiler/src/dotty/tools/dotc/core/ContextOps.scala

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ object ContextOps:
6464
val directSearch =
6565
def asModule =
6666
if name.isTypeName && name.endsWith(StdNames.str.MODULE_SUFFIX) then
67-
pre.findMember(name.stripModuleClassSuffix.moduleClassName, pre, required, excluded) match
68-
case NoDenotation => NoDenotation
69-
case symDenot: SymDenotation =>
70-
symDenot.companionModule.denot
67+
pre.findMember(name.stripModuleClassSuffix.moduleClassName, pre, required, excluded)
7168
else NoDenotation
7269
pre.findMember(name, pre, required, excluded) match
7370
case NoDenotation => asModule

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

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

tests/run/i17255/J.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,29 @@
11
package p;
22

33
public class J {
4-
public static J j = new J();
5-
public static p.J f() {
6-
return p.J.j;
7-
}
8-
public static Module$ module2() {
9-
return p.Module$.MODULE$;
10-
}
11-
public static p.Module$ module() {
12-
return p.Module$.MODULE$;
13-
}
4+
public static J j = new J();
145

15-
public String toString() { return "J"; }
16-
}
6+
public static p.J f() {
7+
return p.J.j;
8+
}
9+
10+
public static Module$ module2() {
11+
return p.Module$.MODULE$;
12+
}
13+
14+
public static p.Module$ module() {
15+
return p.Module$.MODULE$;
16+
}
17+
18+
public static Module.InnerModule$ innermodule2() {
19+
return p.Module.InnerModule$.MODULE$;
20+
}
21+
22+
public static p.Module.InnerModule$ innermodule() {
23+
return p.Module.InnerModule$.MODULE$;
24+
}
25+
26+
public String toString() {
27+
return "J";
28+
}
29+
}

tests/run/i17255/Module.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
// scalajs: --skip
2-
31
package p {
42
object Module {
53
override def toString = "Module"
4+
5+
object InnerModule {
6+
override def toString = "InnerModule"
7+
}
68
}
79
}
810

911
object Test extends App {
1012
assert(p.J.f().toString == "J")
1113
assert(p.J.module().toString == "Module")
1214
assert(p.J.module2().toString == "Module")
13-
}
15+
assert(p.J.innermodule().toString == "InnerModule")
16+
assert(p.J.innermodule2().toString == "InnerModule")
17+
}

0 commit comments

Comments
 (0)