From 35f4b268d9bd6ae7eb8650af2cb59f13681c97ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Wed, 11 Mar 2026 20:51:53 +0100 Subject: [PATCH 01/14] feat: add Gradle plugin module with multi-spec support JustworksPlugin, JustworksExtension, JustworksGenerateTask, JustworksSharedTypesTask, JustworksSpecConfiguration for multi-spec DSL. Functional tests included. Co-Authored-By: Claude Opus 4.6 --- plugin/build.gradle.kts | 56 ++ .../kotlin/main/META-INF/plugin.kotlin_module | Bin 0 -> 24 bytes .../justworks/gradle/JustworksExtension.class | Bin 0 -> 1825 bytes .../gradle/JustworksGenerateTask.class | Bin 0 -> 5501 bytes .../justworks/gradle/JustworksPlugin.class | Bin 0 -> 16330 bytes .../gradle/JustworksSharedTypesTask.class | Bin 0 -> 2167 bytes .../gradle/JustworksSpecConfiguration.class | Bin 0 -> 1784 bytes .../outputs-generated-for-plugins.tab | Bin 0 -> 4096 bytes ...utputs-generated-for-plugins.tab.keystream | Bin 0 -> 4096 bytes ...ts-generated-for-plugins.tab.keystream.len | Bin 0 -> 8 bytes .../outputs-generated-for-plugins.tab.len | Bin 0 -> 8 bytes ...utputs-generated-for-plugins.tab.values.at | Bin 0 -> 55 bytes .../outputs-generated-for-plugins.tab_i.len | Bin 0 -> 8 bytes .../sources-referenced-by-plugins.tab | Bin 0 -> 4096 bytes ...ources-referenced-by-plugins.tab.keystream | Bin 0 -> 4096 bytes ...es-referenced-by-plugins.tab.keystream.len | Bin 0 -> 8 bytes .../sources-referenced-by-plugins.tab.len | Bin 0 -> 8 bytes ...ources-referenced-by-plugins.tab.values.at | Bin 0 -> 55 bytes .../sources-referenced-by-plugins.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/inputs/source-to-output.tab | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.values.at | Bin 0 -> 1362 bytes .../caches-jvm/inputs/source-to-output.tab_i | Bin 0 -> 32768 bytes .../inputs/source-to-output.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/class-attributes.tab.keystream | Bin 0 -> 4096 bytes .../kotlin/class-attributes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab.values.at | Bin 0 -> 64 bytes .../jvm/kotlin/class-attributes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/class-attributes.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-fq-name-to-source.tab | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/class-fq-name-to-source.tab.len | Bin 0 -> 8 bytes .../class-fq-name-to-source.tab.values.at | Bin 0 -> 847 bytes .../jvm/kotlin/class-fq-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/class-fq-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/internal-name-to-source.tab | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/internal-name-to-source.tab.len | Bin 0 -> 8 bytes .../internal-name-to-source.tab.values.at | Bin 0 -> 847 bytes .../jvm/kotlin/internal-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/internal-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/jvm/kotlin/proto.tab | Bin 0 -> 4096 bytes .../caches-jvm/jvm/kotlin/proto.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/proto.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.at | Bin 0 -> 2379 bytes .../caches-jvm/jvm/kotlin/proto.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/proto.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab | Bin 0 -> 4096 bytes .../kotlin/source-to-classes.tab.keystream | Bin 0 -> 4096 bytes .../source-to-classes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab.len | Bin 0 -> 8 bytes .../kotlin/source-to-classes.tab.values.at | Bin 0 -> 747 bytes .../jvm/kotlin/source-to-classes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/source-to-classes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/subtypes.tab.values.at | Bin 0 -> 265 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/supertypes.tab.values.at | Bin 0 -> 154 bytes .../caches-jvm/jvm/kotlin/supertypes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/supertypes.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/lookups/counters.tab | 2 + .../caches-jvm/lookups/file-to-id.tab | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/file-to-id.tab.len | Bin 0 -> 8 bytes .../lookups/file-to-id.tab.values.at | Bin 0 -> 79 bytes .../caches-jvm/lookups/file-to-id.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/file-to-id.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab.len | Bin 0 -> 8 bytes .../lookups/id-to-file.tab.values.at | Bin 0 -> 448 bytes .../caches-jvm/lookups/id-to-file.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/id-to-file.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/lookups/lookups.tab | Bin 0 -> 4096 bytes .../caches-jvm/lookups/lookups.tab.keystream | Bin 0 -> 12288 bytes .../lookups/lookups.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.values.at | Bin 0 -> 1725 bytes .../caches-jvm/lookups/lookups.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/lookups.tab_i.len | Bin 0 -> 8 bytes .../compileKotlin/cacheable/last-build.bin | Bin 0 -> 18 bytes .../shrunk-classpath-snapshot.bin | Bin 0 -> 53918 bytes plugin/build/libs/plugin-0.0.1.jar | Bin 0 -> 13279 bytes .../com.avsystem.justworks.properties | 1 + .../plugin-under-test-metadata.properties | 1 + .../com.avsystem.justworks.properties | 1 + plugin/build/tmp/jar/MANIFEST.MF | 2 + .../gradle/JustworksPluginFunctionalTest.kt | 619 ++++++++++++++++++ .../justworks/gradle/JustworksExtension.kt | 42 ++ .../justworks/gradle/JustworksGenerateTask.kt | 81 +++ .../justworks/gradle/JustworksPlugin.kt | 100 +++ .../gradle/JustworksSharedTypesTask.kt | 29 + .../gradle/JustworksSpecConfiguration.kt | 51 ++ settings.gradle.kts | 2 +- 111 files changed, 986 insertions(+), 1 deletion(-) create mode 100644 plugin/build.gradle.kts create mode 100644 plugin/build/classes/kotlin/main/META-INF/plugin.kotlin_module create mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksExtension.class create mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksGenerateTask.class create mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksPlugin.class create mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksSharedTypesTask.class create mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksSpecConfiguration.class create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len create mode 100644 plugin/build/kotlin/compileKotlin/cacheable/last-build.bin create mode 100644 plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin create mode 100644 plugin/build/libs/plugin-0.0.1.jar create mode 100644 plugin/build/pluginDescriptors/com.avsystem.justworks.properties create mode 100644 plugin/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties create mode 100644 plugin/build/resources/main/META-INF/gradle-plugins/com.avsystem.justworks.properties create mode 100644 plugin/build/tmp/jar/MANIFEST.MF create mode 100644 plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt create mode 100644 plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksExtension.kt create mode 100644 plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt create mode 100644 plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt create mode 100644 plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt create mode 100644 plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts new file mode 100644 index 00000000..ef17898f --- /dev/null +++ b/plugin/build.gradle.kts @@ -0,0 +1,56 @@ +plugins { + kotlin("jvm") + `java-gradle-plugin` + `maven-publish` +} + +kotlin { + jvmToolchain(21) +} + +dependencies { + implementation(project(":core")) + testImplementation(kotlin("test")) +} + +gradlePlugin { + plugins { + create("justworks") { + id = "com.avsystem.justworks" + implementationClass = "com.avsystem.justworks.gradle.JustworksPlugin" + } + } +} + +// Functional test source set +val functionalTest by sourceSets.creating { + compileClasspath += sourceSets["main"].output + runtimeClasspath += sourceSets["main"].output +} + +val functionalTestImplementation by configurations.getting { + extendsFrom(configurations["testImplementation"]) +} + +val functionalTestRuntimeOnly by configurations.getting { + extendsFrom(configurations["testRuntimeOnly"]) +} + +dependencies { + functionalTestImplementation(gradleTestKit()) +} + +val functionalTestTask = + tasks.register("functionalTest") { + testClassesDirs = functionalTest.output.classesDirs + classpath = functionalTest.runtimeClasspath + useJUnitPlatform() + } + +tasks.check { + dependsOn(functionalTestTask) +} + +tasks.test { + useJUnitPlatform() +} diff --git a/plugin/build/classes/kotlin/main/META-INF/plugin.kotlin_module b/plugin/build/classes/kotlin/main/META-INF/plugin.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..3a6b9771be65faf14b320eb82e9860d3a64e8c9c GIT binary patch literal 24 XcmZQzU|?ooU|<4b5Df-O3|b5T0ek>e literal 0 HcmV?d00001 diff --git a/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksExtension.class b/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksExtension.class new file mode 100644 index 0000000000000000000000000000000000000000..0a77847a891313619c8828175366ef638b49a9aa GIT binary patch literal 1825 zcmbtU-)|d55dQYg@tv=xbq?C5Zkv)cBz8i5ZunK|5Spf~WMop*ph#67(B`~c*FN7x zw|gdi%iqEik0604JfNtL{85Oxvs;QAL;}*??#^oF`(|cm=J!8-{SCkd?lCm|c;NA& zdaAS-c)e8VZ{nn{yddG-POp>N^bQI~me}C!-9-Yv)^w;d&0x6M8SV)j2uPmG)I{%6A`(uDF zc)|yQ6my3sBWmTIjbhx+Kmu~Oj5l!BK^f;5%vvT-VcJ0fF2k)8W^#L9_?vO`wG7fE zkI2GX4D4P(ivPt zm7#hpMXk|j)NNd0xcq7o?;q?ZLS==q!^2dRF*{1oHHIlgkt&9jQ~5E6`4S9VXDH|= zlFU~-Crs?i5~a#mnB+XJ02%B+=!x-2U$=rAf6Prh$y8on9YsjlO0mZOb6yI!y%C`=d0{av<8#P%60> zijBX95mo6XjW&jJ9qPlabg(CqFFENjxSiPN;SNt^CXX*Kjj?u)L0XvPc{!l|M(AwE zY2u3qG8Bb5>XbtMATFqJNLnMwzzRO0y+~=YbD5fvBopf-Jthl-_Nyzd^9+^cpYi7M zihKSSTsH97z4{Dq|Ad7faht~2)VT?ZtX?Y@~P0};a$~hmB z{<{?7ja`^+G}`dmXyRrYt9Y-C_wm6ln8JtnXcuLLMTJ`mC50tLGYUn8IfZ$Jj}>YP Ib%oo10{q1CTL1t6 literal 0 HcmV?d00001 diff --git a/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksGenerateTask.class b/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksGenerateTask.class new file mode 100644 index 0000000000000000000000000000000000000000..e51344c62987e60ea4c2e6a415ad452fd70bdf97 GIT binary patch literal 5501 zcmbVQd3Y4%8UKBo&CX_ag(ZX|@d}D25y*m8M1n|&2`nZdP0}D>k6|+;lg!SnGqaIY zs@Tik_aUvVEp5f#)z(13YNUrp@B6f;y^p7V`8<7|*7oeAzovrTS3EqKblgLY8(2 z)KL8yKkeK%LLDga5?q?V3ak{k@Qe}_TrN;0edbDR38bdw8Ft!7TM~_EN}vH(2qgWT zLW+Xb3?Ti0;d+b|2GE`)nvqtq25SW_8nr#su+k%AxwK(N<%@8&imR|*U{NSE)WE&bQ?P;4JYLE;JzqL1znnO@5uH`ofi5NkU%J4SxsEv( znZ7!`y35>2p*zu|Qs|2X)}MnpMQc}fXogvEbOn7x$Q-9_^OJe|fvldFVWHq90t%5C zB$nAY5A#71yKs{{wcQeRy8|S*JC5xTk=4^kE_jBS?j%g9`ptN$ihjI|u2mA-{OL=RKd9S5Q$r?k`xO)*az!T}$!8FpCr?meUR&hM{5zBTV)3 zF!jND&#w2ORqqnF^^LMxZLAkf{NJdGI81WR_|mY(>`^_;=WVu?)w~YPPqPXvfn_;u zR1c=ZP{o{GP4Ex?9 z{xY5jMYL(A*=Kk?%_eAUPI3%|1TD(}6$4<# zd%m&QSIA~{mznrBf#x&CF>6`cFQH+3WjhL9mBez?$k4lk@h~TnODevCI}>=d%#-yh+9F z(m$%Ka(P2$SLR_RhcnrnlPyC!Wak;b6>n2<5O4RzgiWR`u&MERNC|X5U63+Kyc6$| z%DtP(g39&j8sllZ!DQrQhYg)zS~M$%b!mC3@?N}8E_y$E9p6|#y^*BgFcYTXw&(KR zcoH8(I)M-19#)Mr87dFA%`|k&D>~f|C$TIz-H)&w79Yd>@b%m0BP#C2#{{l>;eOfE zN5h3jhW&^I1RB<)XAv-Tr~tfU)o{K)=9www8Av@>)G+FsVDJ8 z97y0ne2G1Fn3KEhUBkMy)zPf%aF^yWCV6mMj?T#TfPME6!$>Ut@TQkd0B;iJT>Gm99|mIIGcI3 z@N`&Zv_Z|&I2Xx{RWKb#|*3I5|1v)`!& zY9y}A%%vjg)S-C8@~J~tM%Ie0%BdrxhE;Z8gVl^6V(OP&w+)1OrY z;q-;CVXi!1laf0Yg~sw`f!T#wHSAkC3ah5T^0L1=G>;O<(Kc2OUOhVvOYbh^_UTT) z1QvVFPCKia1Daz5K=UVSdl{2PP9HE_gA=VY7i|{Eke0E=%22ENj3G<&*if?;^m%j| z%RsnQGGnn!wV9gh%D7hh?1GckgR@9&wQbM!94#MoP;PVuQ)X1+8T{Eq{tUwBGyF#WBPm;2?rO@F~ea9sbB?GGIUzR3OUe=S&2DB4rWZ=kdLO91C@%IPqtG%EfGI z$hsIcsK8%17r_#LiKH#%_iR4aqI2S7M{-Vlyl#go%Kgrty&tu_fI3E`{gDkcfM$uN zD<*L9BrX$}Lc=6h33RTSz`Daot~!ou_NPBnEbqc@O9Ju9-sr1YSM`tvWjeU5E-HQk%tbjGn-)VDf+EqjK57 z!?@=pZkNjrP2x2IyQ^P!9B-V$n~&iw8!KxoDd*q>-r;LBf%mMB)mBd6?n!(|un$n8 zM-i=9ubjlaQo=`PODHGv;~V3(@oAY$lnESNUq!x8FNrOwl4_s87l27T6v0s>PU6_^ zV>te(#7G7H%IEcn{RfvQSo0ii=2O8F{QECD6x=Shh=1dz{}F4df{0HH>5?cE+$-TF zfi^%~fSp}6*7HY_YxuLqwfrTbMPB03&dd9DZqtJ;ywSDdHoouR>|N-<5#F{RLI#iX z|4Cj|pT&(7+a>C;Su}Em1n$j*>=CY-#0et)Aq?Xr9_GnENoilkBh>C$?)4~-GS0P2 z@ffL9s20m`3SS{^uEoFbRgNOu^BH^%U#Hssk zc2Vgf=He$Ve(ECOBI)91E`ILf7cLgNsB!U27t35c?aC#;a`9^ywJz#hT;TKk2LIru O3%I#QqjLW9v;PMZqdYeN literal 0 HcmV?d00001 diff --git a/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksPlugin.class b/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..5214d150c36e186a75ed691e09959e78272e714e GIT binary patch literal 16330 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 HVE_RD6bTXt literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab new file mode 100644 index 0000000000000000000000000000000000000000..8aad32b3b84c79ee82814f17430d858dce49687b GIT binary patch literal 4096 zcmbR3vzw0r2pB;G3OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> HVE_RD6bTXt literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab new file mode 100644 index 0000000000000000000000000000000000000000..d2aa71570acd5d0d5ce4bf6c55042d80bd76df5a GIT binary patch literal 4096 zcmbR3vzw0r2v|V`38e7d zoC39Klrq;!UOSb}>d=hmDOJsRq8r+t(J3Exj@;s_JBmgX>wsGulo{PQRrI4+=`r*> z)FpjR3pzVV>sft;_;n2L-v8f@xy9M!E}Yd}{Ptp#qj*+FTOAB!wOgr8D+_O|s^zN#J~NcqK*8}9 zjy|4Y;OT3iX>IxMI4kMj(xdRgxC4i0M({kLjn*q8Ec3%EHD?MH*AZH?UlAkhW4>l| z!#s`N2@>G;#QGaojuDm^po=@)W6a%l+_fcwfV+2go(JMJMAZgdZ#RK}{NEd0mVgO~ z(Hw!MK;)8NN3d6?;WO%Bl8A=ltX4l-yov(eqXLRVM_*vgnp@VsV)YM{Z4i1g9ehMG Z=E=wi$1gFAcflijw`P|fnP?5C+gcA;vi@7{J)rQMv?--~=|5HYS#IP*SrD15mJrHv=Jo$h-c#yYHn_ z%90^KfB*pk1PBlyK!5-N0t5&UAV7cs0RjgT_(tC%FK!2`tu6rq1PBlyK!5-N0t5&U zAV7cs0RjXF5FkKcb%8E6Uars2>WeKTK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5;&O$6$=TJ>eS$#F*s5FkK+009C72oP8#&_rr_oX16BAp!&l5ZJxI oJ3hP*uX*>6dXNAC0t5&UAV7cs0RjXF5FkK+009C72>g-24^p8EPXGV_ literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab new file mode 100644 index 0000000000000000000000000000000000000000..0b90c9a4a8090d973c0742e80f1438bee8cc3789 GIT binary patch literal 4096 zcmbR3vzw0r2v|V`39U5Jk@qSp-4ciwLd+{ejYIt&b{wsQr6yBZA;IE4hIolQ5Gz_XHS|apgin z%AJN@(XtCSN4ju&sG{biJfTpQl5rQT0T2@E`yJ0*&X3_Nqg^YRlm%UsSa`&eA`71&6G654X V0TVC*6EFc2FaZ-V0TcK)0x!7@XKerg literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..48e9f9a4f1086a6fb0ae4833e23e40b16ad3601c GIT binary patch literal 8 McmZQz00AZe000~S6951J literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..ec8f944c8acd49bcace4e4c78d4306ebd9e28078 GIT binary patch literal 8 LcmZQz0D~0(0I&e5 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..3737e138423429f98a05b0f5daa3414fe62d0dbf GIT binary patch literal 64 zcmdOA@JLNeNi9+cN=?o$N>OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> IWMDu>0JcIB2><{9 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..73e8b8b446a74bde3006d80c84ce216aac80b712 GIT binary patch literal 32768 zcmeIuu?>P?5P;D?Ax=RY!`4u;jEN)IX=y`3$p*AKg9Fg8ffS73tw727uD(m|d*x87 zVh9i*K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfIxDAA^N8K>76`N9svRb2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7csflUI>*q$!Ob<>e$0t5&UNH6e+!t?brrVmXT*hg2l z%uUifSp*0WAV7cs0RjXF5FkK+009C7b}ev=@9S^-+I58I2@oJafB*pk1PBlyK!5-N j0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pke<1J!OM?zU literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..d2a5d1351c2c9f413aeda00ce4bfed0e45313d1a GIT binary patch literal 4096 zcmbR3vzw0r2v|V`32pAO%D?~rbwGvy={Z0;>Mz88d}fTwjfTKz2#kinXb6mkz-S1JhQMeDjE2By2#kin OXb6mkz-S2I4gmn{B^lWO literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..213db59267484d527e8455abc8086e2f62088c0f GIT binary patch literal 4096 zcmeH^%L>9U5Jk@qSp-4ciwLd+{ejYIt&b{wsQr6yBZA;IE4hIolQ5Gz_XHS|apgin z%AJN@(XtCSN4ju&sG{biJfTpQl5rQT0T2@E`yJ0*&X3_Nqg^YRlm%UsSa`&eA`71&6G654X V0TVC*6EFc2FaZ-V0TcK)0x!7@XKerg literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..48e9f9a4f1086a6fb0ae4833e23e40b16ad3601c GIT binary patch literal 8 McmZQz00AZe000~S6951J literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..ec8f944c8acd49bcace4e4c78d4306ebd9e28078 GIT binary patch literal 8 LcmZQz0D~0(0I&e5 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..bc7c08e6adfab860a5e7bb575a74c07d3f9d4a4b GIT binary patch literal 847 zcmc(dO$x#=5QX1SdIEb0(TY$gD(*u&w)H2KN&LHpD_5>ucuZfS3&jI8FeH<_3140& z#Y9Xcn#`o^v`WUECWWYLofqpT#x=RwFU|HKbKj|{P?5P;D?Ax=RY!`4u;jEN)IX=y`3$p*AKg9Fg8ffS73tw727uD(m|d*x87 zVh9i*K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfIxDAA^N8K>76`N9svRb2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7csflUI>*q$!Ob<>e$0t5&UNH6e+!t?brrVmXT*hg2l z%uUifSp*0WAV7cs0RjXF5FkK+009C7b}ev=@9S^-+I58I2@oJafB*pk1PBlyK!5-N j0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pke<1J!OM?zU literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..d2a5d1351c2c9f413aeda00ce4bfed0e45313d1a GIT binary patch literal 4096 zcmbR3vzw0r2v|V`32pAO%D?~rbwGvy={Z0;>Mz88d}fTwjfTKz2#kinXb6mkz-S1JhQMeDjE2By2#kin OXb6mkz-S2I4gmn{B^lWO literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..e2336a96b4908c83adf10e2541d29d55aec84bfc GIT binary patch literal 4096 zcmeH^%L>9U5Jk@qNd-aNiwLd+{ejYIt&b{wsQr6yBZA;IE4hIolQ5Gz_XHS|apgin z%AJN@(XtCSN4ju&sG{biJfTpQl5rQT0T2@E`yJ0*&X3_Nqg^YRlm%UsSa`&eA`71&6G654X V0TVC*6EFc2FaZ-V0TcK)0x#w~XMq3! literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..48e9f9a4f1086a6fb0ae4833e23e40b16ad3601c GIT binary patch literal 8 McmZQz00AZe000~S6951J literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..ec8f944c8acd49bcace4e4c78d4306ebd9e28078 GIT binary patch literal 8 LcmZQz0D~0(0I&e5 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..bc7c08e6adfab860a5e7bb575a74c07d3f9d4a4b GIT binary patch literal 847 zcmc(dO$x#=5QX1SdIEb0(TY$gD(*u&w)H2KN&LHpD_5>ucuZfS3&jI8FeH<_3140& z#Y9Xcn#`o^v`WUECWWYLofqpT#x=RwFU|HKbKj|{3>UtbhB2jHq1rEU|t;KX14&4EI3E!EQ+!OcbEBmr5 zhCp(GTl8ICO`SYb9svRb2oNAZfB*pk1PBlyK!CtT0*|=cpXcjF=ba@$fB*pk1PBly zK!5-N0t5&UAV7cs0RjXFq!SpT=rkRFk0C&S009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBmFAkap`GQPV6DG~?}AV7e?O5h%w>T`Im jJ}d|jAV7cs0RjXF5FkK+009C72oNAZfB*pke=6_=i8Kvw literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab new file mode 100644 index 0000000000000000000000000000000000000000..00bcd647b479bfee8dfef9e1254f77aca127eb3b GIT binary patch literal 4096 zcmbR3vzw0r2-rXb3;5dQ}PkO;CGMj#)AVE`n@4dozf%8iD=Xb6mkz-S1JhQMeD bjE2By2#kinXb6mkz-S1JhQMeDV1@tyS#=%C literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..d2dbc4d5ed26d124603758cd82d03191e8ec9478 GIT binary patch literal 4096 zcmeH_(F%e<5Jk@y^e1HyMDGznPeHwhXqjainw5Xwbs`9Q-Irj5#c`SS-g{<&F$onH zB4X||bXqs|wsWGjuZKEn&Z;9aRWT`rdLmXo9SfdzzEpRvb0shdtg)1Ksnt8_y>9hx z|5~Rw|aaGlPrI`iS>lG5_HkX4^WlHy^_?gv!kw{kJ oT3G6xZbBu0txa5r{c!?LzzH}3C*TB}fD>>6PQVE`f&U}$0^?(CGXMYp literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..486fe1a814e97bee7b3ad3cc77a6bef858da3462 GIT binary patch literal 8 McmZQz00AZg002AyGXMYp literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..9e27f732fe29db9f82162c1114700ef23f6ac174 GIT binary patch literal 8 LcmZQz0D}zx0Js3L literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..f8c0dd4ec4f72258c3adcb66794894fe1b702fa6 GIT binary patch literal 2379 zcmdT_T~8B16diZByVGqcLn)oGyStg)qJ8zJ z@L>8U`~}8m-+l0B81GECAGU>*m}u-nXLrutnYnY$J=a1NMjMPTRaxEVjip_mFC8)- zI$^}Ts6xZDH#9h=Zj03-pHrLt(2@8Z-!qkhVk!igsQZM~?kHxliXRlvrc%1|at<3= zohU`6q+aP7)<~kdNc1AkYFVX(OU9LsO;pryl9(Mm1uLh~=6>C8TJ$n(!y%g1c`J*<;nkQpU`E3VQTH%e z0QT|~qnaZcJSDbPPd;f^x(=-A#Hbbtj_EW@$ssI7(tyoO#4-|_orn>@a%2v6$_}kI zPjVf75fUn(C)3{QYX&UPh#k@JqKxj2Ug8crr7bt=qCGvRYrr)YT<wc1I8mzR4OJ+#%+vqc0*)9>laX4LP}_P^q2wnFC8dRYp@kU8QAP_C~9SV zzX@?BltUbaW?+REgV(gIk{&n<;2Tjky@{mXih@?O<8ZV(dO(>NAW(f!T7y%jVUdG= z*!uVhuL}g}cZmbKV>N$Mg_zNHVW8%&(SQXB!%;xBT~86FBekm%ZI6%y=t$oLox-S8 z@*N$+GD&1jtD!?#Ol7nQ;sanZbGu?J|@)1l99I={(ex;O*zUg6-tQLqFo0nQj^^r800VFd4nUx5c zfXtDZjy?}58#%A07w{C{V}N_xbn?IBALi0RjXF5FkK+009C72oNAZfB*pk1PJ^U=l~b05vu?I literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab new file mode 100644 index 0000000000000000000000000000000000000000..a12ad40a690fcd1cad5f8ad567d566e89ec2f3b8 GIT binary patch literal 4096 zcmbR3vzw0r2v|V`38e7d zoC39Klrq;!UOSb}>d=hmDOJsRq8r+t(J3Exj@;s_JBmgX>wsGulo{PQRrI4+=`r*> z)FpjR3pzVV>sft;_;n2L-v8f@xy9M!E}Yd}{Ptp#qj*+FTOAD=e5cTz09psseXW~ix?IsgiyG^qvXz^ zE6)K%b-Oac;Yd3~N=qR@#+VSZpNJ7|RlZ^Lo_U5nTIev_(x1_1uwiw}8iiDO3PrDB ziV5iqx3J1IE1sSVH7s{wX*bLgams?a$>cTtU(&zdaQ`KCoZeA|ggTTs)AIi+@)n{& W<3z#`V_5xP?5C+gcA;vi@7{J)rQMv?--~=|5HYS#IP*SrD15mJrHv=Jo$h-c#yYHn_ z%90^KfB*pk1PBlyK!5-N0t5&UAV7cs0RjgT_(tC%FK!2`tu6rq1PBlyK!5-N0t5&U zAV7cs0RjXF5FkKcb%8E6Uars2>WeKTK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5;&O$6$=TJ>eS$#F*s5FkK+009C72oP8#&_rr_oX16BAp!&l5ZJxI oJ3hP*uX*>6dXNAC0t5&UAV7cs0RjXF5FkK+009C72>g-24^p8EPXGV_ literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab new file mode 100644 index 0000000000000000000000000000000000000000..4553fe2185f9d559c935829292136b3ac940cd6b GIT binary patch literal 4096 zcmbR3vzw0r2$(?x395c5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4FTdq000Dz B5s3f* literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..3bb149d8c00cf9e606e664dd7205693c7abe5894 GIT binary patch literal 4096 zcmeIuyA6Oa3`J3ffQBJF1vR2z0ZTDfg!w3t{pm9S#eL;{-5Iaq;zd)K=$&P4ZX mKKsyIOH|Ki-_%(TOC3W10R#|0009ILKmY**5I_Kd9}9fAj~QVA literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..b9d571fc209b49a3dfde8526f95bdfff778cf484 GIT binary patch literal 8 LcmZQz00TDw08Ri$ literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..a9f80ae0249093f1db8b14f71053acce35747e3d GIT binary patch literal 8 LcmZQz0D~C-0H6Sw literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..80a0b0e07b3820de60b6345c8f2bf90da6e6d277 GIT binary patch literal 265 zcma*h!3x4K5QO18N?*Wu5Jb;{7C|Vscwd?^jcv1KH&Ocb)`Rz6hyR1wniAw7#T_k+ zE6yxM1<{}hF_om0rvVIE{G6HXh{40 lN>g_vaLqhHf6SWAN>~lqhj=uHm3=*-J#l;npO=q;;}?SEW}5&2 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..8a259bbd54e32391dad08fb7361818db33d70ed3 GIT binary patch literal 32768 zcmeIup$&jQ5Cp(W-eL(2An1k;s0E3n3~EBr1fFZ*lgE7K^xh^rQKEz+K!5-N0t5&U zAV7dXg}{;7`MtM_7f}KP2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0Rr6#oVjROr>nbR z1`!}YfIw4$J=?|@o~EVB2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N J0t9{&_yElp1}6Xj literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab new file mode 100644 index 0000000000000000000000000000000000000000..212ad73dd6afc47d79a4641e15dd71e700810865 GIT binary patch literal 4096 zcmbR3vzw0r2v|S_3$T)exMbuk4c8 zsU=JLg}92+kw(j^xfeBij+D43S)YZO)@E(|tMIy;De~Cw8_QMlE{$zGe1e~h&gXw7 c_y-085P$##AOHafKmY;|fB*y_0D(V&15bHV#sB~S literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..0daf2b724057d74be5d6ff44839805cb1ae42fc3 GIT binary patch literal 8 LcmZQz0E0^a0NMc4 literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..93a595bd1bbabaf1bd4ee4909ac49e65e67fa3f4 GIT binary patch literal 8 LcmZQz0D}bp0H^?= literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..60f08dec15ac07378e8c3037532d462c84c4766b GIT binary patch literal 154 zcmaLOF%E+u7zR)dQ61Wa6W}F`aj`MlbpIlsNJ_>0!2R7FoL^p}dcsol#3hQ=T@*c1 zl24g??vb_u#}}b+&Qaj_QqL&PIDri`IJ{}OqJ;cG`qiqs;24VY`)#V!8e7d zoC39Klrq;!UOSb}>d=hmDOJsRq8r+t(J3Exj@;s_JBmgX>wsGulo{PQRrI4+=`r*> z)FpjR3pzVV>sft;_;n2L-v8f@xy9M!E}Yd}{Ptp#qj*+FTOAOmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> SVE_Rz$p|Kyz$7!6WB~xi4iX{& literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..4f203bbd862355aa7374a84e9644be1d0942cdab GIT binary patch literal 32768 zcmeIuu?>P?5C+gcA;vi@7{J)rQMv?--~=|5HYS#IP*SrD15mJrHv=Jo$h-c#yYHn_ z%90^KfB*pk1PBlyK!5-N0t5&UAV7cs0RjgT_(tC%FK!2`tu6rq1PBlyK!5-N0t5&U zAV7cs0RjXF5FkKcb%8E6Uars2>WeKTK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5;&O$6$=TJ>eS$#F*s5FkK+009C72oP8#&_rr_oX16BAp!&l5ZJxI oJ3hP*uX*>6dXNAC0t5&UAV7cs0RjXF5FkK+009C72>g-24^p8EPXGV_ literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab new file mode 100644 index 0000000000000000000000000000000000000000..b71673ea5789415d1ac1d18e30f6ade783675db6 GIT binary patch literal 4096 zcmbR3vzw0r2v|V`3DYfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R M7!85Z5Fj%I0C2h*Z~y=R literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..1dd772cedaf239fbefddcb6749c5b7b5ed42018f GIT binary patch literal 4096 rcmeIu2N3`O2n3*a^v`S$4Uk2*m#lt78r}(rzlZck$x{`_-mNpY*L16@o%4IvhQz z;^?Vpk=SrR7b@VXf%OV=#6EZejVDpBbJWI3rco}C8tcQH%IFsf58l$|BJYvI)01VX z3Dk_T{tphXB(w2uXTw=Ed02@K2?7qlHhGmO^St&GElC&A=1KhoglgDUIdp-bhQxdt>Rt@Oc1Q=^{xZRT!irJi>B9^N#P5g5(JH~mlJwDo6s@)Td@ zaqi|(cJK(}E!x24tY;nf@@v*`kS|fiG*+;XTe**$`2)+CG$e#|e37eJ$(208JoYk& zQ=>vy%q7g^>wJnIGM(p{%0WXzNM<^xv4FAM!x)}rG)E5eL%4uFeUZpocCnV7{DvKj zz9WP-&Sop~+03{3IZyFZcJpJ7w?~KgH21TBb*yC-TUf#0xrLMN455_ST+33fVm%Al z%3Stw1!qQwu!IY_h-J*=2b|BF%-|y7)xSj|qhv4inId;%X+|t3NDaJ`XaNJzT~o#)Oc~a%S-}&f|!&Aw0=N zOy?%1vXRMbW&*ny%OT_B#aKr3Ax3c?Z~hsHJkM?x^Ji}4WmdAC2Y8Vuc$V$_lHopi zF^)}qjE!8v!+ezoxrh6Cl6AboYF=jr$K9`Ae4ORX;(ETs5^i8Ice8+BF^`?hVT8*# zaeN31IfwJPlo{N}N7=v!d4Y-S<`hQ9hA@GXIgWD}!vaQgH>23XzFU#V4PNJrIQ`-x zcCnP5e2*Qxz&1vBj!6?jIL&OHVhNA4mPgslBm9jAIC^3T`EZ1`-OSqlI{D=iS!#wsdhhrznk7>+iF0=R=GkAchJi}yO<1|i6kQbj}3}4|e z)-bSzy*KSMyO}aszqo{#xryy;^$7Yn$byIIEz ztmcSmAyhJhJ6Om!Sj&w($5IZN?*GV#xspZ9=ljfMGZ*s@W-@MuesL}{xPh}+&oo|S z3J1@0eleX1EMhG8aSYFK6o)2;Fq}!edBgtk8rSeD-{p^N;rHz2w~SA6eld%!T*Z^z z!6qJJBiq=(knH?oBKIH6KAu8xh&?JEZ{Nb@hWpTF-4!4 e$!u=s0&2y;7)W3sfq?`D5*SEeAc6mR0)GSWH}kmw literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..be801fba734bafeea7fb2c7b84f6f2d9ff6fa64a GIT binary patch literal 12288 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 Y%_+<2+G)i4@}Kc9DP4YnkDCbmA6z|ZE&u=k literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/last-build.bin b/plugin/build/kotlin/compileKotlin/cacheable/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..2fef1656a626d680ac240223e5cfc13188d7f919 GIT binary patch literal 18 YcmZ4UmVvdLhk=1{&b<=*X$(LB05@6$<^TWy literal 0 HcmV?d00001 diff --git a/plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin b/plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin new file mode 100644 index 0000000000000000000000000000000000000000..9ec17754c2e07e93c57b564698e9ef432c5e2dea GIT binary patch literal 53918 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 tF#eXIe)sZwhWc}u-T%SM`|$sBzLFLLe}7j52`. + */ +abstract class JustworksExtension + @Inject + constructor(objects: ObjectFactory,) { + /** + * Container of named OpenAPI spec configurations. + * + * Each spec is independently configured and generates to its own + * build/generated/justworks/{specName}/ directory. + */ + val specs: NamedDomainObjectContainer = + objects.domainObjectContainer(JustworksSpecConfiguration::class.java) + } diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt new file mode 100644 index 00000000..3a7b38fb --- /dev/null +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt @@ -0,0 +1,81 @@ +package com.avsystem.justworks.gradle + +import com.avsystem.justworks.core.gen.ClientGenerator +import com.avsystem.justworks.core.gen.ModelGenerator +import com.avsystem.justworks.core.parser.ParseResult +import com.avsystem.justworks.core.parser.SpecParser +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.CacheableTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction + +/** + * Gradle task that generates Kotlin source files from an OpenAPI spec. + * + * Parses the OpenAPI spec via [SpecParser], feeds the result to [ModelGenerator], + * and writes the generated Kotlin source files to the output directory. + */ +@CacheableTask +abstract class JustworksGenerateTask : DefaultTask() { + /** Path to the OpenAPI spec file. */ + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val specFile: RegularFileProperty + + /** Base package name for generated code. */ + @get:Input + abstract val packageName: Property + + /** Package for generated API client classes. */ + @get:Input + abstract val apiPackage: Property + + /** Package for generated model/data classes. */ + @get:Input + abstract val modelPackage: Property + + /** Output directory for generated Kotlin source files. */ + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @TaskAction + fun generate() { + val outDir = outputDir.get().asFile + + // Clean output directory before generation to prevent stale files + if (outDir.exists()) { + outDir.deleteRecursively() + } + outDir.mkdirs() + + val spec = specFile.get().asFile + val result = SpecParser.parse(spec) + + when (result) { + is ParseResult.Failure -> { + throw GradleException( + "Failed to parse spec (task: $name): ${spec.name}:\n${result.errors.joinToString("\n")}", + ) + } + + is ParseResult.Success -> { + val modelGen = ModelGenerator(modelPackage.get()) + val modelCount = modelGen.generateTo(result.apiSpec, outDir) + + val hasPolymorphicTypes = modelGen.getSealedHierarchies().isNotEmpty() + val clientGen = ClientGenerator(apiPackage.get(), modelPackage.get()) + val clientCount = clientGen.generateTo(result.apiSpec, outDir, hasPolymorphicTypes) + + logger.lifecycle("Generated $modelCount model files, $clientCount client files from ${spec.name}") + } + } + } +} diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt new file mode 100644 index 00000000..ddd9b88f --- /dev/null +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt @@ -0,0 +1,100 @@ +package com.avsystem.justworks.gradle + +import org.gradle.api.GradleException +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginExtension + +/** + * Gradle plugin that registers the Justworks OpenAPI code generator. + * + * Applies the `justworks` DSL extension with multi-spec support, + * registers per-spec generation tasks dynamically, wires generated sources + * into Kotlin source sets, and hooks `compileKotlin` to depend on code generation. + */ +class JustworksPlugin : Plugin { + override fun apply(project: Project) { + // 1. Create extension + val extension = project.extensions.create("justworks", JustworksExtension::class.java) + + // 2. Register shared types task (HttpError, Success — generated once) + val sharedTypesTask = + project.tasks.register("justworksSharedTypes", JustworksSharedTypesTask::class.java) { task -> + task.outputDir.set(project.layout.buildDirectory.dir("generated/justworks/shared/kotlin")) + } + + // 3. Register aggregate task + val generateAllTask = + project.tasks.register("justworksGenerateAll") { task -> + task.group = "code generation" + task.description = "Generate Kotlin clients from all configured OpenAPI specs" + } + + // 4. Dynamic per-spec task registration + extension.specs.all { spec -> + // Validate spec name (alphanumeric, starts with letter) + if (!spec.name.matches(Regex("[a-zA-Z][a-zA-Z0-9]*"))) { + throw GradleException( + "Invalid spec name '${spec.name}': must start with a letter and contain only letters and numbers", + ) + } + + // Compute task name: justworksGenerate + val taskName = "justworksGenerate${spec.name.replaceFirstChar { it.uppercase() }}" + + // Register per-spec generate task + val specTask = + project.tasks.register(taskName, JustworksGenerateTask::class.java) { task -> + task.dependsOn(sharedTypesTask) + task.specFile.set(spec.specFile) + task.packageName.set(spec.packageName) + task.apiPackage.set(spec.apiPackage.orElse(spec.packageName.map { "$it.api" })) + task.modelPackage.set(spec.modelPackage.orElse(spec.packageName.map { "$it.model" })) + task.outputDir.set(project.layout.buildDirectory.dir("generated/justworks/${spec.name}")) + task.group = "code generation" + task.description = "Generate Kotlin client from '${spec.name}' OpenAPI spec" + } + + // Wire spec task into aggregate task + generateAllTask.configure { it.dependsOn(specTask) } + } + + // 5. Wire generated sources into Kotlin source sets lazily + project.plugins.withId("org.jetbrains.kotlin.jvm") { + val sourceSets = project.extensions.getByType(JavaPluginExtension::class.java).sourceSets + + sourceSets.named("main") { sourceSet -> + // Wire shared types output + sourceSet.java.srcDir(sharedTypesTask.flatMap { it.outputDir }) + + // Wire each spec's output directory + extension.specs.all { spec -> + val taskName = "justworksGenerate${spec.name.replaceFirstChar { it.uppercase() }}" + val specTask = project.tasks.named(taskName, JustworksGenerateTask::class.java) + sourceSet.java.srcDir(specTask.flatMap { it.outputDir }) + } + } + + // Hook compileKotlin to depend on generateAllTask + project.tasks.named("compileKotlin") { task -> + task.dependsOn(generateAllTask) + } + } + + // 6. Configuration-time validation + project.afterEvaluate { + if (extension.specs.isEmpty()) { + project.logger.warn("justworks: no specs configured in justworks.specs { } block") + } + + extension.specs.all { spec -> + if (!spec.specFile.isPresent) { + throw GradleException("Spec '${spec.name}': specFile is required but not set") + } + if (!spec.packageName.isPresent) { + throw GradleException("Spec '${spec.name}': packageName is required but not set") + } + } + } + } +} diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt new file mode 100644 index 00000000..03fd5489 --- /dev/null +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt @@ -0,0 +1,29 @@ +package com.avsystem.justworks.gradle + +import com.avsystem.justworks.core.gen.ApiResponseGenerator +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.tasks.CacheableTask +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction + +/** + * Gradle task that generates shared types (HttpError, Success) once + * to a fixed output directory shared across all spec configurations. + */ +@CacheableTask +abstract class JustworksSharedTypesTask : DefaultTask() { + /** Output directory for shared type files. */ + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @TaskAction + fun generate() { + val outDir = outputDir.get().asFile + outDir.mkdirs() + + val count = ApiResponseGenerator.generateTo(outDir) + + logger.lifecycle("Generated $count shared type files") + } +} diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt new file mode 100644 index 00000000..4a52486e --- /dev/null +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt @@ -0,0 +1,51 @@ +package com.avsystem.justworks.gradle + +import org.gradle.api.Named +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import javax.inject.Inject + +/** + * Configuration for a single OpenAPI spec in the Justworks multi-spec DSL. + * + * Each spec is independently configured with its own OpenAPI file path, + * package structure, and generates to an isolated output directory. + * + * Usage in `build.gradle.kts`: + * ```kotlin + * justworks { + * specs { + * register("petstore") { + * specFile = file("api/petstore.yaml") + * packageName = "com.example.petstore" + * } + * } + * } + * ``` + * + * This class implements [Named] to work with Gradle's [org.gradle.api.NamedDomainObjectContainer]. + * The name is injected via constructor and determines the task name and output directory. + */ +abstract class JustworksSpecConfiguration + @Inject + constructor(private val name: String,) : Named { + /** Path to the OpenAPI spec file (.yaml or .json). */ + abstract val specFile: RegularFileProperty + + /** Base package name for generated code (e.g., "com.example.api"). */ + abstract val packageName: Property + + /** + * Package for generated API client classes. + * Defaults to `"$packageName.api"` if not set. + */ + abstract val apiPackage: Property + + /** + * Package for generated model/data classes. + * Defaults to `"$packageName.model"` if not set. + */ + abstract val modelPackage: Property + + override fun getName(): String = name + } diff --git a/settings.gradle.kts b/settings.gradle.kts index 14ce48e2..58a42897 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,4 +2,4 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } rootProject.name = "justworks" -include("core") +include("core", "plugin") From 1c4647e9b64b788e602045f8c3e1b18c80239109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Wed, 11 Mar 2026 20:52:10 +0100 Subject: [PATCH 02/14] chore: add .gitignore and remove build artifacts Co-Authored-By: Claude Opus 4.6 --- .gitignore | 4 ++++ .../kotlin/main/META-INF/plugin.kotlin_module | Bin 24 -> 0 bytes .../justworks/gradle/JustworksExtension.class | Bin 1825 -> 0 bytes .../gradle/JustworksGenerateTask.class | Bin 5501 -> 0 bytes .../justworks/gradle/JustworksPlugin.class | Bin 16330 -> 0 bytes .../gradle/JustworksSharedTypesTask.class | Bin 2167 -> 0 bytes .../gradle/JustworksSpecConfiguration.class | Bin 1784 -> 0 bytes .../outputs-generated-for-plugins.tab | Bin 4096 -> 0 bytes .../outputs-generated-for-plugins.tab.keystream | Bin 4096 -> 0 bytes ...puts-generated-for-plugins.tab.keystream.len | Bin 8 -> 0 bytes .../outputs-generated-for-plugins.tab.len | Bin 8 -> 0 bytes .../outputs-generated-for-plugins.tab.values.at | Bin 55 -> 0 bytes .../outputs-generated-for-plugins.tab_i.len | Bin 8 -> 0 bytes .../sources-referenced-by-plugins.tab | Bin 4096 -> 0 bytes .../sources-referenced-by-plugins.tab.keystream | Bin 4096 -> 0 bytes ...rces-referenced-by-plugins.tab.keystream.len | Bin 8 -> 0 bytes .../sources-referenced-by-plugins.tab.len | Bin 8 -> 0 bytes .../sources-referenced-by-plugins.tab.values.at | Bin 55 -> 0 bytes .../sources-referenced-by-plugins.tab_i.len | Bin 8 -> 0 bytes .../caches-jvm/inputs/source-to-output.tab | Bin 4096 -> 0 bytes .../inputs/source-to-output.tab.keystream | Bin 4096 -> 0 bytes .../inputs/source-to-output.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/inputs/source-to-output.tab.len | Bin 8 -> 0 bytes .../inputs/source-to-output.tab.values.at | Bin 1362 -> 0 bytes .../caches-jvm/inputs/source-to-output.tab_i | Bin 32768 -> 0 bytes .../inputs/source-to-output.tab_i.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/class-attributes.tab | Bin 4096 -> 0 bytes .../jvm/kotlin/class-attributes.tab.keystream | Bin 4096 -> 0 bytes .../kotlin/class-attributes.tab.keystream.len | Bin 8 -> 0 bytes .../jvm/kotlin/class-attributes.tab.len | Bin 8 -> 0 bytes .../jvm/kotlin/class-attributes.tab.values.at | Bin 64 -> 0 bytes .../jvm/kotlin/class-attributes.tab_i | Bin 32768 -> 0 bytes .../jvm/kotlin/class-attributes.tab_i.len | Bin 8 -> 0 bytes .../jvm/kotlin/class-fq-name-to-source.tab | Bin 4096 -> 0 bytes .../class-fq-name-to-source.tab.keystream | Bin 4096 -> 0 bytes .../class-fq-name-to-source.tab.keystream.len | Bin 8 -> 0 bytes .../jvm/kotlin/class-fq-name-to-source.tab.len | Bin 8 -> 0 bytes .../class-fq-name-to-source.tab.values.at | Bin 847 -> 0 bytes .../jvm/kotlin/class-fq-name-to-source.tab_i | Bin 32768 -> 0 bytes .../kotlin/class-fq-name-to-source.tab_i.len | Bin 8 -> 0 bytes .../jvm/kotlin/internal-name-to-source.tab | Bin 4096 -> 0 bytes .../internal-name-to-source.tab.keystream | Bin 4096 -> 0 bytes .../internal-name-to-source.tab.keystream.len | Bin 8 -> 0 bytes .../jvm/kotlin/internal-name-to-source.tab.len | Bin 8 -> 0 bytes .../internal-name-to-source.tab.values.at | Bin 847 -> 0 bytes .../jvm/kotlin/internal-name-to-source.tab_i | Bin 32768 -> 0 bytes .../kotlin/internal-name-to-source.tab_i.len | Bin 8 -> 0 bytes .../cacheable/caches-jvm/jvm/kotlin/proto.tab | Bin 4096 -> 0 bytes .../caches-jvm/jvm/kotlin/proto.tab.keystream | Bin 4096 -> 0 bytes .../jvm/kotlin/proto.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/proto.tab.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.at | Bin 2379 -> 0 bytes .../cacheable/caches-jvm/jvm/kotlin/proto.tab_i | Bin 32768 -> 0 bytes .../caches-jvm/jvm/kotlin/proto.tab_i.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/source-to-classes.tab | Bin 4096 -> 0 bytes .../jvm/kotlin/source-to-classes.tab.keystream | Bin 4096 -> 0 bytes .../kotlin/source-to-classes.tab.keystream.len | Bin 8 -> 0 bytes .../jvm/kotlin/source-to-classes.tab.len | Bin 8 -> 0 bytes .../jvm/kotlin/source-to-classes.tab.values.at | Bin 747 -> 0 bytes .../jvm/kotlin/source-to-classes.tab_i | Bin 32768 -> 0 bytes .../jvm/kotlin/source-to-classes.tab_i.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/subtypes.tab | Bin 4096 -> 0 bytes .../jvm/kotlin/subtypes.tab.keystream | Bin 4096 -> 0 bytes .../jvm/kotlin/subtypes.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/subtypes.tab.len | Bin 8 -> 0 bytes .../jvm/kotlin/subtypes.tab.values.at | Bin 265 -> 0 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i | Bin 32768 -> 0 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/supertypes.tab | Bin 4096 -> 0 bytes .../jvm/kotlin/supertypes.tab.keystream | Bin 4096 -> 0 bytes .../jvm/kotlin/supertypes.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/jvm/kotlin/supertypes.tab.len | Bin 8 -> 0 bytes .../jvm/kotlin/supertypes.tab.values.at | Bin 154 -> 0 bytes .../caches-jvm/jvm/kotlin/supertypes.tab_i | Bin 32768 -> 0 bytes .../caches-jvm/jvm/kotlin/supertypes.tab_i.len | Bin 8 -> 0 bytes .../cacheable/caches-jvm/lookups/counters.tab | 2 -- .../cacheable/caches-jvm/lookups/file-to-id.tab | Bin 4096 -> 0 bytes .../caches-jvm/lookups/file-to-id.tab.keystream | Bin 4096 -> 0 bytes .../lookups/file-to-id.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/lookups/file-to-id.tab.len | Bin 8 -> 0 bytes .../caches-jvm/lookups/file-to-id.tab.values.at | Bin 79 -> 0 bytes .../caches-jvm/lookups/file-to-id.tab_i | Bin 32768 -> 0 bytes .../caches-jvm/lookups/file-to-id.tab_i.len | Bin 8 -> 0 bytes .../cacheable/caches-jvm/lookups/id-to-file.tab | Bin 4096 -> 0 bytes .../caches-jvm/lookups/id-to-file.tab.keystream | Bin 4096 -> 0 bytes .../lookups/id-to-file.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/lookups/id-to-file.tab.len | Bin 8 -> 0 bytes .../caches-jvm/lookups/id-to-file.tab.values.at | Bin 448 -> 0 bytes .../caches-jvm/lookups/id-to-file.tab_i | Bin 32768 -> 0 bytes .../caches-jvm/lookups/id-to-file.tab_i.len | Bin 8 -> 0 bytes .../cacheable/caches-jvm/lookups/lookups.tab | Bin 4096 -> 0 bytes .../caches-jvm/lookups/lookups.tab.keystream | Bin 12288 -> 0 bytes .../lookups/lookups.tab.keystream.len | Bin 8 -> 0 bytes .../caches-jvm/lookups/lookups.tab.len | Bin 8 -> 0 bytes .../caches-jvm/lookups/lookups.tab.values.at | Bin 1725 -> 0 bytes .../cacheable/caches-jvm/lookups/lookups.tab_i | Bin 32768 -> 0 bytes .../caches-jvm/lookups/lookups.tab_i.len | Bin 8 -> 0 bytes .../compileKotlin/cacheable/last-build.bin | Bin 18 -> 0 bytes .../shrunk-classpath-snapshot.bin | Bin 53918 -> 0 bytes plugin/build/libs/plugin-0.0.1.jar | Bin 13279 -> 0 bytes .../com.avsystem.justworks.properties | 1 - .../plugin-under-test-metadata.properties | 1 - .../com.avsystem.justworks.properties | 1 - plugin/build/tmp/jar/MANIFEST.MF | 2 -- 104 files changed, 4 insertions(+), 7 deletions(-) create mode 100644 .gitignore delete mode 100644 plugin/build/classes/kotlin/main/META-INF/plugin.kotlin_module delete mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksExtension.class delete mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksGenerateTask.class delete mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksPlugin.class delete mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksSharedTypesTask.class delete mode 100644 plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksSpecConfiguration.class delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len delete mode 100644 plugin/build/kotlin/compileKotlin/cacheable/last-build.bin delete mode 100644 plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin delete mode 100644 plugin/build/libs/plugin-0.0.1.jar delete mode 100644 plugin/build/pluginDescriptors/com.avsystem.justworks.properties delete mode 100644 plugin/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties delete mode 100644 plugin/build/resources/main/META-INF/gradle-plugins/com.avsystem.justworks.properties delete mode 100644 plugin/build/tmp/jar/MANIFEST.MF diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f4ad3507 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build/ +.gradle/ +.kotlin/ +.idea/ diff --git a/plugin/build/classes/kotlin/main/META-INF/plugin.kotlin_module b/plugin/build/classes/kotlin/main/META-INF/plugin.kotlin_module deleted file mode 100644 index 3a6b9771be65faf14b320eb82e9860d3a64e8c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24 XcmZQzU|?ooU|<4b5Df-O3|b5T0ek>e diff --git a/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksExtension.class b/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksExtension.class deleted file mode 100644 index 0a77847a891313619c8828175366ef638b49a9aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1825 zcmbtU-)|d55dQYg@tv=xbq?C5Zkv)cBz8i5ZunK|5Spf~WMop*ph#67(B`~c*FN7x zw|gdi%iqEik0604JfNtL{85Oxvs;QAL;}*??#^oF`(|cm=J!8-{SCkd?lCm|c;NA& zdaAS-c)e8VZ{nn{yddG-POp>N^bQI~me}C!-9-Yv)^w;d&0x6M8SV)j2uPmG)I{%6A`(uDF zc)|yQ6my3sBWmTIjbhx+Kmu~Oj5l!BK^f;5%vvT-VcJ0fF2k)8W^#L9_?vO`wG7fE zkI2GX4D4P(ivPt zm7#hpMXk|j)NNd0xcq7o?;q?ZLS==q!^2dRF*{1oHHIlgkt&9jQ~5E6`4S9VXDH|= zlFU~-Crs?i5~a#mnB+XJ02%B+=!x-2U$=rAf6Prh$y8on9YsjlO0mZOb6yI!y%C`=d0{av<8#P%60> zijBX95mo6XjW&jJ9qPlabg(CqFFENjxSiPN;SNt^CXX*Kjj?u)L0XvPc{!l|M(AwE zY2u3qG8Bb5>XbtMATFqJNLnMwzzRO0y+~=YbD5fvBopf-Jthl-_Nyzd^9+^cpYi7M zihKSSTsH97z4{Dq|Ad7faht~2)VT?ZtX?Y@~P0};a$~hmB z{<{?7ja`^+G}`dmXyRrYt9Y-C_wm6ln8JtnXcuLLMTJ`mC50tLGYUn8IfZ$Jj}>YP Ib%oo10{q1CTL1t6 diff --git a/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksGenerateTask.class b/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksGenerateTask.class deleted file mode 100644 index e51344c62987e60ea4c2e6a415ad452fd70bdf97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5501 zcmbVQd3Y4%8UKBo&CX_ag(ZX|@d}D25y*m8M1n|&2`nZdP0}D>k6|+;lg!SnGqaIY zs@Tik_aUvVEp5f#)z(13YNUrp@B6f;y^p7V`8<7|*7oeAzovrTS3EqKblgLY8(2 z)KL8yKkeK%LLDga5?q?V3ak{k@Qe}_TrN;0edbDR38bdw8Ft!7TM~_EN}vH(2qgWT zLW+Xb3?Ti0;d+b|2GE`)nvqtq25SW_8nr#su+k%AxwK(N<%@8&imR|*U{NSE)WE&bQ?P;4JYLE;JzqL1znnO@5uH`ofi5NkU%J4SxsEv( znZ7!`y35>2p*zu|Qs|2X)}MnpMQc}fXogvEbOn7x$Q-9_^OJe|fvldFVWHq90t%5C zB$nAY5A#71yKs{{wcQeRy8|S*JC5xTk=4^kE_jBS?j%g9`ptN$ihjI|u2mA-{OL=RKd9S5Q$r?k`xO)*az!T}$!8FpCr?meUR&hM{5zBTV)3 zF!jND&#w2ORqqnF^^LMxZLAkf{NJdGI81WR_|mY(>`^_;=WVu?)w~YPPqPXvfn_;u zR1c=ZP{o{GP4Ex?9 z{xY5jMYL(A*=Kk?%_eAUPI3%|1TD(}6$4<# zd%m&QSIA~{mznrBf#x&CF>6`cFQH+3WjhL9mBez?$k4lk@h~TnODevCI}>=d%#-yh+9F z(m$%Ka(P2$SLR_RhcnrnlPyC!Wak;b6>n2<5O4RzgiWR`u&MERNC|X5U63+Kyc6$| z%DtP(g39&j8sllZ!DQrQhYg)zS~M$%b!mC3@?N}8E_y$E9p6|#y^*BgFcYTXw&(KR zcoH8(I)M-19#)Mr87dFA%`|k&D>~f|C$TIz-H)&w79Yd>@b%m0BP#C2#{{l>;eOfE zN5h3jhW&^I1RB<)XAv-Tr~tfU)o{K)=9www8Av@>)G+FsVDJ8 z97y0ne2G1Fn3KEhUBkMy)zPf%aF^yWCV6mMj?T#TfPME6!$>Ut@TQkd0B;iJT>Gm99|mIIGcI3 z@N`&Zv_Z|&I2Xx{RWKb#|*3I5|1v)`!& zY9y}A%%vjg)S-C8@~J~tM%Ie0%BdrxhE;Z8gVl^6V(OP&w+)1OrY z;q-;CVXi!1laf0Yg~sw`f!T#wHSAkC3ah5T^0L1=G>;O<(Kc2OUOhVvOYbh^_UTT) z1QvVFPCKia1Daz5K=UVSdl{2PP9HE_gA=VY7i|{Eke0E=%22ENj3G<&*if?;^m%j| z%RsnQGGnn!wV9gh%D7hh?1GckgR@9&wQbM!94#MoP;PVuQ)X1+8T{Eq{tUwBGyF#WBPm;2?rO@F~ea9sbB?GGIUzR3OUe=S&2DB4rWZ=kdLO91C@%IPqtG%EfGI z$hsIcsK8%17r_#LiKH#%_iR4aqI2S7M{-Vlyl#go%Kgrty&tu_fI3E`{gDkcfM$uN zD<*L9BrX$}Lc=6h33RTSz`Daot~!ou_NPBnEbqc@O9Ju9-sr1YSM`tvWjeU5E-HQk%tbjGn-)VDf+EqjK57 z!?@=pZkNjrP2x2IyQ^P!9B-V$n~&iw8!KxoDd*q>-r;LBf%mMB)mBd6?n!(|un$n8 zM-i=9ubjlaQo=`PODHGv;~V3(@oAY$lnESNUq!x8FNrOwl4_s87l27T6v0s>PU6_^ zV>te(#7G7H%IEcn{RfvQSo0ii=2O8F{QECD6x=Shh=1dz{}F4df{0HH>5?cE+$-TF zfi^%~fSp}6*7HY_YxuLqwfrTbMPB03&dd9DZqtJ;ywSDdHoouR>|N-<5#F{RLI#iX z|4Cj|pT&(7+a>C;Su}Em1n$j*>=CY-#0et)Aq?Xr9_GnENoilkBh>C$?)4~-GS0P2 z@ffL9s20m`3SS{^uEoFbRgNOu^BH^%U#Hssk zc2Vgf=He$Ve(ECOBI)91E`ILf7cLgNsB!U27t35c?aC#;a`9^ywJz#hT;TKk2LIru O3%I#QqjLW9v;PMZqdYeN diff --git a/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksPlugin.class b/plugin/build/classes/kotlin/main/com/avsystem/justworks/gradle/JustworksPlugin.class deleted file mode 100644 index 5214d150c36e186a75ed691e09959e78272e714e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16330 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 HVE_RD6bTXt diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/outputs-generated-for-plugins.tab_i.len deleted file mode 100644 index 1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 KcmZQzfB*mh2mk>9 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab deleted file mode 100644 index 8aad32b3b84c79ee82814f17430d858dce49687b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2pB;G3OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> HVE_RD6bTXt diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/compilerPluginFiles/sources-referenced-by-plugins.tab_i.len deleted file mode 100644 index 1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 KcmZQzfB*mh2mk>9 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab deleted file mode 100644 index d2aa71570acd5d0d5ce4bf6c55042d80bd76df5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|V`38e7d zoC39Klrq;!UOSb}>d=hmDOJsRq8r+t(J3Exj@;s_JBmgX>wsGulo{PQRrI4+=`r*> z)FpjR3pzVV>sft;_;n2L-v8f@xy9M!E}Yd}{Ptp#qj*+FTOAB!wOgr8D+_O|s^zN#J~NcqK*8}9 zjy|4Y;OT3iX>IxMI4kMj(xdRgxC4i0M({kLjn*q8Ec3%EHD?MH*AZH?UlAkhW4>l| z!#s`N2@>G;#QGaojuDm^po=@)W6a%l+_fcwfV+2go(JMJMAZgdZ#RK}{NEd0mVgO~ z(Hw!MK;)8NN3d6?;WO%Bl8A=ltX4l-yov(eqXLRVM_*vgnp@VsV)YM{Z4i1g9ehMG Z=E=wi$1gFAcflijw`P|fnP?5C+gcA;vi@7{J)rQMv?--~=|5HYS#IP*SrD15mJrHv=Jo$h-c#yYHn_ z%90^KfB*pk1PBlyK!5-N0t5&UAV7cs0RjgT_(tC%FK!2`tu6rq1PBlyK!5-N0t5&U zAV7cs0RjXF5FkKcb%8E6Uars2>WeKTK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5;&O$6$=TJ>eS$#F*s5FkK+009C72oP8#&_rr_oX16BAp!&l5ZJxI oJ3hP*uX*>6dXNAC0t5&UAV7cs0RjXF5FkK+009C72>g-24^p8EPXGV_ diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab deleted file mode 100644 index 0b90c9a4a8090d973c0742e80f1438bee8cc3789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|V`39U5Jk@qSp-4ciwLd+{ejYIt&b{wsQr6yBZA;IE4hIolQ5Gz_XHS|apgin z%AJN@(XtCSN4ju&sG{biJfTpQl5rQT0T2@E`yJ0*&X3_Nqg^YRlm%UsSa`&eA`71&6G654X V0TVC*6EFc2FaZ-V0TcK)0x!7@XKerg diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len deleted file mode 100644 index 48e9f9a4f1086a6fb0ae4833e23e40b16ad3601c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz00AZe000~S6951J diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len deleted file mode 100644 index ec8f944c8acd49bcace4e4c78d4306ebd9e28078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D~0(0I&e5 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at deleted file mode 100644 index 3737e138423429f98a05b0f5daa3414fe62d0dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmdOA@JLNeNi9+cN=?o$N>OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> IWMDu>0JcIB2><{9 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i deleted file mode 100644 index 73e8b8b446a74bde3006d80c84ce216aac80b712..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuu?>P?5P;D?Ax=RY!`4u;jEN)IX=y`3$p*AKg9Fg8ffS73tw727uD(m|d*x87 zVh9i*K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfIxDAA^N8K>76`N9svRb2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7csflUI>*q$!Ob<>e$0t5&UNH6e+!t?brrVmXT*hg2l z%uUifSp*0WAV7cs0RjXF5FkK+009C7b}ev=@9S^-+I58I2@oJafB*pk1PBlyK!5-N j0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pke<1J!OM?zU diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab deleted file mode 100644 index d2a5d1351c2c9f413aeda00ce4bfed0e45313d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|V`32pAO%D?~rbwGvy={Z0;>Mz88d}fTwjfTKz2#kinXb6mkz-S1JhQMeDjE2By2#kin OXb6mkz-S2I4gmn{B^lWO diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream deleted file mode 100644 index 213db59267484d527e8455abc8086e2f62088c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeH^%L>9U5Jk@qSp-4ciwLd+{ejYIt&b{wsQr6yBZA;IE4hIolQ5Gz_XHS|apgin z%AJN@(XtCSN4ju&sG{biJfTpQl5rQT0T2@E`yJ0*&X3_Nqg^YRlm%UsSa`&eA`71&6G654X V0TVC*6EFc2FaZ-V0TcK)0x!7@XKerg diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len deleted file mode 100644 index 48e9f9a4f1086a6fb0ae4833e23e40b16ad3601c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz00AZe000~S6951J diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len deleted file mode 100644 index ec8f944c8acd49bcace4e4c78d4306ebd9e28078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D~0(0I&e5 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at deleted file mode 100644 index bc7c08e6adfab860a5e7bb575a74c07d3f9d4a4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 847 zcmc(dO$x#=5QX1SdIEb0(TY$gD(*u&w)H2KN&LHpD_5>ucuZfS3&jI8FeH<_3140& z#Y9Xcn#`o^v`WUECWWYLofqpT#x=RwFU|HKbKj|{P?5P;D?Ax=RY!`4u;jEN)IX=y`3$p*AKg9Fg8ffS73tw727uD(m|d*x87 zVh9i*K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfIxDAA^N8K>76`N9svRb2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7csflUI>*q$!Ob<>e$0t5&UNH6e+!t?brrVmXT*hg2l z%uUifSp*0WAV7cs0RjXF5FkK+009C7b}ev=@9S^-+I58I2@oJafB*pk1PBlyK!5-N j0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pke<1J!OM?zU diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab deleted file mode 100644 index d2a5d1351c2c9f413aeda00ce4bfed0e45313d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|V`32pAO%D?~rbwGvy={Z0;>Mz88d}fTwjfTKz2#kinXb6mkz-S1JhQMeDjE2By2#kin OXb6mkz-S2I4gmn{B^lWO diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream deleted file mode 100644 index e2336a96b4908c83adf10e2541d29d55aec84bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeH^%L>9U5Jk@qNd-aNiwLd+{ejYIt&b{wsQr6yBZA;IE4hIolQ5Gz_XHS|apgin z%AJN@(XtCSN4ju&sG{biJfTpQl5rQT0T2@E`yJ0*&X3_Nqg^YRlm%UsSa`&eA`71&6G654X V0TVC*6EFc2FaZ-V0TcK)0x#w~XMq3! diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len deleted file mode 100644 index 48e9f9a4f1086a6fb0ae4833e23e40b16ad3601c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz00AZe000~S6951J diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len deleted file mode 100644 index ec8f944c8acd49bcace4e4c78d4306ebd9e28078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D~0(0I&e5 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at deleted file mode 100644 index bc7c08e6adfab860a5e7bb575a74c07d3f9d4a4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 847 zcmc(dO$x#=5QX1SdIEb0(TY$gD(*u&w)H2KN&LHpD_5>ucuZfS3&jI8FeH<_3140& z#Y9Xcn#`o^v`WUECWWYLofqpT#x=RwFU|HKbKj|{3>UtbhB2jHq1rEU|t;KX14&4EI3E!EQ+!OcbEBmr5 zhCp(GTl8ICO`SYb9svRb2oNAZfB*pk1PBlyK!CtT0*|=cpXcjF=ba@$fB*pk1PBly zK!5-N0t5&UAV7cs0RjXFq!SpT=rkRFk0C&S009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBmFAkap`GQPV6DG~?}AV7e?O5h%w>T`Im jJ}d|jAV7cs0RjXF5FkK+009C72oNAZfB*pke=6_=i8Kvw diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab deleted file mode 100644 index 00bcd647b479bfee8dfef9e1254f77aca127eb3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2-rXb3;5dQ}PkO;CGMj#)AVE`n@4dozf%8iD=Xb6mkz-S1JhQMeD bjE2By2#kinXb6mkz-S1JhQMeDV1@tyS#=%C diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream deleted file mode 100644 index d2dbc4d5ed26d124603758cd82d03191e8ec9478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeH_(F%e<5Jk@y^e1HyMDGznPeHwhXqjainw5Xwbs`9Q-Irj5#c`SS-g{<&F$onH zB4X||bXqs|wsWGjuZKEn&Z;9aRWT`rdLmXo9SfdzzEpRvb0shdtg)1Ksnt8_y>9hx z|5~Rw|aaGlPrI`iS>lG5_HkX4^WlHy^_?gv!kw{kJ oT3G6xZbBu0txa5r{c!?LzzH}3C*TB}fD>>6PQVE`f&U}$0^?(CGXMYp diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len deleted file mode 100644 index 486fe1a814e97bee7b3ad3cc77a6bef858da3462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz00AZg002AyGXMYp diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len deleted file mode 100644 index 9e27f732fe29db9f82162c1114700ef23f6ac174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D}zx0Js3L diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at deleted file mode 100644 index f8c0dd4ec4f72258c3adcb66794894fe1b702fa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2379 zcmdT_T~8B16diZByVGqcLn)oGyStg)qJ8zJ z@L>8U`~}8m-+l0B81GECAGU>*m}u-nXLrutnYnY$J=a1NMjMPTRaxEVjip_mFC8)- zI$^}Ts6xZDH#9h=Zj03-pHrLt(2@8Z-!qkhVk!igsQZM~?kHxliXRlvrc%1|at<3= zohU`6q+aP7)<~kdNc1AkYFVX(OU9LsO;pryl9(Mm1uLh~=6>C8TJ$n(!y%g1c`J*<;nkQpU`E3VQTH%e z0QT|~qnaZcJSDbPPd;f^x(=-A#Hbbtj_EW@$ssI7(tyoO#4-|_orn>@a%2v6$_}kI zPjVf75fUn(C)3{QYX&UPh#k@JqKxj2Ug8crr7bt=qCGvRYrr)YT<wc1I8mzR4OJ+#%+vqc0*)9>laX4LP}_P^q2wnFC8dRYp@kU8QAP_C~9SV zzX@?BltUbaW?+REgV(gIk{&n<;2Tjky@{mXih@?O<8ZV(dO(>NAW(f!T7y%jVUdG= z*!uVhuL}g}cZmbKV>N$Mg_zNHVW8%&(SQXB!%;xBT~86FBekm%ZI6%y=t$oLox-S8 z@*N$+GD&1jtD!?#Ol7nQ;sanZbGu?J|@)1l99I={(ex;O*zUg6-tQLqFo0nQj^^r800VFd4nUx5c zfXtDZjy?}58#%A07w{C{V}N_xbn?IBALi0RjXF5FkK+009C72oNAZfB*pk1PJ^U=l~b05vu?I diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab deleted file mode 100644 index a12ad40a690fcd1cad5f8ad567d566e89ec2f3b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|V`38e7d zoC39Klrq;!UOSb}>d=hmDOJsRq8r+t(J3Exj@;s_JBmgX>wsGulo{PQRrI4+=`r*> z)FpjR3pzVV>sft;_;n2L-v8f@xy9M!E}Yd}{Ptp#qj*+FTOAD=e5cTz09psseXW~ix?IsgiyG^qvXz^ zE6)K%b-Oac;Yd3~N=qR@#+VSZpNJ7|RlZ^Lo_U5nTIev_(x1_1uwiw}8iiDO3PrDB ziV5iqx3J1IE1sSVH7s{wX*bLgams?a$>cTtU(&zdaQ`KCoZeA|ggTTs)AIi+@)n{& W<3z#`V_5xP?5C+gcA;vi@7{J)rQMv?--~=|5HYS#IP*SrD15mJrHv=Jo$h-c#yYHn_ z%90^KfB*pk1PBlyK!5-N0t5&UAV7cs0RjgT_(tC%FK!2`tu6rq1PBlyK!5-N0t5&U zAV7cs0RjXF5FkKcb%8E6Uars2>WeKTK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5;&O$6$=TJ>eS$#F*s5FkK+009C72oP8#&_rr_oX16BAp!&l5ZJxI oJ3hP*uX*>6dXNAC0t5&UAV7cs0RjXF5FkK+009C72>g-24^p8EPXGV_ diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab deleted file mode 100644 index 4553fe2185f9d559c935829292136b3ac940cd6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2$(?x395c5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4FTdq000Dz B5s3f* diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream deleted file mode 100644 index 3bb149d8c00cf9e606e664dd7205693c7abe5894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeIuyA6Oa3`J3ffQBJF1vR2z0ZTDfg!w3t{pm9S#eL;{-5Iaq;zd)K=$&P4ZX mKKsyIOH|Ki-_%(TOC3W10R#|0009ILKmY**5I_Kd9}9fAj~QVA diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len deleted file mode 100644 index b9d571fc209b49a3dfde8526f95bdfff778cf484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz00TDw08Ri$ diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len deleted file mode 100644 index a9f80ae0249093f1db8b14f71053acce35747e3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D~C-0H6Sw diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at deleted file mode 100644 index 80a0b0e07b3820de60b6345c8f2bf90da6e6d277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcma*h!3x4K5QO18N?*Wu5Jb;{7C|Vscwd?^jcv1KH&Ocb)`Rz6hyR1wniAw7#T_k+ zE6yxM1<{}hF_om0rvVIE{G6HXh{40 lN>g_vaLqhHf6SWAN>~lqhj=uHm3=*-J#l;npO=q;;}?SEW}5&2 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i deleted file mode 100644 index 8a259bbd54e32391dad08fb7361818db33d70ed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIup$&jQ5Cp(W-eL(2An1k;s0E3n3~EBr1fFZ*lgE7K^xh^rQKEz+K!5-N0t5&U zAV7dXg}{;7`MtM_7f}KP2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0Rr6#oVjROr>nbR z1`!}YfIw4$J=?|@o~EVB2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N J0t9{&_yElp1}6Xj diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab deleted file mode 100644 index 212ad73dd6afc47d79a4641e15dd71e700810865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|S_3$T)exMbuk4c8 zsU=JLg}92+kw(j^xfeBij+D43S)YZO)@E(|tMIy;De~Cw8_QMlE{$zGe1e~h&gXw7 c_y-085P$##AOHafKmY;|fB*y_0D(V&15bHV#sB~S diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len deleted file mode 100644 index 0daf2b724057d74be5d6ff44839805cb1ae42fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0E0^a0NMc4 diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len deleted file mode 100644 index 93a595bd1bbabaf1bd4ee4909ac49e65e67fa3f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D}bp0H^?= diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at deleted file mode 100644 index 60f08dec15ac07378e8c3037532d462c84c4766b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmaLOF%E+u7zR)dQ61Wa6W}F`aj`MlbpIlsNJ_>0!2R7FoL^p}dcsol#3hQ=T@*c1 zl24g??vb_u#}}b+&Qaj_QqL&PIDri`IJ{}OqJ;cG`qiqs;24VY`)#V!8e7d zoC39Klrq;!UOSb}>d=hmDOJsRq8r+t(J3Exj@;s_JBmgX>wsGulo{PQRrI4+=`r*> z)FpjR3pzVV>sft;_;n2L-v8f@xy9M!E}Yd}{Ptp#qj*+FTOAOmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> SVE_Rz$p|Kyz$7!6WB~xi4iX{& diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i deleted file mode 100644 index 4f203bbd862355aa7374a84e9644be1d0942cdab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuu?>P?5C+gcA;vi@7{J)rQMv?--~=|5HYS#IP*SrD15mJrHv=Jo$h-c#yYHn_ z%90^KfB*pk1PBlyK!5-N0t5&UAV7cs0RjgT_(tC%FK!2`tu6rq1PBlyK!5-N0t5&U zAV7cs0RjXF5FkKcb%8E6Uars2>WeKTK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5;&O$6$=TJ>eS$#F*s5FkK+009C72oP8#&_rr_oX16BAp!&l5ZJxI oJ3hP*uX*>6dXNAC0t5&UAV7cs0RjXF5FkK+009C72>g-24^p8EPXGV_ diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab deleted file mode 100644 index b71673ea5789415d1ac1d18e30f6ade783675db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmbR3vzw0r2v|V`3DYfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R M7!85Z5Fj%I0C2h*Z~y=R diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream deleted file mode 100644 index 1dd772cedaf239fbefddcb6749c5b7b5ed42018f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 rcmeIu2N3`O2n3*a^v`S$4Uk2*m#lt78r}(rzlZck$x{`_-mNpY*L16@o%4IvhQz z;^?Vpk=SrR7b@VXf%OV=#6EZejVDpBbJWI3rco}C8tcQH%IFsf58l$|BJYvI)01VX z3Dk_T{tphXB(w2uXTw=Ed02@K2?7qlHhGmO^St&GElC&A=1KhoglgDUIdp-bhQxdt>Rt@Oc1Q=^{xZRT!irJi>B9^N#P5g5(JH~mlJwDo6s@)Td@ zaqi|(cJK(}E!x24tY;nf@@v*`kS|fiG*+;XTe**$`2)+CG$e#|e37eJ$(208JoYk& zQ=>vy%q7g^>wJnIGM(p{%0WXzNM<^xv4FAM!x)}rG)E5eL%4uFeUZpocCnV7{DvKj zz9WP-&Sop~+03{3IZyFZcJpJ7w?~KgH21TBb*yC-TUf#0xrLMN455_ST+33fVm%Al z%3Stw1!qQwu!IY_h-J*=2b|BF%-|y7)xSj|qhv4inId;%X+|t3NDaJ`XaNJzT~o#)Oc~a%S-}&f|!&Aw0=N zOy?%1vXRMbW&*ny%OT_B#aKr3Ax3c?Z~hsHJkM?x^Ji}4WmdAC2Y8Vuc$V$_lHopi zF^)}qjE!8v!+ezoxrh6Cl6AboYF=jr$K9`Ae4ORX;(ETs5^i8Ice8+BF^`?hVT8*# zaeN31IfwJPlo{N}N7=v!d4Y-S<`hQ9hA@GXIgWD}!vaQgH>23XzFU#V4PNJrIQ`-x zcCnP5e2*Qxz&1vBj!6?jIL&OHVhNA4mPgslBm9jAIC^3T`EZ1`-OSqlI{D=iS!#wsdhhrznk7>+iF0=R=GkAchJi}yO<1|i6kQbj}3}4|e z)-bSzy*KSMyO}aszqo{#xryy;^$7Yn$byIIEz ztmcSmAyhJhJ6Om!Sj&w($5IZN?*GV#xspZ9=ljfMGZ*s@W-@MuesL}{xPh}+&oo|S z3J1@0eleX1EMhG8aSYFK6o)2;Fq}!edBgtk8rSeD-{p^N;rHz2w~SA6eld%!T*Z^z z!6qJJBiq=(knH?oBKIH6KAu8xh&?JEZ{Nb@hWpTF-4!4 e$!u=s0&2y;7)W3sfq?`D5*SEeAc6mR0)GSWH}kmw diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream deleted file mode 100644 index be801fba734bafeea7fb2c7b84f6f2d9ff6fa64a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 Y%_+<2+G)i4@}Kc9DP4YnkDCbmA6z|ZE&u=k diff --git a/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len deleted file mode 100644 index 131e265740f37d77b7c4a3676d2a7704ca3e4a29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 McmZQz0D%Su009U9fdBvi diff --git a/plugin/build/kotlin/compileKotlin/cacheable/last-build.bin b/plugin/build/kotlin/compileKotlin/cacheable/last-build.bin deleted file mode 100644 index 2fef1656a626d680ac240223e5cfc13188d7f919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 YcmZ4UmVvdLhk=1{&b<=*X$(LB05@6$<^TWy diff --git a/plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin b/plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin deleted file mode 100644 index 9ec17754c2e07e93c57b564698e9ef432c5e2dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53918 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 tF#eXIe)sZwhWc}u-T%SM`|$sBzLFLLe}7j52 Date: Thu, 19 Mar 2026 11:54:20 +0100 Subject: [PATCH 03/14] feat: add generateTo methods for output directory handling in generators - Introduced `generateTo` methods in `ApiResponseGenerator`, `ModelGenerator`, and `ClientGenerator` to streamline file generation and output directory management. - Updated `JustworksGenerateTask` to use the new methods with enhanced polymorphic type handling. --- .../justworks/core/gen/ApiResponseGenerator.kt | 6 ++++++ .../avsystem/justworks/core/gen/ClientGenerator.kt | 11 +++++++++++ .../com/avsystem/justworks/core/gen/ModelGenerator.kt | 10 ++++++++++ .../justworks/gradle/JustworksGenerateTask.kt | 11 +++++------ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt index 3da798ce..8b81d912 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt @@ -20,6 +20,12 @@ object ApiResponseGenerator { private const val MESSAGE = "message" private const val TYPE = "type" + fun generateTo(outputDir: java.io.File): Int { + val files = listOf(generateHttpError(), generateHttpSuccess()) + files.forEach { it.writeTo(outputDir) } + return files.size + } + fun generateHttpError(): FileSpec { val enumType = TypeSpec .enumBuilder(HTTP_ERROR_TYPE) diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt index e182e6fd..3a955190 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt @@ -22,6 +22,7 @@ import com.squareup.kotlinpoet.STRING import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.UNIT +import java.io.File private const val DEFAULT_TAG = "Default" private const val API_SUFFIX = "Api" @@ -32,6 +33,16 @@ private const val API_SUFFIX = "Api" */ @OptIn(ExperimentalKotlinPoetApi::class) class ClientGenerator(private val apiPackage: String, private val modelPackage: String) { + fun generateTo( + spec: ApiSpec, + outputDir: File, + hasPolymorphicTypes: Boolean = false, + ): Int { + val files = generate(spec, hasPolymorphicTypes) + files.forEach { it.writeTo(outputDir) } + return files.size + } + fun generate(spec: ApiSpec, hasPolymorphicTypes: Boolean = false): List { val grouped = spec.endpoints.groupBy { it.tags.firstOrNull() ?: DEFAULT_TAG } return grouped.map { (tag, endpoints) -> generateClientFile(tag, endpoints, hasPolymorphicTypes) } diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt index d59a5f0f..dc682677 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt @@ -22,6 +22,7 @@ import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.WildcardTypeName import kotlinx.datetime.LocalDate +import java.io.File import kotlin.time.Instant /** @@ -31,6 +32,15 @@ import kotlin.time.Instant * and one file per [EnumModel] (enum class), all annotated with kotlinx.serialization annotations. */ class ModelGenerator(private val modelPackage: String) { + data class GenerateResult(val fileCount: Int, val hasPolymorphicTypes: Boolean) + + fun generateTo(spec: ApiSpec, outputDir: File): GenerateResult { + val files = generate(spec) + files.forEach { it.writeTo(outputDir) } + val hasPolymorphic = files.any { it.name == "SerializersModule" } + return GenerateResult(files.size, hasPolymorphic) + } + fun generate(spec: ApiSpec): List = context( buildHierarchyInfo(spec.schemas), InlineSchemaDeduplicator(spec.schemas.map { it.name }.toSet()), diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt index 3a7b38fb..e66e0955 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt @@ -57,9 +57,7 @@ abstract class JustworksGenerateTask : DefaultTask() { outDir.mkdirs() val spec = specFile.get().asFile - val result = SpecParser.parse(spec) - - when (result) { + when (val result = SpecParser.parse(spec)) { is ParseResult.Failure -> { throw GradleException( "Failed to parse spec (task: $name): ${spec.name}:\n${result.errors.joinToString("\n")}", @@ -68,13 +66,14 @@ abstract class JustworksGenerateTask : DefaultTask() { is ParseResult.Success -> { val modelGen = ModelGenerator(modelPackage.get()) - val modelCount = modelGen.generateTo(result.apiSpec, outDir) + val (fileCount, hasPolymorphicTypes) = modelGen.generateTo(result.apiSpec, outDir) - val hasPolymorphicTypes = modelGen.getSealedHierarchies().isNotEmpty() val clientGen = ClientGenerator(apiPackage.get(), modelPackage.get()) val clientCount = clientGen.generateTo(result.apiSpec, outDir, hasPolymorphicTypes) - logger.lifecycle("Generated $modelCount model files, $clientCount client files from ${spec.name}") + logger.lifecycle( + "Generated $fileCount model files, $clientCount client files from ${spec.name}", + ) } } } From 506cda9e6b0259fb3f9a76840b6b291993dd1c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 12:00:33 +0100 Subject: [PATCH 04/14] refactor: consolidate generators into CodeGenerator and remove generateTo methods - Unified `ApiResponseGenerator`, `ModelGenerator`, and `ClientGenerator` under `CodeGenerator` to streamline generation logic. - Removed redundant `generateTo` methods, simplifying file generation and output handling. - Updated Gradle tasks to leverage the new `CodeGenerator` structure. --- .../core/gen/ApiResponseGenerator.kt | 6 +--- .../justworks/core/gen/ClientGenerator.kt | 12 +------ .../justworks/core/gen/CodeGenerator.kt | 35 +++++++++++++++++++ .../justworks/core/gen/ModelGenerator.kt | 10 ------ .../justworks/gradle/JustworksGenerateTask.kt | 18 +++++----- .../gradle/JustworksSharedTypesTask.kt | 4 +-- 6 files changed, 48 insertions(+), 37 deletions(-) create mode 100644 core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt index 8b81d912..f983258b 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiResponseGenerator.kt @@ -20,11 +20,7 @@ object ApiResponseGenerator { private const val MESSAGE = "message" private const val TYPE = "type" - fun generateTo(outputDir: java.io.File): Int { - val files = listOf(generateHttpError(), generateHttpSuccess()) - files.forEach { it.writeTo(outputDir) } - return files.size - } + fun generate(): List = listOf(generateHttpError(), generateHttpSuccess()) fun generateHttpError(): FileSpec { val enumType = TypeSpec diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt index 3a955190..8fda4801 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt @@ -22,7 +22,7 @@ import com.squareup.kotlinpoet.STRING import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.UNIT -import java.io.File + private const val DEFAULT_TAG = "Default" private const val API_SUFFIX = "Api" @@ -33,16 +33,6 @@ private const val API_SUFFIX = "Api" */ @OptIn(ExperimentalKotlinPoetApi::class) class ClientGenerator(private val apiPackage: String, private val modelPackage: String) { - fun generateTo( - spec: ApiSpec, - outputDir: File, - hasPolymorphicTypes: Boolean = false, - ): Int { - val files = generate(spec, hasPolymorphicTypes) - files.forEach { it.writeTo(outputDir) } - return files.size - } - fun generate(spec: ApiSpec, hasPolymorphicTypes: Boolean = false): List { val grouped = spec.endpoints.groupBy { it.tags.firstOrNull() ?: DEFAULT_TAG } return grouped.map { (tag, endpoints) -> generateClientFile(tag, endpoints, hasPolymorphicTypes) } diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt new file mode 100644 index 00000000..0966b82a --- /dev/null +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt @@ -0,0 +1,35 @@ +package com.avsystem.justworks.core.gen + +import com.avsystem.justworks.core.model.ApiSpec +import java.io.File + +/** + * Facade that orchestrates model and client code generation, + * writing the produced files to the given output directory. + */ +object CodeGenerator { + data class Result(val modelFiles: Int, val clientFiles: Int) + + fun generate( + spec: ApiSpec, + modelPackage: String, + apiPackage: String, + outputDir: File + ): Result { + val modelFiles = ModelGenerator(modelPackage).generate(spec) + modelFiles.forEach { it.writeTo(outputDir) } + + val hasPolymorphicTypes = modelFiles.any { it.name == "SerializersModule" } + + val clientFiles = ClientGenerator(apiPackage, modelPackage).generate(spec, hasPolymorphicTypes) + clientFiles.forEach { it.writeTo(outputDir) } + + return Result(modelFiles.size, clientFiles.size) + } + + fun generateSharedTypes(outputDir: File): Int { + val files = ApiResponseGenerator.generate() + files.forEach { it.writeTo(outputDir) } + return files.size + } +} diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt index dc682677..d59a5f0f 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ModelGenerator.kt @@ -22,7 +22,6 @@ import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.WildcardTypeName import kotlinx.datetime.LocalDate -import java.io.File import kotlin.time.Instant /** @@ -32,15 +31,6 @@ import kotlin.time.Instant * and one file per [EnumModel] (enum class), all annotated with kotlinx.serialization annotations. */ class ModelGenerator(private val modelPackage: String) { - data class GenerateResult(val fileCount: Int, val hasPolymorphicTypes: Boolean) - - fun generateTo(spec: ApiSpec, outputDir: File): GenerateResult { - val files = generate(spec) - files.forEach { it.writeTo(outputDir) } - val hasPolymorphic = files.any { it.name == "SerializersModule" } - return GenerateResult(files.size, hasPolymorphic) - } - fun generate(spec: ApiSpec): List = context( buildHierarchyInfo(spec.schemas), InlineSchemaDeduplicator(spec.schemas.map { it.name }.toSet()), diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt index e66e0955..20d426f5 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt @@ -1,7 +1,6 @@ package com.avsystem.justworks.gradle -import com.avsystem.justworks.core.gen.ClientGenerator -import com.avsystem.justworks.core.gen.ModelGenerator +import com.avsystem.justworks.core.gen.CodeGenerator import com.avsystem.justworks.core.parser.ParseResult import com.avsystem.justworks.core.parser.SpecParser import org.gradle.api.DefaultTask @@ -20,7 +19,7 @@ import org.gradle.api.tasks.TaskAction /** * Gradle task that generates Kotlin source files from an OpenAPI spec. * - * Parses the OpenAPI spec via [SpecParser], feeds the result to [ModelGenerator], + * Parses the OpenAPI spec via [SpecParser], feeds the result to [CodeGenerator], * and writes the generated Kotlin source files to the output directory. */ @CacheableTask @@ -65,14 +64,15 @@ abstract class JustworksGenerateTask : DefaultTask() { } is ParseResult.Success -> { - val modelGen = ModelGenerator(modelPackage.get()) - val (fileCount, hasPolymorphicTypes) = modelGen.generateTo(result.apiSpec, outDir) - - val clientGen = ClientGenerator(apiPackage.get(), modelPackage.get()) - val clientCount = clientGen.generateTo(result.apiSpec, outDir, hasPolymorphicTypes) + val (modelCount, clientCount) = CodeGenerator.generate( + spec = result.apiSpec, + modelPackage = modelPackage.get(), + apiPackage = apiPackage.get(), + outputDir = outDir, + ) logger.lifecycle( - "Generated $fileCount model files, $clientCount client files from ${spec.name}", + "Generated $modelCount model files, $clientCount client files from ${spec.name}", ) } } diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt index 03fd5489..9fa9c177 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt @@ -1,6 +1,6 @@ package com.avsystem.justworks.gradle -import com.avsystem.justworks.core.gen.ApiResponseGenerator +import com.avsystem.justworks.core.gen.CodeGenerator import org.gradle.api.DefaultTask import org.gradle.api.file.DirectoryProperty import org.gradle.api.tasks.CacheableTask @@ -22,7 +22,7 @@ abstract class JustworksSharedTypesTask : DefaultTask() { val outDir = outputDir.get().asFile outDir.mkdirs() - val count = ApiResponseGenerator.generateTo(outDir) + val count = CodeGenerator.generateSharedTypes(outDir) logger.lifecycle("Generated $count shared type files") } From 9ef0055799cd507414747acf2e07049f6dd920d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 12:08:16 +0100 Subject: [PATCH 05/14] refactor: streamline test utilities and update Arrow dependency - Removed redundant parameter formatting in `writeFile` and `runner` methods. - Bumped Arrow dependency version from `2.1.2` to `2.2.1.1`. - Applied consistent formatting in assertion blocks for readability. --- .../gradle/JustworksPluginFunctionalTest.kt | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt b/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt index e72e4649..67f09d22 100644 --- a/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt +++ b/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt @@ -21,10 +21,7 @@ class JustworksPluginFunctionalTest { @TempDir lateinit var projectDir: File - private fun writeFile( - path: String, - content: String, - ) { + private fun writeFile(path: String, content: String) { val file = projectDir.resolve(path) file.parentFile.mkdirs() file.writeText(content) @@ -105,7 +102,7 @@ class JustworksPluginFunctionalTest { implementation("io.ktor:ktor-client-core:3.1.1") implementation("io.ktor:ktor-client-content-negotiation:3.1.1") implementation("io.ktor:ktor-serialization-kotlinx-json:3.1.1") - implementation("io.arrow-kt:arrow-core:2.1.2") + implementation("io.arrow-kt:arrow-core:2.2.1.1") } kotlin { @@ -127,13 +124,12 @@ class JustworksPluginFunctionalTest { ) } - private fun runner(vararg args: String): GradleRunner = - GradleRunner - .create() - .withProjectDir(projectDir) - .withPluginClasspath() - .withArguments(*args, "--stacktrace") - .forwardOutput() + private fun runner(vararg args: String): GradleRunner = GradleRunner + .create() + .withProjectDir(projectDir) + .withPluginClasspath() + .withArguments(*args, "--stacktrace") + .forwardOutput() @Test fun `plugin applies and justworksGenerate runs successfully`() { @@ -462,7 +458,9 @@ class JustworksPluginFunctionalTest { // Verify generated files in correct packages assertTrue(projectDir.resolve("build/generated/justworks/petstore/com/example/petstore/model/Pet.kt").exists()) - assertTrue(projectDir.resolve("build/generated/justworks/payments/com/example/payments/model/Payment.kt").exists()) + assertTrue( + projectDir.resolve("build/generated/justworks/payments/com/example/payments/model/Payment.kt").exists(), + ) } @Test From 630201ebb462a316ef0e15a7a31ce0e5d9ce3762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 12:18:16 +0100 Subject: [PATCH 06/14] ktlint --- .../kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt | 1 - .../kotlin/com/avsystem/justworks/gradle/JustworksExtension.kt | 2 +- .../com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt index 8fda4801..e182e6fd 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ClientGenerator.kt @@ -23,7 +23,6 @@ import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.UNIT - private const val DEFAULT_TAG = "Default" private const val API_SUFFIX = "Api" diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksExtension.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksExtension.kt index 2715b849..b02f3576 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksExtension.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksExtension.kt @@ -30,7 +30,7 @@ import javax.inject.Inject */ abstract class JustworksExtension @Inject - constructor(objects: ObjectFactory,) { + constructor(objects: ObjectFactory) { /** * Container of named OpenAPI spec configurations. * diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt index 4a52486e..6c3cacaa 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSpecConfiguration.kt @@ -28,7 +28,7 @@ import javax.inject.Inject */ abstract class JustworksSpecConfiguration @Inject - constructor(private val name: String,) : Named { + constructor(private val name: String) : Named { /** Path to the OpenAPI spec file (.yaml or .json). */ abstract val specFile: RegularFileProperty From d342e72d52899610ba42d6e848233d3b3d63bb0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 12:22:56 +0100 Subject: [PATCH 07/14] fix: remove unused packageName input from JustworksGenerateTask packageName was only used to derive apiPackage/modelPackage, which is already done in JustworksPlugin before wiring task inputs. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../com/avsystem/justworks/gradle/JustworksGenerateTask.kt | 4 ---- .../kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt | 1 - 2 files changed, 5 deletions(-) diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt index 20d426f5..690eb7a1 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt @@ -29,10 +29,6 @@ abstract class JustworksGenerateTask : DefaultTask() { @get:PathSensitive(PathSensitivity.RELATIVE) abstract val specFile: RegularFileProperty - /** Base package name for generated code. */ - @get:Input - abstract val packageName: Property - /** Package for generated API client classes. */ @get:Input abstract val apiPackage: Property diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt index ddd9b88f..3f1c046b 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt @@ -47,7 +47,6 @@ class JustworksPlugin : Plugin { project.tasks.register(taskName, JustworksGenerateTask::class.java) { task -> task.dependsOn(sharedTypesTask) task.specFile.set(spec.specFile) - task.packageName.set(spec.packageName) task.apiPackage.set(spec.apiPackage.orElse(spec.packageName.map { "$it.api" })) task.modelPackage.set(spec.modelPackage.orElse(spec.packageName.map { "$it.model" })) task.outputDir.set(project.layout.buildDirectory.dir("generated/justworks/${spec.name}")) From efd5c1a9c39b7263dcf41be0e68709b5252ff88c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 15:35:32 +0100 Subject: [PATCH 08/14] refactor: address PR review feedback from MattK97 - Add deleteRecursively() to JustworksSharedTypesTask before generation - Extract SerializersModule file name constant to SerializersModuleGenerator.FILE_NAME - Extract spec name regex and task name computation to JustworksPlugin companion - Eliminate duplicated taskName logic in source set wiring Co-Authored-By: Claude Opus 4.6 (1M context) --- .../avsystem/justworks/core/gen/CodeGenerator.kt | 2 +- .../core/gen/SerializersModuleGenerator.kt | 6 +++++- .../avsystem/justworks/gradle/JustworksPlugin.kt | 15 ++++++++++----- .../justworks/gradle/JustworksSharedTypesTask.kt | 3 +++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt index 0966b82a..f3e7dd5e 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt @@ -19,7 +19,7 @@ object CodeGenerator { val modelFiles = ModelGenerator(modelPackage).generate(spec) modelFiles.forEach { it.writeTo(outputDir) } - val hasPolymorphicTypes = modelFiles.any { it.name == "SerializersModule" } + val hasPolymorphicTypes = modelFiles.any { it.name == SerializersModuleGenerator.FILE_NAME } val clientFiles = ClientGenerator(apiPackage, modelPackage).generate(spec, hasPolymorphicTypes) clientFiles.forEach { it.writeTo(outputDir) } diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/SerializersModuleGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/SerializersModuleGenerator.kt index de3780d5..255807c9 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/SerializersModuleGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/SerializersModuleGenerator.kt @@ -13,6 +13,10 @@ import com.squareup.kotlinpoet.PropertySpec * that registers each sealed interface with its subclass variants. */ class SerializersModuleGenerator(private val modelPackage: String) { + companion object { + const val FILE_NAME = "SerializersModule" + } + /** * Generates a [FileSpec] containing the SerializersModule registration. * Returns null if the hierarchy has no sealed types to register. @@ -48,7 +52,7 @@ class SerializersModuleGenerator(private val modelPackage: String) { .build() return FileSpec - .builder(modelPackage, "SerializersModule") + .builder(modelPackage, FILE_NAME) .addProperty(prop) .build() } diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt index 3f1c046b..707dbbdc 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksPlugin.kt @@ -13,6 +13,13 @@ import org.gradle.api.plugins.JavaPluginExtension * into Kotlin source sets, and hooks `compileKotlin` to depend on code generation. */ class JustworksPlugin : Plugin { + companion object { + private val SPEC_NAME_PATTERN = Regex("[a-zA-Z][a-zA-Z0-9]*") + + internal fun taskNameFor(specName: String): String = + "justworksGenerate${specName.replaceFirstChar { it.uppercase() }}" + } + override fun apply(project: Project) { // 1. Create extension val extension = project.extensions.create("justworks", JustworksExtension::class.java) @@ -33,14 +40,13 @@ class JustworksPlugin : Plugin { // 4. Dynamic per-spec task registration extension.specs.all { spec -> // Validate spec name (alphanumeric, starts with letter) - if (!spec.name.matches(Regex("[a-zA-Z][a-zA-Z0-9]*"))) { + if (!spec.name.matches(SPEC_NAME_PATTERN)) { throw GradleException( "Invalid spec name '${spec.name}': must start with a letter and contain only letters and numbers", ) } - // Compute task name: justworksGenerate - val taskName = "justworksGenerate${spec.name.replaceFirstChar { it.uppercase() }}" + val taskName = taskNameFor(spec.name) // Register per-spec generate task val specTask = @@ -68,8 +74,7 @@ class JustworksPlugin : Plugin { // Wire each spec's output directory extension.specs.all { spec -> - val taskName = "justworksGenerate${spec.name.replaceFirstChar { it.uppercase() }}" - val specTask = project.tasks.named(taskName, JustworksGenerateTask::class.java) + val specTask = project.tasks.named(taskNameFor(spec.name), JustworksGenerateTask::class.java) sourceSet.java.srcDir(specTask.flatMap { it.outputDir }) } } diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt index 9fa9c177..82748272 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt @@ -20,6 +20,9 @@ abstract class JustworksSharedTypesTask : DefaultTask() { @TaskAction fun generate() { val outDir = outputDir.get().asFile + if (outDir.exists()) { + outDir.deleteRecursively() + } outDir.mkdirs() val count = CodeGenerator.generateSharedTypes(outDir) From e18237dac6dc16932f0cbecd1cc4813c18077cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 16:52:16 +0100 Subject: [PATCH 09/14] refactor: update ApiClientBaseGenerator modifiers and integrate shared generation into CodeGenerator - Changed `buildMapToResult` to use `@PublishedApi` and `internal` modifier for improved visibility and API stability. - Updated `generateSharedTypes` to include `ApiClientBaseGenerator` in file generation logic. --- .../com/avsystem/justworks/core/gen/ApiClientBaseGenerator.kt | 3 ++- .../kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiClientBaseGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiClientBaseGenerator.kt index 67dddf75..8c953e7c 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiClientBaseGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/ApiClientBaseGenerator.kt @@ -54,7 +54,8 @@ object ApiClientBaseGenerator { private fun buildMapToResult(t: TypeVariableName): FunSpec = FunSpec .builder(MAP_TO_RESULT) - .addModifiers(KModifier.PRIVATE, KModifier.SUSPEND, KModifier.INLINE) + .addAnnotation(PublishedApi::class) + .addModifiers(KModifier.INTERNAL, KModifier.SUSPEND, KModifier.INLINE) .addTypeVariable(t) .receiver(HTTP_RESPONSE) .contextParameters(listOf(ContextParameter(RAISE.parameterizedBy(HTTP_ERROR)))) diff --git a/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt b/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt index f3e7dd5e..10c6715b 100644 --- a/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt +++ b/core/src/main/kotlin/com/avsystem/justworks/core/gen/CodeGenerator.kt @@ -28,7 +28,7 @@ object CodeGenerator { } fun generateSharedTypes(outputDir: File): Int { - val files = ApiResponseGenerator.generate() + val files = ApiResponseGenerator.generate() + ApiClientBaseGenerator.generate() files.forEach { it.writeTo(outputDir) } return files.size } From 4a838017f8fec5c2a68baf05250b7718219a30c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 16:52:52 +0100 Subject: [PATCH 10/14] refactor: extract cleanAndCreate utility for directory handling in Gradle tasks - Replaced repeated directory cleaning and creation logic with `cleanAndCreate` extension function. - Updated ` --- .../justworks/gradle/JustworksGenerateTask.kt | 15 ++++++++------- .../justworks/gradle/JustworksSharedTypesTask.kt | 6 +----- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt index 690eb7a1..98c5aae4 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt @@ -15,6 +15,7 @@ import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskAction +import java.io.File /** * Gradle task that generates Kotlin source files from an OpenAPI spec. @@ -43,13 +44,7 @@ abstract class JustworksGenerateTask : DefaultTask() { @TaskAction fun generate() { - val outDir = outputDir.get().asFile - - // Clean output directory before generation to prevent stale files - if (outDir.exists()) { - outDir.deleteRecursively() - } - outDir.mkdirs() + val outDir = outputDir.get().asFile.cleanAndCreate() val spec = specFile.get().asFile when (val result = SpecParser.parse(spec)) { @@ -74,3 +69,9 @@ abstract class JustworksGenerateTask : DefaultTask() { } } } + +internal fun File.cleanAndCreate(): File { + if (exists()) deleteRecursively() + mkdirs() + return this +} diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt index 82748272..113b0518 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt @@ -19,11 +19,7 @@ abstract class JustworksSharedTypesTask : DefaultTask() { @TaskAction fun generate() { - val outDir = outputDir.get().asFile - if (outDir.exists()) { - outDir.deleteRecursively() - } - outDir.mkdirs() + val outDir = outputDir.get().asFile.cleanAndCreate() val count = CodeGenerator.generateSharedTypes(outDir) From 0cb23ddb5de8b8091b348f2f7e16b677e39f50c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 16:53:06 +0100 Subject: [PATCH 11/14] refactor: extract reusable project setup methods in functional tests - Introduced `writeBuildFile` and `writeMultiSpecProject` helper methods to reduce duplication in test setup. - Added assertion for `ApiClientBase.kt` generation in shared types test. --- .../gradle/JustworksPluginFunctionalTest.kt | 115 ++---------------- 1 file changed, 9 insertions(+), 106 deletions(-) diff --git a/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt b/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt index 67f09d22..c95eeb31 100644 --- a/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt +++ b/plugin/src/functionalTest/kotlin/com/avsystem/justworks/gradle/JustworksPluginFunctionalTest.kt @@ -172,6 +172,7 @@ class JustworksPluginFunctionalTest { val sharedFiles = sharedDir.listFiles()?.filter { it.extension == "kt" } ?: emptyList() assertTrue(sharedFiles.any { it.name == "HttpError.kt" }, "Should contain HttpError.kt") assertTrue(sharedFiles.any { it.name == "HttpSuccess.kt" }, "Should contain HttpSuccess.kt") + assertTrue(sharedFiles.any { it.name == "ApiClientBase.kt" }, "Should contain ApiClientBase.kt") } @Test @@ -282,44 +283,7 @@ class JustworksPluginFunctionalTest { """.trimIndent(), ) - // Need kotlinx-serialization-json for @JsonClassDiscriminator - writeFile( - "build.gradle.kts", - """ - plugins { - kotlin("jvm") version "2.3.0" - kotlin("plugin.serialization") version "2.3.0" - id("com.avsystem.justworks") - } - - repositories { - mavenCentral() - } - - dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1") - implementation("io.ktor:ktor-client-core:3.1.1") - implementation("io.ktor:ktor-client-content-negotiation:3.1.1") - implementation("io.ktor:ktor-serialization-kotlinx-json:3.1.1") - implementation("io.arrow-kt:arrow-core:2.1.2") - } - - kotlin { - compilerOptions { - freeCompilerArgs.add("-Xcontext-parameters") - } - } - - justworks { - specs { - register("main") { - specFile = file("api/petstore.yaml") - packageName = "com.example" - } - } - } - """.trimIndent(), - ) + writeBuildFile() val result = runner("compileKotlin").build() @@ -378,9 +342,7 @@ class JustworksPluginFunctionalTest { // Multi-spec tests - @Test - fun `multiple specs generate independently`() { - // Write two minimal OpenAPI specs (petstore and payments) + private fun writeMultiSpecProject() { writeFile( "api/petstore.yaml", """ @@ -446,6 +408,11 @@ class JustworksPluginFunctionalTest { } """.trimIndent(), ) + } + + @Test + fun `multiple specs generate independently`() { + writeMultiSpecProject() val result = runner("justworksGenerateAll").build() @@ -465,71 +432,7 @@ class JustworksPluginFunctionalTest { @Test fun `single spec task generates only that spec`() { - writeFile( - "api/petstore.yaml", - """ - openapi: 3.0.0 - info: - title: Petstore - version: 1.0.0 - paths: {} - components: - schemas: - Pet: - type: object - properties: - name: - type: string - """.trimIndent(), - ) - - writeFile( - "api/payments.yaml", - """ - openapi: 3.0.0 - info: - title: Payments - version: 1.0.0 - paths: {} - components: - schemas: - Payment: - type: object - properties: - amount: - type: number - """.trimIndent(), - ) - - writeFile( - "build.gradle.kts", - """ - plugins { - kotlin("jvm") version "2.3.0" - kotlin("plugin.serialization") version "2.3.0" - id("com.avsystem.justworks") - } - repositories { mavenCentral() } - dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1") - implementation("io.ktor:ktor-client-core:3.1.1") - implementation("io.ktor:ktor-client-content-negotiation:3.1.1") - implementation("io.ktor:ktor-serialization-kotlinx-json:3.1.1") - } - justworks { - specs { - register("petstore") { - specFile = file("api/petstore.yaml") - packageName = "com.example.petstore" - } - register("payments") { - specFile = file("api/payments.yaml") - packageName = "com.example.payments" - } - } - } - """.trimIndent(), - ) + writeMultiSpecProject() val result = runner("justworksGeneratePetstore").build() From c3dfcc79196108f0d4d9d0f8d82a5b756e191ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 16:54:48 +0100 Subject: [PATCH 12/14] refactor: rename and replace `cleanAndCreate` with `recreateDirectory` for clarity - Updated directory handling logic in `JustworksGenerateTask` and `JustworksSharedTypesTask`. - Ensures consistent behavior for directory recreation across tasks. --- .../com/avsystem/justworks/gradle/JustworksGenerateTask.kt | 4 ++-- .../com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt index 98c5aae4..51c4f914 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksGenerateTask.kt @@ -44,7 +44,7 @@ abstract class JustworksGenerateTask : DefaultTask() { @TaskAction fun generate() { - val outDir = outputDir.get().asFile.cleanAndCreate() + val outDir = outputDir.get().asFile.recreateDirectory() val spec = specFile.get().asFile when (val result = SpecParser.parse(spec)) { @@ -70,7 +70,7 @@ abstract class JustworksGenerateTask : DefaultTask() { } } -internal fun File.cleanAndCreate(): File { +internal fun File.recreateDirectory(): File { if (exists()) deleteRecursively() mkdirs() return this diff --git a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt index 113b0518..a6b915e3 100644 --- a/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt +++ b/plugin/src/main/kotlin/com/avsystem/justworks/gradle/JustworksSharedTypesTask.kt @@ -19,7 +19,7 @@ abstract class JustworksSharedTypesTask : DefaultTask() { @TaskAction fun generate() { - val outDir = outputDir.get().asFile.cleanAndCreate() + val outDir = outputDir.get().asFile.recreateDirectory() val count = CodeGenerator.generateSharedTypes(outDir) From 6bff1c76f8b24799f9609564fb9f6d356ce53d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 19 Mar 2026 17:00:20 +0100 Subject: [PATCH 13/14] feat: add Kover plugin and configure coverage for the plugin module - Applied `org.jetbrains.kotlinx.kover` plugin to `plugin/build.gradle.kts`. - Excluded `functionalTest` sources from coverage reporting. - Updated CI workflow to include plugin coverage report and upload it to Codecov. --- .github/workflows/ci.yml | 4 ++-- plugin/build.gradle.kts | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ff1a4d08..1184ee82 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,12 +27,12 @@ jobs: run: ./gradlew ktlintCheck - name: Run tests with coverage - run: ./gradlew core:koverXmlReport + run: ./gradlew core:koverXmlReport plugin:koverXmlReport - name: Upload coverage to Codecov if: github.event_name == 'pull_request' uses: codecov/codecov-action@v5 with: - files: core/build/reports/kover/report.xml + files: core/build/reports/kover/report.xml,plugin/build/reports/kover/report.xml fail_ci_if_error: false token: ${{ secrets.CODECOV_TOKEN }} diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index ef17898f..4826a9a4 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -2,6 +2,7 @@ plugins { kotlin("jvm") `java-gradle-plugin` `maven-publish` + id("org.jetbrains.kotlinx.kover") version "0.9.1" } kotlin { @@ -51,6 +52,18 @@ tasks.check { dependsOn(functionalTestTask) } +kover { + currentProject { + sources { + excludedSourceSets.add("functionalTest") + } + } +} + +tasks.named("koverXmlReport") { + dependsOn(functionalTestTask) +} + tasks.test { useJUnitPlatform() } From d24c6dd3f53241e391e68eaa23422be8fa1a328e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Fri, 20 Mar 2026 10:14:19 +0100 Subject: [PATCH 14/14] test: add unit tests for `recreateDirectory` extension function in `RecreateDirectoryTest` - Covers directory creation, content deletion, nested structure creation, and instance consistency. --- .../justworks/gradle/RecreateDirectoryTest.kt | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 plugin/src/test/kotlin/com/avsystem/justworks/gradle/RecreateDirectoryTest.kt diff --git a/plugin/src/test/kotlin/com/avsystem/justworks/gradle/RecreateDirectoryTest.kt b/plugin/src/test/kotlin/com/avsystem/justworks/gradle/RecreateDirectoryTest.kt new file mode 100644 index 00000000..4c3d7b93 --- /dev/null +++ b/plugin/src/test/kotlin/com/avsystem/justworks/gradle/RecreateDirectoryTest.kt @@ -0,0 +1,61 @@ +package com.avsystem.justworks.gradle + +import org.junit.jupiter.api.io.TempDir +import java.io.File +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertSame +import kotlin.test.assertTrue + +class RecreateDirectoryTest { + @TempDir + lateinit var tempDir: File + + @Test + fun `creates directory when it does not exist`() { + val dir = tempDir.resolve("new-dir") + assertFalse(dir.exists()) + + val result = dir.recreateDirectory() + + assertTrue(dir.exists()) + assertTrue(dir.isDirectory) + assertEquals(dir, result) + } + + @Test + fun `deletes existing contents and recreates empty directory`() { + val dir = tempDir.resolve("existing-dir") + dir.mkdirs() + dir.resolve("file.txt").writeText("content") + dir.resolve("subdir").mkdir() + dir.resolve("subdir/nested.txt").writeText("nested") + + dir.recreateDirectory() + + assertTrue(dir.exists()) + assertTrue(dir.isDirectory) + assertEquals(emptyList(), dir.listFiles()?.toList()) + } + + @Test + fun `creates nested directory structure`() { + val dir = tempDir.resolve("a/b/c") + assertFalse(dir.exists()) + + dir.recreateDirectory() + + assertTrue(dir.exists()) + assertTrue(dir.isDirectory) + } + + @Test + fun `returns the same file instance`() { + val dir = tempDir.resolve("dir") + + val result = dir.recreateDirectory() + + assertSame(result, dir) + } +}