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:
+2
-1
@@ -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?) {
|
||||
|
||||
+2
-2
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
-16
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user