From d13ad454da17333454886fd5b8e8686d29e51864 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 26 Jan 2023 13:36:00 +0100 Subject: [PATCH] [AA FIR] fix nested type annotations lazy resolve ^KT-56046 --- ...ourceModuleSingleSymbolByPsiGenerated.java | 12 + .../annotations/KtFirAnnotationListForType.kt | 6 +- ...ourceModuleSingleSymbolByPsiGenerated.java | 12 + ...ourceModuleSingleSymbolByPsiGenerated.java | 12 + ...tationWithTypeAlias.descriptors.pretty.txt | 1 + ...ypeAnnotationWithTypeAlias.descriptors.txt | 46 ++++ .../nestedTypeAnnotationWithTypeAlias.kt | 17 ++ ...stedTypeAnnotationWithTypeAlias.pretty.txt | 1 + .../nestedTypeAnnotationWithTypeAlias.txt | 46 ++++ ...nWithTypeAliasAsAnnotation.descriptors.txt | 51 ++++ ...TypeAnnotationWithTypeAliasAsAnnotation.kt | 14 + ...tationWithTypeAliasAsAnnotation.pretty.txt | 1 + ...ypeAnnotationWithTypeAliasAsAnnotation.txt | 51 ++++ .../typeAnnotations.descriptors.txt | 259 ++++++++++++++++++ .../symbols/symbolByPsi/typeAnnotations.kt | 7 +- .../symbolByPsi/typeAnnotations.pretty.txt | 9 + .../symbols/symbolByPsi/typeAnnotations.txt | 259 ++++++++++++++++++ .../kotlin/fir/symbols/FirBasedSymbol.kt | 38 ++- 18 files changed, 830 insertions(+), 12 deletions(-) create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.txt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java index fed01d8502d..2ec1d4053aa 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java @@ -76,6 +76,18 @@ public class Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt"); } + @Test + @TestMetadata("nestedTypeAnnotationWithTypeAlias.kt") + public void testNestedTypeAnnotationWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt"); + } + + @Test + @TestMetadata("nestedTypeAnnotationWithTypeAliasAsAnnotation.kt") + public void testNestedTypeAnnotationWithTypeAliasAsAnnotation() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt"); + } + @Test @TestMetadata("propertyWithAnnotations.kt") public void testPropertyWithAnnotations() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt index 7689b04ce12..65179628693 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt @@ -17,6 +17,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.hasAnnotation import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.symbols.resolvedAnnotationsWithArguments +import org.jetbrains.kotlin.fir.symbols.resolvedAnnotationsWithClassIds import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.custom import org.jetbrains.kotlin.fir.types.customAnnotations @@ -82,8 +84,8 @@ private fun ConeKotlinType.customAnnotationsWithLazyResolve(phase: FirResolvePha for (containerSymbol in custom.containerSymbols) { when (phase) { - FirResolvePhase.TYPES -> containerSymbol.resolvedAnnotationsWithClassIds - FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING -> containerSymbol.resolvedAnnotationsWithArguments + FirResolvePhase.TYPES -> annotations.resolvedAnnotationsWithClassIds(containerSymbol) + FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING -> annotations.resolvedAnnotationsWithArguments(containerSymbol) else -> {} } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java index 3710ca6415b..78fb307ae8f 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java @@ -76,6 +76,18 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt"); } + @Test + @TestMetadata("nestedTypeAnnotationWithTypeAlias.kt") + public void testNestedTypeAnnotationWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt"); + } + + @Test + @TestMetadata("nestedTypeAnnotationWithTypeAliasAsAnnotation.kt") + public void testNestedTypeAnnotationWithTypeAliasAsAnnotation() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt"); + } + @Test @TestMetadata("propertyWithAnnotations.kt") public void testPropertyWithAnnotations() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java index ba83941b646..5cb2253017a 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java @@ -76,6 +76,18 @@ public class FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated e runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt"); } + @Test + @TestMetadata("nestedTypeAnnotationWithTypeAlias.kt") + public void testNestedTypeAnnotationWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt"); + } + + @Test + @TestMetadata("nestedTypeAnnotationWithTypeAliasAsAnnotation.kt") + public void testNestedTypeAnnotationWithTypeAliasAsAnnotation() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt"); + } + @Test @TestMetadata("propertyWithAnnotations.kt") public void testPropertyWithAnnotations() throws Exception { diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.pretty.txt new file mode 100644 index 00000000000..848cca17c17 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.pretty.txt @@ -0,0 +1 @@ +fun foo2(): kotlin.collections.List>? \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.txt new file mode 100644 index 00000000000..7e61c216d64 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.descriptors.txt @@ -0,0 +1,46 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo2 + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo2 + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/collections/List>? + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: kotlin/collections/List<@R|Anno3|() @R|Anno2|() @R|Anno1|(s = String(s)) @R|Anno3|() SecondTypeAlias> + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: @R|Anno3|() @R|Anno2|() @R|Anno1|(s = String(s)) @R|Anno3|() SecondTypeAlias + annotationsList: [ + Anno3() + psi: KtAnnotationEntry + Anno2() + psi: KtAnnotationEntry + Anno1(s = "s") + psi: KtAnnotationEntry + ] + ownTypeArguments: [] + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt new file mode 100644 index 00000000000..70692fbcf9d --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.kt @@ -0,0 +1,17 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 +// PRETTY_RENDERER_OPTION: FULLY_EXPANDED_TYPES + +@Target(AnnotationTarget.TYPE) +annotation class Anno1(val s: String) +@Target(AnnotationTarget.TYPE) +annotation class Anno2 +@Target(AnnotationTarget.TYPE) +annotation class Anno3 + +@Target(AnnotationTarget.TYPE) +annotation class BaseAnnotation + +typealias FirstTypeAlias = @Anno1("s") BaseAnnotation +typealias SecondTypeAlias = @Anno2 FirstTypeAlias + +fun foo2(): List>? = null diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.pretty.txt new file mode 100644 index 00000000000..291131f8636 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.pretty.txt @@ -0,0 +1 @@ +fun foo2(): kotlin.collections.List>? \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.txt new file mode 100644 index 00000000000..ec016e5d6fa --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAlias.txt @@ -0,0 +1,46 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo2 + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo2 + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/collections/List>? + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: kotlin/collections/List<@R|Anno3|() SecondTypeAlias> + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: @R|Anno1|(s = String(s)) @R|Anno2|() @R|Anno3|() BaseAnnotation + annotationsList: [ + Anno1(s = "s") + psi: KtAnnotationEntry + Anno2() + psi: KtAnnotationEntry + Anno3() + psi: KtAnnotationEntry + ] + ownTypeArguments: [] + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.descriptors.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.descriptors.txt new file mode 100644 index 00000000000..1c578d3e0e1 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.descriptors.txt @@ -0,0 +1,51 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo2 + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: true + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo2 + origin: SOURCE + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo2) + type: KtTypeParameterType: + type: T + annotationsList: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + returnType: KtUsualClassType: + type: kotlin/collections/List>? + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: kotlin/collections/List<@R|BaseAnnotation|() T> + annotationsList: [] + ownTypeArguments: [ + KtTypeParameterType: + type: @R|BaseAnnotation|() T + annotationsList: [ + BaseAnnotation() + psi: KtAnnotationEntry + ] + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt new file mode 100644 index 00000000000..edac5536f2c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.kt @@ -0,0 +1,14 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 +// PRETTY_RENDERER_OPTION: FULLY_EXPANDED_TYPES +@Target(AnnotationTarget.TYPE) +annotation class Anno1(val s: String) +@Target(AnnotationTarget.TYPE) +annotation class Anno2 + +@Target(AnnotationTarget.TYPE) +annotation class BaseAnnotation + +typealias FirstTypeAlias = @Anno1("s") BaseAnnotation +typealias SecondTypeAlias = @Anno2 FirstTypeAlias + +fun T.foo2(): List>? = null diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.pretty.txt new file mode 100644 index 00000000000..63d9693bf36 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.pretty.txt @@ -0,0 +1 @@ +fun T.foo2(): kotlin.collections.List>? diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.txt new file mode 100644 index 00000000000..0d9290dae99 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/nestedTypeAnnotationWithTypeAliasAsAnnotation.txt @@ -0,0 +1,51 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo2 + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: true + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo2 + origin: SOURCE + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo2) + type: KtTypeParameterType: + type: T + annotationsList: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + returnType: KtUsualClassType: + type: kotlin/collections/List>? + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: kotlin/collections/List<@R|SecondTypeAlias|() T> + annotationsList: [] + ownTypeArguments: [ + KtTypeParameterType: + type: @R|SecondTypeAlias|() T + annotationsList: [ + BaseAnnotation() + psi: KtAnnotationEntry + ] + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt index 3ae4a6f3a0f..8c3f9478782 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt @@ -118,6 +118,144 @@ KtNamedClassOrObjectSymbol: annotationApplicableTargets: [TYPE] deprecationStatus: null +KtConstructorSymbol: + annotationsList: [] + callableIdIfNonLocal: null + containingClassIdIfNonLocal: Anno5 + contextReceivers: [] + hasStableParameterNames: true + isExtension: false + isPrimary: true + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: Anno5 + annotationsList: [] + ownTypeArguments: [] + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /Anno5.s + contextReceivers: [] + getter: KtPropertyGetterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + hasBody: false + hasStableParameterNames: true + isDefault: true + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/String + annotationsList: [] + ownTypeArguments: [] + symbolKind: ACCESSOR + typeParameters: [] + valueParameters: [] + visibility: Public + getDispatchReceiver(): KtUsualClassType: + type: Anno5 + annotationsList: [] + ownTypeArguments: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + hasBackingField: true + hasGetter: true + hasSetter: false + initializer: null + isConst: false + isDelegatedProperty: false + isExtension: false + isFromPrimaryConstructor: false + isLateInit: false + isOverride: false + isStatic: false + isVal: true + modality: FINAL + name: s + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/String + annotationsList: [] + ownTypeArguments: [] + setter: null + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getDispatchReceiver(): KtUsualClassType: + type: Anno5 + annotationsList: [] + ownTypeArguments: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getS + javaSetterName: null + setterDeprecationStatus: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: s + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/String + annotationsList: [] + ownTypeArguments: [] + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtNamedClassOrObjectSymbol: + annotationsList: [ + kotlin/annotation/Target(allowedTargets = [kotlin.annotation.AnnotationTarget.TYPE]) + psi: KtAnnotationEntry + ] + classIdIfNonLocal: Anno5 + classKind: ANNOTATION_CLASS + companionObject: null + contextReceivers: [] + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: Anno5 + origin: SOURCE + superTypes: [ + KtUsualClassType: + type: kotlin/Annotation + annotationsList: [] + ownTypeArguments: [] + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + annotationApplicableTargets: [TYPE] + deprecationStatus: null + KtNamedClassOrObjectSymbol: annotationsList: [] classIdIfNonLocal: I @@ -312,4 +450,125 @@ KtNamedClassOrObjectSymbol: visibility: Public getContainingModule: KtSourceModule "Sources of main" annotationApplicableTargets: null + deprecationStatus: null + +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: true + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo) + type: KtTypeParameterType: + type: T + annotationsList: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + returnType: KtUsualClassType: + type: kotlin/collections/List<@R|Anno5|(s = String(1)) T>? + annotationsList: [] + ownTypeArguments: [ + KtTypeParameterType: + type: @R|Anno5|(s = String(1)) T + annotationsList: [ + Anno5(s = "1") + psi: KtAnnotationEntry + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo2 + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: true + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo2 + origin: SOURCE + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo2) + type: KtTypeParameterType: + type: T + annotationsList: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + returnType: KtUsualClassType: + type: kotlin/collections/List>? + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: kotlin/collections/List<@R|Anno5|(s = String(1)) T> + annotationsList: [] + ownTypeArguments: [ + KtTypeParameterType: + type: @R|Anno5|(s = String(1)) T + annotationsList: [ + Anno5(s = "1") + psi: KtAnnotationEntry + ] + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt index cfce5b21eb6..89e8aea60b7 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 @Target(AnnotationTarget.TYPE) annotation class Anno1 @Target(AnnotationTarget.TYPE) @@ -7,6 +7,8 @@ annotation class Anno2 annotation class Anno3 @Target(AnnotationTarget.TYPE) annotation class Anno4 +@Target(AnnotationTarget.TYPE) +annotation class Anno5(val s: String) interface I @@ -14,3 +16,6 @@ class X : @Anno1 I { fun f(arg: @Anno2 I): @Anno3 I = arg val x: @Anno4 I = this } + +fun T.foo(): List<@Anno5("1") T>? = null +fun T.foo2(): List>? = null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.pretty.txt index f3d045afe52..c00deb096cc 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.pretty.txt @@ -1,3 +1,7 @@ +fun T.foo(): kotlin.collections.List<@Anno5(s = "1") T>? + +fun T.foo2(): kotlin.collections.List>? + @kotlin.annotation.Target(allowedTargets = [kotlin.annotation.AnnotationTarget.TYPE]) annotation class Anno1 @@ -10,6 +14,11 @@ annotation class Anno3 @kotlin.annotation.Target(allowedTargets = [kotlin.annotation.AnnotationTarget.TYPE]) annotation class Anno4 +@kotlin.annotation.Target(allowedTargets = [kotlin.annotation.AnnotationTarget.TYPE]) +annotation class Anno5(s: kotlin.String) { + val s: kotlin.String +} + interface I class X : @Anno1 I { diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt index 6e165f736c2..a245ce15a7e 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt @@ -118,6 +118,144 @@ KtNamedClassOrObjectSymbol: annotationApplicableTargets: [TYPE] deprecationStatus: null +KtConstructorSymbol: + annotationsList: [] + callableIdIfNonLocal: null + containingClassIdIfNonLocal: Anno5 + contextReceivers: [] + hasStableParameterNames: true + isExtension: false + isPrimary: true + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: Anno5 + annotationsList: [] + ownTypeArguments: [] + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /Anno5.s + contextReceivers: [] + getter: KtPropertyGetterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + hasBody: false + hasStableParameterNames: true + isDefault: true + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/String + annotationsList: [] + ownTypeArguments: [] + symbolKind: ACCESSOR + typeParameters: [] + valueParameters: [] + visibility: Public + getDispatchReceiver(): KtUsualClassType: + type: Anno5 + annotationsList: [] + ownTypeArguments: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + hasBackingField: true + hasGetter: true + hasSetter: false + initializer: KtNonConstantInitializerValue(val s: String) + isConst: false + isDelegatedProperty: false + isExtension: false + isFromPrimaryConstructor: true + isLateInit: false + isOverride: false + isStatic: false + isVal: true + modality: FINAL + name: s + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/String + annotationsList: [] + ownTypeArguments: [] + setter: null + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getDispatchReceiver(): KtUsualClassType: + type: Anno5 + annotationsList: [] + ownTypeArguments: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getS + javaSetterName: null + setterDeprecationStatus: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: s + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + type: kotlin/String + annotationsList: [] + ownTypeArguments: [] + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtNamedClassOrObjectSymbol: + annotationsList: [ + kotlin/annotation/Target(allowedTargets = [kotlin.annotation.AnnotationTarget.TYPE]) + psi: KtAnnotationEntry + ] + classIdIfNonLocal: Anno5 + classKind: ANNOTATION_CLASS + companionObject: null + contextReceivers: [] + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: Anno5 + origin: SOURCE + superTypes: [ + KtUsualClassType: + type: kotlin/Annotation + annotationsList: [] + ownTypeArguments: [] + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + annotationApplicableTargets: [TYPE] + deprecationStatus: null + KtNamedClassOrObjectSymbol: annotationsList: [] classIdIfNonLocal: I @@ -308,4 +446,125 @@ KtNamedClassOrObjectSymbol: visibility: Public getContainingModule: KtSourceModule "Sources of main" annotationApplicableTargets: null + deprecationStatus: null + +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: true + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo) + type: KtTypeParameterType: + type: T + annotationsList: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + returnType: KtUsualClassType: + type: kotlin/collections/List<@R|Anno5|(s = String(1)) T>? + annotationsList: [] + ownTypeArguments: [ + KtTypeParameterType: + type: @R|Anno5|(s = String(1)) T + annotationsList: [ + Anno5(s = "1") + psi: KtAnnotationEntry + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo2 + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: true + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo2 + origin: SOURCE + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo2) + type: KtTypeParameterType: + type: T + annotationsList: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + returnType: KtUsualClassType: + type: kotlin/collections/List>? + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + type: kotlin/collections/List<@R|Anno5|(s = String(1)) T> + annotationsList: [] + ownTypeArguments: [ + KtTypeParameterType: + type: @R|Anno5|(s = String(1)) T + annotationsList: [ + Anno5(s = "1") + psi: KtAnnotationEntry + ] + ] + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt index 3329a4d62bc..5c978618d32 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt @@ -59,40 +59,60 @@ abstract class FirBasedSymbol { @SymbolInternals fun FirAnnotationContainer.resolvedCompilerRequiredAnnotations(anchorElement: FirBasedSymbol<*>): List { - if (annotations.isEmpty()) return emptyList() + return annotations.resolvedCompilerRequiredAnnotations(anchorElement) +} + +@SymbolInternals +fun List.resolvedCompilerRequiredAnnotations(anchorElement: FirBasedSymbol<*>): List { + if (isEmpty()) return emptyList() anchorElement.lazyResolveToPhase(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS) - return annotations + return this } @SymbolInternals fun FirAnnotationContainer.resolvedAnnotationsWithArguments(anchorElement: FirBasedSymbol<*>): List { - if (annotations.isEmpty()) return emptyList() + return annotations.resolvedAnnotationsWithArguments(anchorElement) +} - val phase = if (annotations.any { it is FirAnnotationCall && it.arguments.isNotEmpty() }) { +@SymbolInternals +fun List.resolvedAnnotationsWithArguments(anchorElement: FirBasedSymbol<*>): List { + if (isEmpty()) return emptyList() + + val phase = if (any { it is FirAnnotationCall && it.arguments.isNotEmpty() }) { FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING } else { FirResolvePhase.TYPES } anchorElement.lazyResolveToPhase(phase) - return annotations + return this } @SymbolInternals fun FirAnnotationContainer.resolvedAnnotationsWithClassIds(anchorElement: FirBasedSymbol<*>): List { - if (annotations.isEmpty()) return emptyList() + return annotations.resolvedAnnotationsWithClassIds(anchorElement) +} + +@SymbolInternals +fun List.resolvedAnnotationsWithClassIds(anchorElement: FirBasedSymbol<*>): List { + if (isEmpty()) return emptyList() anchorElement.lazyResolveToPhase(FirResolvePhase.TYPES) - return annotations + return this } @SymbolInternals fun FirAnnotationContainer.resolvedAnnotationClassIds(anchorElement: FirBasedSymbol<*>): List { - if (annotations.isEmpty()) return emptyList() + return annotations.resolvedAnnotationClassIds(anchorElement) +} + +@SymbolInternals +fun List.resolvedAnnotationClassIds(anchorElement: FirBasedSymbol<*>): List { + if (isEmpty()) return emptyList() anchorElement.lazyResolveToPhase(FirResolvePhase.TYPES) - return annotations.mapNotNull { (it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId } + return mapNotNull { (it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId } } @RequiresOptIn