diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt index 82e3c3b8efd..f0c902839ea 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol @@ -17,8 +18,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor +import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.resolve.BindingContext @@ -32,6 +35,13 @@ internal class KtFe10PsiValueParameterSymbol( bindingContext[BindingContext.VALUE_PARAMETER, psi] } + override val generatedPrimaryConstructorProperty: KtKotlinPropertySymbol? by cached { + val bindingContext = analysisContext.analyze(psi, AnalysisMode.PARTIAL) + val propertyDescriptor = bindingContext[BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, psi] ?: return@cached null + + KtFe10DescKotlinPropertySymbol(propertyDescriptor as PropertyDescriptorImpl, analysisContext) + } + override val hasDefaultValue: Boolean get() = withValidityAssertion { psi.hasDefaultValue() } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt index 5b082329e60..1a979238542 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt @@ -16,7 +16,9 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession +import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.arrayElementType @@ -55,6 +57,15 @@ internal class KtFirValueParameterSymbol( override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } + override val generatedPrimaryConstructorProperty: KtKotlinPropertySymbol? by cached { + val propertySymbol = firSymbol.fir.correspondingProperty?.symbol ?: return@cached null + val ktPropertySymbol = builder.variableLikeBuilder.buildPropertySymbol(propertySymbol) + check(ktPropertySymbol is KtKotlinPropertySymbol) { + "Unexpected symbol for primary constructor property ${ktPropertySymbol.javaClass} for fir: ${firSymbol.fir.renderWithType()}" + } + ktPropertySymbol + } + override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating pointers for functions parameters from library is not supported yet") diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt index b56e519c2c0..84c7f42f291 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt @@ -193,4 +193,9 @@ public abstract class KtValueParameterSymbol : KtVariableLikeSymbol(), KtSymbolW * The names of the value parameters for `invoke()` are "item" and "p2" (its default parameter name). */ abstract override val name: Name + + /** + * The corresponding [KtPropertySymbol] if the current value parameter is a `val` or `var` declared inside the primary constructor. + */ + public open val generatedPrimaryConstructorProperty: KtKotlinPropertySymbol? get() = null } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt index cf3f1d3a5a6..aad9cf7b1ac 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/Anno.param1) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -17,6 +18,7 @@ KtValueParameterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/Anno.param2) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt index 51ea87b3cab..307fa29c6d4 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt @@ -21,6 +21,7 @@ KtPropertyGetterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.kt index 6be08136f3f..691f3b45825 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.kt @@ -1,2 +1,2 @@ -class A() { +class A(val a: Int, b: String) { } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.pretty.txt index 83d15dc739b..4791310d1b9 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.pretty.txt @@ -1 +1,5 @@ -class A +class A { + constructor(a: kotlin.Int, b: kotlin.String) + + val a: kotlin.Int +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.txt index 003da5f56b6..4ce54455aea 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classPrimaryConstructor.txt @@ -1,3 +1,37 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/A.a) + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: a + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: b + origin: SOURCE + receiverType: null + returnType: kotlin/String + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + KtConstructorSymbol: annotationsList: [] callableIdIfNonLocal: null @@ -10,7 +44,10 @@ KtConstructorSymbol: returnType: A symbolKind: CLASS_MEMBER typeParameters: [] - valueParameters: [] + valueParameters: [ + KtValueParameterSymbol(a) + KtValueParameterSymbol(b) + ] visibility: Public getContainingModule: KtSourceModule "Sources of main" deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt index 6229c537b94..f0257103651 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt @@ -18,6 +18,7 @@ KtConstructorSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -53,6 +54,7 @@ KtConstructorSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -69,6 +71,7 @@ KtValueParameterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt index a38c18f9dfe..7feebbf2488 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/MyColor.x) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -17,6 +18,7 @@ KtValueParameterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/MyColor.y) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -33,6 +35,7 @@ KtValueParameterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/MyColor.z) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt index 0932cedd740..9e628e82c55 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/Style.value) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt index 5ece4bcd4c3..9158bcadc39 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: KtKotlinPropertySymbol(/Style.value) hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt index 7f7f6f66830..5daced39481 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt index 28184a01d99..662333620f2 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt @@ -14,6 +14,7 @@ KtTypeParameterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt index 9d5b465dbcb..dbe0bfa0152 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt index 05e969f12fd..9dd864286bd 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -61,6 +62,7 @@ KtLocalVariableSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -176,6 +178,7 @@ KtFunctionSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt index 85230c17732..7a4451df7a6 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt @@ -58,6 +58,7 @@ KtPropertyGetterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt index 79269f77d4e..d44beaad230 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt @@ -57,6 +57,7 @@ KtPropertyGetterSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt index 3a32d850f58..c3e632d8fbc 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt @@ -123,6 +123,7 @@ KtNamedClassOrObjectSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt index fee395f6ed0..fd4b439bcd3 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt @@ -123,6 +123,7 @@ KtNamedClassOrObjectSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt index 2a7ae17770e..11d1b36928f 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -44,6 +45,7 @@ KtFunctionSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -87,6 +89,7 @@ KtFunctionSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false @@ -130,6 +133,7 @@ KtFunctionSymbol: KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt index 2669c23b178..a739d7085bc 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: false diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt index 2c677134337..b9c45b8c9b6 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt @@ -1,6 +1,7 @@ KtValueParameterSymbol: annotationsList: [] callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null hasDefaultValue: false isExtension: false isImplicitLambdaParameter: true