Skip to content

Commit 67ab955

Browse files
committed
javaSimpleName / javaBinaryName / javaClassName
1 parent 5bb75fa commit 67ab955

File tree

7 files changed

+54
-27
lines changed

7 files changed

+54
-27
lines changed

src/dotty/tools/dotc/backend/jvm/BCodeBodyBuilder.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
335335
coercionTo(code)
336336
}
337337
else abort(
338-
s"Primitive operation not handled yet: ${sym.fullName}(${fun.symbol.simpleName}) at: ${tree.pos}"
338+
s"Primitive operation not handled yet: ${sym.fullName}(${fun.symbol.name}) at: ${tree.pos}"
339339
)
340340
}
341341

@@ -499,7 +499,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
499499
val owner =
500500
if (hostClass == null) internalName(field.owner)
501501
else internalName(hostClass)
502-
val fieldJName = field.javaSimpleName.toString
502+
val fieldJName = javaName(field).toString
503503
val fieldDescr = symInfoTK(field).getDescriptor
504504
val isStatic = field.isStaticMember
505505
val opc =
@@ -552,7 +552,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
552552
case EnumTag =>
553553
val sym = const.symbolValue
554554
val ownerName = internalName(sym.owner)
555-
val fieldName = sym.javaSimpleName.toString
555+
val fieldName = javaName(sym).toString
556556
val fieldDesc = toTypeKind(sym.tpe.underlying).getDescriptor
557557
mnode.visitFieldInsn(
558558
asm.Opcodes.GETSTATIC,
@@ -1050,7 +1050,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
10501050
val receiver = if (useMethodOwner) methodOwner else hostSymbol
10511051
val bmOwner = asmClassType(receiver)
10521052
val jowner = bmOwner.getInternalName
1053-
val jname = method.javaSimpleName.toString
1053+
val jname = javaName(method).toString
10541054
val bmType = asmMethodType(method)
10551055
val mdescr = bmType.getDescriptor
10561056

src/dotty/tools/dotc/backend/jvm/BCodeGlue.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ import scala.annotation.switch
1111
import scala.collection.{ immutable, mutable }
1212

1313
import ast.Trees.Tree
14+
import core.Contexts.Context
1415
import core.Types.Type
1516
import core.Symbols.{Symbol, NoSymbol}
17+
import core.SymDenotations.SymDenotation
18+
import core.Flags
19+
import core.NameOps._
20+
import core.Names.Name
1621

1722
/*
1823
* Immutable representations of bytecode-level types.
@@ -717,4 +722,25 @@ abstract class BCodeGlue {
717722
DOUBLE -> MethodNameAndType("unboxToDouble", "(Ljava/lang/Object;)D")
718723
)
719724
}
725+
726+
def javaName(symDenot: SymDenotation): Name = {
727+
addModuleSuffix(symDenot.name, symDenot)
728+
}
729+
730+
def javaBinaryName(symDenot: SymDenotation)(implicit ctx: Context): Name = {
731+
addModuleSuffix(symDenot.fullNameSeparated('/'), symDenot)
732+
}
733+
734+
def javaClassName(symDenot: SymDenotation)(implicit ctx: Context): String = {
735+
addModuleSuffix(symDenot.fullName, symDenot).toString
736+
}
737+
738+
private def addModuleSuffix(name: Name, symDenot: SymDenotation): Name = {
739+
// TODO(lrytz): the `needsModuleSuffix` check in scalac also checks:
740+
// !isMethod && !isImplClass && !isJavaDefined
741+
// Moreover, it checks for the `Module` flag instead of `ModuleClass`.
742+
// I assume only a ModuleClass should ever get a moduleClassName.
743+
if (symDenot is Flags.ModuleClass) name.moduleClassName
744+
else name
745+
}
720746
}

src/dotty/tools/dotc/backend/jvm/BCodeHelpers.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
155155
// TODO: make this next claim true, if possible
156156
// by generating valid main methods as static in module classes
157157
// not sure what the jvm allows here
158-
// + " You can still run the program by calling it as " + sym.javaSimpleName + " instead."
158+
// + " You can still run the program by calling it as " + javaName(sym) + " instead."
159159
)
160160
false
161161
}
@@ -919,7 +919,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
919919

920920
val jReturnType = toTypeKind(methodInfo.resultType)
921921
val mdesc = BType.getMethodType(jReturnType, mkArray(paramJavaTypes)).getDescriptor
922-
val mirrorMethodName = m.javaSimpleName.toString
922+
val mirrorMethodName = javaName(m).toString
923923
val mirrorMethod: asm.MethodVisitor = jclass.visitMethod(
924924
flags,
925925
mirrorMethodName,
@@ -1051,7 +1051,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
10511051
def newEEE(eClass: Symbol, m: Symbol) = {
10521052
EnclMethodEntry(
10531053
internalName(eClass),
1054-
m.javaSimpleName.toString,
1054+
javaName(m).toString,
10551055
asmMethodType(m)
10561056
)
10571057
}
@@ -1160,7 +1160,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
11601160
*/
11611161
def genBeanInfoClass(cls: Symbol, cunit: CompilationUnit, fieldSymbols: List[Symbol], methodSymbols: List[Symbol]): asm.tree.ClassNode = {
11621162

1163-
def javaSimpleName(s: Symbol): String = { s.javaSimpleName.toString }
1163+
def javaNameString(s: Symbol): String = javaName(s).toString
11641164

11651165
innerClassBufferASM.clear()
11661166

@@ -1193,7 +1193,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
11931193
if g.isPublic && !(f.name startsWith "$")
11941194
) {
11951195
// inserting $outer breaks the bean
1196-
fieldList = javaSimpleName(f) :: javaSimpleName(g) :: (if (s != NoSymbol) javaSimpleName(s) else null) :: fieldList
1196+
fieldList = javaNameString(f) :: javaNameString(g) :: (if (s != NoSymbol) javaNameString(s) else null) :: fieldList
11971197
}
11981198

11991199
val methodList: List[String] =
@@ -1203,7 +1203,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
12031203
!(m.name startsWith "$") &&
12041204
!m.isGetter &&
12051205
!m.isSetter)
1206-
yield javaSimpleName(m)
1206+
yield javaNameString(m)
12071207

12081208
val constructor = beanInfoClass.visitMethod(
12091209
asm.Opcodes.ACC_PUBLIC,

src/dotty/tools/dotc/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
252252

253253
val jfield = new asm.tree.FieldNode(
254254
flags,
255-
f.javaSimpleName.toString,
255+
javaName(f).toString,
256256
symInfoTK(f).getDescriptor,
257257
javagensig,
258258
null // no initial value
@@ -387,7 +387,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
387387
private def makeLocal(sym: Symbol, tk: BType): Local = {
388388
assert(!slots.contains(sym), "attempt to create duplicate local var.")
389389
assert(nxtIdx != -1, "not a valid start index")
390-
val loc = Local(tk, sym.javaSimpleName.toString, nxtIdx, sym.isSynthetic)
390+
val loc = Local(tk, javaName(sym).toString, nxtIdx, sym.isSynthetic)
391391
slots += (sym -> loc)
392392
assert(tk.getSize > 0, "makeLocal called for a symbol whose type is Unit.")
393393
nxtIdx += tk.getSize
@@ -546,7 +546,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
546546
assert(mnode == null, "GenBCode detected nested method.")
547547

548548
methSymbol = dd.symbol
549-
jMethodName = methSymbol.javaSimpleName.toString
549+
jMethodName = javaName(methSymbol).toString
550550
returnType = asmMethodType(dd.symbol).getReturnType
551551
isMethSymStaticCtor = methSymbol.isStaticConstructor
552552

@@ -671,7 +671,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
671671
insnModA = new asm.tree.TypeInsnNode(asm.Opcodes.NEW, className)
672672
// INVOKESPECIAL <init>
673673
val callee = methSymbol.enclClass.primaryConstructor
674-
val jname = callee.javaSimpleName.toString
674+
val jname = javaName(callee).toString
675675
val jowner = internalName(callee.owner)
676676
val jtype = asmMethodType(callee).getDescriptor
677677
insnModB = new asm.tree.MethodInsnNode(asm.Opcodes.INVOKESPECIAL, jowner, jname, jtype)
@@ -693,7 +693,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
693693
// INVOKESTATIC CREATOR(): android.os.Parcelable$Creator; -- TODO where does this Android method come from?
694694
val callee = definitions.getMember(claszSymbol.companionModule, androidFieldName)
695695
val jowner = internalName(callee.owner)
696-
val jname = callee.javaSimpleName.toString
696+
val jname = javaName(callee).toString
697697
val jtype = asmMethodType(callee).getDescriptor
698698
insnParcA = new asm.tree.MethodInsnNode(asm.Opcodes.INVOKESTATIC, jowner, jname, jtype)
699699
// PUTSTATIC `thisName`.CREATOR;

src/dotty/tools/dotc/backend/jvm/BCodeTypes.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ abstract class BCodeTypes extends BCodeIdiomatic {
124124
defn.BoxedDoubleClass
125125
)
126126
for(csym <- boxedClasses) {
127-
val key = brefType(csym.javaBinaryName.toTypeName)
127+
val key = brefType(javaBinaryName(csym).toTypeName)
128128
val tr = buildExemplar(key, csym)
129129
symExemplars.put(csym, tr)
130130
exemplars.put(tr.c, tr)
@@ -401,7 +401,7 @@ abstract class BCodeTypes extends BCodeIdiomatic {
401401
return opt
402402
}
403403

404-
val key = brefType(csym.javaBinaryName.toTypeName)
404+
val key = brefType(javaBinaryName(csym).toTypeName)
405405
assert(key.isNonSpecial || isCompilingStdLib, s"Not a class to track: ${csym.fullName}")
406406

407407
// TODO accomodate the fix for SI-5031 of https://github.com/scala/scala/commit/0527b2549bcada2fda2201daa630369b377d0877
@@ -767,7 +767,7 @@ abstract class BCodeTypes extends BCodeIdiomatic {
767767
if (innerSym.originalEnclosingMethod != NoSymbol)
768768
null
769769
else {
770-
val outerName = innerSym.rawowner.javaBinaryName
770+
val outerName = javaBinaryName(innerSym.rawowner)
771771
if (isTopLevelModule(innerSym.rawowner)) nme.stripModuleSuffix(outerName)
772772
else outerName
773773
}
@@ -787,7 +787,7 @@ abstract class BCodeTypes extends BCodeIdiomatic {
787787
) & (INNER_CLASSES_FLAGS | asm.Opcodes.ACC_DEPRECATED)
788788
val flags = if (innerSym.isModuleClass) flagsWithFinal & ~asm.Opcodes.ACC_FINAL else flagsWithFinal // For SI-5676, object overriding.
789789

790-
val jname = innerSym.javaBinaryName.toString // never null
790+
val jname = javaBinaryName(innerSym).toString // never null
791791
val oname = { // null when method-enclosed
792792
val on = outerName(innerSym)
793793
if (on == null) null else on.toString

src/dotty/tools/dotc/backend/jvm/GenBCode.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,15 @@ object GenBCode extends BCodeSyncAndTry {
154154
val claszSymbol = cd.symbol
155155

156156
// GenASM checks this before classfiles are emitted, https://github.com/scala/scala/commit/e4d1d930693ac75d8eb64c2c3c69f2fc22bec739
157-
val lowercaseJavaClassName = claszSymbol.javaClassName.toLowerCase
157+
val lowercaseJavaClassName = javaClassName(claszSymbol).toLowerCase
158158
caseInsensitively.get(lowercaseJavaClassName) match {
159159
case None =>
160160
caseInsensitively.put(lowercaseJavaClassName, claszSymbol)
161161
case Some(dupClassSym) =>
162-
item.cunit.warning(
163-
claszSymbol.pos,
164-
s"Class ${claszSymbol.javaClassName} differs only in case from ${dupClassSym.javaClassName}. " +
165-
"Such classes will overwrite one another on case-insensitive filesystems."
162+
ctx.warning(
163+
s"Class ${javaClassName(claszSymbol)} differs only in case from ${javaClassName(dupClassSym)}. " +
164+
"Such classes will overwrite one another on case-insensitive filesystems.",
165+
cunit.source.atPos(claszSymbol.pos)
166166
)
167167
}
168168

@@ -172,13 +172,13 @@ object GenBCode extends BCodeSyncAndTry {
172172
if (claszSymbol.companionClass == NoSymbol) {
173173
mirrorCodeGen.genMirrorClass(claszSymbol, cunit)
174174
} else {
175-
log(s"No mirror class for module with linked class: ${claszSymbol.fullName}")
175+
ctx.log(s"No mirror class for module with linked class: ${claszSymbol.fullName}")
176176
null
177177
}
178178
} else null
179179

180180
// -------------- "plain" class --------------
181-
val pcb = new PlainClassBuilder(cunit, ctx)
181+
val pcb = new PlainClassBuilder(cunit)
182182
pcb.genPlainClass(cd)
183183
val outF = if (needsOutFolder) getOutFolder(claszSymbol, pcb.thisName, cunit) else null;
184184
val plainC = pcb.cnode

src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,8 @@ object SymDenotations {
11161116
}
11171117

11181118
// to avoid overloading ambiguities
1119-
override def fullName(implicit ctx: Context): Name = super.fullName
1119+
// TODO(lrytz) remove
1120+
// override def fullName(implicit ctx: Context): Name = super.fullName
11201121

11211122
override def primaryConstructor(implicit ctx: Context): Symbol = {
11221123
val cname = if (this is ImplClass) nme.IMPLCLASS_CONSTRUCTOR else nme.CONSTRUCTOR

0 commit comments

Comments
 (0)