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
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<JavaTypeParameter> {
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()
)
}