From ed867af01d80ead6f5d67564037185dfcdf8338d Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 3 Oct 2022 17:01:25 +0300 Subject: [PATCH] [AA LC] Expand aliases of type arguments during conversion to KtType ^KT-55781 --- .../fir/components/KtFirPsiTypeProvider.kt | 3 +++ ...lassesByFqNameForLibraryTestGenerated.java | 6 ++++++ ...assesParentingForLibraryTestGenerated.java | 6 ++++++ ...ClassesByFqNameForSourceTestGenerated.java | 6 ++++++ ...lassesParentingForSourceTestGenerated.java | 6 ++++++ .../kotlin/fir/types/ConeTypeProjection.kt | 20 ++++++++++++++++++- .../jetbrains/kotlin/fir/types/TypeUtils.kt | 2 +- .../typealiasInTypeArguments.java | 13 ++++++++++++ .../lightClasses/typealiasInTypeArguments.kt | 15 ++++++++++++++ .../CompilerLightClassTestGenerated.java | 5 +++++ 10 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/typealiasInTypeArguments.java create mode 100644 compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt index 4a6dea8e15a..0685b1a4655 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt @@ -107,6 +107,9 @@ private fun ConeKotlinType.simplifyType( ?: currentType } while (oldType !== currentType) + if (typeArguments.isNotEmpty()) { + currentType = currentType.withArguments { it.replaceType(it.type?.simplifyType(session, useSitePosition)) } + } return currentType } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java index db74a793680..5b3c9520b82 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java @@ -270,6 +270,12 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/TypePararametersInClass.kt"); } + @Test + @TestMetadata("typealiasInTypeArguments.kt") + public void testTypealiasInTypeArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt"); + } + @Test @TestMetadata("VarArgs.kt") public void testVarArgs() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java index 2826388c442..ae5a14b43ba 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java @@ -270,6 +270,12 @@ public class SymbolLightClassesParentingForLibraryTestGenerated extends Abstract runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/TypePararametersInClass.kt"); } + @Test + @TestMetadata("typealiasInTypeArguments.kt") + public void testTypealiasInTypeArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt"); + } + @Test @TestMetadata("VarArgs.kt") public void testVarArgs() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java index d26e0e09f58..e654cbbfc5d 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java @@ -270,6 +270,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/TypePararametersInClass.kt"); } + @Test + @TestMetadata("typealiasInTypeArguments.kt") + public void testTypealiasInTypeArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt"); + } + @Test @TestMetadata("VarArgs.kt") public void testVarArgs() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java index c465bf1192c..61491d7da56 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java @@ -270,6 +270,12 @@ public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/TypePararametersInClass.kt"); } + @Test + @TestMetadata("typealiasInTypeArguments.kt") + public void testTypealiasInTypeArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt"); + } + @Test @TestMetadata("VarArgs.kt") public void testVarArgs() throws Exception { diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeProjection.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeProjection.kt index 2df8ee1f6b1..0a765a24e5c 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeProjection.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypeProjection.kt @@ -61,8 +61,26 @@ val ConeTypeProjection.type: ConeKotlinType? get() = when (this) { ConeStarProjection -> null is ConeKotlinTypeProjection -> type - is ConeKotlinType -> this } val ConeTypeProjection.isStarProjection: Boolean get() = this == ConeStarProjection + +fun ConeTypeProjection.replaceType(newType: ConeKotlinType?): ConeTypeProjection { + return when (this) { + is ConeStarProjection -> this + is ConeKotlinTypeProjection -> { + requireNotNull(newType) { "Type for non star projection should be not null" } + replaceType(newType) + } + } +} + +fun ConeKotlinTypeProjection.replaceType(newType: ConeKotlinType): ConeKotlinTypeProjection { + return when (this) { + is ConeKotlinType -> newType + is ConeKotlinTypeProjectionIn -> ConeKotlinTypeProjectionIn(newType) + is ConeKotlinTypeProjectionOut -> ConeKotlinTypeProjectionOut(newType) + is ConeKotlinTypeConflictingProjection -> ConeKotlinTypeConflictingProjection(newType) + } +} diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index 682d8cbf185..e714c950476 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -119,7 +119,7 @@ fun T.withArguments(arguments: Array ConeErrorType(diagnostic, isUninferredParameter, arguments, attributes) as T - is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, arguments, nullability.isNullable) as T + is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, arguments, nullability.isNullable, attributes) as T is ConeDefinitelyNotNullType -> ConeDefinitelyNotNullType(original.withArguments(arguments)) as T else -> error("Not supported: $this: ${this.renderForDebugging()}") } diff --git a/compiler/testData/asJava/lightClasses/typealiasInTypeArguments.java b/compiler/testData/asJava/lightClasses/typealiasInTypeArguments.java new file mode 100644 index 00000000000..e56af175430 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/typealiasInTypeArguments.java @@ -0,0 +1,13 @@ +public abstract interface Test /* Test*/ { + @org.jetbrains.annotations.NotNull() + public abstract A foo();// foo() + + @org.jetbrains.annotations.NotNull() + public abstract A fooAliased();// fooAliased() + + @org.jetbrains.annotations.NotNull() + public abstract B> bar();// bar() + + @org.jetbrains.annotations.NotNull() + public abstract B> barAliased();// barAliased() +} diff --git a/compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt b/compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt new file mode 100644 index 00000000000..10e4aa6ab12 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt @@ -0,0 +1,15 @@ +// Test +interface A +interface B + +typealias OtherA = A +typealias OtherOtherA = OtherA +typealias OtherB = B + +interface Test { + fun foo(): A + fun fooAliased(): OtherA + + fun bar(): B> + fun barAliased(): OtherB, OtherOtherA> +} diff --git a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index 448f1315c0d..a3825b9018e 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -234,6 +234,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/TypePararametersInClass.kt"); } + @TestMetadata("typealiasInTypeArguments.kt") + public void testTypealiasInTypeArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/typealiasInTypeArguments.kt"); + } + @TestMetadata("VarArgs.kt") public void testVarArgs() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/VarArgs.kt");