From 933636bb50792fc7b850d3b7e93d36604aa7214f Mon Sep 17 00:00:00 2001 From: Jolan Rensen Date: Tue, 10 Dec 2024 16:24:21 +0100 Subject: [PATCH 1/2] moved :generator plugin to worker-based :plugins:keywords-generator plugin, bumping versions --- .../keywords/KeywordsGeneratorPlugin.kt | 28 ------------ .../keywords-generator}/README.md | 9 ++-- .../keywords-generator}/build.gradle.kts | 9 +++- .../keywords-generator}/gradle.properties | 2 +- .../keywords-generator}/settings.gradle.kts | 0 .../jetbrains/dataframe/keywords/EnumEntry.kt | 0 .../keywords/KeywordsGeneratorAction.kt | 29 +++++------- .../keywords/KeywordsGeneratorPlugin.kt | 44 +++++++++++++++++++ .../keywords/KeywordsGeneratorTask.kt | 41 +++++++++++++++++ settings.gradle.kts | 4 +- 10 files changed, 109 insertions(+), 57 deletions(-) delete mode 100644 generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt rename {generator => plugins/keywords-generator}/README.md (58%) rename {generator => plugins/keywords-generator}/build.gradle.kts (63%) rename {generator => plugins/keywords-generator}/gradle.properties (53%) rename {generator => plugins/keywords-generator}/settings.gradle.kts (100%) rename {generator => plugins/keywords-generator}/src/main/kotlin/org/jetbrains/dataframe/keywords/EnumEntry.kt (100%) rename generator/src/main/kotlin/org/jetbrains/dataframe/keywords/GeneratorTask.kt => plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorAction.kt (80%) create mode 100644 plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt create mode 100644 plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorTask.kt 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..fdfa98da47 --- /dev/null +++ b/plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt @@ -0,0 +1,44 @@ +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 org.jetbrains.kotlinx.dataframe.BuildConfig +import java.io.File + +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 taskDependencyScope = configurations.create("keywordsGeneratorScope") + dependencies.add(taskDependencyScope.name, "$KOTLIN_COMPILER_EMBEDDABLE:$KOTLIN_COMPILER_VERSION") + val taskResolvableConfiguration = configurations.create("keywordGeneratorResolvable") { + extendsFrom(taskDependencyScope) + } + + 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(taskResolvableConfiguration) + 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 bc5b6b0297..5a6c05ce00 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") From 69c239bc110b6fa38d27b8b134a6b50acdfce9e3 Mon Sep 17 00:00:00 2001 From: Jolan Rensen Date: Thu, 19 Dec 2024 16:07:01 +0100 Subject: [PATCH 2/2] clarifying some things regarding Configurations in KeywordsGeneratorPlugin --- .../keywords/KeywordsGeneratorPlugin.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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 index fdfa98da47..7523166638 100644 --- 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 @@ -2,6 +2,8 @@ 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 @@ -9,15 +11,17 @@ 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 taskDependencyScope = configurations.create("keywordsGeneratorScope") - dependencies.add(taskDependencyScope.name, "$KOTLIN_COMPILER_EMBEDDABLE:$KOTLIN_COMPILER_VERSION") - val taskResolvableConfiguration = configurations.create("keywordGeneratorResolvable") { - extendsFrom(taskDependencyScope) - } + 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") @@ -26,7 +30,7 @@ abstract class KeywordsGeneratorPlugin : Plugin { mainSourceSet.addDir(genSrcDir) val genTask = tasks.register(KeywordsGeneratorTask.NAME) { - kotlinCompiler.from(taskResolvableConfiguration) + kotlinCompiler.from(resolvableConfiguration) srcDir = genSrcDir }