[FIR] Introduce new FIR node for SAM conversion

#KT-62847
This commit is contained in:
Kirill Rakhman
2023-11-15 11:08:02 +01:00
committed by Space Team
parent ebb6f4c70f
commit 0b28e770b2
13 changed files with 201 additions and 0 deletions
@@ -186,6 +186,10 @@ class ExpressionCheckersDiagnosticComponent(
checkers.allBasicExpressionCheckers.check(varargArgumentsExpression, data)
}
override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression, data: CheckerContext) {
checkers.allBasicExpressionCheckers.check(samConversionExpression, data)
}
override fun visitWrappedExpression(wrappedExpression: FirWrappedExpression, data: CheckerContext) {
checkers.allBasicExpressionCheckers.check(wrappedExpression, data)
}
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2023 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.
*/
// This file was generated automatically. See compiler/fir/tree/tree-generator/Readme.md.
// DO NOT MODIFY IT MANUALLY.
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
/**
* Generated from: [org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.samConversionExpression]
*/
abstract class FirSamConversionExpression : FirExpression() {
abstract override val source: KtSourceElement?
@UnresolvedExpressionTypeAccess
abstract override val coneTypeOrNull: ConeKotlinType?
abstract override val annotations: List<FirAnnotation>
abstract val expression: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitSamConversionExpression(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformSamConversionExpression(this, data) as E
abstract override fun replaceConeTypeOrNull(newConeTypeOrNull: ConeKotlinType?)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirSamConversionExpression
}
@@ -0,0 +1,62 @@
/*
* Copyright 2010-2023 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.
*/
// This file was generated automatically. See compiler/fir/tree/tree-generator/Readme.md.
// DO NOT MODIFY IT MANUALLY.
@file:Suppress("DuplicatedCode", "unused")
package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirSamConversionExpression
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
import org.jetbrains.kotlin.fir.expressions.impl.FirSamConversionExpressionImpl
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@FirBuilderDsl
class FirSamConversionExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder {
override var source: KtSourceElement? = null
override var coneTypeOrNull: ConeKotlinType? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var expression: FirExpression
override fun build(): FirSamConversionExpression {
return FirSamConversionExpressionImpl(
source,
coneTypeOrNull,
annotations.toMutableOrEmpty(),
expression,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildSamConversionExpression(init: FirSamConversionExpressionBuilder.() -> Unit): FirSamConversionExpression {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return FirSamConversionExpressionBuilder().apply(init).build()
}
@OptIn(ExperimentalContracts::class, UnresolvedExpressionTypeAccess::class)
inline fun buildSamConversionExpressionCopy(original: FirSamConversionExpression, init: FirSamConversionExpressionBuilder.() -> Unit): FirSamConversionExpression {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
val copyBuilder = FirSamConversionExpressionBuilder()
copyBuilder.source = original.source
copyBuilder.coneTypeOrNull = original.coneTypeOrNull
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.expression = original.expression
return copyBuilder.apply(init).build()
}
@@ -0,0 +1,57 @@
/*
* Copyright 2010-2023 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.
*/
// This file was generated automatically. See compiler/fir/tree/tree-generator/Readme.md.
// DO NOT MODIFY IT MANUALLY.
@file:Suppress("DuplicatedCode", "unused")
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirSamConversionExpression
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.fir.visitors.transformInplace
@OptIn(UnresolvedExpressionTypeAccess::class)
internal class FirSamConversionExpressionImpl(
override val source: KtSourceElement?,
@property:UnresolvedExpressionTypeAccess
override var coneTypeOrNull: ConeKotlinType?,
override var annotations: MutableOrEmptyList<FirAnnotation>,
override var expression: FirExpression,
) : FirSamConversionExpression() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }
expression.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirSamConversionExpressionImpl {
transformAnnotations(transformer, data)
expression = expression.transform(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirSamConversionExpressionImpl {
annotations.transformInplace(transformer, data)
return this
}
override fun replaceConeTypeOrNull(newConeTypeOrNull: ConeKotlinType?) {
coneTypeOrNull = newConeTypeOrNull
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
}
@@ -185,6 +185,9 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitVarargArgumentsExpression(varargArgumentsExpression: FirVarargArgumentsExpression, data: D): R =
visitExpression(varargArgumentsExpression, data)
override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression, data: D): R =
visitExpression(samConversionExpression, data)
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): R =
visitExpression(resolvedQualifier, data)
@@ -130,6 +130,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitVarargArgumentsExpression(varargArgumentsExpression: FirVarargArgumentsExpression) = visitExpression(varargArgumentsExpression)
override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression) = visitExpression(samConversionExpression)
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) = visitExpression(resolvedQualifier)
override fun visitResolvedReifiedParameterReference(resolvedReifiedParameterReference: FirResolvedReifiedParameterReference) = visitExpression(resolvedReifiedParameterReference)
@@ -971,6 +971,14 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformVarargArgumentsExpression(varargArgumentsExpression, data)
}
open fun transformSamConversionExpression(samConversionExpression: FirSamConversionExpression, data: D): FirStatement {
return transformElement(samConversionExpression, data)
}
final override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression, data: D): FirStatement {
return transformSamConversionExpression(samConversionExpression, data)
}
open fun transformResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): FirStatement {
return transformElement(resolvedQualifier, data)
}
@@ -377,6 +377,9 @@ abstract class FirVisitor<out R, in D> {
open fun visitVarargArgumentsExpression(varargArgumentsExpression: FirVarargArgumentsExpression, data: D): R =
visitElement(varargArgumentsExpression, data)
open fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression, data: D): R =
visitElement(samConversionExpression, data)
open fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): R =
visitElement(resolvedQualifier, data)
@@ -971,6 +971,14 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(varargArgumentsExpression)
}
final override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression, data: Nothing?) {
visitSamConversionExpression(samConversionExpression)
}
open fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression) {
visitElement(samConversionExpression)
}
final override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: Nothing?) {
visitResolvedQualifier(resolvedQualifier)
}
@@ -750,6 +750,12 @@ class FirRenderer(
print(")")
}
override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression) {
print("SAM(")
samConversionExpression.expression.accept(this)
print(")")
}
override fun visitCall(call: FirCall) {
callArgumentsRenderer?.renderArguments(call.arguments)
}
@@ -416,6 +416,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
noBuilder(constExpression)
builder(samConversionExpression) {
withCopy()
}
// -----------------------------------------------------------------------
findImplementationsWithElementInParents(annotationContainer).forEach {
@@ -149,6 +149,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val spreadArgumentExpression by element(Expression, wrappedArgumentExpression)
val namedArgumentExpression by element(Expression, wrappedArgumentExpression)
val varargArgumentsExpression by element(Expression, expression)
val samConversionExpression by element(Expression, expression)
val resolvedQualifier by element(Expression, expression)
val errorResolvedQualifier by element(Expression, resolvedQualifier, diagnosticHolder)
@@ -615,6 +615,10 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("varargElementType", typeRef)
}
samConversionExpression.configure {
+field("expression", expression)
}
resolvedQualifier.configure {
+field("packageFqName", fqNameType)
+field("relativeClassFqName", fqNameType, nullable = true)