Skip to content

Commit 2143fb4

Browse files
authored
Merge pull request #996 from Kotlin/keywords-generator
Keywords generator plugin: moved and fixed for Kotlin 2.1
2 parents 04d3653 + 69c239b commit 2143fb4

File tree

10 files changed

+113
-57
lines changed

10 files changed

+113
-57
lines changed

generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorPlugin.kt

-28
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
## :generator
1+
## :plugins:keywords-generator
22

33
This module holds a little Gradle plugin whose sole purpose is to provide
4-
[:core](../core) with the `generateKeywordsSrc` task.
4+
[:core](../../core) with the `generateKeywordsSrc` task.
55

66
This task, generates three enum classes: `HardKeywords`, `ModifierKeywords`, and `SoftKeywords`.
77
These enums together contain all restricted Kotlin keywords to be taken into account when generating our own
8-
code in Notebooks or any of our [plugins](../plugins). Words like "package", "fun", "suspend", etc...
8+
code in Notebooks or any of our [plugins](..). Words like "package", "fun", "suspend", etc...
99

1010
As the Kotlin language can change over time, this task ensures that any changes to the language
1111
will be reflected in our code generation.
12-
13-
This module will likely be moved under [:plugins](../plugins):
14-
[Issue #899](https://github.com/Kotlin/dataframe/issues/899).

generator/build.gradle.kts plugins/keywords-generator/build.gradle.kts

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
`java-gradle-plugin`
33
`kotlin-dsl`
4+
id("com.github.gmazzo.buildconfig") version "5.5.1"
45
}
56

67
val kotlinCompilerVersion: String by project
@@ -10,8 +11,14 @@ repositories {
1011
mavenCentral()
1112
}
1213

14+
buildConfig {
15+
packageName = "org.jetbrains.kotlinx.dataframe"
16+
className = "BuildConfig"
17+
buildConfigField("kotlinCompilerVersion", kotlinCompilerVersion)
18+
}
19+
1320
dependencies {
14-
implementation(kotlin("compiler-embeddable", kotlinCompilerVersion))
21+
compileOnly(kotlin("compiler-embeddable", kotlinCompilerVersion))
1522
implementation("com.squareup:kotlinpoet:$kotlinPoetVersion")
1623
}
1724

Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
kotlinCompilerVersion=2.0.20
2-
kotlinPoetVersion=1.18.1
2+
kotlinPoetVersion=2.0.0
File renamed without changes.

generator/src/main/kotlin/org/jetbrains/dataframe/keywords/GeneratorTask.kt plugins/keywords-generator/src/main/kotlin/org/jetbrains/dataframe/keywords/KeywordsGeneratorAction.kt

+10-19
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,38 @@ import com.squareup.kotlinpoet.FunSpec
55
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
66
import com.squareup.kotlinpoet.PropertySpec
77
import com.squareup.kotlinpoet.TypeSpec
8-
import org.gradle.api.DefaultTask
9-
import org.gradle.api.tasks.Input
10-
import org.gradle.api.tasks.OutputDirectory
11-
import org.gradle.api.tasks.TaskAction
8+
import org.gradle.workers.WorkAction
9+
import org.gradle.workers.WorkParameters
1210
import org.jetbrains.kotlin.com.intellij.psi.tree.TokenSet
1311
import org.jetbrains.kotlin.lexer.KtKeywordToken
1412
import org.jetbrains.kotlin.lexer.KtTokens
1513
import java.io.File
1614

17-
open class GeneratorTask : DefaultTask() {
15+
abstract class KeywordsGeneratorAction : WorkAction<KeywordsGeneratorAction.Parameters> {
1816

19-
@OutputDirectory
20-
lateinit var srcDir: File
17+
interface Parameters : WorkParameters {
18+
var srcDir: File
19+
}
2120

2221
private val taskPackageName = "org.jetbrains.dataframe.keywords"
2322

24-
@Input
25-
override fun getGroup() = "codegen"
26-
27-
@TaskAction
28-
fun generate() {
29-
srcDir.deleteRecursively()
23+
override fun execute() {
24+
parameters.srcDir.deleteRecursively()
3025
generateKeywordEnums()
3126
}
3227

3328
private fun generateKeywordEnums() {
3429
listOf(
3530
"HardKeywords" to KtTokens.KEYWORDS,
3631
"SoftKeywords" to KtTokens.SOFT_KEYWORDS,
37-
"ModifierKeywords" to KtTokens.MODIFIER_KEYWORDS
32+
"ModifierKeywords" to KtTokens.MODIFIER_KEYWORDS,
3833
).forEach { (name, set) ->
3934
generateKeywordsEnum(name, set)
4035
}
4136
}
4237

4338
private fun generateKeywordsEnum(name: String, tokenSet: TokenSet) {
44-
buildKwEnum(name, getKeywords(tokenSet)).writeTo(srcDir)
39+
buildKwEnum(name, getKeywords(tokenSet)).writeTo(parameters.srcDir)
4540
}
4641

4742
private fun getKeywords(tokenSet: TokenSet): List<EnumEntry> {
@@ -87,8 +82,4 @@ open class GeneratorTask : DefaultTask() {
8782

8883
return fileBuilder.build()
8984
}
90-
91-
companion object {
92-
const val NAME = "generateKeywordsSrc"
93-
}
9485
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.jetbrains.dataframe.keywords
2+
3+
import org.gradle.api.Plugin
4+
import org.gradle.api.Project
5+
import org.gradle.api.artifacts.DependencyScopeConfiguration
6+
import org.gradle.api.artifacts.ResolvableConfiguration
7+
import org.gradle.api.tasks.SourceSet
8+
import org.gradle.api.tasks.SourceSetContainer
9+
import org.gradle.kotlin.dsl.get
10+
import org.gradle.kotlin.dsl.register
11+
import org.jetbrains.kotlinx.dataframe.BuildConfig
12+
import java.io.File
13+
14+
@Suppress("UnstableApiUsage")
15+
abstract class KeywordsGeneratorPlugin : Plugin<Project> {
16+
17+
override fun apply(target: Project): Unit = with(target) {
18+
// from https://kotlinlang.org/docs/whatsnew21.html#compiler-symbols-hidden-from-the-kotlin-gradle-plugin-api
19+
val dependencyScopeConfiguration: DependencyScopeConfiguration = configurations.dependencyScope("keywordsGeneratorDependencyScope").get()
20+
dependencies.add(dependencyScopeConfiguration.name, "$KOTLIN_COMPILER_EMBEDDABLE:$KOTLIN_COMPILER_VERSION")
21+
22+
val resolvableConfiguration: ResolvableConfiguration = configurations.resolvable("keywordGeneratorResolvable") {
23+
extendsFrom(dependencyScopeConfiguration)
24+
}.get()
25+
26+
val genSrcDir = layout.buildDirectory.asFile.get().resolve("generatedSrc")
27+
28+
val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer
29+
val mainSourceSet = sourceSets.named("main").get()
30+
mainSourceSet.addDir(genSrcDir)
31+
32+
val genTask = tasks.register<KeywordsGeneratorTask>(KeywordsGeneratorTask.NAME) {
33+
kotlinCompiler.from(resolvableConfiguration)
34+
srcDir = genSrcDir
35+
}
36+
37+
tasks["compileKotlin"].dependsOn(genTask)
38+
}
39+
40+
private fun SourceSet.addDir(dir: File) {
41+
java.setSrcDirs(java.srcDirs + dir)
42+
}
43+
44+
companion object {
45+
const val KOTLIN_COMPILER_EMBEDDABLE = "org.jetbrains.kotlin:kotlin-compiler-embeddable"
46+
const val KOTLIN_COMPILER_VERSION: String = BuildConfig.kotlinCompilerVersion
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.jetbrains.dataframe.keywords
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.file.ConfigurableFileCollection
5+
import org.gradle.api.tasks.Classpath
6+
import org.gradle.api.tasks.Input
7+
import org.gradle.api.tasks.OutputDirectory
8+
import org.gradle.api.tasks.TaskAction
9+
import org.gradle.kotlin.dsl.submit
10+
import org.gradle.workers.WorkerExecutor
11+
import java.io.File
12+
import javax.inject.Inject
13+
14+
abstract class KeywordsGeneratorTask: DefaultTask() {
15+
16+
@get:Inject
17+
abstract val executor: WorkerExecutor
18+
19+
@get:Classpath
20+
abstract val kotlinCompiler: ConfigurableFileCollection
21+
22+
@OutputDirectory
23+
lateinit var srcDir: File
24+
25+
@Input
26+
override fun getGroup() = "codegen"
27+
28+
@TaskAction
29+
fun generate() {
30+
val workQueue = executor.classLoaderIsolation {
31+
classpath.from(kotlinCompiler)
32+
}
33+
workQueue.submit(KeywordsGeneratorAction::class) {
34+
srcDir = this@KeywordsGeneratorTask.srcDir
35+
}
36+
}
37+
38+
companion object {
39+
const val NAME = "generateKeywordsSrc"
40+
}
41+
}

settings.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
rootProject.name = "dataframe"
44

5-
// treated as a separate project with its own Kotlin version etc.
6-
includeBuild("generator")
5+
// treated as a separate project with its own Kotlin version, etc.
6+
includeBuild("plugins/keywords-generator")
77

88
include("plugins:dataframe-gradle-plugin")
99
include("plugins:symbol-processor")

0 commit comments

Comments
 (0)