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
*/
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 {
@@ -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
@@ -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<FirStatement> {
return if (visitOperationCall) {
return if (visitOperatorCall) {
(operatorCall.transformChildren(this, data) as FirOperatorCall).compose()
} else {
DummyFirStatement().compose()
@@ -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)
}
}