Write this and super expression parsing (light tree to FIR)

This commit is contained in:
Ivan Cilcic
2019-07-16 18:26:40 +03:00
committed by Mikhail Glukhikh
parent a13a043169
commit 08ab530ef0
4 changed files with 52 additions and 14 deletions
@@ -1050,7 +1050,7 @@ class DeclarationsConverter(
/** /**
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeRef * @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? var typeModifiers = TypeModifier(session) //TODO what with suspend?
lateinit var firType: FirTypeRef lateinit var firType: FirTypeRef
type.forEachChildren { type.forEachChildren {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lightTree.converter
import com.intellij.lang.LighterASTNode import com.intellij.lang.LighterASTNode
import com.intellij.util.diff.FlyweightCapableTreeStructure import com.intellij.util.diff.FlyweightCapableTreeStructure
import org.jetbrains.kotlin.KtNodeTypes.* import org.jetbrains.kotlin.KtNodeTypes.*
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.builder.* 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.FunctionUtil.removeLast
import org.jetbrains.kotlin.fir.lightTree.converter.utils.* import org.jetbrains.kotlin.fir.lightTree.converter.utils.*
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference 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.references.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection 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.ir.expressions.IrConstKind
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.Name 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.psi.stubs.elements.KtConstantExpressionElementType
import org.jetbrains.kotlin.resolve.constants.evaluate.* import org.jetbrains.kotlin.resolve.constants.evaluate.*
import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.expressions.OperatorConventions
@@ -51,6 +57,8 @@ class ExpressionsConverter(
is KtConstantExpressionElementType -> return convertConstantExpression(expression) is KtConstantExpressionElementType -> return convertConstantExpression(expression)
REFERENCE_EXPRESSION -> return convertSimpleNameExpression(expression) REFERENCE_EXPRESSION -> return convertSimpleNameExpression(expression)
PARENTHESIZED, PROPERTY_DELEGATE, INDICES -> return visitExpression(expression.getExpressionInParentheses()) PARENTHESIZED, PROPERTY_DELEGATE, INDICES -> return visitExpression(expression.getExpressionInParentheses())
THIS_EXPRESSION -> return convertThisExpression(expression)
SUPER_EXPRESSION -> return convertSuperExpression(expression)
} }
return FirExpressionStub(session, null) return FirExpressionStub(session, null)
//TODO("not fully implemented") //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 * @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseValueArgumentList
*/ */
@@ -414,7 +456,7 @@ class ExpressionsConverter(
fun convertLValue(leftArgNode: LighterASTNode, container: FirModifiableQualifiedAccess<*>): FirReference { fun convertLValue(leftArgNode: LighterASTNode, container: FirModifiableQualifiedAccess<*>): FirReference {
leftArgNode.forEachChildren { leftArgNode.forEachChildren {
return when (it.tokenType) { return when (it.tokenType) {
//THIS_EXPRESSION -> FirExplicitThisReference(session, left, left.getLabelName()) THIS_EXPRESSION -> convertThisExpression(leftArgNode).calleeReference
REFERENCE_EXPRESSION -> FirSimpleNamedReference(session, null, it.getAsString().nameAsSafeName()) REFERENCE_EXPRESSION -> FirSimpleNamedReference(session, null, it.getAsString().nameAsSafeName())
in qualifiedAccessTokens -> (visitExpression(it) as FirQualifiedAccess).let { firQualifiedAccess -> in qualifiedAccessTokens -> (visitExpression(it) as FirQualifiedAccess).let { firQualifiedAccess ->
container.explicitReceiver = firQualifiedAccess.explicitReceiver container.explicitReceiver = firQualifiedAccess.explicitReceiver
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.lightTree.compare
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirAbstractCallableMember 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.*
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractTreeTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractTreeTransformer
@@ -24,7 +23,7 @@ class FirPartialTransformer(
private val visitMemberDeclaration: Boolean = false, private val visitMemberDeclaration: Boolean = false,
private val visitVariable: Boolean = false, private val visitVariable: Boolean = false,
private val visitAnnotation: Boolean = false, private val visitAnnotation: Boolean = false,
private val visitOperationCall: Boolean = false, private val visitOperatorCall: Boolean = false,
private val visitTypeOperatorCall: Boolean = false, private val visitTypeOperatorCall: Boolean = false,
private val visitStringConcatenationCall: Boolean = false, private val visitStringConcatenationCall: Boolean = false,
private val visitArrayOfCall: Boolean = false, private val visitArrayOfCall: Boolean = false,
@@ -106,7 +105,7 @@ class FirPartialTransformer(
} }
override fun transformOperatorCall(operatorCall: FirOperatorCall, data: Nothing?): CompositeTransformResult<FirStatement> { override fun transformOperatorCall(operatorCall: FirOperatorCall, data: Nothing?): CompositeTransformResult<FirStatement> {
return if (visitOperationCall) { return if (visitOperatorCall) {
(operatorCall.transformChildren(this, data) as FirOperatorCall).compose() (operatorCall.transformChildren(this, data) as FirOperatorCall).compose()
} else { } else {
DummyFirStatement().compose() DummyFirStatement().compose()
@@ -7,20 +7,13 @@ package org.jetbrains.kotlin.fir.lightTree.compare
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.CharsetToolkit 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.testFramework.TestDataPath
import com.intellij.util.PathUtil import com.intellij.util.PathUtil
import junit.framework.TestCase import junit.framework.TestCase
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirRenderer import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase 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.LightTree2Fir
import org.jetbrains.kotlin.fir.lightTree.walkTopDown import org.jetbrains.kotlin.fir.lightTree.walkTopDown
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners import org.jetbrains.kotlin.test.JUnit3RunnerWithInners
import org.junit.runner.RunWith import org.junit.runner.RunWith
@@ -70,7 +63,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
visitMemberDeclaration: Boolean = false, visitMemberDeclaration: Boolean = false,
visitVariable: Boolean = false, visitVariable: Boolean = false,
visitAnnotation: Boolean = false, visitAnnotation: Boolean = false,
visitOperationCall: Boolean = false, visitOperatorCall: Boolean = false,
visitTypeOperatorCall: Boolean = false, visitTypeOperatorCall: Boolean = false,
visitStringConcatenationCall: Boolean = false, visitStringConcatenationCall: Boolean = false,
visitArrayOfCall: Boolean = false, visitArrayOfCall: Boolean = false,
@@ -102,7 +95,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
visitMemberDeclaration = visitMemberDeclaration, visitMemberDeclaration = visitMemberDeclaration,
visitVariable = visitVariable, visitVariable = visitVariable,
visitAnnotation = visitAnnotation, visitAnnotation = visitAnnotation,
visitOperationCall = visitOperationCall, visitOperatorCall = visitOperatorCall,
visitTypeOperatorCall = visitTypeOperatorCall, visitTypeOperatorCall = visitTypeOperatorCall,
visitStringConcatenationCall = visitStringConcatenationCall, visitStringConcatenationCall = visitStringConcatenationCall,
visitArrayOfCall = visitArrayOfCall, visitArrayOfCall = visitArrayOfCall,
@@ -165,4 +158,8 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
fun testCallExpression() { fun testCallExpression() {
compare(stubMode = false, visitFunctionCall = true, visitLambdaExpression = false) compare(stubMode = false, visitFunctionCall = true, visitLambdaExpression = false)
} }
fun testQualifiedAccessExpression() {
compare(stubMode = false, visitFunctionCall = true, visitQualifiedAccessExpression = true)
}
} }