FIR: Remove FirQualifiedAcces.safe in non-generated code

^KT-38444 In Progress
This commit is contained in:
Denis Zharkov
2020-06-02 12:35:54 +03:00
parent 55a4c40970
commit 291afd8448
18 changed files with 11 additions and 70 deletions
@@ -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 {
+"."
}
+"."
}
}
@@ -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
@@ -473,7 +473,6 @@ abstract class BaseFirBuilder<T>(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<T>(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<T>(val baseSession: FirSession, val context: Conte
val assignment = buildVariableAssignment {
source = baseSource
safe = false
rValue = value
calleeReference = nestedAccess.calleeReference
explicitReceiver = safeCallNonAssignment.checkedSubject.value
@@ -1705,7 +1705,6 @@ class RawFirBuilder(
return firSelector.wrapWithSafeCall(receiver)
}
firSelector.safe = false
firSelector.explicitReceiver = receiver
}
return firSelector
@@ -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<FirTypeProjection> = 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
}
}
@@ -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 <T : FirQualifiedAccess> 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,
@@ -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
}
}
}
@@ -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 <T : FirResolvable> 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 <T : FirResolvable> 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
@@ -36,7 +36,6 @@ data class CallInfo(
val explicitReceiver: FirExpression?,
val argumentList: FirArgumentList,
val isSafeCall: Boolean,
val isPotentialQualifierPart: Boolean,
val typeArguments: List<FirTypeProjection>,
@@ -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)
}
@@ -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)
@@ -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<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext)
it.withReplacedConeType(nullableType)
} else {
it
}
}
typeCalculator.tryCalculateReturnType(declaration)
} else {
buildErrorTypeRef {
source = calleeReference.source
@@ -153,7 +153,6 @@ class FirSyntheticCallGenerator(
name = name,
explicitReceiver = null,
argumentList = argumentList,
isSafeCall = false,
isPotentialQualifierPart = false,
typeArguments = emptyList(),
session = session,
@@ -222,7 +222,6 @@ private fun FirFunctionCall.toOperatorCall(): FirIntegerOperatorCall {
source,
typeRef,
annotations.toMutableList(),
safe,
typeArguments.toMutableList(),
explicitReceiver,
dispatchReceiver,
@@ -344,7 +344,6 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
val assignment =
buildVariableAssignment {
source = operatorCall.source
safe = false
rValue = resolvedOperatorCall
calleeReference = if (lhsIsVar)
lhsReference!!
@@ -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<FirAnnotationCall>,
safe: Boolean,
typeArguments: MutableList<FirTypeProjection>,
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<FirAnnotationCall> = mutableListOf()
override var safe: Boolean = false
override val typeArguments: MutableList<FirTypeProjection> = 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,
@@ -1006,11 +1006,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
}
}
if (hasSomeReceiver) {
if (qualifiedAccess.safe) {
print("?.")
} else {
print(".")
}
print(".")
}
}
@@ -30,7 +30,6 @@ internal class FirExpressionWithSmartcastImpl(
override val source: FirSourceElement? get() = originalExpression.source
override val annotations: List<FirAnnotationCall> get() = originalExpression.annotations
override val safe: Boolean get() = originalExpression.safe
override val typeArguments: List<FirTypeProjection> 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) {}
}
}