FIR: Remove FirQualifiedAcces.safe in non-generated code
^KT-38444 In Progress
This commit is contained in:
@@ -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 {
|
||||
+"."
|
||||
}
|
||||
+"."
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-2
@@ -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>,
|
||||
|
||||
-1
@@ -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)
|
||||
|
||||
+1
-9
@@ -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
|
||||
|
||||
-1
@@ -153,7 +153,6 @@ class FirSyntheticCallGenerator(
|
||||
name = name,
|
||||
explicitReceiver = null,
|
||||
argumentList = argumentList,
|
||||
isSafeCall = false,
|
||||
isPotentialQualifierPart = false,
|
||||
typeArguments = emptyList(),
|
||||
session = session,
|
||||
|
||||
-1
@@ -222,7 +222,6 @@ private fun FirFunctionCall.toOperatorCall(): FirIntegerOperatorCall {
|
||||
source,
|
||||
typeRef,
|
||||
annotations.toMutableList(),
|
||||
safe,
|
||||
typeArguments.toMutableList(),
|
||||
explicitReceiver,
|
||||
dispatchReceiver,
|
||||
|
||||
-1
@@ -344,7 +344,6 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
val assignment =
|
||||
buildVariableAssignment {
|
||||
source = operatorCall.source
|
||||
safe = false
|
||||
rValue = resolvedOperatorCall
|
||||
calleeReference = if (lhsIsVar)
|
||||
lhsReference!!
|
||||
|
||||
-5
@@ -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(".")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -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) {}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user