[FIR generator] Factor out TypeArgument to common module
This is a step towards commonizing the code generator between FIR and IR: KT-61970
This commit is contained in:
committed by
Space Team
parent
46cbec7260
commit
977e316489
+1
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFieldConfigurator
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder.Companion.baseFirElement
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.type
|
||||
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||
import org.jetbrains.kotlin.generators.tree.SimpleTypeArgument
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuilder) {
|
||||
|
||||
+2
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.tree.generator.context
|
||||
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||
import org.jetbrains.kotlin.generators.tree.ImplementationKind
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
import org.jetbrains.kotlin.generators.tree.SimpleTypeArgument
|
||||
import org.jetbrains.kotlin.generators.tree.TypeArgumentWithMultipleUpperBounds
|
||||
|
||||
abstract class AbstractFieldConfigurator<T : AbstractFirTreeBuilder>(private val builder: T) {
|
||||
inner class ConfigureContext(val element: Element) {
|
||||
|
||||
+5
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.tree.generator.model
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.generics
|
||||
import org.jetbrains.kotlin.generators.tree.FieldContainer
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
|
||||
@@ -42,6 +43,8 @@ class LeafBuilder(val implementation: Implementation) : Builder() {
|
||||
"${implementation.element.type}Builder"
|
||||
}
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type + implementation.element.generics
|
||||
|
||||
override val allFields: List<FieldWithDefault> by lazy { implementation.fieldsWithoutDefault }
|
||||
|
||||
override val uselessFields: List<FieldWithDefault> by lazy {
|
||||
@@ -68,4 +71,6 @@ class IntermediateBuilder(override val type: String) : Builder() {
|
||||
|
||||
override val uselessFields: List<FieldWithDefault> = emptyList()
|
||||
override var packageName: String = DEFAULT_BUILDER_PACKAGE
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type
|
||||
}
|
||||
|
||||
+5
-24
@@ -6,11 +6,13 @@
|
||||
package org.jetbrains.kotlin.fir.tree.generator.model
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.BASE_PACKAGE
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.typeWithArguments
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.generics
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.fir.tree.generator.util.set
|
||||
import org.jetbrains.kotlin.generators.tree.FieldContainer
|
||||
import org.jetbrains.kotlin.generators.tree.ImplementationKind
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
import org.jetbrains.kotlin.generators.tree.TypeArgument
|
||||
import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner
|
||||
|
||||
interface AbstractElement : FieldContainer, ImplementationKindOwner {
|
||||
@@ -34,6 +36,8 @@ interface AbstractElement : FieldContainer, ImplementationKindOwner {
|
||||
get() = false
|
||||
|
||||
override val allParents: List<ImplementationKindOwner> get() = parents
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type + generics
|
||||
}
|
||||
|
||||
class Element(override val name: String, kind: Kind) : AbstractElement {
|
||||
@@ -180,26 +184,3 @@ class ElementWithArguments(val element: Element, override val typeArguments: Lis
|
||||
return element.hashCode()
|
||||
}
|
||||
}
|
||||
|
||||
sealed class TypeArgument(val name: String) {
|
||||
abstract val upperBounds: List<Importable>
|
||||
}
|
||||
|
||||
class SimpleTypeArgument(name: String, val upperBound: Importable?) : TypeArgument(name) {
|
||||
override val upperBounds: List<Importable> = listOfNotNull(upperBound)
|
||||
|
||||
override fun toString(): String {
|
||||
var result = name
|
||||
if (upperBound != null) {
|
||||
result += " : ${upperBound.typeWithArguments}"
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
class TypeArgumentWithMultipleUpperBounds(name: String, override val upperBounds: List<Importable>) : TypeArgument(name) {
|
||||
override fun toString(): String {
|
||||
return name
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.model
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.type
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.typeWithArguments
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
|
||||
// ----------- Simple field -----------
|
||||
|
||||
+7
-1
@@ -5,7 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.tree.generator.model
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.typeWithArguments
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.generics
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.generators.tree.ArbitraryImportable
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
import org.jetbrains.kotlin.generators.tree.AbstractField
|
||||
@@ -30,6 +31,8 @@ sealed class Field : AbstractField() {
|
||||
|
||||
var withBindThis = true
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type + generics + if (nullable && !notNull) "?" else ""
|
||||
|
||||
fun copy(): Field = internalCopy().also {
|
||||
updateFieldsInCopy(it)
|
||||
}
|
||||
@@ -207,6 +210,9 @@ class FirField(
|
||||
override var isLateinit: Boolean = false
|
||||
override var isParameter: Boolean = false
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String =
|
||||
element.getTypeWithArguments(notNull) + if (nullable && !notNull) "?" else ""
|
||||
|
||||
override fun internalCopy(): Field {
|
||||
return FirField(
|
||||
name,
|
||||
|
||||
+5
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.tree.generator.model
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.generics
|
||||
import org.jetbrains.kotlin.generators.tree.*
|
||||
|
||||
class ImplementationWithArg(
|
||||
@@ -12,6 +13,8 @@ class ImplementationWithArg(
|
||||
val argument: Importable?
|
||||
) : FieldContainer by implementation, ImplementationKindOwner by implementation {
|
||||
val element: Element get() = implementation.element
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type + generics
|
||||
}
|
||||
|
||||
class Implementation(val element: Element, val name: String?) : FieldContainer, ImplementationKindOwner {
|
||||
@@ -37,6 +40,8 @@ class Implementation(val element: Element, val name: String?) : FieldContainer,
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type + element.generics
|
||||
|
||||
override val packageName = element.packageName + ".impl"
|
||||
val usedTypes = mutableListOf<Importable>()
|
||||
val arbitraryImportables = mutableListOf<ArbitraryImportable>()
|
||||
|
||||
+3
@@ -5,8 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.tree.generator.model
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.printer.generics
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
|
||||
data class Type(override val packageName: String?, override val type: String, val firType: Boolean = false) : Importable {
|
||||
val arguments = mutableListOf<String>()
|
||||
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type + generics
|
||||
}
|
||||
|
||||
+1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.declarationAttributesType
|
||||
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||
import org.jetbrains.kotlin.utils.withIndent
|
||||
import java.io.File
|
||||
|
||||
+1
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.generators.tree.ImplementationKind
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
|
||||
import org.jetbrains.kotlin.fir.tree.generator.util.get
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||
import org.jetbrains.kotlin.utils.withIndent
|
||||
import java.io.File
|
||||
|
||||
+1
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||
import org.jetbrains.kotlin.generators.tree.ImplementationKind
|
||||
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
|
||||
import org.jetbrains.kotlin.utils.withIndent
|
||||
|
||||
+1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
|
||||
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
|
||||
import org.jetbrains.kotlin.fir.tree.generator.model.Element
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||
import org.jetbrains.kotlin.utils.withIndent
|
||||
|
||||
|
||||
+2
-18
@@ -8,12 +8,10 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
|
||||
import org.jetbrains.kotlin.fir.tree.generator.firImplementationDetailType
|
||||
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||
import org.jetbrains.kotlin.generators.tree.ImplementationKind
|
||||
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
|
||||
import org.jetbrains.kotlin.generators.tree.Importable
|
||||
import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner
|
||||
import java.io.File
|
||||
import org.jetbrains.kotlin.generators.tree.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
|
||||
import java.io.File
|
||||
|
||||
class GeneratedFile(val file: File, val newText: String)
|
||||
|
||||
@@ -168,20 +166,6 @@ fun ImplementationKind?.braces(): String = when (this) {
|
||||
|
||||
val Element.safeDecapitalizedName: String get() = if (name == "Class") "klass" else name.replaceFirstChar(Char::lowercaseChar)
|
||||
|
||||
val Importable.typeWithArguments: String get() = getTypeWithArguments()
|
||||
|
||||
fun Importable.getTypeWithArguments(notNull: Boolean = false): String = when (this) {
|
||||
is AbstractElement -> type + generics
|
||||
is Implementation -> type + element.generics
|
||||
is FirField -> element.getTypeWithArguments(notNull) + if (nullable && !notNull) "?" else ""
|
||||
is Field -> type + generics + if (nullable && !notNull) "?" else ""
|
||||
is Type -> type + generics
|
||||
is ImplementationWithArg -> type + generics
|
||||
is LeafBuilder -> type + implementation.element.generics
|
||||
is IntermediateBuilder -> type
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
|
||||
val ImplementationWithArg.generics: String
|
||||
get() = argument?.let { "<${it.type}>" } ?: ""
|
||||
|
||||
|
||||
+1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
|
||||
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder
|
||||
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
|
||||
import org.jetbrains.kotlin.fir.tree.generator.model.Element
|
||||
import org.jetbrains.kotlin.generators.tree.typeWithArguments
|
||||
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||
import org.jetbrains.kotlin.utils.withIndent
|
||||
import java.io.File
|
||||
|
||||
+3
-1
@@ -5,4 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.generators.tree
|
||||
|
||||
data class ArbitraryImportable(override val packageName: String, override val type: String) : Importable
|
||||
data class ArbitraryImportable(override val packageName: String, override val type: String) : Importable {
|
||||
override fun getTypeWithArguments(notNull: Boolean): String = type
|
||||
}
|
||||
+5
-1
@@ -9,4 +9,8 @@ interface Importable {
|
||||
val type: String
|
||||
val packageName: String?
|
||||
val fullQualifiedName: String? get() = packageName?.let { "$it.${type.replace(Regex("<.+>"), "")}" }
|
||||
}
|
||||
|
||||
fun getTypeWithArguments(notNull: Boolean = false): String
|
||||
}
|
||||
|
||||
val Importable.typeWithArguments: String get() = getTypeWithArguments()
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.generators.tree
|
||||
|
||||
sealed class TypeArgument(val name: String) {
|
||||
abstract val upperBounds: List<Importable>
|
||||
}
|
||||
|
||||
class SimpleTypeArgument(name: String, val upperBound: Importable?) : TypeArgument(name) {
|
||||
override val upperBounds: List<Importable> = listOfNotNull(upperBound)
|
||||
|
||||
override fun toString(): String {
|
||||
var result = name
|
||||
if (upperBound != null) {
|
||||
result += " : ${upperBound.typeWithArguments}"
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
class TypeArgumentWithMultipleUpperBounds(name: String, override val upperBounds: List<Importable>) : TypeArgument(name) {
|
||||
override fun toString(): String {
|
||||
return name
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user