[FIR] Add FirPropertyAccessExpression that inherits FirQualifiedAccessExpression

This commit is contained in:
Ivan Kochurkin
2021-08-11 19:02:13 +03:00
parent 0fb398d45e
commit 8d764fa50e
56 changed files with 201 additions and 101 deletions
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedReifiedParameterReference
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.references.builder.buildBackingFieldReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
@@ -287,7 +286,7 @@ class FirCallResolver(
nameReference.source,
qualifiedAccess.explicitReceiver,
referencedSymbol,
(qualifiedAccess as? FirQualifiedAccessExpressionImpl)?.nonFatalDiagnostics
(qualifiedAccess as? FirPropertyAccessExpression)?.nonFatalDiagnostics
)
)
}
@@ -124,12 +124,10 @@ class CandidateFactory private constructor(
fun PostponedArgumentsAnalyzerContext.addSubsystemFromExpression(statement: FirStatement) {
when (statement) {
is FirFunctionCall,
is FirQualifiedAccessExpression,
is FirWhenExpression,
is FirTryExpression,
is FirCheckNotNullCall,
is FirCallableReferenceAccess,
is FirElvisExpression
-> (statement as FirResolvable).candidate()?.let { addOtherSystem(it.system.asReadOnlyStorage()) }
@@ -8,10 +8,9 @@ package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirPropertyAccessExpressionBuilder
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
@@ -278,7 +277,7 @@ private fun BodyResolveComponents.createExplicitReceiverForInvokeByCallable(
extensionReceiverExpression: FirExpression,
symbol: FirCallableSymbol<*>
): FirExpression {
return FirQualifiedAccessExpressionBuilder().apply {
return FirPropertyAccessExpressionBuilder().apply {
calleeReference = FirNamedReferenceWithCandidate(
null,
symbol.callableId.callableName,
@@ -170,6 +170,13 @@ class FirCallCompletionResultsWriterTransformer(
return result
}
override fun transformPropertyAccessExpression(
propertyAccessExpression: FirPropertyAccessExpression,
data: ExpectedArgumentType?
): FirStatement {
return transformQualifiedAccessExpression(propertyAccessExpression, data)
}
override fun transformFunctionCall(functionCall: FirFunctionCall, data: ExpectedArgumentType?): FirStatement {
val calleeReference = functionCall.calleeReference as? FirNamedReferenceWithCandidate
?: return functionCall
@@ -406,6 +413,10 @@ class FirCallCompletionResultsWriterTransformer(
session.lookupTracker?.recordTypeResolveAsLookup(resolvedTypeRef, qualifiedAccessExpression.source, null)
return qualifiedAccessExpression
}
override fun transformPropertyAccessExpression(propertyAccessExpression: FirPropertyAccessExpression, data: Any?): FirStatement {
return transformQualifiedAccessExpression(propertyAccessExpression, data)
}
}
private fun FirTypeRef.substitute(candidate: Candidate): ConeKotlinType =
@@ -103,6 +103,13 @@ open class FirBodyResolveTransformer(
return expressionsTransformer.transformQualifiedAccessExpression(qualifiedAccessExpression, data)
}
override fun transformPropertyAccessExpression(
propertyAccessExpression: FirPropertyAccessExpression,
data: ResolutionMode
): FirStatement {
return expressionsTransformer.transformQualifiedAccessExpression(propertyAccessExpression, data)
}
override fun transformFunctionCall(functionCall: FirFunctionCall, data: ResolutionMode): FirStatement {
return expressionsTransformer.transformFunctionCall(functionCall, data)
}
@@ -153,6 +153,13 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
return result
}
override fun transformPropertyAccessExpression(
propertyAccessExpression: FirPropertyAccessExpression,
data: ResolutionMode
): FirStatement {
return transformQualifiedAccessExpression(propertyAccessExpression, data)
}
protected open fun resolveQualifiedAccessAndSelectCandidate(qualifiedAccessExpression: FirQualifiedAccessExpression): FirStatement {
return callResolver.resolveVariableAccessAndSelectCandidate(qualifiedAccessExpression)
}
@@ -138,6 +138,13 @@ class ConeEffectExtractor(
return toValueParameterReference(type, index, name)
}
override fun visitPropertyAccessExpression(
propertyAccessExpression: FirPropertyAccessExpression,
data: Nothing?
): ConeContractDescriptionElement? {
return visitQualifiedAccessExpression(propertyAccessExpression, data)
}
private fun toValueParameterReference(
type: ConeKotlinType,
index: Int,
@@ -43,7 +43,6 @@ class FirIntegerOperatorCall @FirImplementationDetail constructor(
explicitReceiver,
dispatchReceiver,
extensionReceiver,
mutableListOf(),
argumentList,
calleeReference,
FirFunctionCallOrigin.Operator