From b7d57690c523f8364d6717d588a820404abf5f8e Mon Sep 17 00:00:00 2001 From: Ivan Cilcic Date: Thu, 18 Jul 2019 17:10:08 +0300 Subject: [PATCH] Write try expression parsing (light tree to FIR) --- .../converter/ExpressionsConverter.kt | 54 +++++++++++++++++++ .../fir/lightTree/compare/TreesCompareTest.kt | 18 +++++++ 2 files changed, 72 insertions(+) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 62a8d5497fc..9f01e334e77 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -81,6 +81,7 @@ class ExpressionsConverter( DO_WHILE -> convertDoWhile(expression) WHILE -> convertWhile(expression) FOR -> convertFor(expression) + TRY -> convertTryExpression(expression) BREAK, CONTINUE -> convertLoopJump(expression) RETURN -> convertReturn(expression) THROW -> convertThrow(expression) @@ -739,6 +740,59 @@ class ExpressionsConverter( } } + /** + * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseTry + * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitTryExpression + */ + private fun convertTryExpression(tryExpression: LighterASTNode): FirExpression { + lateinit var tryBlock: FirBlock + val catchClauses = mutableListOf>() + var finallyBlock: FirBlock? = null + tryExpression.forEachChildren { + when (it.tokenType) { + BLOCK -> tryBlock = declarationsConverter.convertBlock(it) + CATCH -> catchClauses += convertCatchClause(it) + FINALLY -> finallyBlock = convertFinally(it) + } + } + return FirTryExpressionImpl(session, null, tryBlock, finallyBlock).apply { + for ((parameter, block) in catchClauses) { + if (parameter == null) continue + catches += FirCatchImpl(this@ExpressionsConverter.session, null, parameter.firValueParameter, block) + } + } + } + + /** + * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseTry + */ + private fun convertCatchClause(catchClause: LighterASTNode): Pair { + var valueParameter: ValueParameter? = null + lateinit var firBlock: FirBlock + catchClause.forEachChildren { + when (it.tokenType) { + VALUE_PARAMETER_LIST -> valueParameter = declarationsConverter.convertValueParameters(it).first() + BLOCK -> firBlock = declarationsConverter.convertBlock(it) + } + } + + return Pair(valueParameter, firBlock) + } + + /** + * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseTry + */ + private fun convertFinally(finallyExpression: LighterASTNode): FirBlock { + lateinit var firBlock: FirBlock + finallyExpression.forEachChildren { + when (it.tokenType) { + BLOCK -> firBlock = declarationsConverter.convertBlock(it) + } + } + + return firBlock + } + /** * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseCondition */ diff --git a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt index d48f0f032ef..a06ca5756d1 100644 --- a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt +++ b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt @@ -321,4 +321,22 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { visitAnonymousObject = true ) } + + fun testTryExpression() { + compare( + stubMode = false, + visitAnonymousFunction = true, + visitLambdaExpression = true, + visitLocalMembers = true, + visitVariable = true, + visitAnnotation = true, + visitFunctionCall = true, + visitThrowExpression = true, + visitLoops = true, + visitConstExpression = true, + visitQualifiedAccessExpression = true, + visitTryExpression = true, + visitAnonymousObject = true + ) + } }