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 c5a6efaeb65..f59d94e40f2 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 @@ -106,6 +106,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt"); } + @Test + @TestMetadata("typeAnnotationsWithTypeAlias.kt") + public void testTypeAnnotationsWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts") @TestDataPath("$PROJECT_ROOT") 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 a6bf82d99a3..b72eb826ae5 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 @@ -81,6 +81,9 @@ private fun ConeKotlinType.customAnnotationsWithLazyResolve(phase: FirResolvePha val custom = attributes.custom ?: return emptyList() val annotations = custom.annotations.ifEmpty { return emptyList() } - custom.containerSymbol?.lazyResolveToPhase(phase) + for (containerSymbol in custom.containerSymbols) { + containerSymbol.lazyResolveToPhase(phase) + } + return annotations } 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 e560a8ba2d5..4793495cb41 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 @@ -106,6 +106,12 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt"); } + @Test + @TestMetadata("typeAnnotationsWithTypeAlias.kt") + public void testTypeAnnotationsWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts") @TestDataPath("$PROJECT_ROOT") 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 3f3fbdc0816..f4a2f61e47b 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 @@ -106,6 +106,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated e runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt"); } + @Test + @TestMetadata("typeAnnotationsWithTypeAlias.kt") + public void testTypeAnnotationsWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.descriptors.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.descriptors.pretty.txt new file mode 100644 index 00000000000..ece76376d97 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.descriptors.pretty.txt @@ -0,0 +1 @@ +fun foo(): @Anno3 @Anno2 @Anno1 BaseInterface \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.descriptors.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.descriptors.txt new file mode 100644 index 00000000000..3d32a6d45a8 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.descriptors.txt @@ -0,0 +1,33 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + 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: foo + origin: SOURCE + receiverParameter: null + returnType: [ + Anno3() + psi: KtAnnotationEntry + Anno2() + psi: KtAnnotationEntry + Anno1() + psi: KtAnnotationEntry + ] @R|Anno3|() @R|Anno2|() @R|Anno1|() @R|Anno3|() SecondTypeAlias + 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/typeAnnotationsWithTypeAlias.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt new file mode 100644 index 00000000000..ed611be9c5c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.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 +@Target(AnnotationTarget.TYPE) +annotation class Anno2 +@Target(AnnotationTarget.TYPE) +annotation class Anno3 + +interface BaseInterface + +typealias FirstTypeAlias = @Anno1 BaseInterface +typealias SecondTypeAlias = @Anno2 FirstTypeAlias + +fun foo(): @Anno3 SecondTypeAlias { + +} diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.pretty.txt new file mode 100644 index 00000000000..bc68545f836 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.pretty.txt @@ -0,0 +1 @@ +fun foo(): @Anno1 @Anno2 @Anno3 BaseInterface \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.txt new file mode 100644 index 00000000000..e7764ca1444 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.txt @@ -0,0 +1,33 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + 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: foo + origin: SOURCE + receiverParameter: null + returnType: [ + Anno1() + psi: KtAnnotationEntry + Anno2() + psi: KtAnnotationEntry + Anno3() + psi: KtAnnotationEntry + ] @R|Anno1|() @R|Anno2|() @R|Anno3|() BaseInterface + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index 68cf1780bcb..8c3afe8b5e9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -8,21 +8,17 @@ package org.jetbrains.kotlin.fir.resolve.transformers import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType import org.jetbrains.kotlin.fir.declarations.utils.isCompanion -import org.jetbrains.kotlin.fir.declarations.utils.isData import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind -import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.extensions.FirSupertypeGenerationExtension import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.supertypeGenerators -import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterSupertype @@ -36,16 +32,13 @@ import org.jetbrains.kotlin.fir.scopes.impl.wrapNestedClassifierScopeWithSubstit import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.fir.visitors.FirTransformer -import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.model.TypeArgumentMarker import org.jetbrains.kotlin.utils.addIfNotNull @@ -368,7 +361,7 @@ open class FirSupertypeResolverVisitor( val resolvedTypesRefs = transformer.withFile(useSiteFile) { resolveSuperTypeRefs( transformer, - ScopeClassDeclaration(scopes, classDeclarationsStack) + ScopeClassDeclaration(scopes, classDeclarationsStack, classLikeDeclaration), ) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/CustomAnnotationTypeAttribute.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/CustomAnnotationTypeAttribute.kt index d613656bc99..787478b42f2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/CustomAnnotationTypeAttribute.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/CustomAnnotationTypeAttribute.kt @@ -13,15 +13,20 @@ import kotlin.reflect.KClass class CustomAnnotationTypeAttribute( val annotations: List, - val containerSymbol: FirBasedSymbol? = null, + val containerSymbols: List> = emptyList(), ) : ConeAttribute() { + constructor(annotations: List, containerSymbol: FirBasedSymbol?) : this( + annotations, + listOfNotNull(containerSymbol), + ) + override fun union(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null override fun intersect(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null override fun add(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute { if (other == null || other === this) return this - return CustomAnnotationTypeAttribute(annotations + other.annotations, containerSymbol) + return CustomAnnotationTypeAttribute(annotations + other.annotations, containerSymbols + other.containerSymbols) } override fun isSubtypeOf(other: CustomAnnotationTypeAttribute?): Boolean = true