From 80b7fbd07a7bb75e69bb8cf9832462cf893d2efb Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 26 Feb 2020 16:39:05 +0300 Subject: [PATCH] FIR: Add new nodes kind for comparison operator ^KT-31163 In Progress --- .../expressions/FirComparisonExpression.kt | 25 ++++++++ .../builder/FirComparisonExpressionBuilder.kt | 58 +++++++++++++++++++ .../impl/FirComparisonExpressionImpl.kt | 46 +++++++++++++++ .../kotlin/fir/visitors/FirTransformer.kt | 9 +++ .../kotlin/fir/visitors/FirVisitor.kt | 3 + .../kotlin/fir/visitors/FirVisitorVoid.kt | 9 +++ .../fir/tree/generator/FirTreeBuilder.kt | 3 +- .../generator/ImplementationConfigurator.kt | 6 ++ .../fir/tree/generator/NodeConfigurator.kt | 5 ++ 9 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirComparisonExpression.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirComparisonExpressionBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComparisonExpressionImpl.kt diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirComparisonExpression.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirComparisonExpression.kt new file mode 100644 index 00000000000..1bc03eda8a2 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirComparisonExpression.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2020 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.expressions + +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirComparisonExpression : FirExpression() { + abstract override val source: FirSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract val operation: FirOperation + abstract val compareToCall: FirFunctionCall + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitComparisonExpression(this, data) +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirComparisonExpressionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirComparisonExpressionBuilder.kt new file mode 100644 index 00000000000..59757ec373e --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirComparisonExpressionBuilder.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2020 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.expressions.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirOperation +import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder +import org.jetbrains.kotlin.fir.expressions.impl.FirComparisonExpressionImpl +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirComparisonExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { + override var source: FirSourceElement? = null + override val annotations: MutableList = mutableListOf() + lateinit var operation: FirOperation + lateinit var compareToCall: FirFunctionCall + + override fun build(): FirComparisonExpression { + return FirComparisonExpressionImpl( + source, + annotations, + operation, + compareToCall, + ) + } + + + @Deprecated("Modification of 'typeRef' has no impact for FirComparisonExpressionBuilder", level = DeprecationLevel.HIDDEN) + override var typeRef: FirTypeRef + get() = throw IllegalStateException() + set(value) { + throw IllegalStateException() + } +} + +@UseExperimental(ExperimentalContracts::class) +inline fun buildComparisonExpression(init: FirComparisonExpressionBuilder.() -> Unit): FirComparisonExpression { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirComparisonExpressionBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComparisonExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComparisonExpressionImpl.kt new file mode 100644 index 00000000000..1ec9a5742c5 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirComparisonExpressionImpl.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2020 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.expressions.impl + +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirOperation +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirComparisonExpressionImpl( + override val source: FirSourceElement?, + override val annotations: MutableList, + override val operation: FirOperation, + override var compareToCall: FirFunctionCall, +) : FirComparisonExpression() { + override var typeRef: FirTypeRef = FirImplicitBooleanTypeRef(null) + + override fun acceptChildren(visitor: FirVisitor, data: D) { + typeRef.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } + compareToCall.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirComparisonExpressionImpl { + typeRef = typeRef.transformSingle(transformer, data) + annotations.transformInplace(transformer, data) + compareToCall = compareToCall.transformSingle(transformer, data) + return this + } + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index f3b04331e25..37cd77f4265 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -65,6 +65,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirOperatorCall +import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenBranch @@ -365,6 +366,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(comparisonExpression, data) + } + open fun transformTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): CompositeTransformResult { return transformElement(typeOperatorCall, data) } @@ -817,6 +822,10 @@ abstract class FirTransformer : FirVisitor { + return transformComparisonExpression(comparisonExpression, data) + } + final override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): CompositeTransformResult { return transformTypeOperatorCall(typeOperatorCall, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index 1ffe1a792a6..c6903f9a832 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -65,6 +65,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirOperatorCall +import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenBranch @@ -245,6 +246,8 @@ abstract class FirVisitor { open fun visitOperatorCall(operatorCall: FirOperatorCall, data: D): R = visitElement(operatorCall, data) + open fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): R = visitElement(comparisonExpression, data) + open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): R = visitElement(typeOperatorCall, data) open fun visitWhenExpression(whenExpression: FirWhenExpression, data: D): R = visitElement(whenExpression, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index b4886eb86e1..56f6bb6d948 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -65,6 +65,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirOperatorCall +import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall import org.jetbrains.kotlin.fir.expressions.FirWhenExpression import org.jetbrains.kotlin.fir.expressions.FirWhenBranch @@ -363,6 +364,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(operatorCall) } + open fun visitComparisonExpression(comparisonExpression: FirComparisonExpression) { + visitElement(comparisonExpression) + } + open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall) { visitElement(typeOperatorCall) } @@ -815,6 +820,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitOperatorCall(operatorCall) } + final override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: Nothing?) { + visitComparisonExpression(comparisonExpression) + } + final override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: Nothing?) { visitTypeOperatorCall(typeOperatorCall) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 64c46b5a546..85e161f5108 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -79,6 +79,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val call = element("Call", Expression, statement) // TODO: may smth like `CallWithArguments` or `ElementWithArguments`? val annotationCall = element("AnnotationCall", Expression, expression, call) val operatorCall = element("OperatorCall", Expression, expression, call) + val comparisonExpression = element("ComparisonExpression", Expression, expression) val typeOperatorCall = element("TypeOperatorCall", Expression, expression, call) val whenExpression = element("WhenExpression", Expression, expression, resolvable) val whenBranch = element("WhenBranch", Expression) @@ -140,4 +141,4 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val composedSuperTypeRef = element("ComposedSuperTypeRef", TypeRef, typeRef) val contractDescription = element("ContractDescription", Contracts) -} \ No newline at end of file +} diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 69ee98c8adc..d728e55f271 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.tree.generator import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeImplementationConfigurator import org.jetbrains.kotlin.fir.tree.generator.model.Implementation.Kind.Object import org.jetbrains.kotlin.fir.tree.generator.model.Implementation.Kind.OpenClass +import org.jetbrains.kotlin.fir.tree.generator.model.Type object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() { fun configureImplementations() { @@ -241,6 +242,11 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() useTypes(implicitTypeRefType, implicitBooleanTypeRefType) } + impl(comparisonExpression) { + default("typeRef", "FirImplicitBooleanTypeRef(null)") + useTypes(implicitBooleanTypeRefType) + } + impl(typeOperatorCall) impl(resolvedQualifier) { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 688ee5d2037..dad57953336 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -185,6 +185,11 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +field("operation", operationType) } + comparisonExpression.configure { + +field("operation", operationType) + +field("compareToCall", functionCall) + } + typeOperatorCall.configure { +field("operation", operationType) +field("conversionTypeRef", typeRef)