diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index 4fd43edd01e..6c13b150184 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -340,9 +340,20 @@ internal class KtSymbolByFirBuilder( } fun buildValueParameterSymbol(firSymbol: FirValueParameterSymbol): KtValueParameterSymbol { - firSymbol.fir.unwrapSubstitutionOverrideIfNeeded()?.let { - return buildValueParameterSymbol(it.symbol) + val functionSymbol = firSymbol.containingFunctionSymbol + functionSymbol.fir.unwrapSubstitutionOverrideIfNeeded()?.let { unwrappedFunction -> + val originalIndex = functionSymbol.valueParameterSymbols.indexOf(firSymbol) + if (originalIndex == -1) { + errorWithAttachment("Containing function doesn't have the corresponding parameter") { + withFirSymbolEntry("valueParameter", firSymbol) + withFirSymbolEntry("function", functionSymbol) + } + } + + val unwrappedParameter = unwrappedFunction.symbol.valueParameterSymbols[originalIndex] + return buildValueParameterSymbol(unwrappedParameter) } + return symbolsCache.cache(firSymbol) { KtFirValueParameterSymbol(firSymbol, analysisSession) } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverrideProperty.txt b/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverrideProperty.txt index 69dc1d7fbb1..fdb2a9af3f5 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverrideProperty.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverrideProperty.txt @@ -1,7 +1,7 @@ STATUS: TARGET: @PROPERTY:R|second/Anno|[Types](LAZY_EXPRESSION) public final [ResolvedTo(STATUS)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(STATUS)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass] set([ResolvedTo(STATUS)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt @R|kotlin/annotation/Target|[CompilerRequiredAnnotations](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.VALUE_PARAMETER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FIELD|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_SETTER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class Anno : R|kotlin/Annotation| { @@ -36,8 +36,8 @@ FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt EXPECT_ACTUAL_MATCHING: TARGET: @PROPERTY:R|second/Anno|[Types](LAZY_EXPRESSION) public final [ResolvedTo(EXPECT_ACTUAL_MATCHING)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(EXPECT_ACTUAL_MATCHING)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(EXPECT_ACTUAL_MATCHING)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(EXPECT_ACTUAL_MATCHING)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(EXPECT_ACTUAL_MATCHING)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(EXPECT_ACTUAL_MATCHING)] [ContainingClassKey=SubClass] set([ResolvedTo(EXPECT_ACTUAL_MATCHING)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt @R|kotlin/annotation/Target|[CompilerRequiredAnnotations](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.VALUE_PARAMETER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FIELD|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_SETTER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class Anno : R|kotlin/Annotation| { @@ -72,8 +72,8 @@ FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt CONTRACTS: TARGET: @PROPERTY:R|second/Anno|[Types](LAZY_EXPRESSION) public final [ResolvedTo(CONTRACTS)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(CONTRACTS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(CONTRACTS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(CONTRACTS)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(CONTRACTS)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(CONTRACTS)] [ContainingClassKey=SubClass] set([ResolvedTo(CONTRACTS)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt @R|kotlin/annotation/Target|[CompilerRequiredAnnotations](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.VALUE_PARAMETER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FIELD|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_SETTER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class Anno : R|kotlin/Annotation| { @@ -108,8 +108,8 @@ FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt IMPLICIT_TYPES_BODY_RESOLVE: TARGET: @PROPERTY:R|second/Anno|[Types](LAZY_EXPRESSION) public final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=SubClass] set([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt @R|kotlin/annotation/Target|[CompilerRequiredAnnotations](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.VALUE_PARAMETER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FIELD|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_SETTER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class Anno : R|kotlin/Annotation| { @@ -144,8 +144,8 @@ FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt ANNOTATION_ARGUMENTS: TARGET: @PROPERTY:R|second/Anno|[Types](position = (String(property ), R|second/constant|)) public final [ResolvedTo(ANNOTATION_ARGUMENTS)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](position = (String(get ), R|second/constant|)) public [ResolvedTo(ANNOTATION_ARGUMENTS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](position = (String(set ), R|second/constant|)) public [ResolvedTo(ANNOTATION_ARGUMENTS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(ANNOTATION_ARGUMENTS)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](position = (String(get ), R|second/constant|)) public [ResolvedTo(ANNOTATION_ARGUMENTS)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](position = (String(set ), R|second/constant|)) public [ResolvedTo(ANNOTATION_ARGUMENTS)] [ContainingClassKey=SubClass] set([ResolvedTo(ANNOTATION_ARGUMENTS)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt @R|kotlin/annotation/Target|[Types](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.VALUE_PARAMETER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FIELD|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_SETTER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { @@ -180,8 +180,8 @@ FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt BODY_RESOLVE: TARGET: @PROPERTY:R|second/Anno|[Types](position = (String(property ), R|second/constant|)) public final [ResolvedTo(BODY_RESOLVE)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](position = (String(get ), R|second/constant|)) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](position = (String(set ), R|second/constant|)) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](position = (String(get ), R|second/constant|)) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](position = (String(set ), R|second/constant|)) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=SubClass] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverrideProperty.kt @R|kotlin/annotation/Target|[Types](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.VALUE_PARAMETER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FIELD|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_SETTER|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|) public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { diff --git a/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverridePropertyScript.txt b/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverridePropertyScript.txt index 38f2e79de98..414e66549a5 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverridePropertyScript.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/explicitSubstitutionOverridePropertyScript.txt @@ -1,7 +1,7 @@ STATUS: TARGET: @PROPERTY:R|second/Anno|[Types](LAZY_EXPRESSION) public final [ResolvedTo(STATUS)] [SubstitutedOverrideOriginalKey=second/AbstractClass.resolveMe] var resolveMe: R|kotlin/String?| - @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] get(): R|kotlin/String?| - @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass, SubstitutedOverrideOriginalKey=special/accessor] set([ResolvedTo(STATUS)] value: R|kotlin/String?|): R|kotlin/Unit| + @PROPERTY_GETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass] get(): R|kotlin/String?| + @PROPERTY_SETTER:R|second/Anno|[Types](LAZY_EXPRESSION) public [ResolvedTo(STATUS)] [ContainingClassKey=SubClass] set([ResolvedTo(STATUS)] value: R|kotlin/String?|): R|kotlin/Unit| FILE: [ResolvedTo(IMPORTS)] explicitSubstitutionOverridePropertyScript.kts context(