diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsTest.kt index c15f56d3028..fa4a084f2f0 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsTest.kt @@ -5,6 +5,8 @@ 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.test.framework.base.AbstractAnalysisApiSingleFileTest import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider @@ -16,6 +18,9 @@ import org.jetbrains.kotlin.test.services.assertions abstract class AbstractAnalysisApiAnnotationsOnDeclarationsTest : AbstractAnalysisApiSingleFileTest() { + context(KtAnalysisSession) + open fun renderAnnotations(annotations: KtAnnotationsList): String = TestAnnotationRenderer.renderAnnotations(annotations) + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { val ktDeclaration = testServices.expressionMarkerProvider .getElementOfTypeAtCaret(ktFile) @@ -23,7 +28,7 @@ abstract class AbstractAnalysisApiAnnotationsOnDeclarationsTest : AbstractAnalys val declarationSymbol = ktDeclaration.getSymbol() as KtAnnotatedSymbol buildString { appendLine("KtDeclaration: ${ktDeclaration::class.simpleName} ${ktDeclaration.name}") - append(TestAnnotationRenderer.renderAnnotations(declarationSymbol.annotationsList)) + append(renderAnnotations(declarationSymbol.annotationsList)) } } diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsWithMetaTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsWithMetaTest.kt new file mode 100644 index 00000000000..16d65801004 --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/AbstractAnalysisApiAnnotationsOnDeclarationsWithMetaTest.kt @@ -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) +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/TestAnnotationRenderer.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/TestAnnotationRenderer.kt index 3db047ce2a4..dd5be73e105 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/TestAnnotationRenderer.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/annotations/TestAnnotationRenderer.kt @@ -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.symbols.DebugSymbolRenderer import org.jetbrains.kotlin.analysis.test.framework.utils.indented +import org.jetbrains.kotlin.name.ClassId object TestAnnotationRenderer { context (KtAnalysisSession) 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?, + indent: Int + ) { + appendLine("annotations: [".indented(indent)) 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("".indented(indent + 4)) + continue + } + + val metaAnnotations = getClassOrObjectSymbolByClassId(classId)?.annotationsList + if (metaAnnotations != null) { + renderAnnotationsRecursive(metaAnnotations, currentMetaAnnotations + classId, indent = indent + 4) + } else { + appendLine("".indented(indent + 4)) + } + } } - appendLine("]") + appendLine("]".indented(indent)) } } \ No newline at end of file