[AA] Add support for printing meta-annotations in annotation tests.
This functionality will be used in follow-on commits.
This commit is contained in:
committed by
Yan Zhulanow
parent
a90983ca6a
commit
686551d1eb
+6
-1
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.annotations
|
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.annotations
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
|
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest
|
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
|
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
|
||||||
@@ -16,6 +18,9 @@ import org.jetbrains.kotlin.test.services.assertions
|
|||||||
|
|
||||||
abstract class AbstractAnalysisApiAnnotationsOnDeclarationsTest : AbstractAnalysisApiSingleFileTest() {
|
abstract class AbstractAnalysisApiAnnotationsOnDeclarationsTest : AbstractAnalysisApiSingleFileTest() {
|
||||||
|
|
||||||
|
context(KtAnalysisSession)
|
||||||
|
open fun renderAnnotations(annotations: KtAnnotationsList): String = TestAnnotationRenderer.renderAnnotations(annotations)
|
||||||
|
|
||||||
override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
|
override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
|
||||||
val ktDeclaration = testServices.expressionMarkerProvider
|
val ktDeclaration = testServices.expressionMarkerProvider
|
||||||
.getElementOfTypeAtCaret<KtDeclaration>(ktFile)
|
.getElementOfTypeAtCaret<KtDeclaration>(ktFile)
|
||||||
@@ -23,7 +28,7 @@ abstract class AbstractAnalysisApiAnnotationsOnDeclarationsTest : AbstractAnalys
|
|||||||
val declarationSymbol = ktDeclaration.getSymbol() as KtAnnotatedSymbol
|
val declarationSymbol = ktDeclaration.getSymbol() as KtAnnotatedSymbol
|
||||||
buildString {
|
buildString {
|
||||||
appendLine("KtDeclaration: ${ktDeclaration::class.simpleName} ${ktDeclaration.name}")
|
appendLine("KtDeclaration: ${ktDeclaration::class.simpleName} ${ktDeclaration.name}")
|
||||||
append(TestAnnotationRenderer.renderAnnotations(declarationSymbol.annotationsList))
|
append(renderAnnotations(declarationSymbol.annotationsList))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.annotations
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
|
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||||
|
|
||||||
|
abstract class AbstractAnalysisApiAnnotationsOnDeclarationsWithMetaTest : AbstractAnalysisApiAnnotationsOnDeclarationsTest() {
|
||||||
|
context(KtAnalysisSession)
|
||||||
|
override fun renderAnnotations(annotations: KtAnnotationsList) = TestAnnotationRenderer.renderAnnotationsWithMeta(annotations)
|
||||||
|
}
|
||||||
+32
-3
@@ -9,14 +9,43 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
|||||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
|
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.utils.indented
|
import org.jetbrains.kotlin.analysis.test.framework.utils.indented
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|
||||||
object TestAnnotationRenderer {
|
object TestAnnotationRenderer {
|
||||||
context (KtAnalysisSession)
|
context (KtAnalysisSession)
|
||||||
fun renderAnnotations(annotations: KtAnnotationsList) = buildString {
|
fun renderAnnotations(annotations: KtAnnotationsList) = buildString {
|
||||||
appendLine("annotations: [")
|
renderAnnotationsRecursive(annotations, currentMetaAnnotations = null, indent = 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
context(KtAnalysisSession)
|
||||||
|
fun renderAnnotationsWithMeta(annotations: KtAnnotationsList) = buildString {
|
||||||
|
renderAnnotationsRecursive(annotations, currentMetaAnnotations = setOf(), indent = 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
context(KtAnalysisSession)
|
||||||
|
private fun StringBuilder.renderAnnotationsRecursive(
|
||||||
|
annotations: KtAnnotationsList,
|
||||||
|
currentMetaAnnotations: Set<ClassId>?,
|
||||||
|
indent: Int
|
||||||
|
) {
|
||||||
|
appendLine("annotations: [".indented(indent))
|
||||||
for (annotation in annotations.annotations) {
|
for (annotation in annotations.annotations) {
|
||||||
appendLine(DebugSymbolRenderer().renderAnnotationApplication(annotation).indented(indent = 2))
|
appendLine(DebugSymbolRenderer().renderAnnotationApplication(annotation).indented(indent = indent + 2))
|
||||||
|
if (currentMetaAnnotations != null) {
|
||||||
|
val classId = annotation.classId ?: continue
|
||||||
|
if (classId in currentMetaAnnotations) {
|
||||||
|
appendLine("<recursive meta-annotation ${classId}>".indented(indent + 4))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
val metaAnnotations = getClassOrObjectSymbolByClassId(classId)?.annotationsList
|
||||||
|
if (metaAnnotations != null) {
|
||||||
|
renderAnnotationsRecursive(metaAnnotations, currentMetaAnnotations + classId, indent = indent + 4)
|
||||||
|
} else {
|
||||||
|
appendLine("<unknown meta-annotation ${classId}>".indented(indent + 4))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
appendLine("]")
|
appendLine("]".indented(indent))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user