@@ -20,69 +20,47 @@ import groovy.transform.CompileStatic
2020import org.gradle.api.Plugin
2121import org.gradle.api.Project
2222import org.gradle.api.artifacts.VersionCatalogsExtension
23- import org.gradle.api.tasks.JavaExec
2423import org.gradle.jvm.toolchain.JavaLanguageVersion
2524import org.gradle.jvm.toolchain.JavaToolchainService
26- import org.jetbrains.kotlin.cli.common.messages.MessageCollector
27- import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
28- import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer
29- import org.jetbrains.kotlin.com.intellij.openapi.vfs.local.CoreLocalFileSystem
30- import org.jetbrains.kotlin.com.intellij.openapi.vfs.local.CoreLocalVirtualFile
31- import org.jetbrains.kotlin.com.intellij.psi.PsiManager
32- import org.jetbrains.kotlin.config.CompilerConfiguration
33- import org.jetbrains.kotlin.psi.KtFile
34- import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry
35- import org.jetbrains.kotlin.psi.KtStringTemplateExpression
36-
37- import static org.jetbrains.kotlin.cli.common.CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY
38- import static org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles.JVM_CONFIG_FILES
3925
4026@CompileStatic
4127class PreprocessWorkflowsPlugin implements Plugin<Project > {
4228 void apply (Project project ) {
4329 def libs = project. extensions. getByType(VersionCatalogsExtension ). find(' libs' ). orElseThrow(AssertionError ::new )
30+ def kotlinCompilerEmbeddableClasspath = project. configurations. detachedConfiguration(
31+ libs. findLibrary(' workflows-kotlin-compilerEmbeddable' ). orElseThrow(AssertionError ::new ). get(),
32+ )
4433 def kotlinCompilerClasspath = project. configurations. detachedConfiguration(
4534 libs. findLibrary(' workflows-kotlin-compiler' ). orElseThrow(AssertionError ::new ). get(),
4635 libs. findLibrary(' workflows-kotlin-scriptingCompiler' ). orElseThrow(AssertionError ::new ). get()
4736 )
48- def kotlinScriptClasspath = project. configurations. detachedConfiguration(
37+ def mainKtsClasspath = project. configurations. detachedConfiguration(
4938 libs. findLibrary(' workflows-kotlin-mainKts' ). orElseThrow(AssertionError ::new ). get()
5039 ). tap {
5140 it. transitive = false
5241 }
5342
5443 def preprocessWorkflows = project. tasks. register(' preprocessWorkflows' ) {
55- it. group = ' github actions '
44+ it. group = ' github workflows '
5645 }
5746 project. file(' .github/workflows' ). eachFileMatch(~/ .*\. main\. kts$/ ) { workflowScript ->
5847 def workflowName = workflowScript. name - ~/ \. main\. kts$/
5948 def pascalCasedWorkflowName = workflowName
6049 .replaceAll(/ -\w / ) { String it -> it[1 ]. toUpperCase() }
6150 .replaceFirst(/ ^\w / ) { String it -> it[0 ]. toUpperCase() }
62- def preprocessWorkflow = project. tasks. register(" preprocess${ pascalCasedWorkflowName} Workflow" , JavaExec ) {
63- it. group = ' github actions'
64-
65- it. inputs
66- .file(workflowScript)
67- .withPropertyName(' workflowScript' )
68- it. inputs
69- .files(getImportedFiles(project. file(workflowScript)))
70- .withPropertyName(" importedFiles" )
71- it. outputs
72- .file(new File (workflowScript. parent, " ${ workflowName} .yaml" ))
73- .withPropertyName(' workflowFile' )
74-
75- it. javaLauncher. set project. extensions. getByType(JavaToolchainService ). launcherFor {
51+ def determineImportedFiles = project. tasks. register(" determineImportedFilesFor${ pascalCasedWorkflowName} Workflow" , DetermineImportedFiles ) {
52+ it. mainKtsFile. set(workflowScript)
53+ it. importedFiles. set(project. layout. buildDirectory. file(" importedFilesFor${ pascalCasedWorkflowName} Workflow.txt" ))
54+ it. kotlinCompilerEmbeddableClasspath. from(kotlinCompilerEmbeddableClasspath)
55+ }
56+ def preprocessWorkflow = project. tasks. register(" preprocess${ pascalCasedWorkflowName} Workflow" , PreprocessGithubWorkflow ) {
57+ it. workflowScript. set(workflowScript)
58+ it. importedFiles. from(determineImportedFiles. flatMap { it. importedFiles }. map { it. asFile. readLines() })
59+ it. kotlinCompilerClasspath. from(kotlinCompilerClasspath)
60+ it. mainKtsClasspath. from(mainKtsClasspath)
61+ it. javaLauncher. set(project. extensions. getByType(JavaToolchainService ). launcherFor {
7662 it. languageVersion. set(JavaLanguageVersion . of(17 ))
77- }
78- it. classpath(kotlinCompilerClasspath)
79- it. mainClass. set ' org.jetbrains.kotlin.cli.jvm.K2JVMCompiler'
80- it. args(' -no-stdlib' , ' -no-reflect' )
81- it. args(' -classpath' , kotlinScriptClasspath. asPath)
82- it. args(' -script' , workflowScript. absolutePath)
83-
84- // work-around for https://youtrack.jetbrains.com/issue/KT-42101
85- it. systemProperty(' kotlin.main.kts.compiled.scripts.cache.dir' , ' ' )
63+ })
8664 }
8765 project. pluginManager. withPlugin(' io.spring.nohttp' ) {
8866 // iff both tasks are run, workflow files should be generated before checkstyle check
@@ -95,45 +73,4 @@ class PreprocessWorkflowsPlugin implements Plugin<Project> {
9573 }
9674 }
9775 }
98-
99- private List<File > getImportedFiles(File workflowScript) {
100- if (! workflowScript. file) {
101- return []
102- }
103-
104- return PsiManager
105- .getInstance(
106- KotlinCoreEnvironment
107- .createForProduction(
108- Disposer . newDisposable(),
109- new CompilerConfiguration (). tap {
110- it. put(MESSAGE_COLLECTOR_KEY , MessageCollector . @Companion . NONE )
111- },
112- JVM_CONFIG_FILES
113- )
114- .project
115- )
116- .findFile(
117- new CoreLocalVirtualFile (
118- new CoreLocalFileSystem (),
119- workflowScript. toPath()
120- )
121- )
122- .with { it as KtFile }
123- .fileAnnotationList
124- ? . annotationEntries
125- ? . findAll { it. shortName?. asString() == " Import" }
126- * . valueArgumentList
127- ? . collectMany { it?. arguments ?: [] }
128- * . argumentExpression
129- ? . findAll { it instanceof KtStringTemplateExpression }
130- ? . collect { it as KtStringTemplateExpression }
131- * . entries
132- * . first()
133- ? . findAll { it instanceof KtLiteralStringTemplateEntry }
134- ? . collect { it as KtLiteralStringTemplateEntry }
135- ? . collect { new File (workflowScript. parentFile, it. text) }
136- ? . collectMany { getImportedFiles(it) + it }
137- ?: []
138- }
13976}
0 commit comments