From 8befbc637515ca87d8b470be871c1e64f9451a7b Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Tue, 25 Jan 2022 13:48:06 +0300 Subject: [PATCH] KTIJ-20826 Approximate builder inference stub types as type parameters This is a temporary fix to avoid crashes in FIR IDE Of all stub types, only `ConeStubTypeForChainInference` is handled now, so we can catch the other possible errors with stub types (in the delegates' inference, for example) The fix introduced in this commit should be reworked when KT-50916 is fixed ^KTIJ-20826 Fixed --- .../fir/Fe10ResolveCallTestGenerated.java | 6 +++++ .../analysis/api/fir/KtSymbolByFirBuilder.kt | 11 ++++++++ .../fir/fir/FirResolveCallTestGenerated.java | 6 +++++ .../builderInference.descriptors.txt | 25 +++++++++++++++++++ .../resolveCall/builderInference.kt | 14 +++++++++++ .../resolveCall/builderInference.txt | 25 +++++++++++++++++++ 6 files changed, 87 insertions(+) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java index 6ea7bf9a419..d9e56f2b76e 100644 --- a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java @@ -172,6 +172,12 @@ public class Fe10ResolveCallTestGenerated extends AbstractResolveCallTest { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/arrayOfInAnnotation.kt"); } + @Test + @TestMetadata("builderInference.kt") + public void testBuilderInference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt"); + } + @Test @TestMetadata("calleeExpressionOfImplicitInvoke.kt") public void testCalleeExpressionOfImplicitInvoke() throws Exception { 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 5b8bb9bf7da..792d755c2df 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 @@ -30,10 +30,12 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.resolve.getContainingClass import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag +import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable import org.jetbrains.kotlin.fir.resolve.originalConstructorIfTypeAlias import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap +import org.jetbrains.kotlin.fir.scopes.impl.toConeType import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol @@ -438,6 +440,15 @@ internal class KtSymbolByFirBuilder private constructor( is ConeDefinitelyNotNullType -> KtFirDefinitelyNotNullType(coneType, token, this@KtSymbolByFirBuilder) is ConeCapturedType -> KtFirCapturedType(coneType, token, this@KtSymbolByFirBuilder) is ConeIntegerLiteralType -> KtFirIntegerLiteralType(coneType, token, this@KtSymbolByFirBuilder) + is ConeStubTypeForChainInference -> { + // TODO this is a temporary hack to prevent FIR IDE from crashing on builder inference, see KT-50916 + val typeVariable = coneType.constructor.variable as? ConeTypeParameterBasedTypeVariable + val typeParameterSymbol = typeVariable?.typeParameterSymbol ?: throwUnexpectedElementError(coneType) + val coneTypeParameterType = typeParameterSymbol.toConeType() as ConeTypeParameterType + + KtFirTypeParameterType(coneTypeParameterType, token, this@KtSymbolByFirBuilder) + } + else -> throwUnexpectedElementError(coneType) } } diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java index c96f82e56c4..757d83dc216 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java @@ -172,6 +172,12 @@ public class FirResolveCallTestGenerated extends AbstractResolveCallTest { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/arrayOfInAnnotation.kt"); } + @Test + @TestMetadata("builderInference.kt") + public void testBuilderInference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt"); + } + @Test @TestMetadata("calleeExpressionOfImplicitInvoke.kt") public void testCalleeExpressionOfImplicitInvoke() throws Exception { diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt new file mode 100644 index 00000000000..ffda3c50e0f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt @@ -0,0 +1,25 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtReceiverParameterSymbol: + origin: SOURCE + type: test/Target + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = test/Target.add(: test.Target, t: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + receiverType = null + returnType = kotlin.String + symbol = t: T + ] + argumentMapping = { + s -> (KtVariableLikeSignature: + receiverType = null + returnType = kotlin.String + symbol = t: T) + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt new file mode 100644 index 00000000000..3eb65be9805 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt @@ -0,0 +1,14 @@ +// WITH_STDLIB +package test + +class Target { + fun add(t: T) {} +} + +fun buildTarget(@BuilderInference block: Target.() -> Unit): Target { + return Target().apply { block() } +} + +fun test(s: String) { + val result = buildTarget { add(s) } +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt new file mode 100644 index 00000000000..e954cdd274a --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt @@ -0,0 +1,25 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtReceiverParameterSymbol: + origin: SOURCE + type: test/Target + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = test/Target.add(: test.Target, t: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + receiverType = null + returnType = T + symbol = t: T + ] + argumentMapping = { + s -> (KtVariableLikeSignature: + receiverType = null + returnType = T + symbol = t: T) + } \ No newline at end of file