From 9abf4062b12b2f6a899aa0b9b139d38923c2776e Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 10 Apr 2019 21:25:48 +0300 Subject: [PATCH] FIR tree: implement trivial expressions typing --- .../expressions/impl/FirElseIfTrueCondition.kt | 9 ++++++--- .../expressions/impl/FirReturnExpressionImpl.kt | 5 +++++ .../expressions/impl/FirThrowExpressionImpl.kt | 4 ++++ .../fir/expressions/impl/FirUnitExpression.kt | 8 +++++--- .../ir/irText/expressions/bangbang.fir.txt | 16 ++++++++-------- .../eqeqRhsConditionPossiblyAffectingLhs.fir.txt | 6 +++--- .../ir/irText/expressions/kt30020.fir.txt | 12 ++++++------ .../ir/irText/lambdas/nonLocalReturn.fir.txt | 4 ++-- 8 files changed, 39 insertions(+), 25 deletions(-) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirElseIfTrueCondition.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirElseIfTrueCondition.kt index d69bf76f2a6..c7605aaa135 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirElseIfTrueCondition.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirElseIfTrueCondition.kt @@ -6,12 +6,15 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirAbstractElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef // Representation of "dummy" condition at else branch class FirElseIfTrueCondition( session: FirSession, psi: PsiElement? -): FirAbstractExpression(session, psi) \ No newline at end of file +) : FirAbstractExpression(session, psi) { + + override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirReturnExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirReturnExpressionImpl.kt index d241eea6733..7649443ce47 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirReturnExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirReturnExpressionImpl.kt @@ -10,6 +10,9 @@ import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirReturnExpressionImpl( @@ -23,4 +26,6 @@ class FirReturnExpressionImpl( result = result.transformSingle(transformer, data) return super.transformChildren(transformer, data) } + + override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi) } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt index fd5e66b7ced..ff6b80fa211 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirThrowExpressionImpl.kt @@ -12,6 +12,8 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirThrowExpression import org.jetbrains.kotlin.fir.transformSingle +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirThrowExpressionImpl( @@ -23,4 +25,6 @@ class FirThrowExpressionImpl( exception = exception.transformSingle(transformer, data) return super.transformChildren(transformer, data) } + + override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi) } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirUnitExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirUnitExpression.kt index 9fca7c27ba9..3975ef4bb71 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirUnitExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirUnitExpression.kt @@ -6,11 +6,13 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirAbstractElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef class FirUnitExpression( session: FirSession, psi: PsiElement? -): FirAbstractExpression(session, psi) \ No newline at end of file +) : FirAbstractExpression(session, psi) { + override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi) +} \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/bangbang.fir.txt b/compiler/testData/ir/irText/expressions/bangbang.fir.txt index 523bb7a9895..1337193b84f 100644 --- a/compiler/testData/ir/irText/expressions/bangbang.fir.txt +++ b/compiler/testData/ir/irText/expressions/bangbang.fir.txt @@ -1,12 +1,12 @@ FILE fqName: fileName:/bangbang.kt - FUN name:test1 visibility:public modality:FINAL <> (a:kotlin.Any?) returnType:IrErrorType + FUN name:test1 visibility:public modality:FINAL <> (a:kotlin.Any?) returnType:kotlin.Nothing VALUE_PARAMETER name:a index:0 type:kotlin.Any? BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test1 (a: kotlin.Any?): IrErrorType declared in ' - BLOCK type=IrErrorType origin=EXCLEXCL + RETURN type=kotlin.Nothing from='public final fun test1 (a: kotlin.Any?): kotlin.Nothing declared in ' + BLOCK type=kotlin.Nothing origin=EXCLEXCL VAR name: type:kotlin.Any? [val] GET_VAR 'a: kotlin.Any? declared in .test1' type=kotlin.Any? origin=null - WHEN type=IrErrorType origin=EXCLEXCL + WHEN type=kotlin.Nothing origin=EXCLEXCL BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'val : kotlin.Any? [val] declared in .test1' type=kotlin.Any? origin=null @@ -16,14 +16,14 @@ FILE fqName: fileName:/bangbang.kt BRANCH if: CONST Boolean type=kotlin.Boolean value=true then: GET_VAR 'val : kotlin.Any? [val] declared in .test1' type=kotlin.Any? origin=null - FUN name:test2 visibility:public modality:FINAL <> (a:kotlin.Any?) returnType:IrErrorType + FUN name:test2 visibility:public modality:FINAL <> (a:kotlin.Any?) returnType:kotlin.Nothing VALUE_PARAMETER name:a index:0 type:kotlin.Any? BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test2 (a: kotlin.Any?): IrErrorType declared in ' - BLOCK type=IrErrorType origin=EXCLEXCL + RETURN type=kotlin.Nothing from='public final fun test2 (a: kotlin.Any?): kotlin.Nothing declared in ' + BLOCK type=kotlin.Nothing origin=EXCLEXCL VAR name: type:kotlin.Int [val] CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null - WHEN type=IrErrorType origin=EXCLEXCL + WHEN type=kotlin.Nothing origin=EXCLEXCL BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'val : kotlin.Int [val] declared in .test2' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/expressions/floatingPointComparisons/eqeqRhsConditionPossiblyAffectingLhs.fir.txt b/compiler/testData/ir/irText/expressions/floatingPointComparisons/eqeqRhsConditionPossiblyAffectingLhs.fir.txt index abac7f5f067..c8e35b09a6b 100644 --- a/compiler/testData/ir/irText/expressions/floatingPointComparisons/eqeqRhsConditionPossiblyAffectingLhs.fir.txt +++ b/compiler/testData/ir/irText/expressions/floatingPointComparisons/eqeqRhsConditionPossiblyAffectingLhs.fir.txt @@ -5,14 +5,14 @@ FILE fqName: fileName:/eqeqRhsConditionPossiblyAffectingLhs.kt RETURN type=kotlin.Nothing from='public final fun test (x: kotlin.Any): kotlin.Boolean declared in ' CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'x: kotlin.Any declared in .test' type=kotlin.Any origin=null - arg1: WHEN type=IrErrorType origin=IF + arg1: WHEN type=kotlin.Nothing origin=IF BRANCH if: TYPE_OP type=kotlin.Boolean origin=NOT_INSTANCEOF typeOperand=kotlin.Double GET_VAR 'x: kotlin.Any declared in .test' type=kotlin.Any origin=null - then: BLOCK type=IrErrorType origin=EXCLEXCL + then: BLOCK type=kotlin.Nothing origin=EXCLEXCL VAR name: type:kotlin.Nothing? [val] CONST Null type=kotlin.Nothing? value=null - WHEN type=IrErrorType origin=EXCLEXCL + WHEN type=kotlin.Nothing origin=EXCLEXCL BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'val : kotlin.Nothing? [val] declared in .test' type=kotlin.Nothing? origin=null diff --git a/compiler/testData/ir/irText/expressions/kt30020.fir.txt b/compiler/testData/ir/irText/expressions/kt30020.fir.txt index 8ba4c80395b..0bcbf8e361c 100644 --- a/compiler/testData/ir/irText/expressions/kt30020.fir.txt +++ b/compiler/testData/ir/irText/expressions/kt30020.fir.txt @@ -36,11 +36,11 @@ FILE fqName: fileName:/kt30020.kt TYPE_OP type=kotlin.collections.MutableList origin=CAST typeOperand=kotlin.collections.MutableList CALL 'public abstract fun f (): kotlin.collections.MutableList declared in .X' type=kotlin.collections.MutableList origin=null ERROR_CALL 'Unresolved reference: R|/|' type=IrErrorType - VAR name: type:IrErrorType [val] - BLOCK type=IrErrorType origin=EXCLEXCL + VAR name: type:kotlin.Nothing [val] + BLOCK type=kotlin.Nothing origin=EXCLEXCL VAR name: type:kotlin.collections.MutableList [val] CALL 'public abstract fun (): kotlin.collections.MutableList declared in .X' type=kotlin.collections.MutableList origin=null - WHEN type=IrErrorType origin=EXCLEXCL + WHEN type=kotlin.Nothing origin=EXCLEXCL BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'val : kotlin.collections.MutableList [val] declared in .test' type=kotlin.collections.MutableList origin=null @@ -51,11 +51,11 @@ FILE fqName: fileName:/kt30020.kt if: CONST Boolean type=kotlin.Boolean value=true then: GET_VAR 'val : kotlin.collections.MutableList [val] declared in .test' type=kotlin.collections.MutableList origin=null ERROR_CALL 'Unresolved reference: R|/|' type=IrErrorType - VAR name: type:IrErrorType [val] - BLOCK type=IrErrorType origin=EXCLEXCL + VAR name: type:kotlin.Nothing [val] + BLOCK type=kotlin.Nothing origin=EXCLEXCL VAR name: type:kotlin.collections.MutableList [val] CALL 'public abstract fun f (): kotlin.collections.MutableList declared in .X' type=kotlin.collections.MutableList origin=null - WHEN type=IrErrorType origin=EXCLEXCL + WHEN type=kotlin.Nothing origin=EXCLEXCL BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'val : kotlin.collections.MutableList [val] declared in .test' type=kotlin.collections.MutableList origin=null diff --git a/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt b/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt index 2fb0d9816fd..f1997ef24ae 100644 --- a/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt +++ b/compiler/testData/ir/irText/lambdas/nonLocalReturn.fir.txt @@ -54,7 +54,7 @@ FILE fqName: fileName:/nonLocalReturn.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): IrErrorType declared in .testLrmFoo1' BLOCK type=IrErrorType origin=null - WHEN type=IrErrorType origin=IF + WHEN type=kotlin.Unit origin=IF BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: ERROR_CALL 'Unresolved reference: #' type=IrErrorType @@ -73,7 +73,7 @@ FILE fqName: fileName:/nonLocalReturn.kt BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (): IrErrorType declared in .testLrmFoo2' BLOCK type=IrErrorType origin=null - WHEN type=IrErrorType origin=IF + WHEN type=kotlin.Unit origin=IF BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ arg0: ERROR_CALL 'Unresolved reference: #' type=IrErrorType