Intern canonical classes and parameters names in BinaryClassSignatureParser

Otherwise, a lot of duplicated strings are generated
This commit is contained in:
Denis Zharkov
2018-07-16 23:01:06 +07:00
parent 782f221ab5
commit e3bdde45de
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.java.structure.impl.classFiles package org.jetbrains.kotlin.load.java.structure.impl.classFiles
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
import com.intellij.util.containers.StringInterner
import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.load.java.structure.JavaClassifierType import org.jetbrains.kotlin.load.java.structure.JavaClassifierType
import org.jetbrains.kotlin.load.java.structure.JavaType import org.jetbrains.kotlin.load.java.structure.JavaType
@@ -36,6 +37,8 @@ import java.text.StringCharacterIterator
*/ */
class BinaryClassSignatureParser { class BinaryClassSignatureParser {
private val canonicalNameInterner = StringInterner()
fun parseTypeParametersDeclaration(signature: CharacterIterator, context: ClassifierResolutionContext): List<JavaTypeParameter> { fun parseTypeParametersDeclaration(signature: CharacterIterator, context: ClassifierResolutionContext): List<JavaTypeParameter> {
if (signature.current() != '<') { if (signature.current() != '<') {
return emptyList() return emptyList()
@@ -96,7 +99,9 @@ class BinaryClassSignatureParser {
signature.next() signature.next()
} }
return PlainJavaClassifierType({ context.resolveTypeParameter(id.toString()) }, emptyList()) val parameterName = canonicalNameInterner.intern(id.toString())
return PlainJavaClassifierType({ context.resolveTypeParameter(parameterName) }, emptyList())
} }
private fun parseParameterizedClassRefSignature( private fun parseParameterizedClassRefSignature(
@@ -131,9 +136,10 @@ class BinaryClassSignatureParser {
} }
signature.next() signature.next()
val internedCanonicalName = canonicalNameInterner.intern(canonicalName.toString())
return PlainJavaClassifierType( return PlainJavaClassifierType(
{ context.resolveByInternalName(canonicalName.toString()) }, { context.resolveByInternalName(internedCanonicalName) },
argumentGroups.reversed().flattenTo(arrayListOf()).compact() argumentGroups.reversed().flattenTo(arrayListOf()).compact()
) )
} }