From 50abb072455d7f4b9dddf39e35b5adf3eb630ff8 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 25 Feb 2020 19:30:40 +0300 Subject: [PATCH] [FIR] Record & use type arguments of FirQualifiedAccessExpression --- .../kotlin/fir/backend/Fir2IrVisitor.kt | 9 +-- ...rCallCompletionResultsWriterTransformer.kt | 61 +++++++++++-------- .../extensionPropertyInLambda.txt | 2 +- .../resolve/inference/simpleCapturedTypes.txt | 4 +- .../classLiteralForParameter.txt | 2 +- .../resolveWithStdlib/j+k/LoggerInstance.txt | 2 +- .../j+k/StaticGenericMethod.txt | 2 +- .../resolveWithStdlib/reflectionClass.txt | 6 +- .../FirQualifiedAccessWithoutCallee.kt | 2 + .../fir/expressions/FirResolvedQualifier.kt | 2 + .../expressions/impl/FirArraySetCallImpl.kt | 5 ++ .../impl/FirCallableReferenceAccessImpl.kt | 5 ++ .../expressions/impl/FirComponentCallImpl.kt | 5 ++ .../expressions/impl/FirFunctionCallImpl.kt | 5 ++ .../impl/FirModifiableQualifiedAccess.kt | 2 + .../impl/FirQualifiedAccessExpressionImpl.kt | 5 ++ .../impl/FirResolvedQualifierImpl.kt | 5 ++ .../impl/FirThisReceiverExpressionImpl.kt | 5 ++ .../impl/FirVariableAssignmentImpl.kt | 5 ++ .../impl/FirExpressionWithSmartcastImpl.kt | 4 ++ .../kotlin/fir/tree/generator/FieldSets.kt | 2 +- .../irText/expressions/classReference.fir.txt | 8 +-- .../expressions/genericPropertyCall.fir.txt | 3 +- .../expressions/objectClassReference.fir.txt | 4 +- .../expressions/useImportedMember.fir.txt | 8 +-- ...variableAsFunctionCallWithGenerics.fir.txt | 6 +- 26 files changed, 108 insertions(+), 61 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 53db4636ce5..07a764899eb 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -785,13 +785,13 @@ class Fir2IrVisitor( } } - private fun IrExpression.applyTypeArguments(call: FirFunctionCall): IrExpression { + private fun IrExpression.applyTypeArguments(access: FirQualifiedAccess): IrExpression { return when (this) { is IrCallWithIndexedArgumentsBase -> { - val argumentsCount = call.typeArguments.size + val argumentsCount = access.typeArguments.size if (argumentsCount <= typeArgumentsCount) { apply { - for ((index, argument) in call.typeArguments.withIndex()) { + for ((index, argument) in access.typeArguments.withIndex()) { val argumentIrType = (argument as FirTypeProjectionWithVariance).typeRef.toIrType( session, declarationStorage @@ -904,7 +904,8 @@ class Fir2IrVisitor( } override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Any?): IrElement { - return qualifiedAccessExpression.toIrExpression(qualifiedAccessExpression.typeRef).applyReceivers(qualifiedAccessExpression) + return qualifiedAccessExpression.toIrExpression(qualifiedAccessExpression.typeRef) + .applyTypeArguments(qualifiedAccessExpression).applyReceivers(qualifiedAccessExpression) } override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: Any?): IrElement { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 01875c69837..13a2e36ebee 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -53,6 +53,7 @@ class FirCallCompletionResultsWriterTransformer( qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose() val candidateFir = calleeReference.candidateSymbol.phasedFir + val typeArguments = computeTypeArguments(qualifiedAccessExpression, calleeReference.candidate) val typeRef = (candidateFir as? FirTypedDeclaration)?.let { typeCalculator.tryCalculateReturnType(it) } ?: buildErrorTypeRef { @@ -60,7 +61,7 @@ class FirCallCompletionResultsWriterTransformer( diagnostic = FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}") } - qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef) + qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef).replaceTypeArguments(typeArguments) return qualifiedAccessExpression.transformCalleeReference( StoreCalleeReference, @@ -69,7 +70,9 @@ class FirCallCompletionResultsWriterTransformer( name = calleeReference.name resolvedSymbol = calleeReference.candidateSymbol }, - ).compose() + ).apply { + replaceTypeArguments(typeArguments) + }.compose() } private fun D.replaceTypeRefWithSubstituted( @@ -115,7 +118,7 @@ class FirCallCompletionResultsWriterTransformer( source = calleeReference.source name = calleeReference.name resolvedSymbol = calleeReference.candidateSymbol - inferredTypeArguments.addAll(computeTypeArguments(calleeReference.candidate)) + inferredTypeArguments.addAll(computeTypeArgumentTypes(calleeReference.candidate)) }, ).compose() } @@ -141,29 +144,7 @@ class FirCallCompletionResultsWriterTransformer( val subCandidate = calleeReference.candidate val declaration = subCandidate.symbol.phasedFir as FirCallableMemberDeclaration<*> - val typeArguments = computeTypeArguments(subCandidate) - .mapIndexed { index, type -> - when (val argument = functionCall.typeArguments.getOrNull(index)) { - is FirTypeProjectionWithVariance -> { - val typeRef = argument.typeRef as FirResolvedTypeRef - buildTypeProjectionWithVariance { - source = argument.source - this.typeRef = typeRef.withReplacedConeType(type) - variance = argument.variance - } - } - else -> { - buildTypeProjectionWithVariance { - source = argument?.source - typeRef = buildResolvedTypeRef { - this.type = type - } - variance = Variance.INVARIANT - } - } - } - } - + val typeArguments = computeTypeArguments(functionCall, subCandidate) val typeRef = typeCalculator.tryCalculateReturnType(declaration).let { if (functionCall.safe) { val nullableType = it.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE, session.inferenceContext) @@ -262,6 +243,34 @@ class FirCallCompletionResultsWriterTransformer( } private fun computeTypeArguments( + access: FirQualifiedAccess, + candidate: Candidate + ): List { + return computeTypeArgumentTypes(candidate) + .mapIndexed { index, type -> + when (val argument = access.typeArguments.getOrNull(index)) { + is FirTypeProjectionWithVariance -> { + val typeRef = argument.typeRef as FirResolvedTypeRef + buildTypeProjectionWithVariance { + source = argument.source + this.typeRef = typeRef.withReplacedConeType(type) + variance = argument.variance + } + } + else -> { + buildTypeProjectionWithVariance { + source = argument?.source + typeRef = buildResolvedTypeRef { + this.type = type + } + variance = Variance.INVARIANT + } + } + } + } + } + + private fun computeTypeArgumentTypes( candidate: Candidate, ): List { val declaration = candidate.symbol.phasedFir as? FirCallableMemberDeclaration<*> ?: return emptyList() diff --git a/compiler/fir/resolve/testData/resolve/expresssions/extensionPropertyInLambda.txt b/compiler/fir/resolve/testData/resolve/expresssions/extensionPropertyInLambda.txt index 02ef71c036f..acd41b9fc22 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/extensionPropertyInLambda.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/extensionPropertyInLambda.txt @@ -20,7 +20,7 @@ FILE: extensionPropertyInLambda.kt } public final fun test1(): R|kotlin/Unit| { R|/use|( = use@fun (): R|kotlin/String| { - ^ R|/C.C|(String(abc)).R|/y| + ^ R|/C.C|(String(abc)).R|/y| } ) R|/use|(R|/C.C|(String(abc))::R|/y|) diff --git a/compiler/fir/resolve/testData/resolve/inference/simpleCapturedTypes.txt b/compiler/fir/resolve/testData/resolve/inference/simpleCapturedTypes.txt index 1ce4882d956..a9cb7e76358 100644 --- a/compiler/fir/resolve/testData/resolve/inference/simpleCapturedTypes.txt +++ b/compiler/fir/resolve/testData/resolve/inference/simpleCapturedTypes.txt @@ -21,8 +21,8 @@ FILE: simpleCapturedTypes.kt private final fun getSetterInfos(kc: R|KC|): R|kotlin/Unit| { R|/id|(R|/kc|).R|FakeOverride|.R|/Ann.foo|() R|/kc|.R|/idR|().R|FakeOverride|.R|/Ann.foo|() - R|/kc|.R|/idP|.R|FakeOverride|.R|/Ann.foo|() + R|/kc|.R|/idP|.R|FakeOverride|.R|/Ann.foo|() lval x1: R|KC| = R|/id|(R|/kc|) lval x2: R|KC| = R|/kc|.R|/idR|() - lval x3: R|KC| = R|/kc|.R|/idP| + lval x3: R|KC| = R|/kc|.R|/idP| } diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/classLiteralForParameter.txt b/compiler/fir/resolve/testData/resolveWithStdlib/classLiteralForParameter.txt index 5d56dc6d257..8ac2cf4b1ff 100644 --- a/compiler/fir/resolve/testData/resolveWithStdlib/classLiteralForParameter.txt +++ b/compiler/fir/resolve/testData/resolveWithStdlib/classLiteralForParameter.txt @@ -1,5 +1,5 @@ FILE: classLiteralForParameter.kt public final inline fun foo(t: R|T|): R|T| { - lval klass: R|java/lang/Class| = (R|T|).R|kotlin/jvm/java| + lval klass: R|java/lang/Class| = (R|T|).R|kotlin/jvm/java| ^foo R|/t| } diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/j+k/LoggerInstance.txt b/compiler/fir/resolve/testData/resolveWithStdlib/j+k/LoggerInstance.txt index 98000890a3f..5ee849464da 100644 --- a/compiler/fir/resolve/testData/resolveWithStdlib/j+k/LoggerInstance.txt +++ b/compiler/fir/resolve/testData/resolveWithStdlib/j+k/LoggerInstance.txt @@ -7,7 +7,7 @@ FILE: test.kt super() } - private final val klass: R|java/lang/Class| = (this@R|/MyTest|).R|kotlin/jvm/java| + private final val klass: R|java/lang/Class| = (this@R|/MyTest|).R|kotlin/jvm/java| private get(): R|java/lang/Class| private final val logger: R|ft!| = Q|Logger|.R|/Logger.getInstance|(this@R|/MyTest|.R|/MyTest.klass|) diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/j+k/StaticGenericMethod.txt b/compiler/fir/resolve/testData/resolveWithStdlib/j+k/StaticGenericMethod.txt index a3353d2d2c6..61f0fa633ed 100644 --- a/compiler/fir/resolve/testData/resolveWithStdlib/j+k/StaticGenericMethod.txt +++ b/compiler/fir/resolve/testData/resolveWithStdlib/j+k/StaticGenericMethod.txt @@ -13,7 +13,7 @@ FILE: User.kt protected abstract fun createSettings(): R|T| public final fun foo(): R|kotlin/Unit| { - this@R|/User|.R|/User.settings| = Q|StaticOwner|.R|/StaticOwner.newInstance|!|>(this@R|/User|.R|/User.settings|.R|kotlin/jvm/javaClass|) + this@R|/User|.R|/User.settings| = Q|StaticOwner|.R|/StaticOwner.newInstance|!|>(this@R|/User|.R|/User.settings|.R|kotlin/jvm/javaClass|!|>) } } diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/reflectionClass.txt b/compiler/fir/resolve/testData/resolveWithStdlib/reflectionClass.txt index d126742e61b..72e3f2adbd3 100644 --- a/compiler/fir/resolve/testData/resolveWithStdlib/reflectionClass.txt +++ b/compiler/fir/resolve/testData/resolveWithStdlib/reflectionClass.txt @@ -1,9 +1,9 @@ FILE: reflectionClass.kt - public final val javaClass: R|java/lang/Class| = (Q|kotlin/String|).R|kotlin/jvm/java| + public final val javaClass: R|java/lang/Class| = (Q|kotlin/String|).R|kotlin/jvm/java| public get(): R|java/lang/Class| public final val kotlinClass: R|kotlin/reflect/KClass| = (Q|kotlin/String|) public get(): R|kotlin/reflect/KClass| public final fun foo(): R|kotlin/Unit| { - lval stringClass: R|java/lang/Class| = (Q|kotlin/String|).R|kotlin/jvm/java| - lval arrayStringClass: R|java/lang/Class>| = (Q|kotlin/Array|).R|kotlin/jvm/java| + lval stringClass: R|java/lang/Class| = (Q|kotlin/String|).R|kotlin/jvm/java| + lval arrayStringClass: R|java/lang/Class>| = (Q|kotlin/Array|).R|kotlin/jvm/java||> } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt index 0353be33b94..540df0cf449 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessWithoutCallee.kt @@ -25,6 +25,8 @@ interface FirQualifiedAccessWithoutCallee : FirStatement { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitQualifiedAccessWithoutCallee(this, data) + fun replaceTypeArguments(newTypeArguments: List) + fun transformTypeArguments(transformer: FirTransformer, data: D): FirQualifiedAccessWithoutCallee fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccessWithoutCallee diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt index 7ee7ecb0096..ebd60b4b57d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedQualifier.kt @@ -33,5 +33,7 @@ abstract class FirResolvedQualifier : FirExpression() { abstract fun replaceSafe(newSafe: Boolean) + abstract fun replaceTypeArguments(newTypeArguments: List) + abstract fun transformTypeArguments(transformer: FirTransformer, data: D): FirResolvedQualifier } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt index fb8f2c2dc8a..b9892e6f65b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt @@ -109,4 +109,9 @@ internal class FirArraySetCallImpl( indexes.transformInplace(transformer, data) return this } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt index 57bda357a36..29aea55d4bc 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt @@ -88,4 +88,9 @@ internal class FirCallableReferenceAccessImpl( override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt index 1284934fa7d..8f1610f4044 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt @@ -95,4 +95,9 @@ internal class FirComponentCallImpl( override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt index f675348147a..92c8398455f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt @@ -97,4 +97,9 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor( override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt index cb973c9b610..18dda94dc8c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirModifiableQualifiedAccess.kt @@ -35,4 +35,6 @@ interface FirModifiableQualifiedAccess : FirQualifiedAccessWithoutCallee { override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess override fun transformExtensionReceiver(transformer: FirTransformer, data: D): FirModifiableQualifiedAccess + + override fun replaceTypeArguments(newTypeArguments: List) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt index 4c9d3683231..9123365f849 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt @@ -88,4 +88,9 @@ internal class FirQualifiedAccessExpressionImpl( override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt index c6496a65ab2..a3156837fcb 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedQualifierImpl.kt @@ -59,4 +59,9 @@ internal class FirResolvedQualifierImpl( override fun replaceSafe(newSafe: Boolean) { safe = newSafe } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt index f8c489ab91c..2c0f9d594b0 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt @@ -90,4 +90,9 @@ internal class FirThisReceiverExpressionImpl( override fun replaceTypeRef(newTypeRef: FirTypeRef) { typeRef = newTypeRef } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt index 4968546cf90..2a10bace662 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirVariableAssignmentImpl.kt @@ -94,4 +94,9 @@ internal class FirVariableAssignmentImpl( rValue = rValue.transformSingle(transformer, data) return this } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt index e388530f56b..d789c32eb1f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt @@ -67,5 +67,9 @@ internal class FirExpressionWithSmartcastImpl( throw IllegalStateException() } + override fun replaceTypeArguments(newTypeArguments: List) { + throw IllegalStateException() + } + override fun replaceTypeRef(newTypeRef: FirTypeRef) {} } \ No newline at end of file diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt index 435f7078499..0842ba3f6e6 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt @@ -29,7 +29,7 @@ object FieldSets { ) val typeArguments = - fieldList("typeArguments", typeProjection) + fieldList("typeArguments", typeProjection, withReplace = true) val arguments = fieldList("arguments", expression) diff --git a/compiler/testData/ir/irText/expressions/classReference.fir.txt b/compiler/testData/ir/irText/expressions/classReference.fir.txt index c9407ec9fd0..7050f78d46b 100644 --- a/compiler/testData/ir/irText/expressions/classReference.fir.txt +++ b/compiler/testData/ir/irText/expressions/classReference.fir.txt @@ -24,9 +24,5 @@ FILE fqName: fileName:/classReference.kt GET_OBJECT 'CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit GET_CLASS type=kotlin.reflect.KClass<.A> CONSTRUCTOR_CALL 'public constructor () [primary] declared in .A' type=.A origin=null - CALL 'public final fun (): java.lang.Class> declared in kotlin.jvm' type=java.lang.Class<.A> origin=null - $receiver: GET_CLASS type=kotlin.reflect.KClass<.A> - GET_OBJECT 'CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit - CALL 'public final fun (): java.lang.Class> declared in kotlin.jvm' type=java.lang.Class<.A> origin=null - $receiver: GET_CLASS type=kotlin.reflect.KClass<.A> - CONSTRUCTOR_CALL 'public constructor () [primary] declared in .A' type=.A origin=null + ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=java.lang.Class<.A> + ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=java.lang.Class<.A> diff --git a/compiler/testData/ir/irText/expressions/genericPropertyCall.fir.txt b/compiler/testData/ir/irText/expressions/genericPropertyCall.fir.txt index e0ab8f6d14e..51c5b31aa5d 100644 --- a/compiler/testData/ir/irText/expressions/genericPropertyCall.fir.txt +++ b/compiler/testData/ir/irText/expressions/genericPropertyCall.fir.txt @@ -9,8 +9,7 @@ FILE fqName: fileName:/genericPropertyCall.kt PROPERTY name:test visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.String visibility:private [final,static] EXPRESSION_BODY - CALL 'public final fun (): T of declared in ' type=kotlin.String origin=null - $receiver: CONST String type=kotlin.String value="abc" + ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=kotlin.String FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:test visibility:public modality:FINAL [val] BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/objectClassReference.fir.txt b/compiler/testData/ir/irText/expressions/objectClassReference.fir.txt index fb45386c92b..c7bdd8b39c7 100644 --- a/compiler/testData/ir/irText/expressions/objectClassReference.fir.txt +++ b/compiler/testData/ir/irText/expressions/objectClassReference.fir.txt @@ -22,6 +22,4 @@ FILE fqName: fileName:/objectClassReference.kt BLOCK_BODY GET_CLASS type=kotlin.reflect.KClass<.A> GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=.A - CALL 'public final fun (): java.lang.Class> declared in kotlin.jvm' type=java.lang.Class<.A> origin=null - $receiver: GET_CLASS type=kotlin.reflect.KClass<.A> - GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=.A + ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=java.lang.Class<.A> diff --git a/compiler/testData/ir/irText/expressions/useImportedMember.fir.txt b/compiler/testData/ir/irText/expressions/useImportedMember.fir.txt index 5200eedef76..986613a24fe 100644 --- a/compiler/testData/ir/irText/expressions/useImportedMember.fir.txt +++ b/compiler/testData/ir/irText/expressions/useImportedMember.fir.txt @@ -229,9 +229,7 @@ FILE fqName: fileName:/useImportedMember.kt BRANCH if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ $this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ - arg0: CALL 'public final fun (): T of declared in .C' type=kotlin.String origin=null - $this: CONST String type=kotlin.String value="8" - $receiver: CONST String type=kotlin.String value="8" + arg0: ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=kotlin.String arg1: CONST String type=kotlin.String value="8" then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in ' CONST String type=kotlin.String value="8" @@ -250,9 +248,7 @@ FILE fqName: fileName:/useImportedMember.kt BRANCH if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ $this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ - arg0: CALL 'public final fun (): T of declared in .BaseClass' type=kotlin.String origin=null - $this: CONST String type=kotlin.String value="10" - $receiver: CONST String type=kotlin.String value="10" + arg0: ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=kotlin.String arg1: CONST String type=kotlin.String value="10" then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in ' CONST String type=kotlin.String value="10" diff --git a/compiler/testData/ir/irText/expressions/variableAsFunctionCallWithGenerics.fir.txt b/compiler/testData/ir/irText/expressions/variableAsFunctionCallWithGenerics.fir.txt index b8a4afa81bb..059d4779046 100644 --- a/compiler/testData/ir/irText/expressions/variableAsFunctionCallWithGenerics.fir.txt +++ b/compiler/testData/ir/irText/expressions/variableAsFunctionCallWithGenerics.fir.txt @@ -15,8 +15,7 @@ FILE fqName: fileName:/variableAsFunctionCallWithGenerics.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun testGeneric1 (x: kotlin.String): T of declared in ' CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of origin=INVOKE - $this: CALL 'public final fun (): kotlin.Function0> declared in ' type=kotlin.Function0 origin=null - $receiver: GET_VAR 'x: kotlin.String declared in .testGeneric1' type=kotlin.String origin=null + $this: ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=kotlin.Function0 PROPERTY name:kt26531Val visibility:public modality:FINAL [val] FUN name: visibility:public modality:FINAL <> ($receiver:T of ) returnType:kotlin.Function0> correspondingProperty: PROPERTY name:kt26531Val visibility:public modality:FINAL [val] @@ -32,5 +31,4 @@ FILE fqName: fileName:/variableAsFunctionCallWithGenerics.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun kt26531 (): T of declared in ' CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=T of origin=INVOKE - $this: CALL 'public final fun (): kotlin.Function0> declared in ' type=kotlin.Function0 origin=null - $receiver: CONST Int type=kotlin.Int value=7 + $this: ERROR_EXPR 'Cannot bind 1 type arguments to call with 0 type parameters' type=kotlin.Function0