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
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 8ab66d5..a64a659 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
@@ -77,6 +77,12 @@
}
@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 {
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsReturnValue.kt");
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 36900be..eefed97 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
@@ -77,6 +77,12 @@
}
@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 {
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsReturnValue.kt");
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 4e27c4f..ff4a35e 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
@@ -77,6 +77,12 @@
}
@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 {
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsReturnValue.kt");
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 7ffbbb8..b9128ff 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
@@ -77,6 +77,12 @@
}
@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 {
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsReturnValue.kt");
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 0000000..85254c7
--- /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<caret> = mutableListOf<TagData>()
+ })
+ }
+ }
+ }
+}
\ 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 0000000..5acefee
--- /dev/null
+++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/localClass_exposedAsMemberInAnonymousObject.txt
@@ -0,0 +1,2 @@
+KtType: kotlin.collections.MutableList<TagData>
+PsiType: PsiType:List<TagData>
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 f7d0cea..fe58c42 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 @@
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 @@
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 476fc77..0000000
--- 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()
-}