[FIR] do not use FirValueParameter for function type parameter

As it is a different abstraction, introduced FirFunctionTypeParameter instead

Also, fix syntax checkers for function type parameter

^KT-55035 fixed
This commit is contained in:
Ilya Kirillov
2022-10-21 02:52:24 +02:00
committed by teamcity
parent 1b9fdeadfe
commit b6481ed891
40 changed files with 479 additions and 165 deletions
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2022 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
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirFunctionTypeParameter : FirPureAbstractElement(), FirElement {
abstract override val source: KtSourceElement?
abstract val name: Name?
abstract val returnTypeRef: FirTypeRef
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFunctionTypeParameter(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformFunctionTypeParameter(this, data) as E
}
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2022 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.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.impl.FirFunctionTypeParameterImpl
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.Name
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirFunctionTypeParameterBuilder {
var source: KtSourceElement? = null
var name: Name? = null
lateinit var returnTypeRef: FirTypeRef
fun build(): FirFunctionTypeParameter {
return FirFunctionTypeParameterImpl(
source,
name,
returnTypeRef,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildFunctionTypeParameter(init: FirFunctionTypeParameterBuilder.() -> Unit): FirFunctionTypeParameter {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirFunctionTypeParameterBuilder().apply(init).build()
}
@@ -0,0 +1,34 @@
/*
* Copyright 2010-2022 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.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
internal class FirFunctionTypeParameterImpl(
override val source: KtSourceElement?,
override val name: Name?,
override var returnTypeRef: FirTypeRef,
) : FirFunctionTypeParameter() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
returnTypeRef.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirFunctionTypeParameterImpl {
returnTypeRef = returnTypeRef.transform(transformer, data)
return this
}
}
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.visitors.*
@@ -21,7 +21,7 @@ abstract class FirFunctionTypeRef : FirTypeRefWithNullability() {
abstract override val annotations: List<FirAnnotation>
abstract override val isMarkedNullable: Boolean
abstract val receiverTypeRef: FirTypeRef?
abstract val valueParameters: List<FirValueParameter>
abstract val parameters: List<FirFunctionTypeParameter>
abstract val returnTypeRef: FirTypeRef
abstract val isSuspend: Boolean
abstract val contextReceiverTypeRefs: List<FirTypeRef>
@@ -9,9 +9,9 @@ package org.jetbrains.kotlin.fir.types.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -29,7 +29,7 @@ class FirFunctionTypeRefBuilder : FirAnnotationContainerBuilder {
override val annotations: MutableList<FirAnnotation> = mutableListOf()
var isMarkedNullable: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
var receiverTypeRef: FirTypeRef? = null
val valueParameters: MutableList<FirValueParameter> = mutableListOf()
val parameters: MutableList<FirFunctionTypeParameter> = mutableListOf()
lateinit var returnTypeRef: FirTypeRef
var isSuspend: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
val contextReceiverTypeRefs: MutableList<FirTypeRef> = mutableListOf()
@@ -40,7 +40,7 @@ class FirFunctionTypeRefBuilder : FirAnnotationContainerBuilder {
annotations,
isMarkedNullable,
receiverTypeRef,
valueParameters,
parameters,
returnTypeRef,
isSuspend,
contextReceiverTypeRefs,
@@ -67,7 +67,7 @@ inline fun buildFunctionTypeRefCopy(original: FirFunctionTypeRef, init: FirFunct
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.isMarkedNullable = original.isMarkedNullable
copyBuilder.receiverTypeRef = original.receiverTypeRef
copyBuilder.valueParameters.addAll(original.valueParameters)
copyBuilder.parameters.addAll(original.parameters)
copyBuilder.returnTypeRef = original.returnTypeRef
copyBuilder.isSuspend = original.isSuspend
copyBuilder.contextReceiverTypeRefs.addAll(original.contextReceiverTypeRefs)
@@ -8,7 +8,7 @@
package org.jetbrains.kotlin.fir.types.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -24,7 +24,7 @@ internal class FirFunctionTypeRefImpl(
override val annotations: MutableList<FirAnnotation>,
override val isMarkedNullable: Boolean,
override var receiverTypeRef: FirTypeRef?,
override val valueParameters: MutableList<FirValueParameter>,
override val parameters: MutableList<FirFunctionTypeParameter>,
override var returnTypeRef: FirTypeRef,
override val isSuspend: Boolean,
override val contextReceiverTypeRefs: MutableList<FirTypeRef>,
@@ -32,7 +32,7 @@ internal class FirFunctionTypeRefImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }
receiverTypeRef?.accept(visitor, data)
valueParameters.forEach { it.accept(visitor, data) }
parameters.forEach { it.accept(visitor, data) }
returnTypeRef.accept(visitor, data)
contextReceiverTypeRefs.forEach { it.accept(visitor, data) }
}
@@ -40,7 +40,7 @@ internal class FirFunctionTypeRefImpl(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirFunctionTypeRefImpl {
transformAnnotations(transformer, data)
receiverTypeRef = receiverTypeRef?.transform(transformer, data)
valueParameters.transformInplace(transformer, data)
parameters.transformInplace(transformer, data)
returnTypeRef = returnTypeRef.transform(transformer, data)
contextReceiverTypeRefs.transformInplace(transformer, data)
return this
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
@@ -255,6 +256,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(enumEntry, data)
}
open fun transformFunctionTypeParameter(functionTypeParameter: FirFunctionTypeParameter, data: D): FirFunctionTypeParameter {
return transformElement(functionTypeParameter, data)
}
open fun transformClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): FirStatement {
return transformElement(classLikeDeclaration, data)
}
@@ -799,6 +804,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformEnumEntry(enumEntry, data)
}
final override fun visitFunctionTypeParameter(functionTypeParameter: FirFunctionTypeParameter, data: D): FirFunctionTypeParameter {
return transformFunctionTypeParameter(functionTypeParameter, data)
}
final override fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): FirStatement {
return transformClassLikeDeclaration(classLikeDeclaration, data)
}
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
@@ -202,6 +203,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitElement(enumEntry, data)
open fun visitFunctionTypeParameter(functionTypeParameter: FirFunctionTypeParameter, data: D): R = visitElement(functionTypeParameter, data)
open fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: D): R = visitElement(classLikeDeclaration, data)
open fun visitClass(klass: FirClass, data: D): R = visitElement(klass, data)
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.FirFunctionTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
@@ -254,6 +255,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(enumEntry)
}
open fun visitFunctionTypeParameter(functionTypeParameter: FirFunctionTypeParameter) {
visitElement(functionTypeParameter)
}
open fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration) {
visitElement(classLikeDeclaration)
}
@@ -798,6 +803,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitEnumEntry(enumEntry)
}
final override fun visitFunctionTypeParameter(functionTypeParameter: FirFunctionTypeParameter, data: Nothing?) {
visitFunctionTypeParameter(functionTypeParameter)
}
final override fun visitClassLikeDeclaration(classLikeDeclaration: FirClassLikeDeclaration, data: Nothing?) {
visitClassLikeDeclaration(classLikeDeclaration)
}
@@ -707,7 +707,20 @@ class FirRenderer(
it.accept(this)
print(".")
}
valueParameterRenderer.renderParameters(functionTypeRef.valueParameters)
printer.print("(")
for ((index, parameter) in functionTypeRef.parameters.withIndex()) {
if (index > 0) {
printer.print(", ")
}
parameter.name?.let { name ->
printer.print(name.asString())
printer.print(": ")
}
parameter.returnTypeRef.accept(visitor)
}
printer.print(")")
print(" -> ")
functionTypeRef.returnTypeRef.accept(this)
print(" )")
@@ -77,9 +77,9 @@ val FirTypeRef.isMarkedNullable: Boolean?
val FirFunctionTypeRef.parametersCount: Int
get() = if (receiverTypeRef != null)
valueParameters.size + contextReceiverTypeRefs.size + 1
parameters.size + contextReceiverTypeRefs.size + 1
else
valueParameters.size + contextReceiverTypeRefs.size
parameters.size + contextReceiverTypeRefs.size
val EXTENSION_FUNCTION_ANNOTATION = ClassId.fromString("kotlin/ExtensionFunctionType")
val INTRINSIC_CONST_EVALUATION_ANNOTATION = ClassId.fromString("kotlin/internal/IntrinsicConstEvaluation")
@@ -45,6 +45,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val field by element(Declaration, variable, controlFlowGraphOwner)
val enumEntry by element(Declaration, variable)
val functionTypeParameter by element(Other, baseFirElement)
val classLikeDeclaration by sealedElement(Declaration, memberDeclaration, statement)
val klass by sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner)
val regularClass by element(Declaration, klass, controlFlowGraphOwner)
@@ -411,6 +411,12 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
needTransformOtherChildren()
}
functionTypeParameter.configure {
+field("name", nameType, nullable = true)
+field("returnTypeRef", typeRef)
}
errorProperty.configure {
+symbol("FirErrorPropertySymbol")
}
@@ -640,7 +646,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
functionTypeRef.configure {
+field("receiverTypeRef", typeRef, nullable = true)
+valueParameters
+fieldList("parameters", functionTypeParameter)
+returnTypeRef
+booleanField("isSuspend")