[FIR] Add fir node for qualified access with smartcast
This commit is contained in:
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirReference
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
|
||||
abstract class FirExpressionWithSmartcast(
|
||||
open val originalExpression: FirQualifiedAccessExpression,
|
||||
val typesFromSmartcast: Collection<ConeKotlinType>
|
||||
) : FirQualifiedAccessExpression(originalExpression.psi) {
|
||||
val originalType: FirTypeRef get() = originalExpression.typeRef
|
||||
|
||||
final override val safe: Boolean
|
||||
get() = originalExpression.safe
|
||||
|
||||
final override val explicitReceiver: FirExpression?
|
||||
get() = originalExpression.explicitReceiver
|
||||
|
||||
final override val dispatchReceiver: FirExpression
|
||||
get() = originalExpression.dispatchReceiver
|
||||
|
||||
final override val extensionReceiver: FirExpression
|
||||
get() = originalExpression.extensionReceiver
|
||||
|
||||
final override val calleeReference: FirReference
|
||||
get() = originalExpression.calleeReference
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
originalExpression.acceptChildren(visitor, data)
|
||||
}
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
|
||||
class FirExpressionWithSmartcastImpl(
|
||||
override var originalExpression: FirQualifiedAccessExpression,
|
||||
typesFromSmartcast: Collection<ConeKotlinType>
|
||||
) : FirExpressionWithSmartcast(originalExpression, typesFromSmartcast) {
|
||||
init {
|
||||
assert(originalExpression.typeRef is FirResolvedTypeRef)
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
originalExpression = originalExpression.transformSingle(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
+8
@@ -314,6 +314,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
||||
return transformUnknownTypeExpression(errorExpression, data)
|
||||
}
|
||||
|
||||
open fun transformExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): CompositeTransformResult<FirStatement> {
|
||||
return transformUnknownTypeExpression(expressionWithSmartcast, data)
|
||||
}
|
||||
|
||||
open fun transformQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): CompositeTransformResult<FirStatement> {
|
||||
return transformUnknownTypeExpression(qualifiedAccessExpression, data)
|
||||
}
|
||||
@@ -630,6 +634,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
||||
return transformExpression(expression, data)
|
||||
}
|
||||
|
||||
final override fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): CompositeTransformResult<FirElement> {
|
||||
return transformExpressionWithSmartcast(expressionWithSmartcast, data)
|
||||
}
|
||||
|
||||
final override fun visitField(field: FirField, data: D): CompositeTransformResult<FirElement> {
|
||||
return transformField(field, data)
|
||||
}
|
||||
|
||||
@@ -314,6 +314,10 @@ abstract class FirVisitor<out R, in D> {
|
||||
return visitUnknownTypeExpression(errorExpression, data)
|
||||
}
|
||||
|
||||
open fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): R {
|
||||
return visitUnknownTypeExpression(expressionWithSmartcast, data)
|
||||
}
|
||||
|
||||
open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): R {
|
||||
return visitUnknownTypeExpression(qualifiedAccessExpression, data)
|
||||
}
|
||||
|
||||
+8
@@ -314,6 +314,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
||||
visitUnknownTypeExpression(errorExpression, null)
|
||||
}
|
||||
|
||||
open fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast) {
|
||||
visitUnknownTypeExpression(expressionWithSmartcast, null)
|
||||
}
|
||||
|
||||
open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
|
||||
visitUnknownTypeExpression(qualifiedAccessExpression, null)
|
||||
}
|
||||
@@ -630,6 +634,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
||||
visitExpression(expression)
|
||||
}
|
||||
|
||||
final override fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: Nothing?) {
|
||||
visitExpressionWithSmartcast(expressionWithSmartcast)
|
||||
}
|
||||
|
||||
final override fun visitField(field: FirField, data: Nothing?) {
|
||||
visitField(field)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user