[Symbol LC] add test for declaration parents

This commit is contained in:
Ilya Kirillov
2022-08-06 22:56:36 +02:00
parent ebc68dc54c
commit 8856977c78
6 changed files with 41 additions and 15 deletions
@@ -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.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule 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.TestServices
import org.jetbrains.kotlin.test.services.assertions
import java.nio.file.Path import java.nio.file.Path
abstract class AbstractSymbolLightClassesAnnotationOwnerTest( abstract class AbstractSymbolLightClassesParentingTest(
configurator: AnalysisApiTestConfigurator, configurator: AnalysisApiTestConfigurator,
override val currentExtension: String, override val currentExtension: String,
override val stopIfCompilationErrorDirectivePresent: Boolean, override val stopIfCompilationErrorDirectivePresent: Boolean,
@@ -28,18 +30,19 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest(
val ktFile = ktFiles.first() val ktFile = ktFiles.first()
val lightClass = findLightClass(fqName, ktFile.project) 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 { override fun getRenderResult(ktFile: KtFile, testDataFile: Path, module: TestModule, project: Project): String {
throw IllegalStateException("This test is not rendering light elements") 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<PsiModifierListOwner>() private val declarationStack = ArrayDeque<PsiModifierListOwner>()
override fun visitClass(aClass: PsiClass?) { override fun visitClass(aClass: PsiClass?) {
if (aClass == null) return if (aClass == null) return
checkDeclarationParent(aClass)
declarationStack.addLast(aClass) declarationStack.addLast(aClass)
aClass.annotations.forEach { it.accept(this) } aClass.annotations.forEach { it.accept(this) }
@@ -55,6 +58,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest(
override fun visitField(field: PsiField?) { override fun visitField(field: PsiField?) {
if (field == null) return if (field == null) return
checkDeclarationParent(field)
declarationStack.addLast(field) declarationStack.addLast(field)
field.annotations.forEach { it.accept(this) } field.annotations.forEach { it.accept(this) }
@@ -66,6 +70,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest(
override fun visitMethod(method: PsiMethod?) { override fun visitMethod(method: PsiMethod?) {
if (method == null) return if (method == null) return
checkDeclarationParent(method)
declarationStack.addLast(method) declarationStack.addLast(method)
method.annotations.forEach { it.accept(this) } method.annotations.forEach { it.accept(this) }
@@ -80,6 +85,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest(
override fun visitParameter(parameter: PsiParameter?) { override fun visitParameter(parameter: PsiParameter?) {
if (parameter == null) return if (parameter == null) return
checkDeclarationParent(parameter)
declarationStack.addLast(parameter) declarationStack.addLast(parameter)
parameter.annotations.forEach { it.accept(this) } parameter.annotations.forEach { it.accept(this) }
@@ -89,6 +95,7 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest(
override fun visitTypeParameter(classParameter: PsiTypeParameter?) { override fun visitTypeParameter(classParameter: PsiTypeParameter?) {
if (classParameter == null) return if (classParameter == null) return
checkDeclarationParent(classParameter)
declarationStack.addLast(classParameter) declarationStack.addLast(classParameter)
classParameter.annotations.forEach { it.accept(this) } classParameter.annotations.forEach { it.accept(this) }
@@ -96,6 +103,25 @@ abstract class AbstractSymbolLightClassesAnnotationOwnerTest(
declarationStack.removeLast() 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?) { override fun visitAnnotation(annotation: PsiAnnotation?) {
if (annotation == null) return if (annotation == null) return
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.light.classes.symbol.decompiled 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 import org.jetbrains.kotlin.light.classes.symbol.decompiled.test.configurators.AnalysisApiSymbolLightClassesDecompiledTestConfigurator
abstract class AbstractSymbolLightClassesAnnotationOwnerForLibraryTest : abstract class AbstractSymbolLightClassesParentingForLibraryTest :
AbstractSymbolLightClassesAnnotationOwnerTest( AbstractSymbolLightClassesParentingTest(
AnalysisApiSymbolLightClassesDecompiledTestConfigurator, AnalysisApiSymbolLightClassesDecompiledTestConfigurator,
EXTENSIONS.LIB_JAVA, EXTENSIONS.LIB_JAVA,
stopIfCompilationErrorDirectivePresent = true stopIfCompilationErrorDirectivePresent = true
@@ -18,7 +18,7 @@ import java.util.regex.Pattern;
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("compiler/testData/asJava/lightClasses") @TestMetadata("compiler/testData/asJava/lightClasses")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
public class SymbolLightClassesAnnotationOwnerForLibraryTestGenerated extends AbstractSymbolLightClassesAnnotationOwnerForLibraryTest { public class SymbolLightClassesParentingForLibraryTestGenerated extends AbstractSymbolLightClassesParentingForLibraryTest {
@Test @Test
public void testAllFilesPresentInLightClasses() throws Exception { public void testAllFilesPresentInLightClasses() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "compilationErrors"); KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "compilationErrors");
@@ -6,10 +6,10 @@
package org.jetbrains.kotlin.light.classes.symbol.source package org.jetbrains.kotlin.light.classes.symbol.source
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator 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 : abstract class AbstractSymbolLightClassesParentingForSourceTest :
AbstractSymbolLightClassesAnnotationOwnerTest( AbstractSymbolLightClassesParentingTest(
AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false), AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false),
EXTENSIONS.FIR_JAVA, EXTENSIONS.FIR_JAVA,
stopIfCompilationErrorDirectivePresent = false stopIfCompilationErrorDirectivePresent = false
@@ -18,7 +18,7 @@ import java.util.regex.Pattern;
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("compiler/testData/asJava/lightClasses") @TestMetadata("compiler/testData/asJava/lightClasses")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
public class SymbolLightClassesAnnotationOwnerForSourceTestGenerated extends AbstractSymbolLightClassesAnnotationOwnerForSourceTest { public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractSymbolLightClassesParentingForSourceTest {
@Test @Test
public void testAllFilesPresentInLightClasses() throws Exception { public void testAllFilesPresentInLightClasses() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true); KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/lightClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
@@ -7,11 +7,11 @@ package org.jetbrains.kotlin.generators.tests.analysis.api
import org.jetbrains.kotlin.generators.TestGroupSuite import org.jetbrains.kotlin.generators.TestGroupSuite
import org.jetbrains.kotlin.generators.util.TestGeneratorUtil 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.AbstractSymbolLightClassesFacadeForLibraryTest
import org.jetbrains.kotlin.light.classes.symbol.decompiled.AbstractSymbolLightClassesForLibraryTest 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.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.AbstractSymbolLightClassesFacadeForSourceTest
import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesForSourceTest import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesForSourceTest
import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesLoadingForSourceTest import org.jetbrains.kotlin.light.classes.symbol.source.AbstractSymbolLightClassesLoadingForSourceTest
@@ -37,14 +37,14 @@ internal fun TestGroupSuite.generateSymbolLightClassesTests() {
) )
} }
testClass<AbstractSymbolLightClassesAnnotationOwnerForSourceTest> { testClass<AbstractSymbolLightClassesParentingForSourceTest> {
model( model(
"asJava/lightClasses", "asJava/lightClasses",
pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME
) )
} }
testClass<AbstractSymbolLightClassesAnnotationOwnerForLibraryTest> { testClass<AbstractSymbolLightClassesParentingForLibraryTest> {
model( model(
"asJava/lightClasses", "asJava/lightClasses",
excludeDirs = listOf("compilationErrors"), excludeDirs = listOf("compilationErrors"),