From a93bc6065514cc5beb0ca855adff50e3842dfb33 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Wed, 21 Jun 2023 15:20:17 -0700 Subject: [PATCH] AA: use simple name of local type as JVM internal name Otherwise, e.g., if a local type is within an anonymous object, full class id will include that anonymous object too, resulting in invalid type signature for PsiType. ^KT-59533 Fixed --- ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ ...lClass_exposedAsMemberInAnonymousObject.kt | 25 +++++++++++++++++++ ...Class_exposedAsMemberInAnonymousObject.txt | 2 ++ .../fir/backend/jvm/FirJvmTypeMapper.kt | 10 ++++++-- .../localClassDerived.fir.java | 13 ---------- 8 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.txt delete mode 100644 compiler/testData/asJava/lightClasses/lightClassByPsi/localClassDerived.fir.java diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 8ab66d5af33..a64a659ab4d 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -76,6 +76,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGene runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); } + @Test + @TestMetadata("localClass_exposedAsMemberInAnonymousObject.kt") + public void testLocalClass_exposedAsMemberInAnonymousObject() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 36900be5f01..eefed97b22d 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -76,6 +76,12 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGe runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); } + @Test + @TestMetadata("localClass_exposedAsMemberInAnonymousObject.kt") + public void testLocalClass_exposedAsMemberInAnonymousObject() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 4e27c4f30d7..ff4a35ec798 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -76,6 +76,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGener runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); } + @Test + @TestMetadata("localClass_exposedAsMemberInAnonymousObject.kt") + public void testLocalClass_exposedAsMemberInAnonymousObject() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 7ffbbb8c0da..b9128ffd48c 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -76,6 +76,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTe runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); } + @Test + @TestMetadata("localClass_exposedAsMemberInAnonymousObject.kt") + public void testLocalClass_exposedAsMemberInAnonymousObject() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt new file mode 100644 index 00000000000..85254c71eca --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.kt @@ -0,0 +1,25 @@ +// WITH_STDLIB + +interface Indexer { + fun indexing() +} + +interface MyBuilder + +fun build(builder: MyBuilder) { +} + +fun test(): Indexer { + return object : Indexer { + override fun indexing() { + class TagData(val name: String) { + } + + fun foo() { + build(object : MyBuilder { + val tags = mutableListOf() + }) + } + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.txt new file mode 100644 index 00000000000..5acefee632d --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.txt @@ -0,0 +1,2 @@ +KtType: kotlin.collections.MutableList +PsiType: PsiType:List diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt index f7d0ceaceb0..fe58c42a270 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmTypeMapper.kt @@ -82,7 +82,9 @@ class FirJvmTypeMapper(val session: FirSession) : FirSessionComponent { override fun getClassInternalName(typeConstructor: TypeConstructorMarker): String { require(typeConstructor is ConeClassLikeLookupTag) - return typeConstructor.classId.asString().replace(".", "$").replace("/", ".") + val classId = typeConstructor.classId + val name = if (classId.isLocal) safeShortClassName(classId) else classId.asString() + return name.replace(".", "$").replace("/", ".") } override fun getScriptInternalName(typeConstructor: TypeConstructorMarker): String = @@ -230,7 +232,11 @@ class FirJvmTypeMapper(val session: FirSession) : FirSessionComponent { val result = runUnless(classId.isLocal) { classId.asSingleFqName().toUnsafe().let { JavaToKotlinClassMap.mapKotlinToJava(it)?.shortClassName?.asString() } } - return result ?: SpecialNames.safeIdentifier(classId.shortClassName).identifier + return result ?: safeShortClassName(classId) + } + + private fun safeShortClassName(classId: ClassId): String { + return SpecialNames.safeIdentifier(classId.shortClassName).identifier } } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/localClassDerived.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/localClassDerived.fir.java deleted file mode 100644 index 476fc778940..00000000000 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/localClassDerived.fir.java +++ /dev/null @@ -1,13 +0,0 @@ -public final class Boo /* Boo*/ { - public Boo();// .ctor() - - public final void fooBar();// fooBar() -} - -public static final class LocalClassBase /* null*/ { - public LocalClassBase();// .ctor() -} - -public static final class LocalClassDerived /* null*/ extends Boo.LocalClassBase { - public LocalClassDerived();// .ctor() -}