[FIR] Add fir node for binary && and ||

This commit is contained in:
Dmitriy Novozhilov
2019-08-14 15:08:46 +03:00
parent 908b6ade1d
commit ba7a137e74
14 changed files with 201 additions and 72 deletions
@@ -949,4 +949,10 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
}
print("|")
}
override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) {
binaryLogicExpression.leftOperand.accept(this)
print(" ${binaryLogicExpression.kind.token} ")
binaryLogicExpression.rightOperand.accept(this)
}
}
@@ -0,0 +1,34 @@
/*
* 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 com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirBinaryLogicExpression(psi: PsiElement?) : FirUnknownTypeExpression(psi) {
abstract val leftOperand: FirExpression
abstract val rightOperand: FirExpression
abstract val kind: OperationKind
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return visitor.visitBinaryLogicExpression(this, data)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data)
leftOperand.accept(visitor, data)
rightOperand.accept(visitor, data)
}
abstract fun <D> transformLeftOperand(transformer: FirTransformer<D>, data: D): FirBinaryLogicExpression
abstract fun <D> transformRightOperand(transformer: FirTransformer<D>, data: D): FirBinaryLogicExpression
enum class OperationKind(val token: String) {
AND("&&"), OR("||")
}
}
@@ -0,0 +1,36 @@
/*
* 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.FirElement
import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirBinaryLogicExpressionImpl(
psi: PsiElement?,
override var leftOperand: FirExpression,
override var rightOperand: FirExpression,
override val kind: OperationKind
) : FirBinaryLogicExpression(psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
transformLeftOperand(transformer, data)
transformRightOperand(transformer, data)
return super.transformChildren(transformer, data)
}
override fun <D> transformLeftOperand(transformer: FirTransformer<D>, data: D): FirBinaryLogicExpression {
leftOperand = leftOperand.transformSingle(transformer, data)
return this
}
override fun <D> transformRightOperand(transformer: FirTransformer<D>, data: D): FirBinaryLogicExpression {
rightOperand = rightOperand.transformSingle(transformer, data)
return this
}
}
@@ -6,7 +6,9 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.types.*
@@ -280,6 +282,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformExpression(unknownTypeExpression, data)
}
open fun transformBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(binaryLogicExpression, data)
}
open fun transformBlock(block: FirBlock, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(block, data)
}
@@ -496,6 +502,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformBackingFieldReference(backingFieldReference, data)
}
final override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): CompositeTransformResult<FirElement> {
return transformBinaryLogicExpression(binaryLogicExpression, data)
}
final override fun visitBlock(block: FirBlock, data: D): CompositeTransformResult<FirElement> {
return transformBlock(block, data)
}
@@ -6,7 +6,9 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.types.*
@@ -280,6 +282,10 @@ abstract class FirVisitor<out R, in D> {
return visitExpression(unknownTypeExpression, data)
}
open fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: D): R {
return visitUnknownTypeExpression(binaryLogicExpression, data)
}
open fun visitBlock(block: FirBlock, data: D): R {
return visitUnknownTypeExpression(block, data)
}
@@ -6,7 +6,9 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.types.*
@@ -280,6 +282,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitExpression(unknownTypeExpression, null)
}
open fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) {
visitUnknownTypeExpression(binaryLogicExpression, null)
}
open fun visitBlock(block: FirBlock) {
visitUnknownTypeExpression(block, null)
}
@@ -496,6 +502,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitBackingFieldReference(backingFieldReference)
}
final override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: Nothing?) {
visitBinaryLogicExpression(binaryLogicExpression)
}
final override fun visitBlock(block: FirBlock, data: Nothing?) {
visitBlock(block)
}