From 08ab530ef072fa0c880d0fa3ab3a1bea8d0ee27e Mon Sep 17 00:00:00 2001 From: Ivan Cilcic Date: Tue, 16 Jul 2019 18:26:40 +0300 Subject: [PATCH] Write this and super expression parsing (light tree to FIR) --- .../converter/DeclarationsConverter.kt | 2 +- .../converter/ExpressionsConverter.kt | 44 ++++++++++++++++++- .../compare/FirPartialTransformer.kt | 5 +-- .../fir/lightTree/compare/TreesCompareTest.kt | 15 +++---- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 28aaa2e9c75..79616725d0c 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -1050,7 +1050,7 @@ class DeclarationsConverter( /** * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeRef */ - private fun convertType(type: LighterASTNode): FirTypeRef { + fun convertType(type: LighterASTNode): FirTypeRef { var typeModifiers = TypeModifier(session) //TODO what with suspend? lateinit var firType: FirTypeRef type.forEachChildren { 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 e5fe429e07d..04c50f21592 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lightTree.converter import com.intellij.lang.LighterASTNode import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.KtNodeTypes.* +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.builder.* @@ -21,11 +22,16 @@ import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.extractArgumen import org.jetbrains.kotlin.fir.lightTree.converter.FunctionUtil.removeLast import org.jetbrains.kotlin.fir.lightTree.converter.utils.* import org.jetbrains.kotlin.fir.references.FirErrorNamedReference +import org.jetbrains.kotlin.fir.references.FirExplicitSuperReference +import org.jetbrains.kotlin.fir.references.FirExplicitThisReference import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtSuperExpression +import org.jetbrains.kotlin.psi.KtThisExpression import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType import org.jetbrains.kotlin.resolve.constants.evaluate.* import org.jetbrains.kotlin.types.expressions.OperatorConventions @@ -51,6 +57,8 @@ class ExpressionsConverter( is KtConstantExpressionElementType -> return convertConstantExpression(expression) REFERENCE_EXPRESSION -> return convertSimpleNameExpression(expression) PARENTHESIZED, PROPERTY_DELEGATE, INDICES -> return visitExpression(expression.getExpressionInParentheses()) + THIS_EXPRESSION -> return convertThisExpression(expression) + SUPER_EXPRESSION -> return convertSuperExpression(expression) } return FirExpressionStub(session, null) //TODO("not fully implemented") @@ -376,6 +384,40 @@ class ExpressionsConverter( } } + /** + * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseThisExpression + * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitThisExpression + */ + private fun convertThisExpression(thisExpression: LighterASTNode): FirQualifiedAccessExpression { + var label: String? = null + thisExpression.forEachChildren { + when (it.tokenType) { + LABEL_QUALIFIER -> label = it.getAsString().replaceFirst("@", "") + } + } + + return FirQualifiedAccessExpressionImpl(session, null).apply { + calleeReference = FirExplicitThisReference(this@ExpressionsConverter.session, null, label) + } + } + + /** + * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseSuperExpression + * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitSuperExpression + */ + private fun convertSuperExpression(superExpression: LighterASTNode): FirQualifiedAccessExpression { + var superTypeRef: FirTypeRef = implicitType + superExpression.forEachChildren { + when (it.tokenType) { + TYPE_REFERENCE -> superTypeRef = declarationsConverter.convertType(it) + } + } + + return FirQualifiedAccessExpressionImpl(session, null).apply { + calleeReference = FirExplicitSuperReference(this@ExpressionsConverter.session, null, superTypeRef) + } + } + /** * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseValueArgumentList */ @@ -414,7 +456,7 @@ class ExpressionsConverter( fun convertLValue(leftArgNode: LighterASTNode, container: FirModifiableQualifiedAccess<*>): FirReference { leftArgNode.forEachChildren { return when (it.tokenType) { - //THIS_EXPRESSION -> FirExplicitThisReference(session, left, left.getLabelName()) + THIS_EXPRESSION -> convertThisExpression(leftArgNode).calleeReference REFERENCE_EXPRESSION -> FirSimpleNamedReference(session, null, it.getAsString().nameAsSafeName()) in qualifiedAccessTokens -> (visitExpression(it) as FirQualifiedAccess).let { firQualifiedAccess -> container.explicitReceiver = firQualifiedAccess.explicitReceiver diff --git a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/FirPartialTransformer.kt b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/FirPartialTransformer.kt index a7baa16686f..c1ca6f55718 100644 --- a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/FirPartialTransformer.kt +++ b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/FirPartialTransformer.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.lightTree.compare import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirAbstractCallableMember -import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractTreeTransformer @@ -24,7 +23,7 @@ class FirPartialTransformer( private val visitMemberDeclaration: Boolean = false, private val visitVariable: Boolean = false, private val visitAnnotation: Boolean = false, - private val visitOperationCall: Boolean = false, + private val visitOperatorCall: Boolean = false, private val visitTypeOperatorCall: Boolean = false, private val visitStringConcatenationCall: Boolean = false, private val visitArrayOfCall: Boolean = false, @@ -106,7 +105,7 @@ class FirPartialTransformer( } override fun transformOperatorCall(operatorCall: FirOperatorCall, data: Nothing?): CompositeTransformResult { - return if (visitOperationCall) { + return if (visitOperatorCall) { (operatorCall.transformChildren(this, data) as FirOperatorCall).compose() } else { DummyFirStatement().compose() 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 0e3b37f714e..a0df6e50018 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 @@ -7,20 +7,13 @@ package org.jetbrains.kotlin.fir.lightTree.compare import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.CharsetToolkit -import com.intellij.psi.PsiFileFactory -import com.intellij.psi.PsiManager -import com.intellij.psi.impl.PsiFileFactoryImpl -import com.intellij.psi.impl.PsiManagerImpl import com.intellij.testFramework.TestDataPath import com.intellij.util.PathUtil import junit.framework.TestCase -import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirRenderer import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase -import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.walkTopDown -import org.jetbrains.kotlin.parsing.KotlinParserDefinition import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.test.JUnit3RunnerWithInners import org.junit.runner.RunWith @@ -70,7 +63,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { visitMemberDeclaration: Boolean = false, visitVariable: Boolean = false, visitAnnotation: Boolean = false, - visitOperationCall: Boolean = false, + visitOperatorCall: Boolean = false, visitTypeOperatorCall: Boolean = false, visitStringConcatenationCall: Boolean = false, visitArrayOfCall: Boolean = false, @@ -102,7 +95,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { visitMemberDeclaration = visitMemberDeclaration, visitVariable = visitVariable, visitAnnotation = visitAnnotation, - visitOperationCall = visitOperationCall, + visitOperatorCall = visitOperatorCall, visitTypeOperatorCall = visitTypeOperatorCall, visitStringConcatenationCall = visitStringConcatenationCall, visitArrayOfCall = visitArrayOfCall, @@ -165,4 +158,8 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { fun testCallExpression() { compare(stubMode = false, visitFunctionCall = true, visitLambdaExpression = false) } + + fun testQualifiedAccessExpression() { + compare(stubMode = false, visitFunctionCall = true, visitQualifiedAccessExpression = true) + } }