From 291afd84486b2d682f32e83d703d696b057e67a2 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 2 Jun 2020 12:35:54 +0300 Subject: [PATCH] FIR: Remove FirQualifiedAcces.safe in non-generated code ^KT-38444 In Progress --- .../jetbrains/kotlin/fir/dump/HtmlFirDump.kt | 6 +---- .../generators/CallAndReferenceGenerator.kt | 2 -- .../kotlin/fir/builder/BaseFirBuilder.kt | 3 --- .../kotlin/fir/builder/RawFirBuilder.kt | 1 - .../src/org/jetbrains/kotlin/fir/CopyUtils.kt | 4 +--- .../jetbrains/kotlin/fir/FirCallResolver.kt | 6 +---- .../kotlin/fir/FirQualifiedNameResolver.kt | 7 +++--- .../kotlin/fir/resolve/ResolveUtils.kt | 22 ++----------------- .../kotlin/fir/resolve/calls/Candidate.kt | 1 - .../calls/tower/FirTowerResolverSession.kt | 1 - .../fir/resolve/calls/tower/TowerLevels.kt | 1 - ...rCallCompletionResultsWriterTransformer.kt | 10 +-------- .../transformers/FirSyntheticCallGenerator.kt | 1 - ...egerLiteralTypeApproximationTransformer.kt | 1 - .../FirExpressionsResolveTransformer.kt | 1 - .../fir/scopes/impl/FirIntegerOperatorCall.kt | 5 ----- .../org/jetbrains/kotlin/fir/FirRenderer.kt | 6 +---- .../impl/FirExpressionWithSmartcastImpl.kt | 3 +-- 18 files changed, 11 insertions(+), 70 deletions(-) diff --git a/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt b/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt index 6fae7563b5d..ccd46b93744 100644 --- a/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt +++ b/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt @@ -1304,11 +1304,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver val explicitReceiver = access.explicitReceiver if (explicitReceiver != null) { generate(explicitReceiver) - if (access.safe) { - +"?." - } else { - +"." - } + +"." } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index c8b50a61597..2f5931d1d26 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -118,8 +118,6 @@ internal class CallAndReferenceGenerator( typeRef: FirTypeRef, explicitReceiverExpression: IrExpression? ): IrExpression { - require(!qualifiedAccess.safe) - val type = typeRef.toIrType() val samConstructorCall = qualifiedAccess.tryConvertToSamConstructorCall(type) if (samConstructorCall != null) return samConstructorCall diff --git a/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index a9a4b0a41f2..34a092432ed 100644 --- a/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -473,7 +473,6 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte val firMemberAccess = left.convertQualified() return if (firMemberAccess != null) { explicitReceiver = firMemberAccess.explicitReceiver - safe = firMemberAccess.safe firMemberAccess.calleeReference } else { buildErrorNamedReference { @@ -546,7 +545,6 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte return buildVariableAssignment { source = baseSource - safe = false rValue = value calleeReference = initializeLValue(this@generateAssignment) { convert() as? FirQualifiedAccess } } @@ -562,7 +560,6 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte val assignment = buildVariableAssignment { source = baseSource - safe = false rValue = value calleeReference = nestedAccess.calleeReference explicitReceiver = safeCallNonAssignment.checkedSubject.value diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 7beb8c23f81..ea1150180d3 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1705,7 +1705,6 @@ class RawFirBuilder( return firSelector.wrapWithSafeCall(receiver) } - firSelector.safe = false firSelector.explicitReceiver = receiver } return firSelector diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt index 6ba2f56c889..e9428d01a51 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt @@ -32,7 +32,6 @@ fun FirFunctionCall.copy( dispatchReceiver: FirExpression = this.dispatchReceiver, extensionReceiver: FirExpression = this.extensionReceiver, source: FirSourceElement? = this.source, - safe: Boolean = this.safe, typeArguments: List = this.typeArguments, resultType: FirTypeRef = this.typeRef ): FirFunctionCall { @@ -47,7 +46,6 @@ fun FirFunctionCall.copy( } builder.apply { this.source = source - this.safe = safe this.annotations.addAll(annotations) this.argumentList = argumentList this.explicitReceiver = explicitReceiver @@ -165,4 +163,4 @@ fun FirCheckNotNullCall.copy( argumentList = this@copy.argumentList this.typeRef = resultType this.annotations += annotations -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index c8f7dbde425..5b223356189 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -88,7 +88,6 @@ class FirCallResolver( dispatchReceiver = candidate.dispatchReceiverExpression(), extensionReceiver = candidate.extensionReceiverExpression(), argumentList = candidate.callInfo.argumentList, - safe = candidate.callInfo.isSafeCall, ) } else { resultExpression @@ -114,7 +113,6 @@ class FirCallResolver( name, explicitReceiver, argumentList, - qualifiedAccess.safe, isPotentialQualifierPart = qualifiedAccess !is FirFunctionCall && qualifiedAccess.explicitReceiver is FirResolvedQualifier && qualifiedResolver.isPotentialQualifierPartPosition(), @@ -151,7 +149,7 @@ class FirCallResolver( fun resolveVariableAccessAndSelectCandidate(qualifiedAccess: T): FirStatement { val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess - qualifiedResolver.initProcessingQualifiedAccess(qualifiedAccess, callee) + qualifiedResolver.initProcessingQualifiedAccess(callee) @Suppress("NAME_SHADOWING") val qualifiedAccess = qualifiedAccess.transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) @@ -274,7 +272,6 @@ class FirCallResolver( name, explicitReceiver = null, delegatedConstructorCall.argumentList, - isSafeCall = false, isPotentialQualifierPart = false, typeArguments = typeArguments, session, @@ -329,7 +326,6 @@ class FirCallResolver( callableReferenceAccess.calleeReference.name, callableReferenceAccess.explicitReceiver, FirEmptyArgumentList, - false, isPotentialQualifierPart = false, emptyList(), session, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt index d38a29b61d3..74d96de7f46 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirQualifiedNameResolver.kt @@ -40,8 +40,8 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC */ fun isPotentialQualifierPartPosition() = qualifierStack.size > 1 - fun initProcessingQualifiedAccess(qualifiedAccess: FirQualifiedAccess, callee: FirSimpleNamedReference) { - if (qualifiedAccess.safe || callee.name.isSpecial) { + fun initProcessingQualifiedAccess(callee: FirSimpleNamedReference) { + if (callee.name.isSpecial) { qualifierStack.clear() } else { qualifierStack.add(callee.name) @@ -78,7 +78,6 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC this.source = source packageFqName = resolved.packageFqName relativeClassFqName = resolved.relativeClassFqName - safe = false symbol = resolved.classSymbol }.apply { resultType = typeForQualifier(this) @@ -88,4 +87,4 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC return null } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index f518fa5de42..84a9572a2ba 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue -import org.jetbrains.kotlin.fir.resolve.calls.isSuperReferenceExpression import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider @@ -263,7 +262,6 @@ fun BodyResolveComponents.buildResolvedQualifierForClass( source = sourceElement packageFqName = classId.packageFqName relativeClassFqName = classId.relativeClassName - safe = false typeArguments.addAll(typeArgumentsForQualifier) symbol = regularClass }.apply { @@ -318,22 +316,6 @@ internal fun typeForQualifierByDeclaration(declaration: FirDeclaration, resultTy } fun BodyResolveComponents.typeFromCallee(access: T): FirResolvedTypeRef { - val makeNullable: Boolean by lazy { - if (access is FirQualifiedAccess && access.safe) { - val explicitReceiver = access.explicitReceiver - ?: throw AssertionError("Safe call without explicit receiver: ${access.render()}") - val receiverResultType = explicitReceiver.resultType - if (receiverResultType is FirResolvedTypeRef) { - receiverResultType.type.isNullable - } else if (receiverResultType !is FirComposedSuperTypeRef || !explicitReceiver.isSuperReferenceExpression()){ - throw AssertionError("Receiver ${explicitReceiver.render()} type is unresolved: ${receiverResultType.render()}") - } else { - false - } - } else { - false - } - } return when (val newCallee = access.calleeReference) { is FirErrorNamedReference -> @@ -342,10 +324,10 @@ fun BodyResolveComponents.typeFromCallee(access: T): FirReso diagnostic = ConeStubDiagnostic(newCallee.diagnostic) } is FirNamedReferenceWithCandidate -> { - typeFromSymbol(newCallee.candidateSymbol, makeNullable) + typeFromSymbol(newCallee.candidateSymbol, false) } is FirResolvedNamedReference -> { - typeFromSymbol(newCallee.resolvedSymbol, makeNullable) + typeFromSymbol(newCallee.resolvedSymbol, false) } is FirThisReference -> { val labelName = newCallee.labelName diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt index 7da3bd1f8a4..aa2f2e7ef60 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt @@ -36,7 +36,6 @@ data class CallInfo( val explicitReceiver: FirExpression?, val argumentList: FirArgumentList, - val isSafeCall: Boolean, val isPotentialQualifierPart: Boolean, val typeArguments: List, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt index 85da8f283d4..f62c1dd7a84 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt @@ -678,7 +678,6 @@ private fun BodyResolveComponents.createExplicitReceiverForInvokeByCallable( extensionReceiver = extensionReceiverExpression // NB: this should fix problem in DFA (KT-36014) explicitReceiver = info.explicitReceiver - safe = info.isSafeCall } }.build().let(::transformQualifiedAccessUsingSmartcastInfo) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index 5b0ae5aafc0..1180f125f9b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -216,7 +216,6 @@ class ScopeTowerLevel( val resolvedQualifier = buildResolvedQualifier { packageFqName = holderId.packageFqName relativeClassFqName = holderId.relativeClassName - safe = false this.symbol = symbol }.apply { resultType = bodyResolveComponents.typeForQualifier(this) 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 ed64474ec3b..031f7c6ad90 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 @@ -61,15 +61,7 @@ class FirCallCompletionResultsWriterTransformer( val declaration = subCandidate.symbol.phasedFir val typeArguments = computeTypeArguments(qualifiedAccess, subCandidate) val typeRef = if (declaration is FirTypedDeclaration) { - typeCalculator.tryCalculateReturnType(declaration).let { - if (qualifiedAccess.safe) { - val nullableType = - it.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE, session.inferenceContext) - it.withReplacedConeType(nullableType) - } else { - it - } - } + typeCalculator.tryCalculateReturnType(declaration) } else { buildErrorTypeRef { source = calleeReference.source diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt index e2cc0fb6a25..d415a225692 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt @@ -153,7 +153,6 @@ class FirSyntheticCallGenerator( name = name, explicitReceiver = null, argumentList = argumentList, - isSafeCall = false, isPotentialQualifierPart = false, typeArguments = emptyList(), session = session, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/IntegerLiteralTypeApproximationTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/IntegerLiteralTypeApproximationTransformer.kt index bad1ea3ffee..206d30be8c6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/IntegerLiteralTypeApproximationTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/IntegerLiteralTypeApproximationTransformer.kt @@ -222,7 +222,6 @@ private fun FirFunctionCall.toOperatorCall(): FirIntegerOperatorCall { source, typeRef, annotations.toMutableList(), - safe, typeArguments.toMutableList(), explicitReceiver, dispatchReceiver, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 5b573fcd62d..8e04a89b17a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -344,7 +344,6 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : val assignment = buildVariableAssignment { source = operatorCall.source - safe = false rValue = resolvedOperatorCall calleeReference = if (lhsIsVar) lhsReference!! diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt index 7ad510304bb..2c57a67dbd1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerOperatorCall.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder @@ -28,7 +27,6 @@ class FirIntegerOperatorCall @FirImplementationDetail constructor( source: FirSourceElement?, typeRef: FirTypeRef, annotations: MutableList, - safe: Boolean, typeArguments: MutableList, explicitReceiver: FirExpression?, dispatchReceiver: FirExpression, @@ -39,7 +37,6 @@ class FirIntegerOperatorCall @FirImplementationDetail constructor( source, typeRef, annotations, - safe, typeArguments, explicitReceiver, dispatchReceiver, @@ -53,7 +50,6 @@ class FirIntegerOperatorCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, override var source: FirSourceElement? = null override var typeRef: FirTypeRef = buildImplicitTypeRef() override val annotations: MutableList = mutableListOf() - override var safe: Boolean = false override val typeArguments: MutableList = mutableListOf() override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression @@ -67,7 +63,6 @@ class FirIntegerOperatorCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, source, typeRef, annotations, - safe, typeArguments, explicitReceiver, dispatchReceiver, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 580eeeb82a2..8d6f55c1794 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -1006,11 +1006,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM } } if (hasSomeReceiver) { - if (qualifiedAccess.safe) { - print("?.") - } else { - print(".") - } + print(".") } } 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 d1947bc437d..cf1f022b5a1 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 @@ -30,7 +30,6 @@ internal class FirExpressionWithSmartcastImpl( override val source: FirSourceElement? get() = originalExpression.source override val annotations: List get() = originalExpression.annotations - override val safe: Boolean get() = originalExpression.safe override val typeArguments: List get() = originalExpression.typeArguments override val explicitReceiver: FirExpression? get() = originalExpression.explicitReceiver override val dispatchReceiver: FirExpression get() = originalExpression.dispatchReceiver @@ -80,4 +79,4 @@ internal class FirExpressionWithSmartcastImpl( } override fun replaceTypeRef(newTypeRef: FirTypeRef) {} -} \ No newline at end of file +}