diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser.kt index fd5dba6ff93..e69d0913ba0 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.load.java.structure.impl.classFiles import com.intellij.util.containers.ContainerUtil +import com.intellij.util.containers.StringInterner import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.load.java.structure.JavaClassifierType import org.jetbrains.kotlin.load.java.structure.JavaType @@ -36,6 +37,8 @@ import java.text.StringCharacterIterator */ class BinaryClassSignatureParser { + private val canonicalNameInterner = StringInterner() + fun parseTypeParametersDeclaration(signature: CharacterIterator, context: ClassifierResolutionContext): List { if (signature.current() != '<') { return emptyList() @@ -96,7 +99,9 @@ class BinaryClassSignatureParser { signature.next() } - return PlainJavaClassifierType({ context.resolveTypeParameter(id.toString()) }, emptyList()) + val parameterName = canonicalNameInterner.intern(id.toString()) + + return PlainJavaClassifierType({ context.resolveTypeParameter(parameterName) }, emptyList()) } private fun parseParameterizedClassRefSignature( @@ -131,9 +136,10 @@ class BinaryClassSignatureParser { } signature.next() + val internedCanonicalName = canonicalNameInterner.intern(canonicalName.toString()) return PlainJavaClassifierType( - { context.resolveByInternalName(canonicalName.toString()) }, - argumentGroups.reversed().flattenTo(arrayListOf()).compact() + { context.resolveByInternalName(internedCanonicalName) }, + argumentGroups.reversed().flattenTo(arrayListOf()).compact() ) }