[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.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<PsiModifierListOwner>()
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
@@ -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
@@ -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");
@@ -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
@@ -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);
@@ -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<AbstractSymbolLightClassesAnnotationOwnerForSourceTest> {
testClass<AbstractSymbolLightClassesParentingForSourceTest> {
model(
"asJava/lightClasses",
pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME
)
}
testClass<AbstractSymbolLightClassesAnnotationOwnerForLibraryTest> {
testClass<AbstractSymbolLightClassesParentingForLibraryTest> {
model(
"asJava/lightClasses",
excludeDirs = listOf("compilationErrors"),