diff --git a/generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt b/generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt deleted file mode 100644 index a9be91cf6f..0000000000 --- a/generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.jetbrains.dataframe.keywords - -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.SourceSetContainer -import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.register -import java.io.File - -class KeywordsGeneratorPlugin: Plugin { - override fun apply(target: Project): Unit = with(target){ - val genSrcDir = layout.buildDirectory.asFile.get().resolve("generatedSrc") - val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer - val mainSourceSet: SourceSet = sourceSets.named("main").get() - mainSourceSet.addDir(genSrcDir) - - val genTask = tasks.register(GeneratorTask.NAME) { - srcDir = genSrcDir - } - - tasks["compileKotlin"].dependsOn(genTask) - } - - private fun SourceSet.addDir(dir: File) { - java.setSrcDirs(java.srcDirs + dir) - } -} diff --git a/generator/README.md b/plugins/keywords-generator/README.md similarity index 58% rename from generator/README.md rename to plugins/keywords-generator/README.md index fceabae254..1b1de30de5 100644 --- a/generator/README.md +++ b/plugins/keywords-generator/README.md @@ -1,14 +1,11 @@ -## :generator +## :plugins:keywords-generator This module holds a little Gradle plugin whose sole purpose is to provide -[:core](../core) with the `generateKeywordsSrc` task. +[:core](../../core) with the `generateKeywordsSrc` task. This task, generates three enum classes: `HardKeywords`, `ModifierKeywords`, and `SoftKeywords`. These enums together contain all restricted Kotlin keywords to be taken into account when generating our own -code in Notebooks or any of our [plugins](../plugins). Words like "package", "fun", "suspend", etc... +code in Notebooks or any of our [plugins](..). Words like "package", "fun", "suspend", etc... As the Kotlin language can change over time, this task ensures that any changes to the language will be reflected in our code generation. - -This module will likely be moved under [:plugins](../plugins): -[Issue #899](https://github.com/Kotlin/dataframe/issues/899). diff --git a/generator/build.gradle.kts b/plugins/keywords-generator/build.gradle.kts similarity index 63% rename from generator/build.gradle.kts rename to plugins/keywords-generator/build.gradle.kts index 1925b89b6a..9a6724724c 100644 --- a/generator/build.gradle.kts +++ b/plugins/keywords-generator/build.gradle.kts @@ -1,6 +1,7 @@ plugins { `java-gradle-plugin` `kotlin-dsl` + id("com.github.gmazzo.buildconfig") version "5.5.1" } val kotlinCompilerVersion: String by project @@ -10,8 +11,14 @@ repositories { mavenCentral() } +buildConfig { + packageName = "org.jetbrains.kotlinx.dataframe" + className = "BuildConfig" + buildConfigField("kotlinCompilerVersion", kotlinCompilerVersion) +} + dependencies { - implementation(kotlin("compiler-embeddable", kotlinCompilerVersion)) + compileOnly(kotlin("compiler-embeddable", kotlinCompilerVersion)) implementation("com.squareup:kotlinpoet:$kotlinPoetVersion") } diff --git a/generator/gradle.properties b/plugins/keywords-generator/gradle.properties similarity index 53% rename from generator/gradle.properties rename to plugins/keywords-generator/gradle.properties index 9c94b52116..7eade7a0da 100644 --- a/generator/gradle.properties +++ b/plugins/keywords-generator/gradle.properties @@ -1,2 +1,2 @@ kotlinCompilerVersion=2.0.20 -kotlinPoetVersion=1.18.1 +kotlinPoetVersion=2.0.0 diff --git a/generator/settings.gradle.kts b/plugins/keywords-generator/settings.gradle.kts similarity index 100% rename from generator/settings.gradle.kts rename to plugins/keywords-generator/settings.gradle.kts diff --git a/generator/src/main/kotlin/org/jetbrains/dataframe/keywords/EnumEntry.kt b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/EnumEntry.kt similarity index 100% rename from generator/src/main/kotlin/org/jetbrains/dataframe/keywords/EnumEntry.kt rename to plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/EnumEntry.kt diff --git a/generator/src/main/kotlin/org/jetbrains/dataframe/keywords/GeneratorTask.kt b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorAction.kt similarity index 80% rename from generator/src/main/kotlin/org/jetbrains/dataframe/keywords/GeneratorTask.kt rename to plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorAction.kt index 50ad1e77a0..97fc580ed1 100644 --- a/generator/src/main/kotlin/org/jetbrains/dataframe/keywords/GeneratorTask.kt +++ b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorAction.kt @@ -5,28 +5,23 @@ import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeSpec -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction +import org.gradle.workers.WorkAction +import org.gradle.workers.WorkParameters import org.jetbrains.kotlin.com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.lexer.KtKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import java.io.File -open class GeneratorTask : DefaultTask() { +abstract class KeywordsGeneratorAction : WorkAction { - @OutputDirectory - lateinit var srcDir: File + interface Parameters : WorkParameters { + var srcDir: File + } private val taskPackageName = "org.jetbrains.dataframe.keywords" - @Input - override fun getGroup() = "codegen" - - @TaskAction - fun generate() { - srcDir.deleteRecursively() + override fun execute() { + parameters.srcDir.deleteRecursively() generateKeywordEnums() } @@ -34,14 +29,14 @@ open class GeneratorTask : DefaultTask() { listOf( "HardKeywords" to KtTokens.KEYWORDS, "SoftKeywords" to KtTokens.SOFT_KEYWORDS, - "ModifierKeywords" to KtTokens.MODIFIER_KEYWORDS + "ModifierKeywords" to KtTokens.MODIFIER_KEYWORDS, ).forEach { (name, set) -> generateKeywordsEnum(name, set) } } private fun generateKeywordsEnum(name: String, tokenSet: TokenSet) { - buildKwEnum(name, getKeywords(tokenSet)).writeTo(srcDir) + buildKwEnum(name, getKeywords(tokenSet)).writeTo(parameters.srcDir) } private fun getKeywords(tokenSet: TokenSet): List { @@ -87,8 +82,4 @@ open class GeneratorTask : DefaultTask() { return fileBuilder.build() } - - companion object { - const val NAME = "generateKeywordsSrc" - } } diff --git a/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt new file mode 100644 index 0000000000..7523166638 --- /dev/null +++ b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt @@ -0,0 +1,48 @@ +package org.jetbrains.dataframe.keywords + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.DependencyScopeConfiguration +import org.gradle.api.artifacts.ResolvableConfiguration +import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.register +import org.jetbrains.kotlinx.dataframe.BuildConfig +import java.io.File + +@Suppress("UnstableApiUsage") +abstract class KeywordsGeneratorPlugin : Plugin { + + override fun apply(target: Project): Unit = with(target) { + // from https://kotlinlang.org/docs/whatsnew21.html#compiler-symbols-hidden-from-the-kotlin-gradle-plugin-api + val dependencyScopeConfiguration: DependencyScopeConfiguration = configurations.dependencyScope("keywordsGeneratorDependencyScope").get() + dependencies.add(dependencyScopeConfiguration.name, "$KOTLIN_COMPILER_EMBEDDABLE:$KOTLIN_COMPILER_VERSION") + + val resolvableConfiguration: ResolvableConfiguration = configurations.resolvable("keywordGeneratorResolvable") { + extendsFrom(dependencyScopeConfiguration) + }.get() + + val genSrcDir = layout.buildDirectory.asFile.get().resolve("generatedSrc") + + val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer + val mainSourceSet = sourceSets.named("main").get() + mainSourceSet.addDir(genSrcDir) + + val genTask = tasks.register(KeywordsGeneratorTask.NAME) { + kotlinCompiler.from(resolvableConfiguration) + srcDir = genSrcDir + } + + tasks["compileKotlin"].dependsOn(genTask) + } + + private fun SourceSet.addDir(dir: File) { + java.setSrcDirs(java.srcDirs + dir) + } + + companion object { + const val KOTLIN_COMPILER_EMBEDDABLE = "org.jetbrains.kotlin:kotlin-compiler-embeddable" + const val KOTLIN_COMPILER_VERSION: String = BuildConfig.kotlinCompilerVersion + } +} diff --git a/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorTask.kt b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorTask.kt new file mode 100644 index 0000000000..ef49146790 --- /dev/null +++ b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorTask.kt @@ -0,0 +1,41 @@ +package org.jetbrains.dataframe.keywords + +import org.gradle.api.DefaultTask +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.tasks.Classpath +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction +import org.gradle.kotlin.dsl.submit +import org.gradle.workers.WorkerExecutor +import java.io.File +import javax.inject.Inject + +abstract class KeywordsGeneratorTask: DefaultTask() { + + @get:Inject + abstract val executor: WorkerExecutor + + @get:Classpath + abstract val kotlinCompiler: ConfigurableFileCollection + + @OutputDirectory + lateinit var srcDir: File + + @Input + override fun getGroup() = "codegen" + + @TaskAction + fun generate() { + val workQueue = executor.classLoaderIsolation { + classpath.from(kotlinCompiler) + } + workQueue.submit(KeywordsGeneratorAction::class) { + srcDir = this@KeywordsGeneratorTask.srcDir + } + } + + companion object { + const val NAME = "generateKeywordsSrc" + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 1689a39156..72771da882 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,8 +2,8 @@ rootProject.name = "dataframe" -// treated as a separate project with its own Kotlin version etc. -includeBuild("generator") +// treated as a separate project with its own Kotlin version, etc. +includeBuild("plugins/keywords-generator") include("plugins:dataframe-gradle-plugin") include("plugins:symbol-processor")