[SLC] Fix nested classes missing in SLC structure tests for libraries
^KT-62038 fixed
This commit is contained in:
committed by
Space Team
parent
315573d99f
commit
cd8143af7b
@@ -0,0 +1,145 @@
|
|||||||
|
B.class:
|
||||||
|
KtClass:
|
||||||
|
line: 5
|
||||||
|
name: NestedInB
|
||||||
|
qualifier: B.NestedInB
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: NestedInB
|
||||||
|
qualifier: B.NestedInB
|
||||||
|
superTypes: [
|
||||||
|
PsiType:NestedInNestedInA
|
||||||
|
]
|
||||||
|
superClass: KtLightClassForDecompiledDeclaration: NestedInNestedInA (A.NestedInA.NestedInNestedInA)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
KtLightClassForDecompiledDeclaration: NestedInNestedInA (A.NestedInA.NestedInNestedInA)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 8
|
||||||
|
name: InnerInB
|
||||||
|
qualifier: B.InnerInB
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: InnerInB
|
||||||
|
qualifier: B.InnerInB
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 4
|
||||||
|
name: B
|
||||||
|
qualifier: B
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: B
|
||||||
|
qualifier: B
|
||||||
|
superTypes: [
|
||||||
|
PsiType:A
|
||||||
|
]
|
||||||
|
superClass: KtLightClassForDecompiledDeclaration: A (A)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
KtLightClassForDecompiledDeclaration: A (A)
|
||||||
|
]
|
||||||
|
|
||||||
|
A.class:
|
||||||
|
KtClass:
|
||||||
|
line: 6
|
||||||
|
name: NestedInNestedInA
|
||||||
|
qualifier: A.NestedInA.NestedInNestedInA
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: NestedInNestedInA
|
||||||
|
qualifier: A.NestedInA.NestedInNestedInA
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 9
|
||||||
|
name: InnerInNestedInA
|
||||||
|
qualifier: A.NestedInA.InnerInNestedInA
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: InnerInNestedInA
|
||||||
|
qualifier: A.NestedInA.InnerInNestedInA
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 5
|
||||||
|
name: NestedInA
|
||||||
|
qualifier: A.NestedInA
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: NestedInA
|
||||||
|
qualifier: A.NestedInA
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 14
|
||||||
|
name: InnerInInnerInA
|
||||||
|
qualifier: A.InnerInA.InnerInInnerInA
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: InnerInInnerInA
|
||||||
|
qualifier: A.InnerInA.InnerInInnerInA
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 13
|
||||||
|
name: InnerInA
|
||||||
|
qualifier: A.InnerInA
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: InnerInA
|
||||||
|
qualifier: A.InnerInA
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
|
|
||||||
|
KtClass:
|
||||||
|
line: 4
|
||||||
|
name: A
|
||||||
|
qualifier: A
|
||||||
|
light: KtLightClassForDecompiledDeclaration
|
||||||
|
name: A
|
||||||
|
qualifier: A
|
||||||
|
superTypes: [
|
||||||
|
PsiType:Object
|
||||||
|
]
|
||||||
|
superClass: ClsClassImpl: Object (java.lang.Object)
|
||||||
|
interfaces: []
|
||||||
|
supers: [
|
||||||
|
ClsClassImpl: Object (java.lang.Object)
|
||||||
|
]
|
||||||
+25
-16
@@ -12,7 +12,6 @@ import com.intellij.psi.search.GlobalSearchScope
|
|||||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
|
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter
|
import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtEnumEntry
|
import org.jetbrains.kotlin.psi.KtEnumEntry
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
@@ -101,24 +100,14 @@ open class AbstractSymbolLightClassesStructureTestBase(
|
|||||||
}.toSet()
|
}.toSet()
|
||||||
|
|
||||||
private fun wrongInheritorStructure(line: String): Nothing = error("Can't parse '$line' line correctly")
|
private fun wrongInheritorStructure(line: String): Nothing = error("Can't parse '$line' line correctly")
|
||||||
|
|
||||||
protected fun PrettyPrinter.handleFile(ktFile: KtFile) {
|
protected fun PrettyPrinter.handleFile(ktFile: KtFile) {
|
||||||
val text = ktFile.text
|
val text = ktFile.text
|
||||||
if (ktFile.isCompiled) {
|
if (ktFile.isCompiled) {
|
||||||
ktFile.declarations.forEach { classOrObject ->
|
// A compiled file for a class should only contain a single class declaration. `*Kt.class` files on the other hand may contain
|
||||||
if (classOrObject is KtClassOrObject) {
|
// top-level callables and need to be skipped.
|
||||||
if (classOrObject is KtClass && classOrObject.isEnum()) {
|
val classOrObject = ktFile.declarations.singleOrNull() as? KtClassOrObject ?: return
|
||||||
classOrObject.declarations.forEach { declaration ->
|
handleCompiledClassDeclaration(classOrObject, text)
|
||||||
if (declaration is KtEnumEntry) {
|
|
||||||
handleClassDeclaration(declaration, text)
|
|
||||||
appendLine()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleClassDeclaration(classOrObject, text)
|
|
||||||
appendLine()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ktFile.forEachDescendantOfType<KtClassOrObject> { classOrObject ->
|
ktFile.forEachDescendantOfType<KtClassOrObject> { classOrObject ->
|
||||||
handleClassDeclaration(classOrObject, text)
|
handleClassDeclaration(classOrObject, text)
|
||||||
@@ -127,6 +116,26 @@ open class AbstractSymbolLightClassesStructureTestBase(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [handleCompiledClassDeclaration] uses a custom traversal instead of [forEachDescendantOfType] because trying to access the PSI of
|
||||||
|
* compiled code in this test results in exceptions. Hence, we have to traverse nested classes and enum entries manually.
|
||||||
|
*/
|
||||||
|
private fun PrettyPrinter.handleCompiledClassDeclaration(classOrObject: KtClassOrObject, text: String) {
|
||||||
|
classOrObject.declarations.forEach { declaration ->
|
||||||
|
when (declaration) {
|
||||||
|
is KtEnumEntry -> {
|
||||||
|
// We don't call `handleCompiledClassDeclaration` to avoid printing class declarations inside enum entry initializers.
|
||||||
|
handleClassDeclaration(declaration, text)
|
||||||
|
appendLine()
|
||||||
|
}
|
||||||
|
is KtClassOrObject -> handleCompiledClassDeclaration(declaration, text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleClassDeclaration(classOrObject, text)
|
||||||
|
appendLine()
|
||||||
|
}
|
||||||
|
|
||||||
private fun PrettyPrinter.handleClassDeclaration(declaration: KtClassOrObject, fileText: String) {
|
private fun PrettyPrinter.handleClassDeclaration(declaration: KtClassOrObject, fileText: String) {
|
||||||
appendLine("${declaration::class.simpleName}:")
|
appendLine("${declaration::class.simpleName}:")
|
||||||
withIndent {
|
withIndent {
|
||||||
|
|||||||
Reference in New Issue
Block a user