From 95f5848e6c6915a5875995464d7ee87784f7b1a3 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 28 Sep 2022 14:37:11 +0300 Subject: [PATCH] [AA LC] Save unresolved qualifier name in arguments of annotations --- .../evaluate/FirAnnotationValueConverter.kt | 26 ++++++++++++++++++- .../api/annotations/KtAnnotationValue.kt | 3 ++- .../light/classes/symbol/symbolLightUtils.kt | 14 +++++----- ...lassesByFqNameForLibraryTestGenerated.java | 6 ----- ...assesParentingForLibraryTestGenerated.java | 6 ----- ...ClassesByFqNameForSourceTestGenerated.java | 12 ++++----- ...lassesParentingForSourceTestGenerated.java | 12 ++++----- .../unresolvedQuialifierInAnnotation.fir.java | 4 +++ .../unresolvedQuialifierInAnnotation.java | 4 +++ .../unresolvedQuialifierInAnnotation.kt | 6 +++++ .../CompilerLightClassTestGenerated.java | 10 +++---- 11 files changed, 66 insertions(+), 37 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.fir.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt index 15c997cc187..70e6a397f40 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt @@ -17,9 +17,13 @@ import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedTypeQualifierError import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.types.ConeErrorType +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.parents @@ -145,7 +149,27 @@ internal object FirAnnotationValueConverter { is FirGetClassCall -> { val symbol = (argument as? FirResolvedQualifier)?.symbol when { - symbol == null -> KtKClassAnnotationValue.KtErrorClassAnnotationValue(sourcePsi) + symbol == null -> { + val qualifierParts = mutableListOf() + + fun process(expression: FirExpression) { + val errorType = expression.typeRef.coneType as? ConeErrorType + val unresolvedName = when (val diagnostic = errorType?.diagnostic) { + is ConeUnresolvedTypeQualifierError -> diagnostic.qualifier + is ConeUnresolvedNameError -> diagnostic.qualifier + else -> null + } + qualifierParts += unresolvedName + if (errorType != null && expression is FirPropertyAccessExpression) { + expression.explicitReceiver?.let { process(it) } + } + } + + process(argument) + + val unresolvedName = qualifierParts.asReversed().filterNotNull().takeIf { it.isNotEmpty() }?.joinToString(".") + KtKClassAnnotationValue.KtErrorClassAnnotationValue(sourcePsi, unresolvedName) + } symbol.isLocal -> KtKClassAnnotationValue.KtLocalKClassAnnotationValue( symbol.fir.psi as KtClassOrObject, sourcePsi diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/annotations/KtAnnotationValue.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/annotations/KtAnnotationValue.kt index 002a210abd3..2d8aaa26505 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/annotations/KtAnnotationValue.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/annotations/KtAnnotationValue.kt @@ -97,6 +97,7 @@ public sealed class KtKClassAnnotationValue : KtAnnotationValue() { */ public class KtErrorClassAnnotationValue( override val sourcePsi: KtElement?, + public val unresolvedQualifierName: String?, ) : KtKClassAnnotationValue() } @@ -127,4 +128,4 @@ public class KtConstantAnnotationValue( * Render annotation value, resulted string is a valid Kotlin source code. */ public fun KtAnnotationValue.renderAsSourceCode(): String = - KtAnnotationValueRenderer.render(this) \ No newline at end of file + KtAnnotationValueRenderer.render(this) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index db3dc4f9c3a..c9310db899a 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -201,16 +201,18 @@ internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiA } KtUnsupportedAnnotationValue -> null - is KtKClassAnnotationValue.KtErrorClassAnnotationValue -> null - is KtKClassAnnotationValue.KtLocalKClassAnnotationValue -> null - is KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue -> toAnnotationMemberValue(parent) + is KtKClassAnnotationValue -> toAnnotationMemberValue(parent) } } -private fun KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiExpression? { - val fqName = classId.asSingleFqName() +private fun KtKClassAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiExpression? { + val typeString = when (this) { + is KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue -> classId.asSingleFqName().asString() + is KtKClassAnnotationValue.KtLocalKClassAnnotationValue -> null + is KtKClassAnnotationValue.KtErrorClassAnnotationValue -> unresolvedQualifierName + } ?: return null val canonicalText = psiType( - fqName.asString(), parent, boxPrimitiveType = false, /* TODO value.arrayNestedness > 0*/ + typeString, parent, boxPrimitiveType = false, /* TODO value.arrayNestedness > 0*/ ).let(TypeConversionUtil::erasure).getCanonicalText(false) return try { PsiElementFactory.getInstance(parent.project).createExpressionFromText("$canonicalText.class", parent) 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 5b3c9520b82..db74a793680 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,12 +270,6 @@ 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 ae5a14b43ba..2826388c442 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,12 +270,6 @@ 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 e654cbbfc5d..2ab6c1bf842 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,12 +270,6 @@ 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 { @@ -411,6 +405,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/TwoOverrides.kt"); } + @Test + @TestMetadata("unresolvedQuialifierInAnnotation.kt") + public void testUnresolvedQuialifierInAnnotation() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt"); + } + @Test @TestMetadata("WrongAnnotations.kt") public void testWrongAnnotations() 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 61491d7da56..15c34afe439 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,12 +270,6 @@ 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 { @@ -411,6 +405,12 @@ public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/TwoOverrides.kt"); } + @Test + @TestMetadata("unresolvedQuialifierInAnnotation.kt") + public void testUnresolvedQuialifierInAnnotation() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt"); + } + @Test @TestMetadata("WrongAnnotations.kt") public void testWrongAnnotations() throws Exception { diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.fir.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.fir.java new file mode 100644 index 00000000000..debac036b8e --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.fir.java @@ -0,0 +1,4 @@ +@Ann(kClass = some.name.Unresolved.class) +public final class A /* A*/ { + public A();// .ctor() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.java new file mode 100644 index 00000000000..cd86d74c0e2 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.java @@ -0,0 +1,4 @@ +@Ann(kClass = some.name.Unresolved::class) +public final class A /* A*/ { + public A();// .ctor() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt new file mode 100644 index 00000000000..50bc1b8cf1e --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt @@ -0,0 +1,6 @@ +// A + +annotation class Ann(val kClass: KClass<*>) + +@Ann(some.name.Unresolved::class) +class A diff --git a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index a3825b9018e..3e4618dafc4 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -234,11 +234,6 @@ 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"); @@ -356,6 +351,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/TwoOverrides.kt"); } + @TestMetadata("unresolvedQuialifierInAnnotation.kt") + public void testUnresolvedQuialifierInAnnotation() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/unresolvedQuialifierInAnnotation.kt"); + } + @TestMetadata("WrongAnnotations.kt") public void testWrongAnnotations() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/WrongAnnotations.kt");