Remove unneeded name-handling code in ClassifierResolutionContext

The only place where a name with dots was passed to
ClassifierResolutionContext.mapInternalNameToClassId was in
BinaryClassSignatureParser.parseParameterizedClassRefSignature, where
for some reason names can be both of internal (`a/b$c`) and canonical
(`a/b.c`) form. Supporting both names in mapInternalNameToClassId was
confusing because JVM internal names cannot contain dots. Replace dots
with dollars in parseParameterizedClassRefSignature to get rid of the
dot-name handling in mapInternalNameToClassId and rely on the correct
(simplified) InnerClasses-based name resolution later instead.

Also inline mapDescToClassId to its only usage.
This commit is contained in:
Alexander Udalov
2018-10-31 15:45:46 +01:00
parent c20f93ddbf
commit a3231e561c
3 changed files with 4 additions and 19 deletions
@@ -168,7 +168,8 @@ class BinaryJavaAnnotationVisitor(
}
override fun visitEnum(name: String?, desc: String, value: String) {
addArgument(PlainJavaEnumValueAnnotationArgument(name, context.mapDescToClassId(desc), value))
val enumClassId = context.mapInternalNameToClassId(Type.getType(desc).internalName)
addArgument(PlainJavaEnumValueAnnotationArgument(name, enumClassId, value))
}
override fun visit(name: String?, value: Any?) {
@@ -136,9 +136,9 @@ class BinaryClassSignatureParser {
}
signature.next()
val internedCanonicalName = canonicalNameInterner.intern(canonicalName.toString())
val internalName = canonicalNameInterner.intern(canonicalName.toString().replace('.', '$'))
return PlainJavaClassifierType(
{ context.resolveByInternalName(internedCanonicalName) },
{ context.resolveByInternalName(internalName) },
argumentGroups.reversed().flattenTo(arrayListOf()).compact()
)
}
@@ -26,8 +26,6 @@ import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import org.jetbrains.kotlin.util.javaslang.getOrNull
import org.jetbrains.org.objectweb.asm.Type
typealias ClassIdToJavaClass = (ClassId) -> JavaClass?
class ClassifierResolutionContext private constructor(
@@ -63,19 +61,7 @@ class ClassifierResolutionContext private constructor(
internal fun copyForMember() = ClassifierResolutionContext(classesByQName, typeParameters, innerClasses)
// See com.intellij.psi.impl.compiled.StubBuildingVisitor.createMapping(byte[])
internal fun mapInternalNameToClassId(internalName: String): ClassId {
if ('.' in internalName) {
val parts = internalName.split('.')
val outerClass = mapInternalNameToClassId(parts[0])
val nestedParts = parts.subList(1, parts.size)
return nestedParts.fold(outerClass) { classId, part ->
classId.createNestedClassId(Name.identifier(part))
}
}
if ('$' in internalName) {
val innerClassInfo = innerClasses.getOrNull(internalName)
if (innerClassInfo != null && Name.isValidIdentifier(innerClassInfo.simpleName)) {
@@ -88,6 +74,4 @@ class ClassifierResolutionContext private constructor(
}
internal fun resolveByInternalName(c: String): Result = resolveClass(mapInternalNameToClassId(c))
internal fun mapDescToClassId(desc: String): ClassId = mapInternalNameToClassId(Type.getType(desc).internalName)
}