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 87a10ab8c92..bd89668fb72 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 @@ -188,17 +188,24 @@ internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiA } } - is KtEnumEntryAnnotationValue -> { - val fqName = this.callableId?.asSingleFqName()?.asString() ?: return null - val psiReference = PsiElementFactory.getInstance(parent.project).createReferenceFromText(fqName, parent) - SymbolPsiReference(sourcePsi, parent, psiReference) - } - + is KtEnumEntryAnnotationValue -> asPsiReferenceExpression(parent) KtUnsupportedAnnotationValue -> null is KtKClassAnnotationValue -> toAnnotationMemberValue(parent) } } +private fun KtEnumEntryAnnotationValue.asPsiReferenceExpression(parent: PsiElement): SymbolPsiReference? { + val fqName = this.callableId?.asSingleFqName()?.asString() ?: return null + val elementFactory = PsiElementFactory.getInstance(parent.project) + val psiReference = try { + elementFactory.createReferenceFromText(fqName, parent) + } catch (_: IncorrectOperationException) { + return null + } + + return SymbolPsiReference(sourcePsi, parent, psiReference) +} + private fun KtKClassAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiExpression? { val typeString = when (this) { is KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue -> classId.asSingleFqName().asString() diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt index 802d99c342f..00a9f0f5a95 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.ConfigurationDirectives import org.jetbrains.kotlin.test.directives.ModuleStructureDirectives +import org.jetbrains.kotlin.test.directives.model.Directive import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer import org.jetbrains.kotlin.test.model.TestModule @@ -65,7 +66,7 @@ abstract class AbstractSymbolLightClassesTestBase( val ktFile = ktFiles.first() val project = ktFile.project - ignoreExceptionIfIgnoreFirPresent(module) { + ignoreExceptionIfIgnoreDirectivePresent(module) { compareResults(module, testServices) { getRenderResult(ktFile, ktFiles, testDataPath, module, project) } @@ -75,7 +76,7 @@ abstract class AbstractSymbolLightClassesTestBase( protected fun compareResults(module: TestModule, testServices: TestServices, computeActual: () -> String) { val actual = computeActual().cleanup() compareResults(testServices, actual) - removeIgnoreFir(module) + removeIgnoreDirectives(module) removeDuplicatedFirJava(testServices) } @@ -95,13 +96,15 @@ abstract class AbstractSymbolLightClassesTestBase( project: Project ): String - private inline fun ignoreExceptionIfIgnoreFirPresent(module: TestModule, action: () -> Unit) { + private inline fun ignoreExceptionIfIgnoreDirectivePresent(module: TestModule, action: () -> Unit) { try { action() } catch (e: Throwable) { - if (Directives.IGNORE_FIR in module.directives) { + val directives = module.directives + if (Directives.IGNORE_FIR in directives || stopIfCompilationErrorDirectivePresent && Directives.IGNORE_LIBRARY_EXCEPTIONS in directives) { return } + throw e } } @@ -114,10 +117,19 @@ abstract class AbstractSymbolLightClassesTestBase( testServices.assertions.assertEqualsToFile(path, actual) } - private fun removeIgnoreFir(module: TestModule) { - if (Directives.IGNORE_FIR in module.directives) { - error("Test is passing. Please, remove `// ${Directives.IGNORE_FIR.name}` directive") + private fun removeIgnoreDirectives(module: TestModule) { + val directives = module.directives + if (Directives.IGNORE_FIR in directives) { + throwTestIsPassingException(Directives.IGNORE_FIR) } + + if (stopIfCompilationErrorDirectivePresent && Directives.IGNORE_LIBRARY_EXCEPTIONS in directives) { + throwTestIsPassingException(Directives.IGNORE_LIBRARY_EXCEPTIONS) + } + } + + private fun throwTestIsPassingException(directive: Directive): Nothing { + error("Test is passing. Please, remove `// ${directive.name}` directive") } protected fun findLightClass(fqname: String, project: Project): PsiClass? { @@ -183,5 +195,9 @@ abstract class AbstractSymbolLightClassesTestBase( description = "Ignore the test for Symbol FIR-based implementation of LC", applicability = DirectiveApplicability.Global ) + + val IGNORE_LIBRARY_EXCEPTIONS by stringDirective( + description = "Ignore the test for decompiled-based implementation of LC" + ) } } 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 732bacdaa74..1c79ca6620d 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 @@ -186,6 +186,12 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @Test + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @Test @TestMetadata("JavaBetween.kt") public void testJavaBetween() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java index b8e7ba69f1f..c527db84f72 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java @@ -186,6 +186,12 @@ public class SymbolLightClassesEqualityByFqNameForLibraryTestGenerated extends A runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @Test + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @Test @TestMetadata("JavaBetween.kt") public void testJavaBetween() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java index fb604526af2..685834d5a7b 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java @@ -186,6 +186,12 @@ public class SymbolLightClassesParentingByFqNameForLibraryTestGenerated extends runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @Test + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @Test @TestMetadata("JavaBetween.kt") public void testJavaBetween() 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 fafadaada81..91d9fb31ce3 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 @@ -186,6 +186,12 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @Test + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @Test @TestMetadata("JavaBetween.kt") public void testJavaBetween() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java index 5dbd8ece488..fd7f22d86b5 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java @@ -186,6 +186,12 @@ public class SymbolLightClassesEqualityByFqNameForSourceTestGenerated extends Ab runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @Test + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @Test @TestMetadata("JavaBetween.kt") public void testJavaBetween() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java index 9c5a5fceedc..4598affd7bf 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java @@ -186,6 +186,12 @@ public class SymbolLightClassesParentingByFqNameForSourceTestGenerated extends A runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @Test + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @Test @TestMetadata("JavaBetween.kt") public void testJavaBetween() throws Exception { diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.descriptors.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.descriptors.java new file mode 100644 index 00000000000..cc68fc49c5e --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.descriptors.java @@ -0,0 +1,4 @@ +@Sized(value = Size.3x3) +public final class Big /* Big*/ { + public Big();// .ctor() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.java new file mode 100644 index 00000000000..072fb6afe12 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.java @@ -0,0 +1,4 @@ +@Sized(value = ?) +public final class Big /* Big*/ { + public Big();// .ctor() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt new file mode 100644 index 00000000000..007a4233660 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt @@ -0,0 +1,8 @@ +// Big +enum class Size { `2x2`, `3x3` } +annotation class Sized(val value: Size) + +@Sized(Size.`3x3`) +class Big + +// IGNORE_LIBRARY_EXCEPTIONS: KT-57328 \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index e9cbeb0eb99..447898000a6 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -164,6 +164,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InlineReified.kt"); } + @TestMetadata("InvalidJavaIdentifierAsAnnotationArgument.kt") + public void testInvalidJavaIdentifierAsAnnotationArgument() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/InvalidJavaIdentifierAsAnnotationArgument.kt"); + } + @TestMetadata("JavaBetween.kt") public void testJavaBetween() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/JavaBetween.kt");