Write this and super expression parsing (light tree to FIR)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
a13a043169
commit
08ab530ef0
+1
-1
@@ -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 {
|
||||
|
||||
+43
-1
@@ -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
|
||||
|
||||
+2
-3
@@ -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()
|
||||
|
||||
+6
-9
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user