Skip to content

Commit c46ab15

Browse files
committed
Factor out javaSimpleName, javaClassName and javaBinaryName
1 parent 9a3b80e commit c46ab15

File tree

9 files changed

+33
-23
lines changed

9 files changed

+33
-23
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeAsmCommon.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ final class BCodeAsmCommon[I <: DottyBackendInterface](val interface: I) {
9292
ctx.debuglog(s"enclosing method for $classSym is $methodOpt (in ${methodOpt.map(_.enclosingClass)})")
9393
Some(EnclosingMethodEntry(
9494
classDesc(enclosingClassForEnclosingMethodAttribute(classSym)),
95-
methodOpt.map(_.name.mangledString.toString).orNull,
95+
methodOpt.map(_.javaSimpleName).orNull,
9696
methodOpt.map(methodDesc).orNull))
9797
} else {
9898
None

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
468468
val useSpecificReceiver = specificReceiver != null && !field.isScalaStatic
469469

470470
val owner = internalName(if (useSpecificReceiver) specificReceiver else field.owner)
471-
val fieldJName = field.name.mangledString.toString
471+
val fieldJName = field.javaSimpleName
472472
val fieldDescr = symInfoTK(field).descriptor
473473
val isStatic = field.isStaticMember
474474
val opc =
@@ -516,7 +516,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
516516
case EnumTag =>
517517
val sym = const.symbolValue
518518
val ownerName = internalName(sym.owner)
519-
val fieldName = sym.name.mangledString.toString
519+
val fieldName = sym.javaSimpleName
520520
val underlying = sym.info match {
521521
case t: TypeProxy => t.underlying
522522
case t => t
@@ -705,7 +705,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
705705
// we initialize the MODULE$ field immediately after the super ctor
706706
if (!isModuleInitialized &&
707707
jMethodName == INSTANCE_CONSTRUCTOR_NAME &&
708-
fun.symbol.name.mangledString.toString == INSTANCE_CONSTRUCTOR_NAME &&
708+
fun.symbol.javaSimpleName == INSTANCE_CONSTRUCTOR_NAME &&
709709
claszSymbol.isStaticModuleClass) {
710710
isModuleInitialized = true
711711
mnode.visitVarInsn(asm.Opcodes.ALOAD, 0)
@@ -803,7 +803,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
803803
// Emitting `def f(c: C) = c.clone()` as `Object.clone()` gives a VerifyError.
804804
val target: String = tpeTK(qual).asRefBType.classOrArrayType
805805
val methodBType = asmMethodType(sym)
806-
bc.invokevirtual(target, sym.name.mangledString.toString, methodBType.descriptor)
806+
bc.invokevirtual(target, sym.javaSimpleName, methodBType.descriptor)
807807
generatedType = methodBType.returnType
808808
} else {
809809
val receiverClass = if (!invokeStyle.isVirtual) null else {
@@ -1158,7 +1158,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
11581158
receiverClass.info // ensure types the type is up to date; erasure may add lateINTERFACE to traits
11591159
val receiverName = internalName(receiverClass)
11601160

1161-
val jname = method.name.mangledString.toString
1161+
val jname = method.javaSimpleName
11621162
val bmType = asmMethodType(method)
11631163
val mdescr = bmType.descriptor
11641164

@@ -1447,7 +1447,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
14471447
val targetHandle =
14481448
new asm.Handle(invokeStyle,
14491449
classBTypeFromSymbol(lambdaTarget.owner).internalName,
1450-
lambdaTarget.name.mangledString,
1450+
lambdaTarget.javaSimpleName,
14511451
asmMethodType(lambdaTarget).descriptor,
14521452
/* itf = */ isInterface)
14531453

@@ -1473,7 +1473,7 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
14731473
}
14741474
}
14751475

1476-
val methodName = abstractMethod.name.mangledString
1476+
val methodName = abstractMethod.javaSimpleName
14771477
val applyN = {
14781478
val mt = asmMethodType(abstractMethod)
14791479
mt.toASMType

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import dotty.tools.dotc.core.TypeErasure
2727
import dotty.tools.dotc.transform.GenericSignatures
2828
import dotty.tools.io.AbstractFile
2929

30+
import dotty.tools.backend.jvm.DottyBackendInterface.symExtensions
31+
3032
/*
3133
* Traits encapsulating functionality to convert Scala AST Trees into ASM ClassNodes.
3234
*
@@ -369,7 +371,7 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
369371
case ClazzTag => av.visit(name, typeToTypeKind(const.typeValue)(bcodeStore)(innerClasesStore).toASMType)
370372
case EnumTag =>
371373
val edesc = innerClasesStore.typeDescriptor(const.tpe) // the class descriptor of the enumeration class.
372-
val evalue = const.symbolValue.name.mangledString // value the actual enumeration value.
374+
val evalue = const.symbolValue.javaSimpleName // value the actual enumeration value.
373375
av.visitEnum(name, edesc, evalue)
374376
}
375377
case t: TypeApply if (t.fun.symbol == defn.Predef_classOf) =>
@@ -378,7 +380,7 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
378380
// An underscore argument indicates that we want to use the default value for this parameter, so do not emit anything
379381
case t: tpd.RefTree if t.symbol.denot.owner.isAllOf(Flags.JavaEnumTrait) =>
380382
val edesc = innerClasesStore.typeDescriptor(t.tpe) // the class descriptor of the enumeration class.
381-
val evalue = t.symbol.name.mangledString // value the actual enumeration value.
383+
val evalue = t.symbol.javaSimpleName // value the actual enumeration value.
382384
av.visitEnum(name, edesc, evalue)
383385
case t: SeqLiteral =>
384386
val arrAnnotV: AnnotationVisitor = av.visitArray(name)
@@ -517,7 +519,7 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
517519

518520
val jReturnType = toTypeKind(methodInfo.resultType)
519521
val mdesc = MethodBType(paramJavaTypes, jReturnType).descriptor
520-
val mirrorMethodName = m.name.mangledString.toString
522+
val mirrorMethodName = m.javaSimpleName
521523
val mirrorMethod: asm.MethodVisitor = jclass.visitMethod(
522524
flags,
523525
mirrorMethodName,

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {
263263

264264
val jfield = new asm.tree.FieldNode(
265265
flags,
266-
f.name.mangledString.toString,
266+
f.javaSimpleName,
267267
symInfoTK(f).descriptor,
268268
javagensig,
269269
null // no initial value
@@ -404,7 +404,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {
404404

405405
private def makeLocal(sym: Symbol, tk: BType): Local = {
406406
assert(nxtIdx != -1, "not a valid start index")
407-
val loc = Local(tk, sym.name.mangledString.toString, nxtIdx, sym.is(Flags.Synthetic))
407+
val loc = Local(tk, sym.javaSimpleName, nxtIdx, sym.is(Flags.Synthetic))
408408
val existing = slots.put(sym, loc)
409409
if (existing.isDefined)
410410
ctx.error("attempt to create duplicate local var.", ctx.source.atSpan(sym.span))
@@ -545,7 +545,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {
545545
assert(mnode == null, "GenBCode detected nested method.")
546546

547547
methSymbol = dd.symbol
548-
jMethodName = methSymbol.name.mangledString.toString
548+
jMethodName = methSymbol.javaSimpleName
549549
returnType = asmMethodType(dd.symbol).returnType
550550
isMethSymStaticCtor = methSymbol.isStaticConstructor
551551

@@ -659,7 +659,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {
659659
insnModA = new asm.tree.TypeInsnNode(asm.Opcodes.NEW, className)
660660
// INVOKESPECIAL <init>
661661
val callee = methSymbol.enclosingClass.primaryConstructor
662-
val jname = callee.name.mangledString.toString
662+
val jname = callee.javaSimpleName
663663
val jowner = internalName(callee.owner)
664664
val jtype = asmMethodType(callee).descriptor
665665
insnModB = new asm.tree.MethodInsnNode(asm.Opcodes.INVOKESPECIAL, jowner, jname, jtype, false)
@@ -681,7 +681,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {
681681
// INVOKESTATIC CREATOR(): android.os.Parcelable$Creator; -- TODO where does this Android method come from?
682682
val callee = claszSymbol.companionModule.info.member(androidFieldName).symbol
683683
val jowner = internalName(callee.owner)
684-
val jname = callee.name.mangledString.toString
684+
val jname = callee.javaSimpleName
685685
val jtype = asmMethodType(callee).descriptor
686686
insnParcA = new asm.tree.MethodInsnNode(asm.Opcodes.INVOKESTATIC, jowner, jname, jtype, false)
687687
// PUTSTATIC `thisName`.CREATOR;

compiler/src/dotty/tools/backend/jvm/BTypesFromSymbols.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class BTypesFromSymbols[I <: DottyBackendInterface](val int: I) extends BTypes {
8383
s"Cannot create ClassBType for special class symbol ${classSym.showFullName}")
8484

8585
convertedClasses.getOrElse(classSym, {
86-
val internalName = classSym.fullName.mangledString.replace('.', '/')
86+
val internalName = classSym.javaBinaryName
8787
// We first create and add the ClassBType to the hash map before computing its info. This
8888
// allows initializing cylic dependencies, see the comment on variable ClassBType._info.
8989
val classBType = new ClassBType(internalName)
@@ -240,7 +240,7 @@ class BTypesFromSymbols[I <: DottyBackendInterface](val int: I) extends BTypes {
240240
if (isAnonymousOrLocalClass(innerClassSym)) {
241241
None
242242
} else {
243-
val outerName = innerClassSym.originalOwner.originalLexicallyEnclosingClass.fullName.mangledString.replace('.', '/')
243+
val outerName = innerClassSym.originalOwner.originalLexicallyEnclosingClass.javaBinaryName
244244
def dropModule(str: String): String =
245245
if (!str.isEmpty && str.last == '$') str.take(str.length - 1) else str
246246
// Java compatibility. See the big comment in BTypes that summarizes the InnerClass spec.

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ object DottyBackendInterface {
162162
toDenot(sym).owner.is(Flags.PackageClass)
163163
}
164164

165+
def javaSimpleName(using Context): String = toDenot(sym).name.mangledString
166+
def javaClassName(using Context): String = toDenot(sym).fullName.mangledString
167+
def javaBinaryName(using Context): String = javaClassName.replace('.', '/')
165168
}
166169

167170
private val primitiveCompilationUnits = Set(

compiler/src/dotty/tools/backend/sjs/JSEncoding.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import ScopedVar.withScopedVars
3030
import JSDefinitions._
3131
import JSInterop._
3232

33+
import dotty.tools.backend.jvm.DottyBackendInterface.symExtensions
34+
3335
/** Encoding of symbol names for JavaScript
3436
*
3537
* Some issues that this encoding solves:
@@ -119,7 +121,7 @@ object JSEncoding {
119121
js.LabelIdent(freshLabelName(base))
120122

121123
def labelSymbolName(sym: Symbol)(implicit ctx: Context): LabelName =
122-
labelSymbolNames.getOrElseUpdate(sym, freshLabelName(sym.name.mangledString))
124+
labelSymbolNames.getOrElseUpdate(sym, freshLabelName(sym.javaSimpleName))
123125

124126
def getEnclosingReturnLabel()(implicit pos: ir.Position): js.LabelIdent = {
125127
if (returnLabelName.isEmpty)
@@ -157,7 +159,7 @@ object JSEncoding {
157159
require(sym.owner.isClass && sym.isTerm && !sym.is(Flags.Method) && !sym.is(Flags.Module),
158160
"encodeFieldSym called with non-field symbol: " + sym)
159161

160-
val name0 = sym.name.mangledString
162+
val name0 = sym.javaSimpleName
161163
val name =
162164
if (name0.charAt(name0.length()-1) != ' ') name0
163165
else name0.substring(0, name0.length()-1)
@@ -247,7 +249,7 @@ object JSEncoding {
247249
*/
248250
ir.Names.BoxedUnitClass
249251
} else {
250-
ClassName(sym1.fullName.mangledString)
252+
ClassName(sym1.javaClassName)
251253
}
252254
}
253255

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import parsing.Parsers.OutlineParser
2020
import reporting.trace
2121
import ast.desugar
2222

23+
import dotty.tools.backend.jvm.DottyBackendInterface.symExtensions
24+
2325
object SymbolLoaders {
2426
import ast.untpd._
2527

@@ -279,7 +281,7 @@ object SymbolLoaders {
279281
if (!sourceModule.isCompleted)
280282
sourceModule.completer.complete(sourceModule)
281283

282-
val packageName = if (root.isEffectiveRoot) "" else root.fullName.mangledString
284+
val packageName = if (root.isEffectiveRoot) "" else root.symbol.javaClassName
283285

284286
enterFlatClasses = Some { ctx =>
285287
enterFlatClasses = None

compiler/src/dotty/tools/dotc/transform/TreeChecker.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import scala.internal.Chars._
2323
import collection.mutable
2424
import ProtoTypes._
2525

26+
import dotty.tools.backend.jvm.DottyBackendInterface.symExtensions
2627

2728
import scala.util.control.NonFatal
2829

@@ -50,7 +51,7 @@ class TreeChecker extends Phase with SymTransformer {
5051
val NoSuperClassFlags: FlagSet = Trait | Package
5152

5253
def testDuplicate(sym: Symbol, registry: mutable.Map[String, Symbol], typ: String)(using Context): Unit = {
53-
val name = sym.fullName.mangledString
54+
val name = sym.javaClassName
5455
val isDuplicate = this.flatClasses && registry.contains(name)
5556
assert(!isDuplicate, s"$typ defined twice $sym ${sym.id} ${registry(name).id}")
5657
registry(name) = sym

0 commit comments

Comments
 (0)