From 8856977c78b6e77f61bf0c7115064b8f55d99a73 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 6 Aug 2022 22:56:36 +0200 Subject: [PATCH] [Symbol LC] add test for declaration parents --- ...bstractSymbolLightClassesParentingTest.kt} | 32 +++++++++++++++++-- ...bolLightClassesParentingForLibraryTest.kt} | 6 ++-- ...ssesParentingForLibraryTestGenerated.java} | 2 +- ...mbolLightClassesParentingForSourceTest.kt} | 6 ++-- ...assesParentingForSourceTestGenerated.java} | 2 +- .../tests/analysis/api/lightClasses.kt | 8 ++--- 6 files changed, 41 insertions(+), 15 deletions(-) rename analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/{AbstractSymbolLightClassesAnnotationOwnerTest.kt => AbstractSymbolLightClassesParentingTest.kt} (74%) rename analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/{AbstractSymbolLightClassesAnnotationOwnerForLibraryTest.kt => AbstractSymbolLightClassesParentingForLibraryTest.kt} (79%) rename analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/{SymbolLightClassesAnnotationOwnerForLibraryTestGenerated.java => SymbolLightClassesParentingForLibraryTestGenerated.java} (99%) rename analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/{AbstractSymbolLightClassesAnnotationOwnerForSourceTest.kt => AbstractSymbolLightClassesParentingForSourceTest.kt} (79%) rename analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/{SymbolLightClassesAnnotationOwnerForSourceTestGenerated.java => SymbolLightClassesParentingForSourceTestGenerated.java} (99%) diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesAnnotationOwnerTest.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTest.kt similarity index 74% rename from analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesAnnotationOwnerTest.kt rename to analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTest.kt index 967bc46e2bc..bb6104a210e 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesAnnotationOwnerTest.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTest.kt @@ -14,10 +14,12 @@ import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassM import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.AssertionsService import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions import java.nio.file.Path -abstract class AbstractSymbolLightClassesAnnotationOwnerTest( +abstract class AbstractSymbolLightClassesParentingTest( configurator: AnalysisApiTestConfigurator, override val currentExtension: String, override val stopIfCompilationErrorDirectivePresent: Boolean, @@ -28,18 +30,19 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest( val ktFile = ktFiles.first() val lightClass = findLightClass(fqName, ktFile.project) - lightClass?.accept(lightAnnotationVisitor) + lightClass?.accept(createLightAnnotationVisitor(testServices.assertions)) } override fun getRenderResult(ktFile: KtFile, testDataFile: Path, module: TestModule, project: Project): String { throw IllegalStateException("This test is not rendering light elements") } - private val lightAnnotationVisitor = object : JavaElementVisitor() { + private fun createLightAnnotationVisitor(assertions: AssertionsService) = object : JavaElementVisitor() { private val declarationStack = ArrayDeque() override fun visitClass(aClass: PsiClass?) { if (aClass == null) return + checkDeclarationParent(aClass) declarationStack.addLast(aClass) aClass.annotations.forEach { it.accept(this) } @@ -55,6 +58,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest( override fun visitField(field: PsiField?) { if (field == null) return + checkDeclarationParent(field) declarationStack.addLast(field) field.annotations.forEach { it.accept(this) } @@ -66,6 +70,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest( override fun visitMethod(method: PsiMethod?) { if (method == null) return + checkDeclarationParent(method) declarationStack.addLast(method) method.annotations.forEach { it.accept(this) } @@ -80,6 +85,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest( override fun visitParameter(parameter: PsiParameter?) { if (parameter == null) return + checkDeclarationParent(parameter) declarationStack.addLast(parameter) parameter.annotations.forEach { it.accept(this) } @@ -89,6 +95,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest( override fun visitTypeParameter(classParameter: PsiTypeParameter?) { if (classParameter == null) return + checkDeclarationParent(classParameter) declarationStack.addLast(classParameter) classParameter.annotations.forEach { it.accept(this) } @@ -96,6 +103,25 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest( declarationStack.removeLast() } + private fun checkDeclarationParent(declaration: PsiElement) { + val expectedParent = declarationStack.lastOrNull() ?: return + val parent = when (declaration) { + is PsiParameter -> { + val parameterList = declaration.parent as PsiParameterList + parameterList.parent + } + is PsiTypeParameter -> { + val parameterList = declaration.parent as PsiTypeParameterList + parameterList.parent + } + else -> declaration.parent + } + assertions.assertNotNull(parent) { "Parent should not be null for ${declaration::class} with text ${declaration.text} "} + assertions.assertEquals(expectedParent, parent) { + "Unexpected parent for ${declaration::class} with text ${declaration.text}" + } + } + override fun visitAnnotation(annotation: PsiAnnotation?) { if (annotation == null) return diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/AbstractSymbolLightClassesAnnotationOwnerForLibraryTest.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/AbstractSymbolLightClassesParentingForLibraryTest.kt similarity index 79% rename from analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/AbstractSymbolLightClassesAnnotationOwnerForLibraryTest.kt rename to analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/AbstractSymbolLightClassesParentingForLibraryTest.kt index 3fa93e21aa4..ddd6cd45dfe 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/AbstractSymbolLightClassesAnnotationOwnerForLibraryTest.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/AbstractSymbolLightClassesParentingForLibraryTest.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.light.classes.symbol.decompiled -import org.jetbrains.kotlin.light.classes.symbol.base.AbstractSymbolLightClassesAnnotationOwnerTest +import org.jetbrains.kotlin.light.classes.symbol.base.AbstractSymbolLightClassesParentingTest import org.jetbrains.kotlin.light.classes.symbol.decompiled.test.configurators.AnalysisApiSymbolLightClassesDecompiledTestConfigurator -abstract class AbstractSymbolLightClassesAnnotationOwnerForLibraryTest : - AbstractSymbolLightClassesAnnotationOwnerTest( +abstract class AbstractSymbolLightClassesParentingForLibraryTest : + AbstractSymbolLightClassesParentingTest( AnalysisApiSymbolLightClassesDecompiledTestConfigurator, EXTENSIONS.LIB_JAVA, stopIfCompilationErrorDirectivePresent = true diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesAnnotationOwnerForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java similarity index 99% rename from analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesAnnotationOwnerForLibraryTestGenerated.java rename to analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java index 910a68fd95e..8ef667d527f 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesAnnotationOwnerForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("compiler/testData/asJava/lightClasses") @TestDataPath("$PROJECT_ROOT") -public class SymbolLightClassesAnnotationOwnerForLibraryTestGenerated extends AbstractSymbolLightClassesAnnotationOwnerForLibraryTest { +public class SymbolLightClassesParentingForLibraryTestGenerated extends AbstractSymbolLightClassesParentingForLibraryTest { @Test public void testAllFilesPresentInLightClasses() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "compilationErrors"); diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/AbstractSymbolLightClassesAnnotationOwnerForSourceTest.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/AbstractSymbolLightClassesParentingForSourceTest.kt similarity index 79% rename from analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/AbstractSymbolLightClassesAnnotationOwnerForSourceTest.kt rename to analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/AbstractSymbolLightClassesParentingForSourceTest.kt index c8c57da47ee..8769533d6e4 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/AbstractSymbolLightClassesAnnotationOwnerForSourceTest.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/AbstractSymbolLightClassesParentingForSourceTest.kt @@ -6,10 +6,10 @@ package org.jetbrains.kotlin.light.classes.symbol.source import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator -import org.jetbrains.kotlin.light.classes.symbol.base.AbstractSymbolLightClassesAnnotationOwnerTest +import org.jetbrains.kotlin.light.classes.symbol.base.AbstractSymbolLightClassesParentingTest -abstract class AbstractSymbolLightClassesAnnotationOwnerForSourceTest : - AbstractSymbolLightClassesAnnotationOwnerTest( +abstract class AbstractSymbolLightClassesParentingForSourceTest : + AbstractSymbolLightClassesParentingTest( AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false), EXTENSIONS.FIR_JAVA, stopIfCompilationErrorDirectivePresent = false diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesAnnotationOwnerForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java similarity index 99% rename from analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesAnnotationOwnerForSourceTestGenerated.java rename to analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java index ed9fa9d9255..41561f69889 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesAnnotationOwnerForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("compiler/testData/asJava/lightClasses") @TestDataPath("$PROJECT_ROOT") -public class SymbolLightClassesAnnotationOwnerForSourceTestGenerated extends AbstractSymbolLightClassesAnnotationOwnerForSourceTest { +public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractSymbolLightClassesParentingForSourceTest { @Test public void testAllFilesPresentInLightClasses() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true); diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt index 4e8595e69ad..010ded06d67 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt @@ -7,11 +7,11 @@ package org.jetbrains.kotlin.generators.tests.analysis.api import org.jetbrains.kotlin.generators.TestGroupSuite import org.jetbrains.kotlin.generators.util.TestGeneratorUtil -import org.jetbrains.kotlin.light.classes.symbol.decompiled.AbstractSymbolLightClassesAnnotationOwnerForLibraryTest +import org.jetbrains.kotlin.light.classes.symbol.decompiled.AbstractSymbolLightClassesParentingForLibraryTest import org.jetbrains.kotlin.light.classes.symbol.decompiled.AbstractSymbolLightClassesFacadeForLibraryTest import org.jetbrains.kotlin.light.classes.symbol.decompiled.AbstractSymbolLightClassesForLibraryTest import org.jetbrains.kotlin.light.classes.symbol.decompiled.AbstractSymbolLightClassesLoadingForLibraryTest -import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesAnnotationOwnerForSourceTest +import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesParentingForSourceTest import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesFacadeForSourceTest import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesForSourceTest import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesLoadingForSourceTest @@ -37,14 +37,14 @@ internal fun TestGroupSuite.generateSymbolLightClassesTests() { ) } - testClass { + testClass { model( "asJava/lightClasses", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME ) } - testClass { + testClass { model( "asJava/lightClasses", excludeDirs = listOf("compilationErrors"),