From 37d688ae83079b3f317c3d710fa6018d02ee0376 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 18 Oct 2022 08:56:10 +0200 Subject: [PATCH] [AA] introduce FirReceiverParameter ^KT-54417 --- ...KtFirAnnotationListForReceiverParameter.kt | 66 +++++++++++++++++++ .../symbols/KtFirReceiverParameterSymbol.kt | 6 ++ .../fir/symbols/KtFirTypeAndAnnotations.kt | 3 +- .../analysis/api/symbols/KtCallableSymbol.kt | 5 +- .../builderInference.descriptors.txt | 1 + .../resolveCall/builderInference.txt | 3 +- .../javaPropertyGetter_unqualified.txt | 3 +- .../javaPropertySetter_unqualified.txt | 3 +- .../kotlinPropertyGetter_unqualified.txt | 3 +- .../kotlinPropertySetter_unqualified.txt | 3 +- .../smartCastImplicitDispatchReceiver.txt | 3 +- .../smartCastImplicitExtensionReceiver.txt | 3 +- .../builderInference.descriptors.txt | 1 + .../singleCandidate/builderInference.txt | 1 + .../functionReceiverParameter.pretty.txt | 4 ++ .../functionReceiverParameter.txt | 4 ++ .../propertyReceiverParameter.pretty.txt | 4 ++ .../propertyReceiverParameter.txt | 4 ++ .../checkers/FirNativeObjCNameChecker.kt | 1 + .../kotlin/fir/symbols/FirBasedSymbol.kt | 33 ++++++---- .../fir/symbols/impl/FirCallableSymbol.kt | 9 ++- 21 files changed, 139 insertions(+), 24 deletions(-) create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForReceiverParameter.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForReceiverParameter.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForReceiverParameter.kt new file mode 100644 index 00000000000..8f41619a5d8 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForReceiverParameter.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2010-2022 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.annotations + +import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication +import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList +import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication +import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.fir.FirAnnotationContainer +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.fullyExpandedClassId +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.resolvedAnnotationClassIds +import org.jetbrains.kotlin.fir.symbols.resolvedAnnotationsWithArguments +import org.jetbrains.kotlin.name.ClassId + +internal class KtFirAnnotationListForReceiverParameter private constructor( + private val firCallableSymbol: FirCallableSymbol<*>, + private val receiverParameter: FirAnnotationContainer, + private val useSiteSession: FirSession, + override val token: KtLifetimeToken, +) : KtAnnotationsList() { + + override val annotations: List + get() = withValidityAssertion { + receiverParameter.resolvedAnnotationsWithArguments(firCallableSymbol).map { annotation -> + annotation.toKtAnnotationApplication(useSiteSession) + } + } + + override fun hasAnnotation(classId: ClassId): Boolean = withValidityAssertion { + classId in receiverParameter.resolvedAnnotationClassIds(firCallableSymbol) + } + + override fun annotationsByClassId(classId: ClassId): List = withValidityAssertion { + receiverParameter.resolvedAnnotationsWithArguments(firCallableSymbol).mapNotNull { annotation -> + if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null + annotation.toKtAnnotationApplication(useSiteSession) + } + } + + override val annotationClassIds: Collection + get() = withValidityAssertion { + receiverParameter.resolvedAnnotationClassIds(firCallableSymbol) + } + + companion object { + fun create( + firCallableSymbol: FirCallableSymbol<*>, + useSiteSession: FirSession, + token: KtLifetimeToken, + ): KtAnnotationsList { + val receiverParameter = firCallableSymbol.receiverParameter + return if (receiverParameter?.annotations?.isEmpty() != false) { + KtEmptyAnnotationsList(token) + } else { + KtFirAnnotationListForReceiverParameter(firCallableSymbol, receiverParameter, useSiteSession, token) + } + } + } +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt index 7b04a59e438..185b98d6b9e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -7,7 +7,9 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForReceiverParameter import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirReceiverParameterSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer @@ -46,4 +48,8 @@ internal class KtFirReceiverParameterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtFirReceiverParameterSymbolPointer(owningCallableSymbol.createPointer()) } + + override val annotationsList: KtAnnotationsList by cached { + KtFirAnnotationListForReceiverParameter.create(firSymbol, firResolveSession.useSiteFirSession, token) + } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt index df16195dffc..a7ced14e465 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 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. */ @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.resolveSupertypesInTheAir import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt index fc282d9e61f..0548e5717e2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt @@ -1,11 +1,12 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 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.symbols import org.jetbrains.kotlin.analysis.api.base.KtContextReceiversOwner +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -26,7 +27,7 @@ public sealed class KtCallableSymbol : KtSymbolWithKind, KtPossibleMemberSymbol, * Symbol for a receiver parameter of a function or property. For example, consider code `fun String.foo() {...}`, the declaration of * `String` receiver parameter is such a symbol. */ -public abstract class KtReceiverParameterSymbol : KtSymbol { +public abstract class KtReceiverParameterSymbol : KtAnnotatedSymbol { public abstract val type: KtType /** diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt index 446e3fc9825..f532a9d69a1 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt index 9bcecbed816..29a3c571124 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target @@ -30,4 +31,4 @@ KtSuccessCallInfo: returnType = T symbol = t: T callableIdIfNonLocal = null) - } + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt index f68ebcf152c..a849706a23f 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt @@ -3,6 +3,7 @@ KtSuccessCallInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/call) type: JavaClass @@ -16,4 +17,4 @@ KtSuccessCallInfo: callableIdIfNonLocal = /JavaClass.foo simpleAccess = Read: - typeArgumentsMapping = {} + typeArgumentsMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt index 47f01f6bf1e..4f6d02c865d 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt @@ -3,6 +3,7 @@ KtSuccessCallInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/call) type: JavaClass @@ -16,4 +17,4 @@ KtSuccessCallInfo: callableIdIfNonLocal = /JavaClass.foo simpleAccess = Write: value = 42 - typeArgumentsMapping = {} + typeArgumentsMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt index 1d4d9dd438a..7710b9470c5 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt @@ -3,6 +3,7 @@ KtSuccessCallInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/foo) type: A @@ -16,4 +17,4 @@ KtSuccessCallInfo: callableIdIfNonLocal = /A.i simpleAccess = Read: - typeArgumentsMapping = {} + typeArgumentsMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt index 339fa4d1dc9..b70f7ff8c3a 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt @@ -3,6 +3,7 @@ KtSuccessCallInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/foo) type: A @@ -16,4 +17,4 @@ KtSuccessCallInfo: callableIdIfNonLocal = /A.i simpleAccess = Write: value = 1 - typeArgumentsMapping = {} + typeArgumentsMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt index ff19aeda24c..f12b97bbc68 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: dispatchReceiver = KtSmartCastedReceiverValue: original = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/test) type: kotlin/Any @@ -18,4 +19,4 @@ KtSuccessCallInfo: callableIdIfNonLocal = kotlin/String.length simpleAccess = Read: - typeArgumentsMapping = {} + typeArgumentsMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt index 6d302cb3b9b..54e46cd9018 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt @@ -6,6 +6,7 @@ KtSuccessCallInfo: extensionReceiver = KtSmartCastedReceiverValue: original = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/test) type: kotlin/Any @@ -18,4 +19,4 @@ KtSuccessCallInfo: valueParameters = [] callableIdIfNonLocal = /foo typeArgumentsMapping = {} - argumentMapping = {} + argumentMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt index 8a90fc4ddfa..ac2ca8fefa3 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt @@ -4,6 +4,7 @@ KtApplicableCallCandidateInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt index ce85af37943..276953d402b 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt @@ -4,6 +4,7 @@ KtApplicableCallCandidateInfo: partiallyAppliedSymbol = KtPartiallyAppliedSymbol: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: + annotationsList: [] origin: SOURCE owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.pretty.txt index ff972f7ad83..14e9fe97494 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.pretty.txt @@ -1,4 +1,8 @@ KtReceiverParameterSymbol: + annotationsList: [ + ReceiverAnnotation() + psi: KtAnnotationEntry + ] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/foo) type: [ diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.txt index c8c850fdae4..8ce7fc5c266 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.txt @@ -1,4 +1,8 @@ KtReceiverParameterSymbol: + annotationsList: [ + ReceiverAnnotation() + psi: KtAnnotationEntry + ] origin: SOURCE owningCallableSymbol: KtFunctionSymbol(/foo) type: [ diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.pretty.txt index ab9a5ab9607..8c6b9d30c8d 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.pretty.txt @@ -1,4 +1,8 @@ KtReceiverParameterSymbol: + annotationsList: [ + ReceiverAnnotation() + psi: KtAnnotationEntry + ] origin: SOURCE owningCallableSymbol: KtKotlinPropertySymbol(/prop) type: [ diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.txt index e1398c98005..c5a9e5e6d3a 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.txt @@ -1,4 +1,8 @@ KtReceiverParameterSymbol: + annotationsList: [ + ReceiverAnnotation() + psi: KtAnnotationEntry + ] origin: SOURCE owningCallableSymbol: KtKotlinPropertySymbol(/prop) type: [ diff --git a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameChecker.kt b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameChecker.kt index c54ef356275..59ec80b62c7 100644 --- a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameChecker.kt +++ b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCNameChecker.kt @@ -125,6 +125,7 @@ object FirNativeObjCNameChecker : FirBasicDeclarationChecker() { is FirFunctionSymbol<*> -> buildList { add((this@getObjCNames as FirBasedSymbol<*>).getObjCName()) add(resolvedReceiverTypeRef?.getObjCName()) + add(receiverParameter?.getObjCName()) valueParameterSymbols.forEach { add(it.getObjCName()) } } 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 d0ccd7f9260..0684ced108f 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 @@ -1,11 +1,12 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 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.fir.symbols import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin @@ -42,22 +43,28 @@ abstract class FirBasedSymbol { get() = fir.annotations val resolvedAnnotationsWithArguments: List - get() { - lazyResolveToPhase(FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING) - return fir.annotations - } + get() = fir.resolvedAnnotationsWithArguments(this) val resolvedAnnotationsWithClassIds: List - get() { - lazyResolveToPhase(FirResolvePhase.TYPES) - return fir.annotations - } + get() = fir.resolvedAnnotationsWithClassIds(this) val resolvedAnnotationClassIds: List - get() { - lazyResolveToPhase(FirResolvePhase.TYPES) - return fir.annotations.mapNotNull { (it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId } - } + get() = fir.resolvedAnnotationClassIds(this) +} + +fun FirAnnotationContainer.resolvedAnnotationsWithArguments(anchorElement: FirBasedSymbol<*>): List { + anchorElement.lazyResolveToPhase(FirResolvePhase.ANNOTATIONS_ARGUMENTS_MAPPING) + return annotations +} + +fun FirAnnotationContainer.resolvedAnnotationsWithClassIds(anchorElement: FirBasedSymbol<*>): List { + anchorElement.lazyResolveToPhase(FirResolvePhase.TYPES) + return annotations +} + +fun FirAnnotationContainer.resolvedAnnotationClassIds(anchorElement: FirBasedSymbol<*>): List { + anchorElement.lazyResolveToPhase(FirResolvePhase.TYPES) + return annotations.mapNotNull { (it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId } } @RequiresOptIn diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt index b1a8b5c43ed..ded09cad2ac 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt @@ -1,11 +1,12 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 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.fir.symbols.impl import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase @@ -32,6 +33,12 @@ abstract class FirCallableSymbol : FirBasedSymbol return fir.receiverParameter?.type as FirResolvedTypeRef? } + val receiverParameter: FirAnnotationContainer? + get() { + ensureType(fir.receiverParameter?.type) + return fir.receiverParameter + } + val resolvedContextReceivers: List get() { lazyResolveToPhase(FirResolvePhase.TYPES)