diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt index de4d3e63f89..e44c13e0f1e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyRe import org.jetbrains.kotlin.fir.scopes.callableCopySubstitutionForTypeUpdater import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.util.setMultimapOf import org.jetbrains.kotlin.fir.utils.exceptions.withFirSymbolEntry @@ -83,16 +84,25 @@ internal class LLImplicitBodyResolveComputationSession : ImplicitBodyResolveComp * @see postponedSymbols */ fun postponeForeignAnnotationResolution(symbol: FirBasedSymbol<*>) { + // We should unwrap local symbols to avoid recursion + val symbolToPostpone = when (symbol) { + is FirValueParameterSymbol -> symbol.containingFunctionSymbol + else -> symbol + } + // We cannot resolve them on demand, so we shouldn't postpone them - if (symbol.cannotResolveAnnotationsOnDemand()) { + if (symbolToPostpone.cannotResolveAnnotationsOnDemand()) { return } val currentSymbol = anchorForForeignAnnotations ?: errorWithAttachment("Unexpected state: the current symbol have to be here") { - withFirSymbolEntry("symbol to postpone", symbol) + withFirSymbolEntry("symbol to postpone", symbolToPostpone) } - postponedSymbols.put(currentSymbol, symbol) + // There is no sense to postpone itself as it will lead to recursion + if (currentSymbol == symbolToPostpone) return + + postponedSymbols.put(currentSymbol, symbolToPostpone) } /** diff --git a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.after.txt b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.after.txt index 029a687e844..56f58361a38 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.after.txt @@ -1,14 +1,14 @@ @R|Anno|(position = (String(parameter type ), R|/prop|)) kotlin/collections/List<@R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String>> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] FILE: [ResolvedTo(IMPORTS)] parameterWithAnnotations.kt @R|kotlin/annotation/Target|[Types](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|) public final [ResolvedTo(STATUS)] annotation class Anno : R|kotlin/Annotation| { diff --git a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.before.txt b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.before.txt index 46b15a5ba7d..7887ff038ad 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.before.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotations.before.txt @@ -1,14 +1,14 @@ @R|Anno|((String(parameter type ), prop#)) kotlin/collections/List<@R|Anno|((String(nested parameter type ), prop#)) kotlin/collections/Collection<@R|Anno|((String(nested nested parameter type ), prop#)) kotlin/String>> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|((String(nested parameter type ), prop#)) kotlin/collections/Collection<@R|Anno|((String(nested nested parameter type ), prop#)) kotlin/String> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|((String(nested nested parameter type ), prop#)) kotlin/String context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] FILE: [ResolvedTo(IMPORTS)] parameterWithAnnotations.kt @R|kotlin/annotation/Target|[CompilerRequiredAnnotations](Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] annotation class Anno : R|kotlin/Annotation| { diff --git a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.after.txt b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.after.txt index ecceec50e62..f0857f6c02f 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.after.txt @@ -1,14 +1,14 @@ @R|Anno|(position = (String(parameter type ), R|/prop|)) kotlin/collections/List<@R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String>> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(anonymousFunction return type ), R|/prop|)) kotlin/Int context -> FirAnonymousFunctionSymbol special/anonymous diff --git a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.before.txt b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.before.txt index ecceec50e62..f0857f6c02f 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.before.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsBodyResolve.before.txt @@ -1,14 +1,14 @@ @R|Anno|(position = (String(parameter type ), R|/prop|)) kotlin/collections/List<@R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String>> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(anonymousFunction return type ), R|/prop|)) kotlin/Int context -> FirAnonymousFunctionSymbol special/anonymous diff --git a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsScript.after.txt b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsScript.after.txt index a8ceeca0e32..ac03363d5ab 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsScript.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveTypeAnnotations/constructor/parameterWithAnnotationsScript.after.txt @@ -1,14 +1,14 @@ @R|Anno|(position = (String(parameter type ), R|/prop|)) kotlin/collections/List<@R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String>> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested parameter type ), R|/prop|)) kotlin/collections/Collection<@R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String> context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] @R|Anno|(position = (String(nested nested parameter type ), R|/prop|)) kotlin/String context -> FirValueParameterSymbol /param from FirConstructorSymbol /A.A - anchor -> [FirConstructorSymbol /A.A] + anchor -> [FirValueParameterSymbol /param from FirConstructorSymbol /A.A] FILE: [ResolvedTo(IMPORTS)] parameterWithAnnotationsScript.kts context(