[AA] Add implementation for annotationApplicableTargets.

Adds implementation and tests for the new
KtClassOrObjectSymbol.annotationApplicableTargets property on
KtSymbolInfoProvider. This implementation delegates to the canonical
implementation in AnnotationChecker for FE1.0, and to the implementation
in FirAnnotationHelpers for FIR.

This change also includes direct tests for annotationApplicableTargets,
and a fix for FirClassLikeSymbol.getAllowedAnnotationTargets in
FirAnnotationHelpers.
This commit is contained in:
Justin Paupore
2023-01-17 20:39:24 -08:00
committed by Ilya Kirillov
parent 3e80433356
commit eccbc66581
26 changed files with 470 additions and 15 deletions
@@ -0,0 +1,40 @@
/*
* Copyright 2010-2023 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.components.symbolInfoProvider
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
abstract class AbstractAnnotationApplicableTargetsTest : AbstractAnalysisApiSingleFileTest() {
override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
val annotationEntry = testServices.expressionMarkerProvider.getElementOfTypeAtCaret<KtAnnotationEntry>(ktFile)
val actual = analyseForTest(annotationEntry) {
val annotationClassSymbol = annotationEntry.typeReference?.getKtType()?.expandedClassSymbol!!
val applicableTargetsInOrder =
annotationClassSymbol.annotationApplicableTargets
?.map { it.name }
?.sorted()
?.joinToString(prefix = "[", separator = ", ", postfix = "]")
?: "<null>"
buildString {
appendLine("KtAnnotationEntry: ${annotationEntry.text}")
appendLine()
appendLine("Resolved annotation symbol:")
appendLine(annotationClassSymbol.render())
appendLine()
appendLine("Applicable targets: $applicableTargetsInOrder")
}
}
testServices.assertions.assertEqualsToTestDataFileSibling(actual)
}
}