diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt index 0a1cf6a9dcb..4613a8708cc 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt @@ -18,8 +18,6 @@ import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.* -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.isExpression -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.nameAsSafeName import org.jetbrains.kotlin.name.Name open class BaseConverter( diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt index 6cfe05dbf5c..6d3d6fd3a86 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.lightTree.converter import com.intellij.lang.LighterASTNode import com.intellij.psi.tree.IElementType +import com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.KtNodeType import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.KtNodeTypes.* @@ -16,10 +17,12 @@ import org.jetbrains.kotlin.fir.FirFunctionTarget import org.jetbrains.kotlin.fir.FirLabel import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.builder.generateResolvedAccessExpression import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.* +import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirExplicitThisReference @@ -29,6 +32,7 @@ import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.lexer.KtSingleValueToken @@ -42,73 +46,106 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType import org.jetbrains.kotlin.psi.stubs.elements.KtStringTemplateExpressionElementType import org.jetbrains.kotlin.types.Variance -object ConverterUtil { - private val expressionSet = listOf( - REFERENCE_EXPRESSION, - DOT_QUALIFIED_EXPRESSION, - LAMBDA_EXPRESSION, - FUN - ) +private val expressionSet = listOf( + REFERENCE_EXPRESSION, + DOT_QUALIFIED_EXPRESSION, + LAMBDA_EXPRESSION, + FUN +) - fun String?.nameAsSafeName(defaultName: String = ""): Name { - return when { - this != null -> Name.identifier(this.replace("`", "")) - defaultName.isNotEmpty() -> Name.identifier(defaultName) - else -> SpecialNames.NO_NAME_PROVIDED - } - } +val qualifiedAccessTokens = TokenSet.create(DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION) - fun LighterASTNode.getAsStringWithoutBacktick(): String { - return this.toString().replace("`", "") - } - - fun LighterASTNode.isExpression(): Boolean { - return when (this.tokenType) { - is KtNodeType, - is KtConstantExpressionElementType, - is KtStringTemplateExpressionElementType, - in expressionSet -> true - else -> false - } - } - - fun FirTypeParameterContainer.joinTypeParameters(typeConstraints: List) { - typeConstraints.forEach { typeConstraint -> - this.typeParameters.forEach { typeParameter -> - if (typeConstraint.identifier == typeParameter.name.identifier) { - (typeParameter as FirTypeParameterImpl).bounds += typeConstraint.firTypeRef - typeParameter.annotations += typeConstraint.firTypeRef.annotations - typeParameter.annotations += typeConstraint.annotations - } - } - } - } - - fun T.extractArgumentsFrom(container: List, stubMode: Boolean): T { - if (!stubMode || this is FirAnnotationCall) { - this.arguments += container - } - return this - } - - inline fun isClassLocal(classNode: LighterASTNode, getParent: LighterASTNode.() -> LighterASTNode?): Boolean { - var currentNode: LighterASTNode? = classNode - while (currentNode != null) { - val tokenType = currentNode.tokenType - val parent = currentNode.getParent() - if (tokenType == PROPERTY || tokenType == FUN) { - val grandParent = parent?.getParent() - when { - parent?.tokenType == KT_FILE -> return true - parent?.tokenType == CLASS_BODY && !(grandParent?.tokenType == OBJECT_DECLARATION && grandParent?.getParent()?.tokenType == OBJECT_LITERAL) -> return true - parent?.tokenType == BLOCK && grandParent?.tokenType == SCRIPT -> return true - } - } - if (tokenType == BLOCK) { - return true - } - currentNode = parent - } - return false +fun String?.nameAsSafeName(defaultName: String = ""): Name { + return when { + this != null -> Name.identifier(this.replace("`", "")) + defaultName.isNotEmpty() -> Name.identifier(defaultName) + else -> SpecialNames.NO_NAME_PROVIDED + } +} + +fun String.getOperationSymbol(): IElementType { + KotlinExpressionParsing.ALL_OPERATIONS.types.forEach { + if (it is KtSingleValueToken && it.value == this) return it + } + if (this == "as?") return KtTokens.AS_SAFE + return KtTokens.IDENTIFIER +} + +fun LighterASTNode.getAsStringWithoutBacktick(): String { + return this.toString().replace("`", "") +} + +fun LighterASTNode.isExpression(): Boolean { + return when (this.tokenType) { + is KtNodeType, + is KtConstantExpressionElementType, + is KtStringTemplateExpressionElementType, + in expressionSet -> true + else -> false + } +} + +fun FirTypeParameterContainer.joinTypeParameters(typeConstraints: List) { + typeConstraints.forEach { typeConstraint -> + this.typeParameters.forEach { typeParameter -> + if (typeConstraint.identifier == typeParameter.name.identifier) { + (typeParameter as FirTypeParameterImpl).bounds += typeConstraint.firTypeRef + typeParameter.annotations += typeConstraint.firTypeRef.annotations + typeParameter.annotations += typeConstraint.annotations + } + } + } +} + +fun T.extractArgumentsFrom(container: List, stubMode: Boolean): T { + if (!stubMode || this is FirAnnotationCall) { + this.arguments += container + } + return this +} + +inline fun isClassLocal(classNode: LighterASTNode, getParent: LighterASTNode.() -> LighterASTNode?): Boolean { + var currentNode: LighterASTNode? = classNode + while (currentNode != null) { + val tokenType = currentNode.tokenType + val parent = currentNode.getParent() + if (tokenType == PROPERTY || tokenType == FUN) { + val grandParent = parent?.getParent() + when { + parent?.tokenType == KT_FILE -> return true + parent?.tokenType == CLASS_BODY && !(grandParent?.tokenType == OBJECT_DECLARATION && grandParent?.getParent()?.tokenType == OBJECT_LITERAL) -> return true + parent?.tokenType == BLOCK && grandParent?.tokenType == SCRIPT -> return true + } + } + if (tokenType == BLOCK) { + return true + } + currentNode = parent + } + return false +} + +fun generateDestructuringBlock( + session: FirSession, + multiDeclaration: DestructuringDeclaration, + container: FirVariable<*>, + tmpVariable: Boolean +): FirExpression { + return FirBlockImpl(session, null).apply { + if (tmpVariable) { + statements += container + } + val isVar = multiDeclaration.isVar + for ((index, entry) in multiDeclaration.entries.withIndex()) { + statements += FirVariableImpl( + session, null, entry.name, + entry.returnTypeRef, isVar, + FirComponentCallImpl(session, null, index + 1, generateResolvedAccessExpression(session, null, container)), + FirVariableSymbol(entry.name) // TODO? + ).apply { + annotations += entry.annotations + symbol.bind(this) + } + } } } 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 e2b09666933..07a9466c9ef 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 @@ -22,12 +22,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.extractArgumentsFrom -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.getAsStringWithoutBacktick -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.isExpression -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.joinTypeParameters -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.nameAsSafeName -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.isClassLocal import org.jetbrains.kotlin.fir.lightTree.fir.* import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier import org.jetbrains.kotlin.fir.lightTree.fir.modifier.TypeModifier @@ -403,7 +397,7 @@ class DeclarationsConverter( //parse properties properties += primaryConstructorWrapper.valueParameters .filter { it.hasValOrVar() } - .map { it.toFirProperty(callableIdForName(it.firValueParameter.name)) } + .map { it.toFirProperty(session, callableIdForName(it.firValueParameter.name)) } firClass.addDeclarations(properties) } 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 e46d346eb4c..406a5d1f1a6 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 @@ -20,13 +20,6 @@ import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.labels.FirLabelImpl import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.extractArgumentsFrom -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.getAsStringWithoutBacktick -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.isExpression -import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.nameAsSafeName -import org.jetbrains.kotlin.fir.lightTree.converter.utils.generateDestructuringBlock -import org.jetbrains.kotlin.fir.lightTree.converter.utils.getOperationSymbol -import org.jetbrains.kotlin.fir.lightTree.converter.utils.qualifiedAccessTokens import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter import org.jetbrains.kotlin.fir.lightTree.fir.WhenEntry import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -66,7 +59,8 @@ class ExpressionsConverter( return when (expression.tokenType) { LAMBDA_EXPRESSION -> { val lambdaTree = LightTree2Fir.buildLightTreeLambdaExpression(expression.asText) - ExpressionsConverter(session, stubMode, lambdaTree, declarationsConverter, context).convertLambdaExpression(lambdaTree.root) + ExpressionsConverter(session, stubMode, lambdaTree, declarationsConverter, context) + .convertLambdaExpression(lambdaTree.root) } BINARY_EXPRESSION -> convertBinaryExpression(expression) BINARY_WITH_TYPE -> convertBinaryWithType(expression) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/utils/ExpressionUtil.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/utils/ExpressionUtil.kt deleted file mode 100644 index 2b71ad92b6e..00000000000 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/utils/ExpressionUtil.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.fir.lightTree.converter.utils - -import com.intellij.psi.tree.IElementType -import com.intellij.psi.tree.TokenSet -import org.jetbrains.kotlin.KtNodeTypes.DOT_QUALIFIED_EXPRESSION -import org.jetbrains.kotlin.KtNodeTypes.SAFE_ACCESS_EXPRESSION -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.builder.RawFirBuilder -import org.jetbrains.kotlin.fir.builder.generateNotNullOrOther -import org.jetbrains.kotlin.fir.builder.generateResolvedAccessExpression -import org.jetbrains.kotlin.fir.declarations.impl.FirVariableImpl -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.expressions.FirVariable -import org.jetbrains.kotlin.fir.expressions.FirWhenExpression -import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl -import org.jetbrains.kotlin.fir.expressions.impl.FirComponentCallImpl -import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl -import org.jetbrains.kotlin.fir.expressions.impl.FirThrowExpressionImpl -import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration -import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference -import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol -import org.jetbrains.kotlin.lexer.KtSingleValueToken -import org.jetbrains.kotlin.lexer.KtTokens.AS_SAFE -import org.jetbrains.kotlin.lexer.KtTokens.IDENTIFIER -import org.jetbrains.kotlin.parsing.KotlinExpressionParsing - -val qualifiedAccessTokens = TokenSet.create(DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION) - -fun String.getOperationSymbol(): IElementType { - KotlinExpressionParsing.ALL_OPERATIONS.types.forEach { - if (it is KtSingleValueToken && it.value == this) return it - } - if (this == "as?") return AS_SAFE - return IDENTIFIER -} - -fun generateDestructuringBlock( - session: FirSession, - multiDeclaration: DestructuringDeclaration, - container: FirVariable<*>, - tmpVariable: Boolean -): FirExpression { - return FirBlockImpl(session, null).apply { - if (tmpVariable) { - statements += container - } - val isVar = multiDeclaration.isVar - for ((index, entry) in multiDeclaration.entries.withIndex()) { - statements += FirVariableImpl( - session, null, entry.name, - entry.returnTypeRef, isVar, - FirComponentCallImpl(session, null, index + 1, generateResolvedAccessExpression(session, null, container)), - FirVariableSymbol(entry.name) // TODO? - ).apply { - annotations += entry.annotations - symbol.bind(this) - } - } - } -} diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt index 2433cda5164..7adddb696f8 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirVariable import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl -import org.jetbrains.kotlin.fir.lightTree.converter.utils.generateDestructuringBlock +import org.jetbrains.kotlin.fir.lightTree.converter.generateDestructuringBlock data class DestructuringDeclaration( val isVar: Boolean, diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index a060218e03e..9ca5c39793b 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.lightTree.fir +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter @@ -32,15 +33,15 @@ class ValueParameter( return isVal || isVar } - fun toFirProperty(callableId: CallableId): FirProperty { + fun toFirProperty(session: FirSession, callableId: CallableId): FirProperty { val name = this.firValueParameter.name var type = this.firValueParameter.returnTypeRef if (type is FirImplicitTypeRef) { - type = FirErrorTypeRefImpl(this.firValueParameter.session, null, "Incomplete code") + type = FirErrorTypeRefImpl(session, null, "Incomplete code") } return FirMemberPropertyImpl( - this.firValueParameter.session, + session, null, FirPropertySymbol(callableId), name, @@ -54,14 +55,14 @@ class ValueParameter( receiverTypeRef = null, returnTypeRef = type, isVar = this.isVar, - initializer = FirQualifiedAccessExpressionImpl(this.firValueParameter.session, null).apply { + initializer = FirQualifiedAccessExpressionImpl(session, null).apply { calleeReference = FirPropertyFromParameterCallableReference( - this@ValueParameter.firValueParameter.session, null, name, this@ValueParameter.firValueParameter.symbol + session, null, name, this@ValueParameter.firValueParameter.symbol ) }, - getter = FirDefaultPropertyGetter(this.firValueParameter.session, null, type, modifiers.getVisibility()), + getter = FirDefaultPropertyGetter(session, null, type, modifiers.getVisibility()), setter = if (this.isVar) FirDefaultPropertySetter( - this.firValueParameter.session, + session, null, type, modifiers.getVisibility()