diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeProvider/Fe10IdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeProvider/Fe10IdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java index 70212532ed3..792f17639a6 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeProvider/Fe10IdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeProvider/Fe10IdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java @@ -52,12 +52,30 @@ public class Fe10IdeNormalAnalysisSourceModuleTypeReferenceTestGenerated extends runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntry.kt"); } + @Test + @TestMetadata("annotationEntryBackingField.kt") + public void testAnnotationEntryBackingField() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt"); + } + + @Test + @TestMetadata("annotationEntryGetter.kt") + public void testAnnotationEntryGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt"); + } + @Test @TestMetadata("annotationEntryOnParameter.kt") public void testAnnotationEntryOnParameter() throws Exception { runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryOnParameter.kt"); } + @Test + @TestMetadata("annotationEntrySetter.kt") + public void testAnnotationEntrySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt"); + } + @Test @TestMetadata("annotationOnFunction.kt") public void testAnnotationOnFunction() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index 6dcb7a508c6..d4eb23e8b28 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfTypeSafe import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker @@ -30,11 +29,10 @@ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass -import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirGetClassCall -import org.jetbrains.kotlin.fir.realPsi +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.renderer.FirRenderer import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.toSymbol @@ -120,10 +118,18 @@ internal class KtFirTypeProvider( if (parent.receiverTypeReference === ktTypeReference) firCallable?.receiverParameter?.typeRef else firCallable?.returnTypeRef } parent is KtConstructorCalleeExpression && parent.parent is KtAnnotationEntry -> { - val firDeclaration = getFirDeclaration(parent.parent as KtAnnotationEntry, ktTypeReference) + fun FirMemberDeclaration.findAnnotationTypeRef(annotationEntry: KtAnnotationEntry) = annotations.find { + it.psi === annotationEntry + }?.annotationTypeRef + + val annotationEntry = parent.parent as KtAnnotationEntry + val firDeclaration = getFirDeclaration(annotationEntry, ktTypeReference) if (firDeclaration != null) { - firDeclaration.annotations.find { it.realPsi === parent.parent }?.annotationTypeRef - ?: (firDeclaration as? FirProperty)?.backingField?.annotations?.find { it.realPsi === parent.parent }?.annotationTypeRef + firDeclaration.findAnnotationTypeRef(annotationEntry) ?: (firDeclaration as? FirProperty)?.run { + backingField?.findAnnotationTypeRef(annotationEntry) + ?: getter?.findAnnotationTypeRef(annotationEntry) + ?: setter?.findAnnotationTypeRef(annotationEntry) + } } else { ktTypeReference.getOrBuildFir(firResolveSession) } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeDependentAnalysisSourceModuleTypeReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeDependentAnalysisSourceModuleTypeReferenceTestGenerated.java index ba1edb07ccc..0f57fd9b8cc 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeDependentAnalysisSourceModuleTypeReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeDependentAnalysisSourceModuleTypeReferenceTestGenerated.java @@ -52,12 +52,30 @@ public class FirIdeDependentAnalysisSourceModuleTypeReferenceTestGenerated exten runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntry.kt"); } + @Test + @TestMetadata("annotationEntryBackingField.kt") + public void testAnnotationEntryBackingField() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt"); + } + + @Test + @TestMetadata("annotationEntryGetter.kt") + public void testAnnotationEntryGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt"); + } + @Test @TestMetadata("annotationEntryOnParameter.kt") public void testAnnotationEntryOnParameter() throws Exception { runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryOnParameter.kt"); } + @Test + @TestMetadata("annotationEntrySetter.kt") + public void testAnnotationEntrySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt"); + } + @Test @TestMetadata("annotationOnFunction.kt") public void testAnnotationOnFunction() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java index 1c202bb6b46..c3c3fb3371d 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeProvider/FirIdeNormalAnalysisSourceModuleTypeReferenceTestGenerated.java @@ -52,12 +52,30 @@ public class FirIdeNormalAnalysisSourceModuleTypeReferenceTestGenerated extends runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntry.kt"); } + @Test + @TestMetadata("annotationEntryBackingField.kt") + public void testAnnotationEntryBackingField() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt"); + } + + @Test + @TestMetadata("annotationEntryGetter.kt") + public void testAnnotationEntryGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt"); + } + @Test @TestMetadata("annotationEntryOnParameter.kt") public void testAnnotationEntryOnParameter() throws Exception { runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryOnParameter.kt"); } + @Test + @TestMetadata("annotationEntrySetter.kt") + public void testAnnotationEntrySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt"); + } + @Test @TestMetadata("annotationOnFunction.kt") public void testAnnotationOnFunction() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeProvider/FirStandaloneNormalAnalysisSourceModuleTypeReferenceTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeProvider/FirStandaloneNormalAnalysisSourceModuleTypeReferenceTestGenerated.java index b523b8d7fe5..50f57c7c581 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeProvider/FirStandaloneNormalAnalysisSourceModuleTypeReferenceTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeProvider/FirStandaloneNormalAnalysisSourceModuleTypeReferenceTestGenerated.java @@ -52,12 +52,30 @@ public class FirStandaloneNormalAnalysisSourceModuleTypeReferenceTestGenerated e runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntry.kt"); } + @Test + @TestMetadata("annotationEntryBackingField.kt") + public void testAnnotationEntryBackingField() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt"); + } + + @Test + @TestMetadata("annotationEntryGetter.kt") + public void testAnnotationEntryGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt"); + } + @Test @TestMetadata("annotationEntryOnParameter.kt") public void testAnnotationEntryOnParameter() throws Exception { runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryOnParameter.kt"); } + @Test + @TestMetadata("annotationEntrySetter.kt") + public void testAnnotationEntrySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt"); + } + @Test @TestMetadata("annotationOnFunction.kt") public void testAnnotationOnFunction() throws Exception { diff --git a/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt new file mode 100644 index 00000000000..96559183c7f --- /dev/null +++ b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.kt @@ -0,0 +1,4 @@ +annotation class Anno + +@field:Anno +val x = 0 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.txt b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.txt new file mode 100644 index 00000000000..b7219d101aa --- /dev/null +++ b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryBackingField.txt @@ -0,0 +1,2 @@ +expression: Anno +ktType: Anno \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt new file mode 100644 index 00000000000..c56947e2e08 --- /dev/null +++ b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.kt @@ -0,0 +1,4 @@ +annotation class Anno + +@get:Anno +val x = 0 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.txt b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.txt new file mode 100644 index 00000000000..b7219d101aa --- /dev/null +++ b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntryGetter.txt @@ -0,0 +1,2 @@ +expression: Anno +ktType: Anno \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt new file mode 100644 index 00000000000..ebc5695e16a --- /dev/null +++ b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.kt @@ -0,0 +1,4 @@ +annotation class Anno + +@set:Anno +var x = 0 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.txt b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.txt new file mode 100644 index 00000000000..b7219d101aa --- /dev/null +++ b/analysis/analysis-api/testData/components/typeProvider/typeReference/annotationEntrySetter.txt @@ -0,0 +1,2 @@ +expression: Anno +ktType: Anno \ No newline at end of file