diff --git a/analysis/analysis-api/testData/standalone/binary/propertyWithValueClass.txt b/analysis/analysis-api/testData/standalone/binary/propertyWithValueClass.txt index c562d298e8d..0582db60e41 100644 --- a/analysis/analysis-api/testData/standalone/binary/propertyWithValueClass.txt +++ b/analysis/analysis-api/testData/standalone/binary/propertyWithValueClass.txt @@ -1,2 +1,2 @@ Resolved to: -PsiMethod:getColor(): PsiType:Color \ No newline at end of file +PsiMethod:getColor-ywy1UOY(): PsiType:int \ No newline at end of file diff --git a/analysis/analysis-api/testData/standalone/binary/topLevelFunctionWithValueClass.txt b/analysis/analysis-api/testData/standalone/binary/topLevelFunctionWithValueClass.txt index 74f073427fc..6fb923b8715 100644 --- a/analysis/analysis-api/testData/standalone/binary/topLevelFunctionWithValueClass.txt +++ b/analysis/analysis-api/testData/standalone/binary/topLevelFunctionWithValueClass.txt @@ -1,2 +1,2 @@ Resolved to: -PsiMethod:ColorProvider(resId: PsiType:int): PsiType:ColorProvider +PsiMethod:ColorProvider-MpdQY78(color: PsiType:int): PsiType:ColorProvider \ No newline at end of file diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt index e6256dbbb08..cf4cbfbaf63 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt @@ -86,7 +86,11 @@ private class KotlinStaticPsiDeclarationFromBinaryModuleProvider( // E.g., getJVM_FIELD -> JVM_FIELD nameWithoutPrefix == id || // E.g., getFooBar -> FooBar -> fooBar - nameWithoutPrefix.decapitalizeSmart().endsWith(id) + nameWithoutPrefix.decapitalizeSmart().let { decapitalizedPrefix -> + decapitalizedPrefix.endsWith(id) || + // value class mangling: getColor-hash + isValueClassMangled(decapitalizedPrefix, id) + } } }.toList() } @@ -102,12 +106,22 @@ private class KotlinStaticPsiDeclarationFromBinaryModuleProvider( val classes = callableId.classId?.let { classId -> getClassesByClassId(classId) } ?: getClassesInPackage(callableId.packageName) + val id = callableId.callableName.identifier return classes.flatMap { psiClass -> psiClass.methods.filter { psiMethod -> - psiMethod.name == callableId.callableName.identifier + psiMethod.name == id || + // value class mangling: functionName-hash + isValueClassMangled(psiMethod.name, id) } }.toList() } + + private fun isValueClassMangled(name: String, prefix: String): Boolean { + // A memory optimization for `name.startsWith("$prefix-")`, see KT-63486 + return name.length > prefix.length && + name[prefix.length] == '-' && + name.startsWith(prefix) + } } class KotlinStaticPsiDeclarationProviderFactory(