[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
@@ -13,14 +13,15 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.resolve.AnnotationChecker
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
@@ -132,4 +133,11 @@ internal class KtFe10SymbolInfoProvider(
val ktPropertyName = (symbol.psi as? KtProperty)?.takeIf { it.isVar }?.name ?: return SpecialNames.NO_NAME_PROVIDED val ktPropertyName = (symbol.psi as? KtProperty)?.takeIf { it.isVar }?.name ?: return SpecialNames.NO_NAME_PROVIDED
return Name.identifier(JvmAbi.setterName(ktPropertyName)) return Name.identifier(JvmAbi.setterName(ktPropertyName))
} }
override fun getAnnotationApplicableTargets(symbol: KtClassOrObjectSymbol): Set<KotlinTarget>? {
val descriptor = getSymbolDescriptor(symbol) as? ClassDescriptor ?: return null
if (descriptor.kind != ClassKind.ANNOTATION_CLASS) return null
return AnnotationChecker.applicableTargetSet(descriptor)
}
} }
@@ -0,0 +1,78 @@
/*
* 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.fe10.test.cases.generated.cases.components.symbolInfoProvider;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolInfoProvider.AbstractAnnotationApplicableTargetsTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets")
@TestDataPath("$PROJECT_ROOT")
public class Fe10IdeNormalAnalysisSourceModuleAnnotationApplicableTargetsTestGenerated extends AbstractAnnotationApplicableTargetsTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fe10,
TestModuleKind.Source,
AnalysisSessionMode.Normal,
AnalysisApiMode.Ide
)
);
}
@Test
public void testAllFilesPresentInAnnotationApplicableTargets() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("defaultTargets.kt")
public void testDefaultTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/defaultTargets.kt");
}
@Test
@TestMetadata("emptyTargets.kt")
public void testEmptyTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/emptyTargets.kt");
}
@Test
@TestMetadata("javaAnnotation.kt")
public void testJavaAnnotation() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/javaAnnotation.kt");
}
@Test
@TestMetadata("listedTargets.kt")
public void testListedTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/listedTargets.kt");
}
@Test
@TestMetadata("nonAnnotationClass.kt")
public void testNonAnnotationClass() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/nonAnnotationClass.kt");
}
}
@@ -7,16 +7,20 @@ package org.jetbrains.kotlin.analysis.api.fir.components
import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProvider import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProvider
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.symbols.*
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirPackageSymbol
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSyntheticJavaPropertySymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSyntheticJavaPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.fir.analysis.checkers.getAllowedAnnotationTargets
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite
import org.jetbrains.kotlin.fir.declarations.getJvmNameFromAnnotation import org.jetbrains.kotlin.fir.declarations.getJvmNameFromAnnotation
@@ -94,6 +98,13 @@ internal class KtFirSymbolInfoProvider(
return getJvmName(firProperty, isSetter = true) return getJvmName(firProperty, isSetter = true)
} }
override fun getAnnotationApplicableTargets(symbol: KtClassOrObjectSymbol): Set<KotlinTarget>? {
requireIsInstance<KtFirSymbol<*>>(symbol)
if (symbol !is KtFirNamedClassOrObjectSymbol) return null
if (symbol.firSymbol.classKind != ClassKind.ANNOTATION_CLASS) return null
return symbol.firSymbol.getAllowedAnnotationTargets(analysisSession.useSiteSession)
}
private fun getJvmName(property: FirProperty, isSetter: Boolean): Name { private fun getJvmName(property: FirProperty, isSetter: Boolean): Name {
if (property.hasAnnotation(StandardClassIds.Annotations.JvmField, analysisSession.useSiteSession)) return property.name if (property.hasAnnotation(StandardClassIds.Annotations.JvmField, analysisSession.useSiteSession)) return property.name
return Name.identifier(getJvmNameAsString(property, isSetter)) return Name.identifier(getJvmNameAsString(property, isSetter))
@@ -0,0 +1,78 @@
/*
* 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.fir.test.cases.generated.cases.components.symbolInfoProvider;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolInfoProvider.AbstractAnnotationApplicableTargetsTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets")
@TestDataPath("$PROJECT_ROOT")
public class FirIdeDependentAnalysisSourceModuleAnnotationApplicableTargetsTestGenerated extends AbstractAnnotationApplicableTargetsTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fir,
TestModuleKind.Source,
AnalysisSessionMode.Dependent,
AnalysisApiMode.Ide
)
);
}
@Test
public void testAllFilesPresentInAnnotationApplicableTargets() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("defaultTargets.kt")
public void testDefaultTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/defaultTargets.kt");
}
@Test
@TestMetadata("emptyTargets.kt")
public void testEmptyTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/emptyTargets.kt");
}
@Test
@TestMetadata("javaAnnotation.kt")
public void testJavaAnnotation() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/javaAnnotation.kt");
}
@Test
@TestMetadata("listedTargets.kt")
public void testListedTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/listedTargets.kt");
}
@Test
@TestMetadata("nonAnnotationClass.kt")
public void testNonAnnotationClass() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/nonAnnotationClass.kt");
}
}
@@ -0,0 +1,78 @@
/*
* 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.fir.test.cases.generated.cases.components.symbolInfoProvider;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolInfoProvider.AbstractAnnotationApplicableTargetsTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets")
@TestDataPath("$PROJECT_ROOT")
public class FirIdeNormalAnalysisSourceModuleAnnotationApplicableTargetsTestGenerated extends AbstractAnnotationApplicableTargetsTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fir,
TestModuleKind.Source,
AnalysisSessionMode.Normal,
AnalysisApiMode.Ide
)
);
}
@Test
public void testAllFilesPresentInAnnotationApplicableTargets() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("defaultTargets.kt")
public void testDefaultTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/defaultTargets.kt");
}
@Test
@TestMetadata("emptyTargets.kt")
public void testEmptyTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/emptyTargets.kt");
}
@Test
@TestMetadata("javaAnnotation.kt")
public void testJavaAnnotation() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/javaAnnotation.kt");
}
@Test
@TestMetadata("listedTargets.kt")
public void testListedTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/listedTargets.kt");
}
@Test
@TestMetadata("nonAnnotationClass.kt")
public void testNonAnnotationClass() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/nonAnnotationClass.kt");
}
}
@@ -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)
}
}
@@ -0,0 +1,78 @@
/*
* 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.standalone.fir.test.cases.generated.cases.components.symbolInfoProvider;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolInfoProvider.AbstractAnnotationApplicableTargetsTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets")
@TestDataPath("$PROJECT_ROOT")
public class FirStandaloneNormalAnalysisSourceModuleAnnotationApplicableTargetsTestGenerated extends AbstractAnnotationApplicableTargetsTest {
@NotNull
@Override
public AnalysisApiTestConfigurator getConfigurator() {
return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator(
new AnalysisApiTestConfiguratorFactoryData(
FrontendKind.Fir,
TestModuleKind.Source,
AnalysisSessionMode.Normal,
AnalysisApiMode.Standalone
)
);
}
@Test
public void testAllFilesPresentInAnnotationApplicableTargets() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("defaultTargets.kt")
public void testDefaultTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/defaultTargets.kt");
}
@Test
@TestMetadata("emptyTargets.kt")
public void testEmptyTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/emptyTargets.kt");
}
@Test
@TestMetadata("javaAnnotation.kt")
public void testJavaAnnotation() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/javaAnnotation.kt");
}
@Test
@TestMetadata("listedTargets.kt")
public void testListedTargets() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/listedTargets.kt");
}
@Test
@TestMetadata("nonAnnotationClass.kt")
public void testNonAnnotationClass() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolInfoProvider/annotationApplicableTargets/nonAnnotationClass.kt");
}
}
@@ -22,6 +22,8 @@ public abstract class KtSymbolInfoProvider : KtAnalysisSessionComponent() {
public abstract fun getJavaGetterName(symbol: KtPropertySymbol): Name public abstract fun getJavaGetterName(symbol: KtPropertySymbol): Name
public abstract fun getJavaSetterName(symbol: KtPropertySymbol): Name? public abstract fun getJavaSetterName(symbol: KtPropertySymbol): Name?
public abstract fun getAnnotationApplicableTargets(symbol: KtClassOrObjectSymbol): Set<KotlinTarget>?
} }
public interface KtSymbolInfoProviderMixIn : KtAnalysisSessionMixIn { public interface KtSymbolInfoProviderMixIn : KtAnalysisSessionMixIn {
@@ -66,5 +68,5 @@ public interface KtSymbolInfoProviderMixIn : KtAnalysisSessionMixIn {
/** Gets the set of applicable targets for an annotation class symbol. Returns `null` if the symbol is not an annotation class. */ /** Gets the set of applicable targets for an annotation class symbol. Returns `null` if the symbol is not an annotation class. */
public val KtClassOrObjectSymbol.annotationApplicableTargets: Set<KotlinTarget>? public val KtClassOrObjectSymbol.annotationApplicableTargets: Set<KotlinTarget>?
get() = withValidityAssertion { null /* TODO */ } get() = withValidityAssertion { analysisSession.symbolInfoProvider.getAnnotationApplicableTargets(this) }
} }
@@ -0,0 +1,3 @@
annotation class A()
@<caret>A object Foo
@@ -0,0 +1,6 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
annotation class A
Applicable targets: [ANNOTATION_CLASS, BACKING_FIELD, CLASS, CONSTRUCTOR, FIELD, FUNCTION, LOCAL_VARIABLE, PROPERTY, PROPERTY_GETTER, PROPERTY_SETTER, VALUE_PARAMETER]
@@ -0,0 +1,7 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
@kotlin.annotation.Target(allowedTargets = [])
annotation class A
Applicable targets: []
@@ -0,0 +1,4 @@
@Target()
annotation class A
@<caret>A object Foo
@@ -0,0 +1,7 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
@kotlin.annotation.Target
annotation class A
Applicable targets: []
@@ -0,0 +1,7 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
@kotlin.annotation.Target(allowedTargets = [kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER])
annotation class A
Applicable targets: [CLASS, FILE, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER]
@@ -0,0 +1,10 @@
// FILE: A.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface A {}
// FILE: Foo.kt
@<caret>A object Foo
@@ -0,0 +1,7 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
@kotlin.annotation.Target(allowedTargets = [kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FILE])
annotation class A
Applicable targets: [CLASS, FILE, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER]
@@ -0,0 +1,7 @@
import kotlin.annotation.AnnotationTarget
import kotlin.annotation.Target
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY)
annotation class A
@<caret>A object Foo
@@ -0,0 +1,7 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
@kotlin.annotation.Target(allowedTargets = [kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.PROPERTY])
annotation class A
Applicable targets: [CLASS, PROPERTY]
@@ -0,0 +1,3 @@
class A()
@<caret>A object Foo
@@ -0,0 +1,6 @@
KtAnnotationEntry: @A
Resolved annotation symbol:
class A
Applicable targets: <null>
@@ -180,7 +180,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [CLASS, ANNOTATION_CLASS, PROPERTY, FIELD, LOCAL_VARIABLE, VALUE_PARAMETER, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, BACKING_FIELD]
deprecationStatus: null deprecationStatus: null
KtFunctionSymbol: KtFunctionSymbol:
@@ -180,7 +180,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [CLASS, ANNOTATION_CLASS, PROPERTY, FIELD, LOCAL_VARIABLE, VALUE_PARAMETER, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, BACKING_FIELD]
deprecationStatus: null deprecationStatus: null
KtFunctionSymbol: KtFunctionSymbol:
@@ -22,7 +22,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -49,7 +49,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -76,7 +76,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -103,7 +103,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -22,7 +22,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -49,7 +49,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -76,7 +76,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -103,7 +103,7 @@ KtNamedClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
getContainingModule: KtSourceModule "Sources of main" getContainingModule: KtSourceModule "Sources of main"
annotationApplicableTargets: null annotationApplicableTargets: [TYPE]
deprecationStatus: null deprecationStatus: null
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
@@ -70,6 +70,7 @@ fun FirRegularClass.getAllowedAnnotationTargets(session: FirSession): Set<Kotlin
} }
fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(session: FirSession): Set<KotlinTarget> { fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(session: FirSession): Set<KotlinTarget> {
lazyResolveToPhase(FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING)
val targetAnnotation = getTargetAnnotation(session) ?: return defaultAnnotationTargets val targetAnnotation = getTargetAnnotation(session) ?: return defaultAnnotationTargets
val arguments = targetAnnotation.findArgumentByName(ParameterNames.targetAllowedTargets)?.unfoldArrayOrVararg().orEmpty() val arguments = targetAnnotation.findArgumentByName(ParameterNames.targetAllowedTargets)?.unfoldArrayOrVararg().orEmpty()
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.substut
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationOverridesProvider.AbstractIsSubclassOfTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationOverridesProvider.AbstractIsSubclassOfTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationOverridesProvider.AbstractOverriddenDeclarationProviderTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationOverridesProvider.AbstractOverriddenDeclarationProviderTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationRenderer.AbstractRendererTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationRenderer.AbstractRendererTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolInfoProvider.AbstractAnnotationApplicableTargetsTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeCreator.AbstractBuildClassTypeTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeCreator.AbstractBuildClassTypeTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeCreator.AbstractTypeParameterTypeTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeCreator.AbstractTypeParameterTypeTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeInfoProvider.AbstractFunctionClassKindTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeInfoProvider.AbstractFunctionClassKindTest
@@ -310,6 +311,12 @@ private fun AnalysisApiTestGroup.generateAnalysisApiComponentsTests() {
} }
} }
component("symbolInfoProvider") {
test(AbstractAnnotationApplicableTargetsTest::class) {
model("annotationApplicableTargets")
}
}
component("typeCreator") { component("typeCreator") {
test(AbstractTypeParameterTypeTest::class) { test(AbstractTypeParameterTypeTest::class) {
model("typeParameter") model("typeParameter")