diff --git a/compiler/fir/tree/build.gradle.kts b/compiler/fir/tree/build.gradle.kts index 5b9bc999f4a..a020291ecde 100644 --- a/compiler/fir/tree/build.gradle.kts +++ b/compiler/fir/tree/build.gradle.kts @@ -27,25 +27,17 @@ sourceSets { val generatorClasspath by configurations.creating dependencies { - generatorClasspath(project("visitors-generator")) + generatorClasspath(project("tree-generator")) } -val generateVisitors by tasks.registering(NoDebugJavaExec::class) { - val generationRoot = "$projectDir/src/org/jetbrains/kotlin/fir/" - val output = "$projectDir/visitors" - - val allSourceFiles = fileTree(generationRoot) { - include("**/*.kt") - } - - inputs.files(allSourceFiles) - outputs.dirs(output) +val generateTree by tasks.registering(NoDebugJavaExec::class) { + val generationRoot = "$projectDir/src/" + args(generationRoot) classpath = generatorClasspath - args(generationRoot, output) - main = "org.jetbrains.kotlin.fir.visitors.generator.VisitorsGeneratorKt" + main = "org.jetbrains.kotlin.fir.tree.generator.MainKt" } val compileKotlin by tasks -compileKotlin.dependsOn(generateVisitors) +compileKotlin.dependsOn(generateTree) diff --git a/compiler/fir/tree/visitors-generator/build.gradle.kts b/compiler/fir/tree/tree-generator/build.gradle.kts similarity index 100% rename from compiler/fir/tree/visitors-generator/build.gradle.kts rename to compiler/fir/tree/tree-generator/build.gradle.kts diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FieldSets.kt diff --git a/compiler/fir/tree/visitors-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 similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt diff --git a/compiler/fir/tree/visitors-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 similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Main.kt diff --git a/compiler/fir/tree/visitors-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 similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Printer.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFieldConfigurator.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeBuilder.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeBuilder.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeBuilder.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeImplementationConfigurator.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeImplementationConfigurator.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/context/AbstractFirTreeImplementationConfigurator.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Implementation.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Importable.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Importable.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Importable.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Importable.kt diff --git a/compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt similarity index 100% rename from compiler/fir/tree/visitors-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt rename to compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Type.kt diff --git a/compiler/fir/tree/visitors-generator/src/AbstractVisitorGenerator.kt b/compiler/fir/tree/visitors-generator/src/AbstractVisitorGenerator.kt deleted file mode 100644 index e59db308bf5..00000000000 --- a/compiler/fir/tree/visitors-generator/src/AbstractVisitorGenerator.kt +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import org.jetbrains.kotlin.utils.Printer - -abstract class AbstractVisitorGenerator(val referencesData: DataCollector.ReferencesData) { - fun Printer.generateFunction( - name: String, - parameters: Map, - returnType: String, - override: Boolean = false, - final: Boolean = false, - typeParametersWithBounds: List = emptyList(), - body: (Printer.() -> Unit)? - ) { - - if (body == null) { - print("abstract ") - } else { - printIndent() - if (!final) { - printWithNoIndent("open ") - } - if (override) { - if (final) { - printWithNoIndent("final ") - } - printWithNoIndent("override ") - } - } - printWithNoIndent("fun ") - if (typeParametersWithBounds.isNotEmpty()) { - printWithNoIndent("<") - separatedOneLine(typeParametersWithBounds, ", ") - printWithNoIndent("> ") - } - printWithNoIndent(name, "(") - parameters - .flatMap { (parameterName, typeNameWithTypeParameters) -> - listOf(parameterName, ": ", typeNameWithTypeParameters.asStringWithoutBounds(), ", ") - }.dropLast(1) - .forEach { - printWithNoIndent(it) - } - printWithNoIndent(")") - if (returnType != "Unit") { - printWithNoIndent(": ", returnType) - } - if (body != null) { - printlnWithNoIndent(" {") - indented { - body() - } - println("}") - } else { - printlnWithNoIndent() - } - println() - } - - protected inline fun Printer.indented(l: () -> Unit) { - pushIndent() - l() - popIndent() - } - - protected fun Printer.generateCall(name: String, args: List) { - printWithNoIndent(name, "(") - separatedOneLine(args, ", ") - printWithNoIndent(")") - } - - private fun Printer.separatedOneLine(iterable: Iterable, separator: Any) { - var first = true - for (element in iterable) { - if (!first) { - printWithNoIndent(separator) - } else { - first = false - } - printWithNoIndent(element) - } - } - - private fun Printer.generateDefaultImports() { - referencesData.usedPackages.forEach { - println("import ", it.asString(), ".*") - } - println() - println() - } - - val String.safeName - get() = when (this) { - "class" -> "klass" - else -> this - } - - fun generate(): String { - val builder = StringBuilder() - val printer = Printer(builder, " ") - printer.apply { - println(javaClass.getResource("/notice.txt").readText()) - - println("package $VISITOR_PACKAGE") - println() - generateDefaultImports() - println(WARNING_GENERATED_FILE) - - printer.generateContent() - } - return builder.toString() - } - - - fun allElementTypes() = - referencesData.direct.let { map -> - map.keys + map.values.flatten() - }.distinct() - - abstract fun Printer.generateContent() - -} \ No newline at end of file diff --git a/compiler/fir/tree/visitors-generator/src/DataCollector.kt b/compiler/fir/tree/visitors-generator/src/DataCollector.kt deleted file mode 100644 index 8f97501fe7d..00000000000 --- a/compiler/fir/tree/visitors-generator/src/DataCollector.kt +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType - -class DataCollector { - - class NameWithTypeParameters private constructor( - val name: String, - val typeParameters: List, - private val typeParameterBounds: Map - ) : Comparable { - - override fun compareTo(other: NameWithTypeParameters): Int = name.compareTo(other.name) - - private constructor(name: String, typeParameters: Pair, Map>) : - this(name, typeParameters.first, typeParameters.second) - - constructor(name: String, typeParameterString: String) : - this(name, typeParameterString.splitToParametersAndBounds()) - - constructor(name: String) : this(name, emptyList(), emptyMap()) - - fun typeParametersWithBounds(): List = - typeParameters.map { parameter -> - parameter + (typeParameterBounds[parameter]?.let { " : $it" } ?: "") - } - - fun asStringWithoutBounds(): String = - name + if (typeParameters.isEmpty()) "" else typeParameters.joinToString(prefix = "<", postfix = ">", separator = ", ") - - override fun equals(other: Any?): Boolean = - other is NameWithTypeParameters && name == other.name - - override fun hashCode(): Int = name.hashCode() - - override fun toString(): String = - name + if (typeParameters.isEmpty()) "" else typeParameters.joinToString(prefix = "<", postfix = ">", separator = ", ") { - val bound = typeParameterBounds[it] - if (bound == null) it else "$it : $bound" - } - - companion object { - private fun String.splitToParametersAndBounds(): Pair, Map> { - val typeParametersWithBounds = drop(1).dropLast(1).split(",").map { it.trim() }.filter { it.isNotBlank() } - val typeParameters = mutableListOf() - val bounds = mutableMapOf() - for (parameterWithBounds in typeParametersWithBounds) { - val parts = parameterWithBounds.split(":").map { it.trim() } - typeParameters += parts[0] - if (parts.size > 1) { - bounds[parts[0]] = parts[1] - } - } - return typeParameters to bounds - } - } - } - - private val references = mutableMapOf>() - private val packagePerClass = mutableMapOf() - private val baseTransformedTypes = mutableListOf() - - private fun KtSuperTypeListEntry.toNameWithTypeParameters(): NameWithTypeParameters? { - val type = typeAsUserType ?: return null - val name = type.referencedName ?: return null - val typeArguments = type.typeArgumentList?.text ?: "" - return NameWithTypeParameters(name, typeArguments) - } - - fun readFile(file: KtFile) { - file.acceptChildren(object : KtVisitorVoid() { - - override fun visitKtElement(element: KtElement) { - super.visitKtElement(element) - element.acceptChildren(this) - } - - override fun visitClass(klass: KtClass) { - val className = klass.name ?: run { - super.visitClass(klass) - return - } - val classNameWithParameters = NameWithTypeParameters(className, klass.typeParameterList?.text ?: "") - if (klass.isInterface() || (klass.hasModifier(KtTokens.ABSTRACT_KEYWORD) && "Abstract" !in (klass.name ?: ""))) { - packagePerClass[classNameWithParameters] = file.packageFqName - val isBaseTT = klass.annotationEntries.any { - it.shortName?.asString() == BASE_TRANSFORMED_TYPE_ANNOTATION_NAME - } - if (isBaseTT) { - baseTransformedTypes += classNameWithParameters - } - - val manual = klass.superTypeListEntries.find { - it.typeReference?.findDescendantOfType { annotationEntry -> - annotationEntry.shortName?.asString() == VISITED_SUPERTYPE_ANNOTATION_NAME - } != null - } - if (manual != null) { - references[classNameWithParameters] = listOfNotNull(manual.toNameWithTypeParameters()) - } else { - references[classNameWithParameters] = - klass.superTypeListEntries.mapNotNull { - it.toNameWithTypeParameters() - } - } - } - - super.visitClass(klass) - } - }) - } - - - private fun Map>.computeBackReferences(): Map> { - val result = mutableMapOf>() - - this.forEach { (k, v) -> - v.forEach { - result.merge(it, listOf(k)) { a, b -> a + b } - } - } - return result - } - - private fun > Map>.sortedMap(): Map> { - return this.toSortedMap().mapValues { (_, v) -> v.sorted() } - } - - fun computeResult(): ReferencesData { - val back = references.computeBackReferences() - - val keysToKeep = - generateSequence(listOf(FIR_ELEMENT_CLASS_NAME)) { firName -> - firName.flatMap { back[it].orEmpty() }.takeUnless { it.isEmpty() } - }.flatten().toSet() - - val cleanBack = back.filterKeys { it in keysToKeep } - return ReferencesData( - cleanBack.computeBackReferences().sortedMap(), - cleanBack.sortedMap(), - packagePerClass.filterKeys { it in keysToKeep }.values.distinct().sortedBy { it.asString() }, - baseTransformedTypes.sorted() - ) - } - - data class ReferencesData( - val direct: Map>, - val back: Map>, - val usedPackages: List, - val baseTransformedTypes: List - ) -} \ No newline at end of file diff --git a/compiler/fir/tree/visitors-generator/src/ParametricTransformerGenerator.kt b/compiler/fir/tree/visitors-generator/src/ParametricTransformerGenerator.kt deleted file mode 100644 index 5eef9eb9951..00000000000 --- a/compiler/fir/tree/visitors-generator/src/ParametricTransformerGenerator.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import org.jetbrains.kotlin.fir.visitors.generator.DataCollector.NameWithTypeParameters -import org.jetbrains.kotlin.utils.Printer - -class ParametricTransformerGenerator(data: DataCollector.ReferencesData) : AbstractVisitorGenerator(data) { - override fun Printer.generateContent() { - println("abstract class $PARAMETRIC_TRANSFORMER_NAME : $SIMPLE_VISITOR_NAME<$TRANSFORMER_RESULT_NAME<$FIR_ELEMENT_CLASS_NAME>, D>() {") - indented { - - generateFunction( - "transformElement", - mapOf( - "element" to NameWithTypeParameters("E"), - "data" to NameWithTypeParameters("D") - ), - constructCompositeBoxType("E"), - typeParametersWithBounds = listOf("E : $FIR_ELEMENT_CLASS_NAME"), - body = null - ) - - referencesData.walkHierarchyTopDown(FIR_ELEMENT_CLASS_NAME) { parent, className -> - generateTransformMethod(className, parent) - } - - allElementTypes().forEach { - generateTrampolineVisit(it) - } - - } - println("}") - } - - - fun constructCompositeBoxType(type: String): String { - return "$TRANSFORMER_RESULT_NAME<$type>" - } - - val baseTypes = mutableMapOf().also { - for (baseTransformedType in referencesData.baseTransformedTypes) { - it[baseTransformedType] = baseTransformedType - } - - data.walkHierarchyTopDown(FIR_ELEMENT_CLASS_NAME) { parent, element -> - it[element] = it[parent] ?: return@walkHierarchyTopDown - } - } - - fun Printer.generateTrampolineVisit(className: NameWithTypeParameters) { - val shortcutName = className.name.classNameWithoutFir - val parameterName = shortcutName.decapitalize().safeName - generateFunction( - name = "visit$shortcutName", - parameters = mapOf( - parameterName to className, - "data" to NameWithTypeParameters("D") - ), - returnType = constructCompositeBoxType(FIR_ELEMENT_CLASS_NAME.name), - override = true, - final = true, - typeParametersWithBounds = className.typeParametersWithBounds() - ) { - print("return ") - generateCall("transform$shortcutName", listOf(parameterName, "data")) - println() - } - } - - fun Printer.generateTransformMethod( - className: NameWithTypeParameters, - parent: NameWithTypeParameters - ) { - val baseType = baseTypes[className] - - val shortcutName = className.name.classNameWithoutFir - val parameterName = shortcutName.decapitalize().safeName - if (baseType == null) { - generateFunction( - "transform$shortcutName", - mapOf( - parameterName to NameWithTypeParameters("E"), - "data" to NameWithTypeParameters("D") - ), - constructCompositeBoxType("E"), - typeParametersWithBounds = listOf("E : $parent") + className.typeParametersWithBounds() - ) { - print("return ") - generateCall("transformElement", listOf(parameterName, "data")) - printlnWithNoIndent() - } - } else { - generateFunction( - "transform$shortcutName", - mapOf( - parameterName to className, - "data" to NameWithTypeParameters("D") - ), - constructCompositeBoxType(baseType.name), - typeParametersWithBounds = className.typeParametersWithBounds() - ) { - print("return ") - generateCall("transformElement", listOf(parameterName, "data")) - printlnWithNoIndent() - } - } - - } - -} \ No newline at end of file diff --git a/compiler/fir/tree/visitors-generator/src/PsiSetup.kt b/compiler/fir/tree/visitors-generator/src/PsiSetup.kt deleted file mode 100644 index 1a969c68c20..00000000000 --- a/compiler/fir/tree/visitors-generator/src/PsiSetup.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import com.intellij.core.CoreApplicationEnvironment -import com.intellij.core.CoreProjectEnvironment -import com.intellij.lang.MetaLanguage -import com.intellij.openapi.Disposable -import com.intellij.openapi.extensions.Extensions -import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Disposer -import org.jetbrains.kotlin.idea.KotlinFileType -import org.jetbrains.kotlin.parsing.KotlinParserDefinition - -internal data class PsiSetup( - val applicationEnvironment: CoreApplicationEnvironment, - val projectEnvironment: CoreProjectEnvironment, - val project: Project, - val disposable: Disposable -) - -internal fun setup(): PsiSetup { - val disposable = Disposer.newDisposable() - - val applicationEnvironment = CoreApplicationEnvironment(disposable, false) - - val projectEnvironment = CoreProjectEnvironment(disposable, applicationEnvironment) - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), MetaLanguage.EP_NAME, MetaLanguage::class.java) - - - applicationEnvironment.registerFileType(KotlinFileType.INSTANCE, "kt") - applicationEnvironment.registerParserDefinition(KotlinParserDefinition()) - - - val project = projectEnvironment.project - return PsiSetup(applicationEnvironment, projectEnvironment, project, disposable) -} - -internal inline fun withPsiSetup(l: PsiSetup.() -> T): T { - val setup = setup() - val t = setup.l() - Disposer.dispose(setup.disposable) - return t -} - diff --git a/compiler/fir/tree/visitors-generator/src/SimpleVisitorGenerator.kt b/compiler/fir/tree/visitors-generator/src/SimpleVisitorGenerator.kt deleted file mode 100644 index bea3ba67c56..00000000000 --- a/compiler/fir/tree/visitors-generator/src/SimpleVisitorGenerator.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import org.jetbrains.kotlin.fir.visitors.generator.DataCollector.NameWithTypeParameters -import org.jetbrains.kotlin.utils.Printer - -class SimpleVisitorGenerator(referencesData: DataCollector.ReferencesData) : AbstractVisitorGenerator(referencesData) { - override fun Printer.generateContent() { - println("abstract class $SIMPLE_VISITOR_NAME {") - indented { - generateFunction( - "visitElement", - parameters = mapOf( - "element" to FIR_ELEMENT_CLASS_NAME, - "data" to NameWithTypeParameters("D") - ), - returnType = "R", - body = null - ) - - referencesData.walkHierarchyTopDown(from = FIR_ELEMENT_CLASS_NAME) { parent, element -> - generateVisit(element, parent) - } - } - println("}") - } - - - private fun Printer.generateVisit( - className: NameWithTypeParameters, - parent: NameWithTypeParameters - ) { - val shortcutName = className.name.classNameWithoutFir - val parameterName = shortcutName.decapitalize().safeName - generateFunction( - name = "visit$shortcutName", - parameters = mapOf( - parameterName to className, - "data" to NameWithTypeParameters("D") - ), - returnType = "R", - typeParametersWithBounds = className.typeParametersWithBounds() - ) { - print("return ") - generateCall("visitElement", listOf(parameterName, "data")) - println() - } - } -} \ No newline at end of file diff --git a/compiler/fir/tree/visitors-generator/src/UnitVisitorGenerator.kt b/compiler/fir/tree/visitors-generator/src/UnitVisitorGenerator.kt deleted file mode 100644 index 23650f87a47..00000000000 --- a/compiler/fir/tree/visitors-generator/src/UnitVisitorGenerator.kt +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import org.jetbrains.kotlin.fir.visitors.generator.DataCollector.NameWithTypeParameters -import org.jetbrains.kotlin.utils.Printer - -class UnitVisitorGenerator(referencesData: DataCollector.ReferencesData) : AbstractVisitorGenerator(referencesData) { - override fun Printer.generateContent() { - println("abstract class $UNIT_VISITOR_NAME : $SIMPLE_VISITOR_NAME() {") - indented { - generateFunction( - "visitElement", - parameters = mapOf( - "element" to FIR_ELEMENT_CLASS_NAME - ), - returnType = "Unit", - body = null - ) - - referencesData.walkHierarchyTopDown(from = FIR_ELEMENT_CLASS_NAME) { parent, element -> - generateVisit(element, parent) - } - - allElementTypes().forEach { - generateTrampolineVisit(it) - } - - } - println("}") - } - - - private fun Printer.generateVisit( - className: NameWithTypeParameters, - parent: NameWithTypeParameters - ) { - val shortcutName = className.name.classNameWithoutFir - val parameterName = shortcutName.decapitalize().safeName - generateFunction( - name = "visit$shortcutName", - parameters = mapOf( - parameterName to className - ), - returnType = "Unit", - typeParametersWithBounds = className.typeParametersWithBounds() - ) { - printIndent() - generateCall("visitElement", listOf(parameterName, "null")) - println() - } - } - - private fun Printer.generateTrampolineVisit(className: NameWithTypeParameters) { - val shortcutName = className.name.classNameWithoutFir - val parameterName = shortcutName.decapitalize().safeName - generateFunction( - name = "visit$shortcutName", - parameters = mapOf( - parameterName to className, - "data" to NameWithTypeParameters("Nothing?") - ), - returnType = "Unit", - override = true, - final = true, - typeParametersWithBounds = className.typeParametersWithBounds() - ) { - printIndent() - generateCall("visit$shortcutName", listOf(parameterName)) - println() - } - } -} \ No newline at end of file diff --git a/compiler/fir/tree/visitors-generator/src/VisitorsGenerator.kt b/compiler/fir/tree/visitors-generator/src/VisitorsGenerator.kt deleted file mode 100644 index 5061e1aa70c..00000000000 --- a/compiler/fir/tree/visitors-generator/src/VisitorsGenerator.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2000-2018 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.visitors.generator - -import com.intellij.openapi.util.text.StringUtil -import com.intellij.openapi.vfs.StandardFileSystems -import com.intellij.openapi.vfs.VirtualFileManager -import com.intellij.openapi.vfs.local.CoreLocalFileSystem -import com.intellij.psi.PsiManager -import com.intellij.psi.SingleRootFileViewProvider -import org.jetbrains.kotlin.psi.KtFile -import java.io.File - - -val FIR_ELEMENT_CLASS_NAME = DataCollector.NameWithTypeParameters("FirElement") -const val VISITOR_PACKAGE = "org.jetbrains.kotlin.fir.visitors" -const val SIMPLE_VISITOR_NAME = "FirVisitor" -const val UNIT_VISITOR_NAME = "FirVisitorVoid" -const val PARAMETRIC_TRANSFORMER_NAME = "FirTransformer" -const val TRANSFORMER_RESULT_NAME = "CompositeTransformResult" - -const val BASE_TRANSFORMED_TYPE_ANNOTATION_NAME = "BaseTransformedType" -const val VISITED_SUPERTYPE_ANNOTATION_NAME = "VisitedSupertype" - -const val WARNING_GENERATED_FILE = - """/** This file generated by :compiler:fir:tree:generateVisitors. DO NOT MODIFY MANUALLY! */""" - -fun main(args: Array) { - -// val rootPath = File(args[0]) -// val output = File(args[1]) -// -// val packageDirectory = output.resolve(VISITOR_PACKAGE.replace('.', '/')) -// packageDirectory.mkdirs() -// -// withPsiSetup { -// val psiManager = PsiManager.getInstance(project) -// val vfm = VirtualFileManager.getInstance() -// -// -// val dataCollector = DataCollector() -// -// rootPath.walkTopDown() -// .filter { -// it.extension == "kt" -// }.map { -// (vfm.getFileSystem(StandardFileSystems.FILE_PROTOCOL) as CoreLocalFileSystem).findFileByIoFile(it) -// }.flatMap { -// SingleRootFileViewProvider(psiManager, it!!).allFiles.asSequence() -// } -// .filterIsInstance() -// .forEach(dataCollector::readFile) -// -// -// val data = dataCollector.computeResult() -// -// -// SimpleVisitorGenerator(data).runGenerator(packageDirectory.resolve("${SIMPLE_VISITOR_NAME}Generated.kt")) -// UnitVisitorGenerator(data).runGenerator(packageDirectory.resolve("${UNIT_VISITOR_NAME}Generated.kt")) -// ParametricTransformerGenerator(data).runGenerator(packageDirectory.resolve("${PARAMETRIC_TRANSFORMER_NAME}Generated.kt")) -// } -} - -fun AbstractVisitorGenerator.runGenerator(file: File) { - file.writeText(StringUtil.convertLineSeparators(this.generate(), System.lineSeparator())) -} - - -val String.classNameWithoutFir get() = this.removePrefix("Fir") - - -fun DataCollector.ReferencesData.walkHierarchyTopDown( - from: DataCollector.NameWithTypeParameters, - l: (p: DataCollector.NameWithTypeParameters, e: DataCollector.NameWithTypeParameters) -> Unit -) { - val referents = back[from] ?: return - for (referent in referents) { - l(from, referent) - walkHierarchyTopDown(referent, l) - } -} - - diff --git a/settings.gradle b/settings.gradle index b540561e92f..bfd5e5188d0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -43,7 +43,7 @@ include ":kotlin-build-common", ":compiler:visualizer:render-psi", ":compiler:fir:cones", ":compiler:fir:tree", - ":compiler:fir:tree:visitors-generator", + ":compiler:fir:tree:tree-generator", ":compiler:fir:psi2fir", ":compiler:fir:lightTree", ":compiler:fir:fir2ir",