From a30d9e0ed3fd27acc8817075d682cebf833b85fd Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 15 Dec 2020 20:26:23 +0100 Subject: [PATCH] FIR: add fake source fir element to `it` parameter symbol --- .../kotlin/fir/resolve/inference/FirCallCompleter.kt | 4 +++- .../fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt | 4 ++++ .../kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt | 3 ++- idea/testData/highlighter/AutoCreatedItParameter.kt | 1 - 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index 217f86e2997..f3dc5091520 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -5,12 +5,14 @@ package org.jetbrains.kotlin.fir.resolve.inference +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.fakeElement import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate @@ -33,7 +35,6 @@ import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode -import org.jetbrains.kotlin.resolve.calls.inference.model.ArgumentConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.types.TypeApproximatorConfiguration import org.jetbrains.kotlin.types.model.StubTypeMarker @@ -183,6 +184,7 @@ class FirCallCompleter( val name = Name.identifier("it") val itType = parameters.single() buildValueParameter { + source = lambdaAtom.atom.source?.fakeElement(FirFakeSourceElementKind.ItLambdaParameter) session = this@FirCallCompleter.session origin = FirDeclarationOrigin.Source returnTypeRef = buildResolvedTypeRef { type = itType.approximateLambdaInputType() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index cc05f1bb283..bab6e154260 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -157,6 +157,10 @@ sealed class FirFakeSourceElementKind : FirSourceElementKind() { // Part of desugared x?.y object CheckedSafeCallSubject : FirFakeSourceElementKind() + + // { it + 1} --> { it -> it + 1 } + // where `it` parameter declaration has fake source + object ItLambdaParameter : FirFakeSourceElementKind() } sealed class FirSourceElement { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt index e51d168ec1f..13d6ac803a8 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/LowLevelFirApiFacade.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.unwrapFakeOverrides import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo @@ -109,7 +110,7 @@ fun D.withFirDeclaration( -> { val cache = session.cache val file = resolveState.getFirFile(this, cache) - ?: error("Fir file was not found for\n${render()}\n${ktDeclaration.getElementTextInContext()}") + ?: error("Fir file was not found for\n${render()}\n${(psi as? KtElement)?.getElementTextInContext()}") cache.firFileLockProvider.withReadLock(file) { action(this) } } else -> action(this) diff --git a/idea/testData/highlighter/AutoCreatedItParameter.kt b/idea/testData/highlighter/AutoCreatedItParameter.kt index 68af0a13a90..f50f05c068b 100644 --- a/idea/testData/highlighter/AutoCreatedItParameter.kt +++ b/idea/testData/highlighter/AutoCreatedItParameter.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR fun test() { val vect = MyIterable<Int>() vect.filter { it != 2 }.forEach { it.toString() }