[FIR] Introduce unchecked not-null cast as internal operation for !!, ?:

This commit is contained in:
Simon Ogorodnik
2019-05-15 15:48:26 +03:00
committed by Mikhail Glukhikh
parent b469eb293b
commit aa96837758
16 changed files with 138 additions and 43 deletions
@@ -919,4 +919,9 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitErrorExpression(errorExpression: FirErrorExpression) {
print("ERROR_EXPR(${errorExpression.reason})")
}
override fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast) {
uncheckedNotNullCast.expression.accept(this)
print("!")
}
}
@@ -0,0 +1,14 @@
/*
* 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.visitors.FirVisitor
interface FirUncheckedNotNullCast : FirCall {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitUncheckedNotNullCast(this, data)
val expression: FirExpression get() = arguments[0]
}
@@ -0,0 +1,24 @@
/*
* 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 com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirUncheckedNotNullCast
import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.types.FirTypeRef
class FirUncheckedNotNullCastImpl(
session: FirSession,
psi: PsiElement?,
expression: FirExpression
) : FirAbstractCall(session, psi), FirUncheckedNotNullCast {
init {
arguments += expression
}
}
@@ -236,6 +236,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformCall(stringConcatenationCall, data)
}
open fun transformUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): CompositeTransformResult<FirStatement> {
return transformCall(uncheckedNotNullCast, data)
}
open fun transformClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(classReferenceExpression, data)
}
@@ -732,6 +736,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformTypedDeclaration(typedDeclaration, data)
}
final override fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): CompositeTransformResult<FirElement> {
return transformUncheckedNotNullCast(uncheckedNotNullCast, data)
}
final override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: D): CompositeTransformResult<FirElement> {
return transformUserTypeRef(userTypeRef, data)
}
@@ -236,6 +236,10 @@ abstract class FirVisitor<out R, in D> {
return visitCall(stringConcatenationCall, data)
}
open fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): R {
return visitCall(uncheckedNotNullCast, data)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): R {
return visitExpression(classReferenceExpression, data)
}
@@ -236,6 +236,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCall(stringConcatenationCall, null)
}
open fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast) {
visitCall(uncheckedNotNullCast, null)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) {
visitExpression(classReferenceExpression, null)
}
@@ -732,6 +736,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitTypedDeclaration(typedDeclaration)
}
final override fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: Nothing?) {
visitUncheckedNotNullCast(uncheckedNotNullCast)
}
final override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: Nothing?) {
visitUserTypeRef(userTypeRef)
}