From d0319d6b31e4c123864c89d05c027fbcc91f5e64 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 18 Mar 2020 16:45:38 +0300 Subject: [PATCH] [FIR2IR] Use FirSourceElement.elementType instead of PSI --- .../kotlin/fir/backend/ConversionUtils.kt | 21 ++++++++++++------- .../fir/backend/Fir2IrDeclarationStorage.kt | 5 ++--- .../kotlin/fir/backend/Fir2IrVisitor.kt | 14 +++++++------ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 0414d561c20..1205db8421c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.backend import com.intellij.psi.PsiCompiledElement +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirClass @@ -31,8 +32,6 @@ import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.IrErrorType import org.jetbrains.kotlin.ir.types.impl.IrErrorTypeImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtForExpression -import org.jetbrains.kotlin.psi.KtOperationReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.types.Variance @@ -212,12 +211,18 @@ internal fun FirReference.statementOrigin(): IrStatementOrigin? { is FirResolvedNamedReference -> when (resolvedSymbol) { is AccessorSymbol, is SyntheticPropertySymbol -> IrStatementOrigin.GET_PROPERTY is FirNamedFunctionSymbol -> when { - resolvedSymbol.callableId.isInvoke() -> IrStatementOrigin.INVOKE - source.psi is KtForExpression && resolvedSymbol.callableId.isIteratorNext() -> IrStatementOrigin.FOR_LOOP_NEXT - source.psi is KtForExpression && resolvedSymbol.callableId.isIteratorHasNext() -> IrStatementOrigin.FOR_LOOP_HAS_NEXT - source.psi is KtForExpression && resolvedSymbol.callableId.isIterator() -> IrStatementOrigin.FOR_LOOP_ITERATOR - source.psi is KtOperationReferenceExpression -> nameToOperationConventionOrigin[resolvedSymbol.callableId.callableName] - else -> null + resolvedSymbol.callableId.isInvoke() -> + IrStatementOrigin.INVOKE + source?.elementType == KtNodeTypes.FOR && resolvedSymbol.callableId.isIteratorNext() -> + IrStatementOrigin.FOR_LOOP_NEXT + source?.elementType == KtNodeTypes.FOR && resolvedSymbol.callableId.isIteratorHasNext() -> + IrStatementOrigin.FOR_LOOP_HAS_NEXT + source?.elementType == KtNodeTypes.FOR && resolvedSymbol.callableId.isIterator() -> + IrStatementOrigin.FOR_LOOP_ITERATOR + source?.elementType == KtNodeTypes.OPERATION_REFERENCE -> + nameToOperationConventionOrigin[resolvedSymbol.callableId.callableName] + else -> + null } else -> null } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index b1003844af6..d00dfd4965d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.backend +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities @@ -19,7 +20,6 @@ import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirTypeRef @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtFunctionLiteral import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments @@ -327,7 +326,7 @@ class Fir2IrDeclarationStorage( val simpleFunction = function as? FirSimpleFunction val containerSource = simpleFunction?.containerSource val descriptor = containerSource?.let { WrappedFunctionDescriptorWithContainerSource(it) } ?: WrappedSimpleFunctionDescriptor() - val isLambda = function.psi is KtFunctionLiteral + val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL val updatedOrigin = when { isLambda -> IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA function.symbol.callableId.isKFunctionInvoke() -> IrDeclarationOrigin.FAKE_OVERRIDE diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 42f174650df..09e209a94b1 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.backend +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Visibilities @@ -483,16 +484,17 @@ class Fir2IrVisitor( override fun visitWhenExpression(whenExpression: FirWhenExpression, data: Any?): IrElement { val subjectVariable = generateWhenSubjectVariable(whenExpression) - val origin = when (val psi = whenExpression.psi) { - is KtWhenExpression -> IrStatementOrigin.WHEN - is KtIfExpression -> IrStatementOrigin.IF - is KtBinaryExpression -> when (psi.operationToken) { + val psi = whenExpression.psi + val origin = when (whenExpression.source?.elementType) { + KtNodeTypes.WHEN -> IrStatementOrigin.WHEN + KtNodeTypes.IF -> IrStatementOrigin.IF + KtNodeTypes.BINARY_EXPRESSION -> when ((psi as? KtBinaryExpression)?.operationToken) { KtTokens.ELVIS -> IrStatementOrigin.ELVIS KtTokens.OROR -> IrStatementOrigin.OROR KtTokens.ANDAND -> IrStatementOrigin.ANDAND else -> null } - is KtUnaryExpression -> IrStatementOrigin.EXCLEXCL + KtNodeTypes.POSTFIX_EXPRESSION -> IrStatementOrigin.EXCLEXCL else -> null } return conversionScope.withSubject(subjectVariable) { @@ -555,7 +557,7 @@ class Fir2IrVisitor( override fun visitWhileLoop(whileLoop: FirWhileLoop, data: Any?): IrElement { return whileLoop.convertWithOffsets { startOffset, endOffset -> - val origin = if (whileLoop.psi is KtForExpression) IrStatementOrigin.FOR_LOOP_INNER_WHILE + val origin = if (whileLoop.source?.elementType == KtNodeTypes.FOR) IrStatementOrigin.FOR_LOOP_INNER_WHILE else IrStatementOrigin.WHILE_LOOP IrWhileLoopImpl(startOffset, endOffset, irBuiltIns.unitType, origin).apply { loopMap[whileLoop] = this