From 95455c9870de26a7871b87c83e0ad5cc5bb8f2a0 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 22 Feb 2023 17:14:03 +0100 Subject: [PATCH] [DLC] add missing visitor methods Some of our light classes have no correct parent (KT-56882), so I temporarily disabled AbstractSymbolLightClassesParentingTestBase for such cases (previously decompiled light classes were not tested at all) ^KT-56613 ^KT-56882 --- ...tLightClassForDecompiledDeclarationBase.kt | 12 ++++++- ...tLightEnumClassForDecompiledDeclaration.kt | 10 +++++- ...tLightEnumEntryForDecompiledDeclaration.kt | 10 +++++- .../KtLightFieldForDecompiledDeclaration.kt | 10 +++++- .../KtLightMethodForDecompiledDeclaration.kt | 10 +++++- ...ractSymbolLightClassesParentingTestBase.kt | 35 ++++++++++++------- 6 files changed, 69 insertions(+), 18 deletions(-) diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledDeclarationBase.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledDeclarationBase.kt index 0714853d09b..caf69443ad2 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledDeclarationBase.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledDeclarationBase.kt @@ -5,8 +5,10 @@ package org.jetbrains.kotlin.analysis.decompiled.light.classes +import com.intellij.psi.JavaElementVisitor import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.asJava.classes.KtExtensibleLightClass import org.jetbrains.kotlin.asJava.elements.KtLightElementBase import org.jetbrains.kotlin.psi.KtClassOrObject @@ -15,4 +17,12 @@ abstract class KtLightClassForDecompiledDeclarationBase( val clsDelegate: PsiClass, clsParent: PsiElement, final override val kotlinOrigin: KtClassOrObject? -) : KtLightElementBase(clsParent), PsiClass, KtExtensibleLightClass \ No newline at end of file +) : KtLightElementBase(clsParent), PsiClass, KtExtensibleLightClass { + override fun accept(visitor: PsiElementVisitor) { + if (visitor is JavaElementVisitor) { + visitor.visitClass(this) + } else { + visitor.visitElement(this) + } + } +} diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumClassForDecompiledDeclaration.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumClassForDecompiledDeclaration.kt index b29db756f2d..904e5e86f6c 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumClassForDecompiledDeclaration.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumClassForDecompiledDeclaration.kt @@ -34,4 +34,12 @@ internal class KtLightEnumClassForDecompiledDeclaration( override fun equals(other: Any?): Boolean = this === other || other is KtLightEnumClassForDecompiledDeclaration && super.equals(other) override fun hashCode(): Int = super.hashCode() -} \ No newline at end of file + + override fun accept(visitor: PsiElementVisitor) { + if (visitor is JavaElementVisitor) { + visitor.visitEnumConstantInitializer(this) + } else { + visitor.visitElement(this) + } + } +} diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumEntryForDecompiledDeclaration.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumEntryForDecompiledDeclaration.kt index 48ea919fb9f..d0cefe2f150 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumEntryForDecompiledDeclaration.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightEnumEntryForDecompiledDeclaration.kt @@ -44,4 +44,12 @@ internal class KtLightEnumEntryForDecompiledDeclaration( fldDelegate == other.fldDelegate override fun hashCode(): Int = super.hashCode() -} \ No newline at end of file + + override fun accept(visitor: PsiElementVisitor) { + if (visitor is JavaElementVisitor) { + visitor.visitEnumConstant(this) + } else { + visitor.visitElement(this) + } + } +} diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightFieldForDecompiledDeclaration.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightFieldForDecompiledDeclaration.kt index 60a70501ff8..871b7888c0a 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightFieldForDecompiledDeclaration.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightFieldForDecompiledDeclaration.kt @@ -77,4 +77,12 @@ open class KtLightFieldForDecompiledDeclaration( another is KtLightFieldForDecompiledDeclaration && fldDelegate.isEquivalentTo(another.fldDelegate) || fldDelegate.isEquivalentTo(another) } -} \ No newline at end of file + + override fun accept(visitor: PsiElementVisitor) { + if (visitor is JavaElementVisitor) { + visitor.visitField(this) + } else { + visitor.visitElement(this) + } + } +} diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightMethodForDecompiledDeclaration.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightMethodForDecompiledDeclaration.kt index 3aff0252f60..0673036a3b4 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightMethodForDecompiledDeclaration.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightMethodForDecompiledDeclaration.kt @@ -109,10 +109,18 @@ class KtLightMethodForDecompiledDeclaration( another is KtLightMethodForDecompiledDeclaration && funDelegate.isEquivalentTo(another.funDelegate) || funDelegate.isEquivalentTo(another) } + + override fun accept(visitor: PsiElementVisitor) { + if (visitor is JavaElementVisitor) { + visitor.visitMethod(this) + } else { + visitor.visitElement(this) + } + } } private fun KtLightMethod.checkIsMangled(): Boolean { val demangledName = demangleInternalName(name) ?: return false val originalName = propertyNameByAccessor(demangledName, this) ?: demangledName return originalName == kotlinOrigin?.name -} \ No newline at end of file +} diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt index b4fe6abd584..f1c91c2136c 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesParentingTestBase.kt @@ -40,15 +40,20 @@ open class AbstractSymbolLightClassesParentingTestBase( protected fun createLightElementsVisitor(directives: RegisteredDirectives, assertions: AssertionsService): JavaElementVisitor { Assume.assumeFalse("The test is not supported", Directives.IGNORE_PARENTING_CHECK in directives) + // drop after KT-56882 + val ignoreDecompiledClasses = stopIfCompilationErrorDirectivePresent return object : JavaElementVisitor() { private val declarationStack = ArrayDeque() private fun checkParentAndVisitChildren( declaration: T?, + notCheckItself: Boolean = false, action: T.(visitor: JavaElementVisitor) -> Unit = {}, ) { if (declaration == null) return - checkDeclarationParent(declaration) + if (!notCheckItself) { + checkDeclarationParent(declaration) + } declarationStack.addLast(declaration) try { @@ -72,19 +77,19 @@ open class AbstractSymbolLightClassesParentingTestBase( } override fun visitModifierList(list: PsiModifierList?) { - checkParentAndVisitChildren(list) { visitor -> + checkParentAndVisitChildren(list, notCheckItself = ignoreDecompiledClasses) { visitor -> annotations.forEach { it.accept(visitor) } } } override fun visitParameterList(list: PsiParameterList?) { - checkParentAndVisitChildren(list) { visitor -> + checkParentAndVisitChildren(list, notCheckItself = ignoreDecompiledClasses) { visitor -> parameters.forEach { it.accept(visitor) } } } override fun visitTypeParameterList(list: PsiTypeParameterList?) { - checkParentAndVisitChildren(list) { visitor -> + checkParentAndVisitChildren(list, notCheckItself = ignoreDecompiledClasses) { visitor -> typeParameters.forEach { it.accept(visitor) } } } @@ -108,6 +113,8 @@ open class AbstractSymbolLightClassesParentingTestBase( } override fun visitMethod(method: PsiMethod?) { + if (method is SyntheticElement) return + checkParentAndVisitChildren(method) { visitor -> annotations.forEach { it.accept(visitor) } @@ -150,17 +157,19 @@ open class AbstractSymbolLightClassesParentingTestBase( (lastDeclaration as PsiModifierList).parent } as PsiModifierListOwner - when (psiModifierListOwner) { - is PsiClass, - is PsiParameter -> - assertions.assertTrue(owner is SymbolLightClassModifierList<*>) + if (!ignoreDecompiledClasses) { + when (psiModifierListOwner) { + is PsiClass, + is PsiParameter -> + assertions.assertTrue(owner is SymbolLightClassModifierList<*>) - is PsiField, - is PsiMethod -> - assertions.assertTrue(owner is SymbolLightMemberModifierList<*>) + is PsiField, + is PsiMethod -> + assertions.assertTrue(owner is SymbolLightMemberModifierList<*>) - else -> - throw IllegalStateException("Unexpected annotation owner kind: ${lastDeclaration::class.java}") + else -> + throw IllegalStateException("Unexpected annotation owner kind: ${lastDeclaration::class.java}") + } } val modifierList = psiModifierListOwner.modifierList!!