Raw FIR: set "implicit boolean" result type for some operator calls

This commit is contained in:
Mikhail Glukhikh
2019-04-02 15:12:25 +03:00
parent eb1aaad41b
commit 30697787a0
4 changed files with 37 additions and 6 deletions
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.fir.expressions
import java.util.*
enum class FirOperation(val operator: String = "???") {
// Binary
RANGE(".."),
@@ -37,6 +39,10 @@ enum class FirOperation(val operator: String = "???") {
OTHER;
companion object {
val ASSIGNMENTS = setOf(ASSIGN, PLUS_ASSIGN, MINUS_ASSIGN, TIMES_ASSIGN, DIV_ASSIGN, REM_ASSIGN)
val ASSIGNMENTS: Set<FirOperation> = EnumSet.of(ASSIGN, PLUS_ASSIGN, MINUS_ASSIGN, TIMES_ASSIGN, DIV_ASSIGN, REM_ASSIGN)
val BOOLEANS: Set<FirOperation> = EnumSet.of(
EQ, NOT_EQ, IDENTITY, NOT_IDENTITY, LT, GT, LT_EQ, GT_EQ, IN, NOT_IN, IS, NOT_IS
)
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. 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.FirOperation
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
abstract class FirAbstractOperationBasedCall(
session: FirSession,
psi: PsiElement?,
val operation: FirOperation
) : FirAbstractCall(session, psi) {
override var typeRef: FirTypeRef = if (operation in FirOperation.BOOLEANS) {
FirImplicitBooleanTypeRef(session, null)
} else {
FirImplicitTypeRefImpl(session, null)
}
}
@@ -13,5 +13,5 @@ import org.jetbrains.kotlin.fir.expressions.FirOperatorCall
class FirOperatorCallImpl(
session: FirSession,
psi: PsiElement?,
override val operation: FirOperation
) : FirAbstractCall(session, psi), FirOperatorCall
operation: FirOperation
) : FirAbstractOperationBasedCall(session, psi, operation), FirOperatorCall
@@ -17,11 +17,11 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirTypeOperatorCallImpl(
session: FirSession,
psi: PsiElement?,
override val operation: FirOperation,
operation: FirOperation,
override var conversionTypeRef: FirTypeRef
) : FirAbstractCall(session, psi), FirTypeOperatorCall {
) : FirAbstractOperationBasedCall(session, psi, operation), FirTypeOperatorCall {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
conversionTypeRef = conversionTypeRef.transformSingle(transformer, data)
return super<FirAbstractCall>.transformChildren(transformer, data)
return super<FirAbstractOperationBasedCall>.transformChildren(transformer, data)
}
}