From 8d34f37af056ad163d33a90150c6dc3e16d514ca Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 15 Jun 2024 21:31:36 -0700 Subject: [PATCH 01/12] Moved Dokka operation to its own extension --- .github/workflows/bld.yml | 8 - README.md | 27 +- examples/README.md | 9 - examples/lib/bld/bld-wrapper.properties | 4 +- .../bld/java/com/example/ExampleBuild.java | 65 +- lib/bld/bld-wrapper.properties | 6 +- scripts/checkcliargs.sh | 14 - scripts/cliargs.sh | 12 - .../CompileKotlinOperationBuild.java | 20 +- .../bld/extension/dokka/AnalysisPlatform.java | 27 - .../extension/dokka/DocumentedVisibility.java | 27 - .../bld/extension/dokka/DokkaOperation.java | 609 ---------------- .../bld/extension/dokka/LoggingLevel.java | 27 - .../bld/extension/dokka/OutputFormat.java | 27 - .../rife/bld/extension/dokka/SourceSet.java | 680 ------------------ .../extension/dokka/DokkaOperationTest.java | 123 ---- .../bld/extension/dokka/SourceSetTest.java | 132 ---- src/test/resources/dokka-args.txt | 16 - src/test/resources/dokka-sourceset-args.txt | 21 - 19 files changed, 26 insertions(+), 1828 deletions(-) delete mode 100644 src/main/java/rife/bld/extension/dokka/AnalysisPlatform.java delete mode 100644 src/main/java/rife/bld/extension/dokka/DocumentedVisibility.java delete mode 100644 src/main/java/rife/bld/extension/dokka/DokkaOperation.java delete mode 100644 src/main/java/rife/bld/extension/dokka/LoggingLevel.java delete mode 100644 src/main/java/rife/bld/extension/dokka/OutputFormat.java delete mode 100644 src/main/java/rife/bld/extension/dokka/SourceSet.java delete mode 100644 src/test/java/rife/bld/extension/dokka/DokkaOperationTest.java delete mode 100644 src/test/java/rife/bld/extension/dokka/SourceSetTest.java delete mode 100644 src/test/resources/dokka-args.txt delete mode 100644 src/test/resources/dokka-sourceset-args.txt diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index d897fcc..ceddff2 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -32,14 +32,6 @@ jobs: working-directory: examples run: ./bld compile test - - name: Build examples documentation - working-directory: examples - run: | - ./bld javadoc - ./bld dokka-html - ./bld dokka-gfm - ./bld dokka-jekyll - - name: Grant execute permission for bld run: chmod +x bld diff --git a/README.md b/README.md index c7801b6..8c1d080 100644 --- a/README.md +++ b/README.md @@ -33,31 +33,6 @@ public void compile() throws IOException { Please check the [Compile Operation documentation](https://rife2.github.io/bld-kotlin/rife/bld/extension/CompileKotlinOperation.html#method-summary) for all available configuration options. -## Generate Javadoc - -To generate the Javadoc using [Dokka](https://github.com/Kotlin/dokka): - -```java -@Override -public void javadoc() throws ExitStatusException, IOException, InterruptedException { - new DokkaOperation() - .fromProject(this) - .outputDir(new File(buildDirectory(), "javadoc")) - .outputFormat(OutputFormat.JAVADOC) - .execute(); -} -``` - -```console -./bld javadoc -``` - -- [View Examples Project](https://github.com/rife2/bld-kotlin/tree/main/examples/) - -Please check the [Dokka Operation documentation](https://rife2.github.io/bld-kotlin/rife/bld/extension/dokka/DokkaOperation.html#method-summary) -for all available configuration options. - ## Template Project -There is also a [Template Project](https://github.com/rife2/kotlin-bld-example) with support for Dokka and the -[Detekt](https://github.com/rife2/bld-detekt) extensions. +There is also a [Template Project](https://github.com/rife2/kotlin-bld-example) with support for the [Dokka](https://github.com/rife2/bld-dokka) and [Detekt](https://github.com/rife2/bld-detekt) extensions. diff --git a/examples/README.md b/examples/README.md index 1dbc9fb..e5a785f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -16,12 +16,3 @@ ```console ./bld test ``` - -## Build the documentation with [Dokka](https://github.com/Kotlin/dokka) - -```console -./bld javadoc -./bld dokka-html -./bld dokka-gfm -./bld dokka-jekyll -``` diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 8c08ccc..edf4d9d 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.8 -bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0-SNAPSHOT +bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 5cccf1a..51fc4c5 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -3,9 +3,6 @@ package com.example; import rife.bld.BuildCommand; import rife.bld.Project; import rife.bld.extension.CompileKotlinOperation; -import rife.bld.extension.dokka.DokkaOperation; -import rife.bld.extension.dokka.LoggingLevel; -import rife.bld.extension.dokka.OutputFormat; import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; @@ -48,14 +45,14 @@ public class ExampleBuild extends Project { public static void main(String[] args) { // Enable detailed logging for the Kotlin extension - // var level = Level.ALL; - // var logger = Logger.getLogger("rife.bld.extension"); - // var consoleHandler = new ConsoleHandler(); - - // consoleHandler.setLevel(level); - // logger.addHandler(consoleHandler); - // logger.setLevel(level); - // logger.setUseParentHandlers(false); +// var level = Level.ALL; +// var logger = Logger.getLogger("rife.bld.extension"); +// var consoleHandler = new ConsoleHandler(); +// +// consoleHandler.setLevel(level); +// logger.addHandler(consoleHandler); +// logger.setLevel(level); +// logger.setUseParentHandlers(false); new ExampleBuild().start(args); } @@ -72,50 +69,4 @@ public class ExampleBuild extends Project { // op.compileOptions().verbose(true); // op.execute(); } - - @BuildCommand(value = "dokka-gfm", summary = "Generates documentation in GitHub flavored markdown format") - public void dokkaGfm() throws ExitStatusException, IOException, InterruptedException { - new DokkaOperation() - .fromProject(this) - .loggingLevel(LoggingLevel.INFO) - // Create build/dokka/gfm - .outputDir(Path.of(buildDirectory().getAbsolutePath(), "dokka", "gfm").toFile()) - .outputFormat(OutputFormat.MARKDOWN) - .execute(); - } - - @BuildCommand(value = "dokka-html", summary = "Generates documentation in HTML format") - public void dokkaHtml() throws ExitStatusException, IOException, InterruptedException { - new DokkaOperation() - .fromProject(this) - .loggingLevel(LoggingLevel.INFO) - // Create build/dokka/html - .outputDir(Path.of(buildDirectory().getAbsolutePath(), "dokka", "html").toFile()) - .outputFormat(OutputFormat.HTML) - .execute(); - } - - @BuildCommand(value = "dokka-jekyll", summary = "Generates documentation in Jekyll flavored markdown format") - public void dokkaJekyll() throws ExitStatusException, IOException, InterruptedException { - new DokkaOperation() - .fromProject(this) - .loggingLevel(LoggingLevel.INFO) - // Create build/dokka/jekyll - .outputDir(Path.of(buildDirectory().getAbsolutePath(), "dokka", "jekkyl").toFile()) - .outputFormat(OutputFormat.JEKYLL) - .execute(); - } - - @BuildCommand(summary = "Generates Javadoc for the project") - @Override - public void javadoc() throws ExitStatusException, IOException, InterruptedException { - new DokkaOperation() - .fromProject(this) - .failOnWarning(true) - .loggingLevel(LoggingLevel.INFO) - // Create build/javadoc - .outputDir(new File(buildDirectory(), "javadoc")) - .outputFormat(OutputFormat.JAVADOC) - .execute(); - } } diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index b50fe85..aea9055 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.9 -bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.0 -bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_RELEASES bld.downloadLocation= +bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.0 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.0.1 +bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 diff --git a/scripts/checkcliargs.sh b/scripts/checkcliargs.sh index aa2c55e..7855fdc 100755 --- a/scripts/checkcliargs.sh +++ b/scripts/checkcliargs.sh @@ -1,19 +1,5 @@ #!/bin/bash -main=org.jetbrains.dokka.MainKt -new=/tmp/checkcliargs-new -old=/tmp/checkcliargs-old - -java -cp "lib/compile/*" $main -h >$new -java -cp "examples/lib/bld/*" $main -h >$old - -diff $old $new - -java -cp "lib/compile/*" $main -sourceSet -h >$new -java -cp "examples/lib/bld/*" $main -sourceSet -h >$old - -diff $old $new - main=org.jetbrains.kotlin.cli.jvm.K2JVMCompiler java -cp "lib/compile/*" $main -h 2>$new diff --git a/scripts/cliargs.sh b/scripts/cliargs.sh index 9bceae4..ebc70f7 100755 --- a/scripts/cliargs.sh +++ b/scripts/cliargs.sh @@ -3,15 +3,3 @@ java -cp "lib/compile/*" org.jetbrains.kotlin.cli.jvm.K2JVMCompiler -h 2> >(grep "^ ") |\ sed -e "s/^ //" -e "s/ .*//" -e "s/<.*//" -e '/-help/d' -e '/-version/d' -e '/^$/d'|\ sort > "src/test/resources/kotlinc-args.txt" - -main=org.jetbrains.dokka.MainKt - -java -cp "lib/compile/*" $main -h |\ -grep " -" |\ -sed -e "s/^ -/-/" -e "s/ \[.*//" -e "s/ ->.*//" -e '/help/d' |\ -sort > "src/test/resources/dokka-args.txt" - -java -cp "lib/compile/*" $main -sourceSet -h |\ -grep " -" |\ -sed -e "s/^ -/-/" -e "s/ \[.*//" -e "s/ ->.*//" -e '/help/d' -e '/includeNonPublic/d' |\ -sort > "src/test/resources/dokka-sourceset-args.txt" diff --git a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java index 7d2e9b2..a93cbf1 100644 --- a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java +++ b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java @@ -33,7 +33,7 @@ public class CompileKotlinOperationBuild extends Project { public CompileKotlinOperationBuild() { pkg = "rife.bld.extension"; name = "bld-kotlin"; - version = version(0, 9, 8); + version = version(1, 0, 0, "SNAPSHOT"); javaRelease = 17; @@ -41,18 +41,22 @@ public class CompileKotlinOperationBuild extends Project { autoDownloadPurge = true; repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - var dokka = version(1, 9, 20); var kotlin = version(2, 0, 0); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-compiler", kotlin)) .include(dependency("org.jetbrains.kotlin", "kotlin-annotation-processing", kotlin)) .include(dependency("org.jetbrains.kotlin", "kotlin-scripting-compiler", kotlin)) - .include(dependency("org.jetbrains.dokka", "dokka-cli", dokka)) - .include(dependency("org.jetbrains.dokka", "dokka-base", dokka)) - .include(dependency("org.jetbrains.dokka", "analysis-kotlin-descriptors", dokka)) - .include(dependency("org.jetbrains.dokka", "javadoc-plugin", dokka)) - .include(dependency("org.jetbrains.dokka", "gfm-plugin", dokka)) - .include(dependency("org.jetbrains.dokka", "jekyll-plugin", dokka)) + .include(dependency("org.jetbrains.kotlin", "kotlin-reflect", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib-common", kotlin)) + .include(dependency("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm", version(1, 9, 0 , "RC"))) +// .include(dependency("org.jetbrains.kotlin", "kotlin-allopen-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-assignment-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-serialization-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-lombok-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-allopen-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-noarg-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-power-assert-compiler-plugin", kotlin)) +// .include(dependency("org.jetbrains.kotlin", "kotlin-sam-with-receiver-compiler-plugin", kotlin)) .include(dependency("com.uwyn.rife2", "bld", version(1, 9, 1))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) diff --git a/src/main/java/rife/bld/extension/dokka/AnalysisPlatform.java b/src/main/java/rife/bld/extension/dokka/AnalysisPlatform.java deleted file mode 100644 index dd6ff1a..0000000 --- a/src/main/java/rife/bld/extension/dokka/AnalysisPlatform.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -/** - * Dokka's analysis platforms. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public enum AnalysisPlatform { - JVM, JS, NATIVE, COMMON, ANDROID -} diff --git a/src/main/java/rife/bld/extension/dokka/DocumentedVisibility.java b/src/main/java/rife/bld/extension/dokka/DocumentedVisibility.java deleted file mode 100644 index dae65a4..0000000 --- a/src/main/java/rife/bld/extension/dokka/DocumentedVisibility.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -/** - * Dokka documented visibilities. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public enum DocumentedVisibility { - PUBLIC, PRIVATE, PROTECTED, INTERNAL, PACKAGE -} diff --git a/src/main/java/rife/bld/extension/dokka/DokkaOperation.java b/src/main/java/rife/bld/extension/dokka/DokkaOperation.java deleted file mode 100644 index 56d2661..0000000 --- a/src/main/java/rife/bld/extension/dokka/DokkaOperation.java +++ /dev/null @@ -1,609 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -import rife.bld.BaseProject; -import rife.bld.extension.CompileKotlinOperation; -import rife.bld.operations.AbstractProcessOperation; -import rife.tools.StringUtils; - -import java.io.File; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static rife.bld.extension.CompileKotlinOperation.isNotBlank; - -/** - * Builds documentation (javadoc, HTML, etc.) using Dokka. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -@SuppressWarnings("PMD.AvoidThrowingRawExceptionTypes") -public class DokkaOperation extends AbstractProcessOperation { - private final static String GFM_PLUGIN_REGEXP = - "^.*(dokka-base|analysis-kotlin-descriptors|gfm-plugin|freemarker).*\\.jar$"; - private final static String HTML_PLUGIN_REGEXP = - "^.*(dokka-base|analysis-kotlin-descriptors|kotlinx-html-jvm|freemarker).*\\.jar$"; - private final static String JAVADOC_PLUGIN_REGEXP = - "^.*(dokka-base|analysis-kotlin-descriptors|javadoc-plugin|kotlin-as-java-plugin|korte-jvm).*\\.jar$"; - private final static String JEKYLL_PLUGIN_REGEXP = - "^.*(dokka-base|analysis-kotlin-descriptors|jekyll-plugin|gfm-plugin|freemarker).*\\.jar$"; - private final Logger LOGGER = Logger.getLogger(DokkaOperation.class.getName()); - private final Map globalLinks_ = new ConcurrentHashMap<>(); - private final Collection globalPackageOptions_ = new ArrayList<>(); - private final Collection globalSrcLinks_ = new ArrayList<>(); - private final Collection includes_ = new ArrayList<>(); - private final Collection pluginsClasspath_ = new ArrayList<>(); - private final Map pluginsConfiguration_ = new ConcurrentHashMap<>(); - private boolean delayTemplateSubstitution_; - private boolean failOnWarning_; - private File json; - private LoggingLevel loggingLevel_; - private String moduleName_; - private String moduleVersion_; - private boolean noSuppressObviousFunctions_; - private boolean offlineMode_; - private File outputDir_; - private BaseProject project_; - private SourceSet sourceSet_; - private boolean suppressInheritedMembers_; - - // Encodes to JSON adding braces as needed - private static String encodeJson(final String json) { - var sb = new StringBuilder(json); - if (!json.startsWith("{") || !json.endsWith("}")) { - sb.insert(0, "{").append('}'); - } - return StringUtils.encodeJson(sb.toString()); - } - - /** - * Sets the delay substitution of some elements. - *

- * Used in incremental builds of multimodule projects. - * - * @param delayTemplateSubstitution the delay - * @return this operation instance - */ - public DokkaOperation delayTemplateSubstitution(Boolean delayTemplateSubstitution) { - delayTemplateSubstitution_ = delayTemplateSubstitution; - return this; - } - - /** - * Part of the {@link #execute execute} operation, constructs the command list to use for building the process. - * - * @since 1.5 - */ - @Override - protected List executeConstructProcessCommandList() { - if (project_ == null) { - throw new IllegalArgumentException("A project must be specified."); - } - - final List args = new ArrayList<>(); - - // java - args.add(javaTool()); - - var cli = CompileKotlinOperation.getJarList(project_.libBldDirectory(), "^.*dokka-cli.*\\.jar$"); - - if (cli.size() != 1) { - throw new RuntimeException("The dokka-cli JAR could not be found."); - } - - // -jar dokka-cli - args.add("-jar"); - args.add(cli.get(0)); - - // -pluginClasspath - if (!pluginsClasspath_.isEmpty()) { - args.add("-pluginsClasspath"); - args.add(String.join(";", pluginsClasspath_)); - } - - // -sourceSet - var sourceSetArgs = sourceSet_.args(); - if (sourceSetArgs.isEmpty()) { - throw new IllegalArgumentException("At least one sourceSet is required."); - } else { - args.add("-sourceSet"); - args.add(String.join(" ", sourceSet_.args())); - } - - // -outputDir - if (outputDir_ != null) { - if (!outputDir_.exists() && !outputDir_.mkdirs()) { - throw new RuntimeException("Could not create: " + outputDir_.getAbsolutePath()); - } - - args.add("-outputDir"); - args.add(outputDir_.getAbsolutePath()); - } - - // -delayTemplateSubstitution - if (delayTemplateSubstitution_) { - args.add("-delayTemplateSubstitution"); - } - - // -failOnWarning - if (failOnWarning_) { - args.add("-failOnWarning"); - } - - // -globalLinks_ - if (!globalLinks_.isEmpty()) { - args.add("-globalLinks"); - var links = new ArrayList(); - globalLinks_.forEach((k, v) -> - links.add(String.format("%s^%s", k, v))); - args.add(String.join("^^", links)); - } - - // -globalPackageOptions - if (!globalPackageOptions_.isEmpty()) { - args.add("-globalPackageOptions"); - args.add(String.join(";", globalPackageOptions_)); - } - - // -globalSrcLinks - if (!globalSrcLinks_.isEmpty()) { - args.add("-globalSrcLinks_"); - args.add(String.join(";", globalSrcLinks_)); - } - - // -includes - if (!includes_.isEmpty()) { - args.add("-includes"); - args.add(String.join(";", includes_)); - } - - // -loggingLevel - if (loggingLevel_ != null) { - args.add("-loggingLevel"); - args.add(loggingLevel_.name().toLowerCase()); - } - - // -moduleName - if (isNotBlank(moduleName_)) { - args.add("-moduleName"); - args.add(moduleName_); - } - - // -moduleVersion - if (isNotBlank(moduleVersion_)) { - args.add("-moduleVersion"); - args.add(moduleVersion_); - } - - // -noSuppressObviousFunctions - if (noSuppressObviousFunctions_) { - args.add("-noSuppressObviousFunctions"); - } - - // -offlineMode - if (offlineMode_) { - args.add("-offlineMode"); - } - - // -pluginConfiguration - if (!pluginsConfiguration_.isEmpty()) { - args.add("-pluginsConfiguration"); - var confs = new ArrayList(); - pluginsConfiguration_.forEach((k, v) -> - confs.add(String.format("%s=%s", encodeJson(k), encodeJson(v)))); - args.add(String.join("^^", confs)); - } - - // -suppressInheritedMembers - if (suppressInheritedMembers_) { - args.add("-suppressInheritedMembers"); - } - - // json - if (json != null) { - args.add(json.getAbsolutePath()); - } - - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.fine(String.join(" ", args)); - } - - return args; - } - - /** - * Configures the operation from a {@link BaseProject}. - *

- * Sets the {@link #sourceSet sourceSet}, {@link SourceSet#jdkVersion jdkVersion}, {@link #moduleName moduleName} - * and {@link SourceSet#classpath(String...) classpath} from the project. - * - * @param project the project to configure the operation from - */ - @Override - public DokkaOperation fromProject(BaseProject project) { - project_ = project; - sourceSet_ = new SourceSet() - .src(new File(project.srcMainDirectory(), "kotlin").getAbsolutePath()) - .classpath(project.compileClasspathJars()) - .classpath(project.providedClasspathJars()); - if (project.javaRelease() != null) { - sourceSet_ = sourceSet_.jdkVersion(project.javaRelease()); - } - moduleName_ = project.name(); - return this; - } - - /** - * Sets whether to fail documentation generation if Dokka has emitted a warning or an error. - *

- * Whether to fail documentation generation if Dokka has emitted a warning or an error. The process waits until all - * errors and warnings have been emitted first. - *

- * This setting works well with {@link SourceSet#reportUndocumented} - * - * @param failOnWarning {@code true} or {@code false} - * @return this operation instance - */ - public DokkaOperation failOnWarning(Boolean failOnWarning) { - failOnWarning_ = failOnWarning; - return this; - } - - /** - * Set the global external documentation links. - * - * @param url the external documentation URL - * @param packageListUrl the external documentation package list URL - * @return this operation instance - */ - public DokkaOperation globalLinks(String url, String packageListUrl) { - globalLinks_.put(url, packageListUrl); - return this; - } - - /** - * Set the global external documentation links. - * - * @param globalLinks the map of global links - * @return this operation instance - * @see #globalSrcLink(String...) #globalSrcLink(String...)#globalSrcLink(String...) - */ - public DokkaOperation globalLinks(Map globalLinks) { - globalLinks_.putAll(globalLinks); - return this; - } - - /** - * Sets the global list of package configurations. - *

- * Using format: - *

    - *
  • matchingRegexp
  • - *
  • -deprecated
  • - *
  • -privateApi
  • - *
  • +warnUndocumented
  • - *
  • +suppress
  • - *
  • +visibility:PUBLIC
  • - *
  • ...
  • - *
- * - * @param options ome pr more package configurations - * @return this operation instance - */ - public DokkaOperation globalPackageOptions(String... options) { - Collections.addAll(globalPackageOptions_, options); - return this; - } - - /** - * Sets the global list of package configurations. - *

- * Using format: - *

    - *
  • matchingRegexp
  • - *
  • -deprecated
  • - *
  • -privateApi
  • - *
  • +warnUndocumented
  • - *
  • +suppress
  • - *
  • +visibility:PUBLIC
  • - *
  • ...
  • - *
- * - * @param options the list of package configurations - * @return this operation instance - */ - public DokkaOperation globalPackageOptions(Collection options) { - globalPackageOptions_.addAll(options); - return this; - } - - /** - * Sets the global mapping between a source directory and a Web service for browsing the code. - * - * @param links one or more links mapping - * @return this operation instance - */ - public DokkaOperation globalSrcLink(String... links) { - Collections.addAll(globalSrcLinks_, links); - return this; - } - - /** - * Sets the global mapping between a source directory and a Web service for browsing the code. - * - * @param links the links mapping - * @return this operation instance - */ - public DokkaOperation globalSrcLink(Collection links) { - globalSrcLinks_.addAll(links); - return this; - } - - /** - * Sets the Markdown files that contain module and package documentation. - *

- * The contents of specified files are parsed and embedded into documentation as module and package descriptions. - *

- * This can be configured on per-package basis. - * - * @param files one or more files - * @return this operation instance - */ - public DokkaOperation includes(String... files) { - Collections.addAll(includes_, files); - return this; - } - - /** - * Sets the Markdown files that contain module and package documentation. - *

- * The contents of specified files are parsed and embedded into documentation as module and package descriptions. - *

- * This can be configured on per-package basis. - * - * @param files the list of files - * @return this operation instance - */ - public DokkaOperation includes(Collection files) { - includes_.addAll(files); - return this; - } - - /** - * JSON configuration file path. - * - * @param configuration the configuration file path - */ - public DokkaOperation json(File configuration) { - json = configuration; - return this; - } - - /** - * Sets the logging level. - * - * @param loggingLevel the logging level - * @return this operation instance - */ - public DokkaOperation loggingLevel(LoggingLevel loggingLevel) { - loggingLevel_ = loggingLevel; - return this; - } - - /** - * Sets the name of the project/module. Default is {@code root}. - *

- * The display name used to refer to the module. It is used for the table of contents, navigation, logging, etc. - * - * @param moduleName the project/module name - * @return this operation instance - */ - public DokkaOperation moduleName(String moduleName) { - moduleName_ = moduleName; - return this; - } - - /** - * Set the documented version. - * - * @param version the version - * @return this operation instance - */ - public DokkaOperation moduleVersion(String version) { - moduleVersion_ = version; - return this; - } - - /** - * Sets whether to suppress obvious functions such as inherited from - * kotlin.Any and {@link java.lang.Object}. - *

- * A function is considered to be obvious if it is: - *

    - *
  • Inherited from kotlin.Any, - * Kotlin.Enum, {@link java.lang.Object} - * or {@link java.lang.Enum}, such as {@code equals}, {@code hashCode}, {@code toString}. - *
  • Synthetic (generated by the compiler) and does not have any documentation, such as - * {@code dataClass.componentN} or {@code dataClass.copy}. - *
- * - * @param noSuppressObviousFunctions {@code true} or {@code false} - * @return this operation instance - */ - public DokkaOperation noSuppressObviousFunctions(Boolean noSuppressObviousFunctions) { - noSuppressObviousFunctions_ = noSuppressObviousFunctions; - return this; - } - - /** - * Sets whether to resolve remote files/links over network. - *

- * This includes package-lists used for generating external documentation links. For example, to make classes from - * the standard library clickable. - *

- * Setting this to true can significantly speed up build times in certain cases, but can also worsen documentation - * quality and user experience. For example, by not resolving class/member links from your dependencies, including - * the standard library. - *

- * Note: You can cache fetched files locally and provide them to Dokka as local paths. - * - * @param offlineMode the offline mode - * @return this operation instance - * @see SourceSet#externalDocumentationLinks(String, String) - */ - public DokkaOperation offlineMode(Boolean offlineMode) { - offlineMode_ = offlineMode; - return this; - } - - /** - * Sets the output directory path, {@code ./dokka} by default. - *

- * The directory to where documentation is generated, regardless of output format. - * - * @param outputDir the output directory - * @return this operation instance - */ - public DokkaOperation outputDir(File outputDir) { - outputDir_ = outputDir; - return this; - } - - /** - * Sets the output directory path, {@code ./dokka} by default. - *

- * The directory to where documentation is generated, regardless of output format. - * - * @param outputDir the output directory - * @return this operation instance - */ - public DokkaOperation outputDir(String outputDir) { - outputDir_ = new File(outputDir); - return this; - } - - /** - * Sets the Dokka {@link OutputFormat output format}. - * - * @param format The {@link OutputFormat output format} - * @return this operation instance - */ - public DokkaOperation outputFormat(OutputFormat format) { - pluginsClasspath_.clear(); - if (format.equals(OutputFormat.JAVADOC)) { - pluginsClasspath_.addAll(CompileKotlinOperation.getJarList(project_.libBldDirectory(), - JAVADOC_PLUGIN_REGEXP)); - } else if (format.equals(OutputFormat.HTML)) { - pluginsClasspath_.addAll(CompileKotlinOperation.getJarList(project_.libBldDirectory(), - HTML_PLUGIN_REGEXP)); - } else if (format.equals(OutputFormat.MARKDOWN)) { - pluginsClasspath_.addAll(CompileKotlinOperation.getJarList(project_.libBldDirectory(), - GFM_PLUGIN_REGEXP)); - } else if (format.equals(OutputFormat.JEKYLL)) { - pluginsClasspath_.addAll(CompileKotlinOperation.getJarList(project_.libBldDirectory(), - JEKYLL_PLUGIN_REGEXP)); - } - return this; - } - - /** - * Sets the configuration for Dokka plugins. - * - * @param name The fully-qualified plugin name - * @param jsonConfiguration The plugin JSON configuration - * @return this operation instance - */ - public DokkaOperation pluginConfigurations(String name, String jsonConfiguration) { - pluginsConfiguration_.put(name, jsonConfiguration); - return this; - } - - /** - * Sets the configuration for Dokka plugins. - * - * @param pluginConfiguratione the map of configurations - * @return this operation instance - * @see #pluginConfigurations(String, String) - */ - public DokkaOperation pluginConfigurations(Map pluginConfiguratione) { - pluginsConfiguration_.putAll(pluginConfiguratione); - return this; - } - - /** - * Sets the list of jars with Dokka plugins and their dependencies. - * - * @param jars one or more jars - * @return this operation instance - */ - public DokkaOperation pluginsClasspath(String... jars) { - Collections.addAll(pluginsClasspath_, jars); - return this; - } - - /** - * Sets the list of jars with Dokka plugins and their dependencies. - * - * @param jars the list of jars - * @return this operation instance - */ - public DokkaOperation pluginsClasspath(Collection jars) { - pluginsClasspath_.addAll(jars); - return this; - } - - /** - * Clears the list of Dokka plugins. - * - * @param clear set to clear the list - * @return this operation instance - */ - public DokkaOperation pluginsClasspath(boolean clear) { - if (clear) { - pluginsClasspath_.clear(); - } - return this; - } - - /** - * Sets the configurations for a source set. - *

- * Individual and additional configuration of Kotlin source sets. - * - * @param sourceSet the source set configurations - * @return this operation instance - */ - public DokkaOperation sourceSet(SourceSet sourceSet) { - sourceSet_ = sourceSet; - return this; - } - - /** - * Sets whether to suppress inherited members that aren't explicitly overridden in a given class. - * - * @param suppressInheritedMembers {@code true} or {@code false} - * @return this operation instance - */ - public DokkaOperation suppressInheritedMembers(Boolean suppressInheritedMembers) { - suppressInheritedMembers_ = suppressInheritedMembers; - return this; - } -} diff --git a/src/main/java/rife/bld/extension/dokka/LoggingLevel.java b/src/main/java/rife/bld/extension/dokka/LoggingLevel.java deleted file mode 100644 index b493e11..0000000 --- a/src/main/java/rife/bld/extension/dokka/LoggingLevel.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -/** - * Dokka logging levels. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public enum LoggingLevel { - DEBUG, PROGRESS, INFO, WARN, ERROR -} diff --git a/src/main/java/rife/bld/extension/dokka/OutputFormat.java b/src/main/java/rife/bld/extension/dokka/OutputFormat.java deleted file mode 100644 index 0d4a2c0..0000000 --- a/src/main/java/rife/bld/extension/dokka/OutputFormat.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -/** - * Dokka output formats. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public enum OutputFormat { - JAVADOC, JEKYLL, HTML, MARKDOWN -} diff --git a/src/main/java/rife/bld/extension/dokka/SourceSet.java b/src/main/java/rife/bld/extension/dokka/SourceSet.java deleted file mode 100644 index e9457b5..0000000 --- a/src/main/java/rife/bld/extension/dokka/SourceSet.java +++ /dev/null @@ -1,680 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -import java.io.File; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Configuration for a Dokka source set. - * - * @author Erik C. Thauvin - * @since 1.0 - */ -public class SourceSet { - private static final String SEMICOLON = ";"; - private final Collection classpath_ = new ArrayList<>(); - private final Map dependentSourceSets_ = new ConcurrentHashMap<>(); - private final Collection documentedVisibilities_ = new ArrayList<>(); - private final Map externalDocumentationLinks_ = new ConcurrentHashMap<>(); - private final Collection includes_ = new ArrayList<>(); - private final Collection perPackageOptions_ = new ArrayList<>(); - private final Collection samples_ = new ArrayList<>(); - private final Map srcLinks_ = new ConcurrentHashMap<>(); - private final Collection src_ = new ArrayList<>(); - private final Collection suppressedFiles_ = new ArrayList<>(); - private AnalysisPlatform analysisPlatform_; - private String apiVersion_; - private String displayName_; - private String jdkVersion_; - private String languageVersion_; - private boolean noJdkLink_; - private boolean noSkipEmptyPackages_; - private boolean noStdlibLink_; - private boolean reportUndocumented_; - private boolean skipDeprecated_; - private String sourceSetName_; - - /** - * Sets the platform used for setting up analysis. Default is {@link AnalysisPlatform#JVM JVM} - *

- * Platform to be used for setting up code analysis and {@code @sample} environment. - * - * @param analysisPlatform the analysis platform - * @return this operation instance - */ - public SourceSet analysisPlatform(AnalysisPlatform analysisPlatform) { - analysisPlatform_ = analysisPlatform; - return this; - } - - /** - * Sets the Kotlin API version used for setting up analysis and samples. - * - * @param apiVersion the api version - * @return this operation instance - */ - public SourceSet apiVersion(String apiVersion) { - apiVersion_ = apiVersion; - return this; - } - - /** - * Sets the Kotlin API version used for setting up analysis and samples. - * - * @param apiVersion the api version - * @return this operation instance - */ - public SourceSet apiVersion(int apiVersion) { - apiVersion_ = String.valueOf(apiVersion); - return this; - } - - /** - * Returns the formatted arguments. - * - * @return the arguments - */ - public List args() { - var args = new ArrayList(); - - // -analysisPlatform - if (analysisPlatform_ != null) { - args.add("-analysisPlatform"); - args.add(analysisPlatform_.name().toLowerCase()); - } - - // -apiVersion - if (apiVersion_ != null) { - args.add("-apiVersion"); - args.add(apiVersion_); - } - - // -classpath - if (!classpath_.isEmpty()) { - args.add("-classpath"); - args.add(String.join(SEMICOLON, classpath_)); - } - - // -dependentSourceSets - if (!dependentSourceSets_.isEmpty()) { - args.add("-dependentSourceSets"); - var deps = new ArrayList(); - dependentSourceSets_.forEach((k, v) -> deps.add(String.format("%s/%s", k, v))); - args.add(String.join(SEMICOLON, deps)); - } - - // -displayName - if (displayName_ != null) { - args.add("-displayName"); - args.add(displayName_); - } - - // -documentedVisibilities - if (!documentedVisibilities_.isEmpty()) { - args.add("-documentedVisibilities"); - var vis = new ArrayList(); - documentedVisibilities_.forEach(d -> vis.add(d.name().toLowerCase())); - args.add(String.join(SEMICOLON, vis)); - } - - // -externalDocumentationLinks - if (!externalDocumentationLinks_.isEmpty()) { - args.add("-externalDocumentationLinks"); - var links = new ArrayList(); - externalDocumentationLinks_.forEach((k, v) -> links.add(String.format("%s^%s", k, v))); - args.add(String.join("^^", links)); - } - - // -jdkVersion - if (jdkVersion_ != null) { - args.add("-jdkVersion"); - args.add(jdkVersion_); - } - - // -includes - if (!includes_.isEmpty()) { - args.add("-includes"); - args.add(String.join(SEMICOLON, includes_)); - } - - // -languageVersion - if (languageVersion_ != null) { - args.add("-languageVersion"); - args.add(languageVersion_); - } - - // -noJdkLink - if (noJdkLink_) { - args.add("-noJdkLink"); - args.add(String.valueOf(noJdkLink_)); - } - - // -noSkipEmptyPackages - if (noSkipEmptyPackages_) { - args.add("-noSkipEmptyPackages"); - args.add(String.valueOf(noSkipEmptyPackages_)); - } - - // -noStdlibLink - if (noStdlibLink_) { - args.add("-noStdlibLink"); - args.add(String.valueOf(noStdlibLink_)); - } - - // -reportUndocumented - if (reportUndocumented_) { - args.add("-reportUndocumented"); - args.add(String.valueOf(reportUndocumented_)); - } - - // -perPackageOptions - if (!perPackageOptions_.isEmpty()) { - args.add("-perPackageOptions"); - args.add(String.join(SEMICOLON, perPackageOptions_)); - } - - // -samples - if (!samples_.isEmpty()) { - args.add("-samples"); - args.add(String.join(SEMICOLON, samples_)); - } - - // -skipDeprecated - if (skipDeprecated_) { - args.add("-skipDeprecated"); - args.add(String.valueOf(skipDeprecated_)); - } - - // -src - if (!src_.isEmpty()) { - args.add("-src"); - args.add(String.join(SEMICOLON, src_)); - } - - // -srcLink - if (!srcLinks_.isEmpty()) { - args.add("-srcLink"); - var links = new ArrayList(); - srcLinks_.forEach((k, v) -> links.add(String.format("%s=%s", k, v))); - args.add(String.join(SEMICOLON, links)); - } - - // -sourceSetName - if (sourceSetName_ != null) { - args.add("-sourceSetName"); - args.add(sourceSetName_); - } - - // -suppressedFiles - if (!suppressedFiles_.isEmpty()) { - args.add("-suppressedFiles"); - args.add(String.join(SEMICOLON, suppressedFiles_)); - } - - return args; - } - - /** - * Sets classpath for analysis and interactive samples. - *

- * This is useful if some types that come from dependencies are not resolved/picked up automatically. - *

- * This option accepts both {@code .jar} and {@code .klib} files. - * - * @param files one or more file - * @return this operation instance - */ - public SourceSet classpath(String... files) { - Collections.addAll(classpath_, files); - return this; - } - - /** - * Sets classpath for analysis and interactive samples. - *

- * This is useful if some types that come from dependencies are not resolved/picked up automatically. - *

- * This option accepts both {@code .jar} and {@code .klib} files. - * - * @param files the list of files - * @return this operation instance - */ - public SourceSet classpath(Collection files) { - classpath_.addAll(files); - return this; - } - - /** - * Sets classpath for analysis and interactive samples. - *

- * This is useful if some types that come from dependencies are not resolved/picked up automatically. - *

- * This option accepts both {@code .jar} and {@code .klib} files. - * - * @param files the list of files - * @return this operation instance - */ - public SourceSet classpath(List files) { - files.forEach(it -> classpath_.add(it.getAbsolutePath())); - return this; - } - - /** - * Sets the names of dependent source sets. - * - * @param moduleName the module name - * @param sourceSetName the source set name - * @return this operation instance - */ - public SourceSet dependentSourceSets(String moduleName, String sourceSetName) { - dependentSourceSets_.put(moduleName, sourceSetName); - return this; - } - - /** - * Sets the names of dependent source sets. - * - * @param dependentSourceSets the map of dependent source set names - * @return this operation instance - * @see #dependentSourceSets(String, String) - */ - public SourceSet dependentSourceSets(Map dependentSourceSets) { - dependentSourceSets_.putAll(dependentSourceSets); - return this; - } - - /** - * Sets the display name of the source set, used both internally and externally. - *

- * The name is used both externally (for example, the source set name is visible to documentation readers) and - * internally (for example, for logging messages of {@link #reportUndocumented reportUndocumented}). - *

- * The platform name can be used if you don't have a better alternative. - * - * @param displayName the display name - * @return this operation instance - */ - public SourceSet displayName(String displayName) { - displayName_ = displayName; - return this; - } - - /** - * Sets visibilities to be documented. - *

- * This can be used if you want to document protected/internal/private declarations, as well as if you want to - * exclude public declarations and only document internal API. - *

- * This can be configured on per-package basis. - * - * @param visibilities one or more visibilities - * @return this operation instance - */ - public SourceSet documentedVisibilities(DocumentedVisibility... visibilities) { - documentedVisibilities_.addAll(Arrays.asList(visibilities)); - return this; - } - - /** - * Sets the external documentation links. - *

- * A set of parameters for external documentation links that is applied only for this source set. - * - * @param url the external documentation URL - * @param packageListUrl the external documentation package list URL - * @return this operation instance - */ - public SourceSet externalDocumentationLinks(String url, String packageListUrl) { - externalDocumentationLinks_.put(url, packageListUrl); - return this; - } - - /** - * Sets the external documentation links. - *

- * A set of parameters for external documentation links that is applied only for this source set. - * - * @param externalDocumentationLinks the map of external documentation links - * @return this operation instance - * @see #externalDocumentationLinks(String, String) - */ - public SourceSet externalDocumentationLinks(Map externalDocumentationLinks) { - externalDocumentationLinks_.putAll(externalDocumentationLinks); - return this; - } - - /** - * Sets the Markdown files that contain module and package documentation. - *

- * A list of Markdown files that contain module and package documentation. - *

- * The contents of the specified files are parsed and embedded into documentation as module and package - * descriptions. - * - * @param files one or more files - * @return this operation instance - */ - public SourceSet includes(String... files) { - Collections.addAll(includes_, files); - return this; - } - - /** - * Sets the Markdown files that contain module and package documentation. - *

- * A list of Markdown files that contain module and package documentation. - *

- * The contents of the specified files are parsed and embedded into documentation as module and package - * descriptions. - * - * @param files the list of files - * @return this operation instance - */ - public SourceSet includes(Collection files) { - includes_.addAll(files); - return this; - } - - /** - * Sets the version of JDK to use for linking to JDK Javadocs. - *

- * The JDK version to use when generating external documentation links for Java types. - *

- * For example, if you use {@link java.util.UUID} in some public declaration signature, and this option is set to 8, - * Dokka generates an external documentation link to JDK 8 Javadocs for it. - * - * @param jdkVersion the JDK version - * @return this operation instance - */ - public SourceSet jdkVersion(String jdkVersion) { - jdkVersion_ = jdkVersion; - return this; - } - - /** - * Sets the version of JDK to use for linking to JDK Javadocs. - *

- * The JDK version to use when generating external documentation links for Java types. - *

- * For example, if you use {@link java.util.UUID} in some public declaration signature, and this option is set to 8, - * Dokka generates an external documentation link to JDK 8 Javadocs for it. - * - * @param jdkVersion the JDK version - * @return this operation instance - */ - public SourceSet jdkVersion(int jdkVersion) { - jdkVersion_ = String.valueOf(jdkVersion); - return this; - } - - /** - * Sets the language version used for setting up analysis and samples. - * - * @param languageVersion the language version - * @return this operation instance - */ - public SourceSet languageVersion(String languageVersion) { - languageVersion_ = languageVersion; - return this; - } - - /** - * Sets the language version used for setting up analysis and samples. - * - * @param languageVersion the language version - * @return this operation instance - */ - public SourceSet languageVersion(int languageVersion) { - languageVersion_ = String.valueOf(languageVersion); - return this; - } - - /** - * Sets whether to generate links to JDK Javadocs. - *

- * Whether to generate external documentation links to JDK's Javadocs. - *

- * The version of JDK Javadocs is determined by the {@link #jdkVersion jdkVersion} option. - *

- * Note: Links are generated when noJdkLink is set to false. - * - * @param noJdkLink {@code true} or {@code false} - * @return this operation instance - */ - public SourceSet noJdkLink(Boolean noJdkLink) { - noJdkLink_ = noJdkLink; - return this; - } - - /** - * Sets whether to create pages for empty packages. - *

- * Whether to skip packages that contain no visible declarations after various filters have been applied. - * - * @param noSkipEmptyPackages {@code true} or {@code false} - * @return this operation instance - */ - public SourceSet noSkipEmptyPackages(boolean noSkipEmptyPackages) { - noSkipEmptyPackages_ = noSkipEmptyPackages; - return this; - } - - /** - * Sets whether to generate links to Standard library. - *

- * Whether to generate external documentation links that lead to the API reference documentation of Kotlin's - * standard library. - *

- * Note: Links are generated when noStdLibLink is set to {@code false}. - * - * @param noStdlibLink {@code true} or {@code false} - * @return this operation instance - */ - public SourceSet noStdlibLink(Boolean noStdlibLink) { - noStdlibLink_ = noStdlibLink; - return this; - } - - /** - * Set the list of package source set configuration. - *

- * A set of parameters specific to matched packages within this source set. - *

- * Using format: - *

    - *
  • matchingRegexp
  • - *
  • -deprecated
  • - *
  • -privateApi
  • - *
  • +warnUndocumented
  • - *
  • +suppress
  • - *
  • +visibility:PUBLIC
  • - *
  • ...
  • - *
- * - * @param perPackageOptions the list of per package options - * @return this operation instance - */ - public SourceSet perPackageOptions(Collection perPackageOptions) { - perPackageOptions_.addAll(perPackageOptions); - return this; - } - - /** - * Set the list of package source set configuration. - *

- * A set of parameters specific to matched packages within this source set. - *

- * Using format: - *

    - *
  • matchingRegexp
  • - *
  • -deprecated
  • - *
  • -privateApi
  • - *
  • +warnUndocumented
  • - *
  • +suppress
  • - *
  • +visibility:PUBLIC
  • - *
  • ...
  • - *
- * - * @param perPackageOptions the list of per package options - * @return this operation instance - */ - public SourceSet perPackageOptions(String... perPackageOptions) { - Collections.addAll(perPackageOptions_, perPackageOptions); - return this; - } - - /** - * Sets whether to report undocumented declarations. - *

- * Whether to emit warnings about visible undocumented declarations, that is declarations without KDocs after they - * have been filtered by documentedVisibilities and other filters. - *

- * This setting works well with {@link DokkaOperation#failOnWarning}. - *

- * This can be configured on per-package basis. - * - * @param reportUndocumented {@code true} or {@code false} - * @return this operation instance - */ - public SourceSet reportUndocumented(Boolean reportUndocumented) { - reportUndocumented_ = reportUndocumented; - return this; - } - - /** - * Set the list of directories or files that contain sample functions. - *

- * A list of directories or files that contain sample functions which are referenced via the {@code @sample} KDoc - * tag. - * - * @param samples the list of samples - * @return this operation instance - */ - public SourceSet samples(Collection samples) { - samples_.addAll(samples); - return this; - } - - /** - * Set the list of directories or files that contain sample functions. - *

- * A list of directories or files that contain sample functions which are referenced via the {@code @sample} KDoc - * tag. - * - * @param samples nne or more samples - * @return this operation instance - */ - public SourceSet samples(String... samples) { - Collections.addAll(samples_, samples); - return this; - } - - /** - * Sets whether to skip deprecated declarations. - *

- * Whether to document declarations annotated with {@code @Deprecated}. - *

- * This can be configured on per-package basis. - * - * @param skipDeprecated {@code true} or {@code false} - * @return this operation instance - */ - public SourceSet skipDeprecated(boolean skipDeprecated) { - skipDeprecated_ = skipDeprecated; - return this; - } - - /** - * Sets the name of the source set. Default is {@code main}. - * - * @param sourceSetName the source set name. - * @return this operation instance - */ - public SourceSet sourceSetName(String sourceSetName) { - sourceSetName_ = sourceSetName; - return this; - } - - /** - * Sets the source code roots to be analyzed and documented. - *

- * The source code roots to be analyzed and documented. Acceptable inputs are directories and individual - * {@code .kt} / {@code .java} files. - * - * @param src the list of source code roots - * @return this operation instance - */ - public SourceSet src(Collection src) { - src_.addAll(src); - return this; - } - - /** - * Sets the source code roots to be analyzed and documented. - *

- * The source code roots to be analyzed and documented. Acceptable inputs are directories and individual - * {@code .kt} / {@code .java} files. - * - * @param src pne ore moe source code roots - * @return this operation instance - */ - public SourceSet src(String... src) { - Collections.addAll(src_, src); - return this; - } - - /** - * Sets the mapping between a source directory and a Web service for browsing the code. - * - * @param srcPath the source path - * @param remotePath the remote path - * @param lineSuffix the line suffix - * @return this operation instance - */ - public SourceSet srcLink(String srcPath, String remotePath, String lineSuffix) { - srcLinks_.put(srcPath, remotePath + lineSuffix); - return this; - } - - /** - * Sets the paths to files to be suppressed. - *

- * The files to be suppressed when generating documentation. - * - * @param suppressedFiles the list of suppressed files - * @return this operation instance - */ - public SourceSet suppressedFiles(Collection suppressedFiles) { - suppressedFiles_.addAll(suppressedFiles); - return this; - } - - /** - * Sets the paths to files to be suppressed. - *

- * The files to be suppressed when generating documentation. - * - * @param suppressedFiles one or moe suppressed files - * @return this operation instance - */ - public SourceSet suppressedFiles(String... suppressedFiles) { - suppressedFiles_.addAll(Arrays.asList(suppressedFiles)); - return this; - } -} diff --git a/src/test/java/rife/bld/extension/dokka/DokkaOperationTest.java b/src/test/java/rife/bld/extension/dokka/DokkaOperationTest.java deleted file mode 100644 index 0e089ee..0000000 --- a/src/test/java/rife/bld/extension/dokka/DokkaOperationTest.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -import org.junit.jupiter.api.Test; -import rife.bld.blueprints.BaseProjectBlueprint; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; - -import static org.assertj.core.api.Assertions.assertThat; - -class DokkaOperationTest { - @Test - @SuppressWarnings({"ExtractMethodRecommender", "PMD.AvoidDuplicateLiterals"}) - void executeConstructProcessCommandListTest() throws IOException { - var args = Files.readAllLines(Paths.get("src", "test", "resources", "dokka-args.txt")); - - assertThat(args).isNotEmpty(); - - var examples = new File("examples"); - var jsonConf = new File("config.json"); - var params = new DokkaOperation() - .delayTemplateSubstitution(true) - .failOnWarning(true) - .fromProject(new BaseProjectBlueprint(examples, "com.example", "Example")) - .globalLinks("s", "link") - .globalLinks(Map.of("s2", "link2")) - .globalPackageOptions("option1", "option2") - .globalPackageOptions(List.of("option3", "option4")) - .globalSrcLink("link1", "link2") - .globalSrcLink(List.of("link3", "link4")) - .includes("file1", "file2") - .includes(List.of("file3", "file4")) - .json(jsonConf) - .loggingLevel(LoggingLevel.DEBUG) - .moduleName("name") - .moduleVersion("1.0") - .noSuppressObviousFunctions(true) - .offlineMode(true) - .outputDir(new File(examples, "build")) - .outputFormat(OutputFormat.JAVADOC) - .pluginConfigurations("name", "{\"json\"}") - .pluginConfigurations(Map.of("{\"name2\"}", "json2", "name3}", "{json3")) - .pluginsClasspath("path1", "path2") - .pluginsClasspath(List.of("path3", "path4")) - .sourceSet(new SourceSet().classpath( - List.of( - new File("examples/foo.jar"), - new File("examples/bar.jar") - ))) - .suppressInheritedMembers(true) - .executeConstructProcessCommandList(); - - for (var p : args) { - var found = false; - for (var a : params) { - if (a.startsWith(p)) { - found = true; - break; - } - } - assertThat(found).as(p + " not found.").isTrue(); - } - - var path = examples.getAbsolutePath(); - var dokkaJar = "1.9.20.jar"; - var matches = List.of("java", - "-jar", path + "/lib/bld/dokka-cli-" + dokkaJar, - "-pluginsClasspath", path + "/lib/bld/dokka-base-" + dokkaJar + ';' + - path + "/lib/bld/analysis-kotlin-descriptors-" + dokkaJar + ';' + - path + "/lib/bld/javadoc-plugin-" + dokkaJar + ';' + - path + "/lib/bld/korte-jvm-4.0.10.jar;" + - path + "/lib/bld/kotlin-as-java-plugin-" + dokkaJar + ";path1;path2;path3;path4", - "-sourceSet", "-src " + path + "/src/main/kotlin" + " -classpath " + path + "/foo.jar;" + path + "/bar.jar", - "-outputDir", path + "/build", - "-delayTemplateSubstitution", - "-failOnWarning", - "-globalLinks", "s^link^^s2^link2", - "-globalPackageOptions", "option1;option2;option3;option4", - "-globalSrcLinks_", "link1;link2;link3;link4", - "-includes", "file1;file2;file3;file4", - "-loggingLevel", "debug", - "-moduleName", "name", - "-moduleVersion", "1.0", - "-noSuppressObviousFunctions", - "-offlineMode", - "-pluginsConfiguration", "{\\\"name2\\\"}={json2}^^{name}={\\\"json\\\"}^^{name3}}={{json3}", - "-suppressInheritedMembers", - jsonConf.getAbsolutePath()); - - assertThat(params).hasSize(matches.size()); - - IntStream.range(0, params.size()).forEach(i -> { - if (params.get(i).contains(".jar;")) { - var jars = params.get(i).split(";"); - Arrays.stream(jars).forEach(jar -> assertThat(matches.get(i)).as(matches.get(i)).contains(jar)); - } else { - assertThat(params.get(i)).as(params.get(i)).isEqualTo(matches.get(i)); - } - }); - } -} diff --git a/src/test/java/rife/bld/extension/dokka/SourceSetTest.java b/src/test/java/rife/bld/extension/dokka/SourceSetTest.java deleted file mode 100644 index b503335..0000000 --- a/src/test/java/rife/bld/extension/dokka/SourceSetTest.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rife.bld.extension.dokka; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; - -import static org.assertj.core.api.Assertions.assertThat; - -class SourceSetTest { - @Test - void sourceSetCollectionsTest() { - var args = new SourceSet() - .classpath(List.of("path1", "path2")) - .dependentSourceSets(Map.of("set1", "set2", "set3", "set4")) - .externalDocumentationLinks(Map.of("link1", "link2", "link3", "link4")) - .perPackageOptions(List.of("option1", "option2")) - .samples(List.of("samples1", "samples1")) - .suppressedFiles(List.of("sup1", "sup2")) - .args(); - - var matches = List.of( - "-classpath", "path1;path2", - "-dependentSourceSets", "set1/set2;set3/set4", - "-externalDocumentationLinks", "link3^link4^^link1^link2", - "-perPackageOptions", "option1;option2", - "-samples", "samples1;samples1", - "-suppressedFiles", "sup1;sup2" - ); - - assertThat(args).hasSize(matches.size()); - - IntStream.range(0, args.size()).forEach(i -> assertThat(args.get(i)).isEqualTo(matches.get(i))); - } - - @Test - @SuppressWarnings("PMD.AvoidDuplicateLiterals") - void sourceSetTest() throws IOException { - var args = Files.readAllLines(Paths.get("src", "test", "resources", "dokka-sourceset-args.txt")); - - assertThat(args).isNotEmpty(); - - var sourceSet = new SourceSet() - .analysisPlatform(AnalysisPlatform.JVM) - .apiVersion("1.0") - .classpath("classpath1", "classpath2") - .dependentSourceSets("moduleName", "sourceSetName") - .displayName("name") - .documentedVisibilities(DocumentedVisibility.PACKAGE, DocumentedVisibility.PRIVATE) - .externalDocumentationLinks("url1", "packageListUrl1") - .externalDocumentationLinks("url2", "packageListUrl2") - .includes("includes1", "includes2") - .jdkVersion(18) - .languageVersion("2.0") - .noJdkLink(true) - .noSkipEmptyPackages(true) - .noStdlibLink(true) - .perPackageOptions("options1", "options2") - .reportUndocumented(true) - .samples("samples1", "sample2") - .skipDeprecated(true) - .sourceSetName("setName") - .src("src1", "src2") - .srcLink("path1", "remote1", "#suffix1") - .srcLink("path2", "remote2", "#suffix2") - .suppressedFiles("sup1", "sup2"); - - var params = sourceSet.args(); - - for (var p : args) { - var found = false; - for (var a : params) { - if (a.startsWith(p)) { - found = true; - break; - } - } - assertThat(found).as(p + " not found.").isTrue(); - } - - var matches = List.of( - "-analysisPlatform", "jvm", - "-apiVersion", "1.0", - "-classpath", "classpath1;classpath2", - "-dependentSourceSets", "moduleName/sourceSetName", - "-displayName", "name", - "-documentedVisibilities", "package;private", - "-externalDocumentationLinks", "url1^packageListUrl1^^url2^packageListUrl2", - "-jdkVersion", "18", - "-includes", "includes1;includes2", - "-languageVersion", "2.0", - "-noJdkLink", "true", - "-noSkipEmptyPackages", "true", - "-noStdlibLink", "true", - "-reportUndocumented", "true", - "-perPackageOptions", "options1;options2", - "-samples", "samples1;sample2", - "-skipDeprecated", "true", - "-src", "src1;src2", - "-srcLink", "path1=remote1#suffix1;path2=remote2#suffix2", - "-sourceSetName", "setName", - "-suppressedFiles", "sup1;sup2"); - - assertThat(params).hasSize(matches.size()); - - IntStream.range(0, params.size()).forEach(i -> assertThat(params.get(i)).isEqualTo(matches.get(i))); - - sourceSet.classpath(List.of("classpath1", "classpath2")); - - IntStream.range(0, params.size()).forEach(i -> assertThat(params.get(i)).isEqualTo(matches.get(i))); - } -} diff --git a/src/test/resources/dokka-args.txt b/src/test/resources/dokka-args.txt deleted file mode 100644 index 4c9f29c..0000000 --- a/src/test/resources/dokka-args.txt +++ /dev/null @@ -1,16 +0,0 @@ --delayTemplateSubstitution --failOnWarning --globalLinks --globalPackageOptions --globalSrcLink --includes --loggingLevel --moduleName --moduleVersion --noSuppressObviousFunctions --offlineMode --outputDir --pluginsClasspath --pluginsConfiguration --sourceSet --suppressInheritedMembers diff --git a/src/test/resources/dokka-sourceset-args.txt b/src/test/resources/dokka-sourceset-args.txt deleted file mode 100644 index 0699eb7..0000000 --- a/src/test/resources/dokka-sourceset-args.txt +++ /dev/null @@ -1,21 +0,0 @@ --analysisPlatform --apiVersion --classpath --dependentSourceSets --displayName --documentedVisibilities --externalDocumentationLinks --includes --jdkVersion --languageVersion --noJdkLink --noSkipEmptyPackages --noStdlibLink --perPackageOptions --reportUndocumented --samples --skipDeprecated --sourceSetName --src --srcLink --suppressedFiles From dcc68afdf3eed90848a219e228542826e7f6eb3d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 15 Jun 2024 21:32:53 -0700 Subject: [PATCH 02/12] Removed unavailable compiler plugins --- src/main/java/rife/bld/extension/CompileKotlinPlugin.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/rife/bld/extension/CompileKotlinPlugin.java b/src/main/java/rife/bld/extension/CompileKotlinPlugin.java index 47264b3..16c0424 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinPlugin.java +++ b/src/main/java/rife/bld/extension/CompileKotlinPlugin.java @@ -25,9 +25,7 @@ package rife.bld.extension; public enum CompileKotlinPlugin { ALL_OPEN("^allopen-compiler-plugin-.*$"), ASSIGNMENT("^assignment-compiler-plugin-.*$"), - KOTLIN_IMPORTS_DUMPER("^kotlin-imports-dumper-compiler-plugin-.*$"), KOTLIN_SERIALIZATION("^kotlin-serialization-compiler-plugin-.*$"), - KOTLINX_SERIALIZATION("^kotlinx-serialization-compiler-plugin-.*$"), LOMBOK("^lombok-compiler-plugin-.*$"), NOARG("^noarg-compiler-plugin-.*$"), POWER_ASSERT("^power-assert-compiler-plugin-.*$"), From 41e60f606a7e6a3c8ff8a4493e4914c594b2c885 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Jun 2024 08:04:44 -0700 Subject: [PATCH 03/12] Configure the main and test source directories from the project --- .../rife/bld/extension/CompileKotlinOperation.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/rife/bld/extension/CompileKotlinOperation.java b/src/main/java/rife/bld/extension/CompileKotlinOperation.java index 6576aac..f8ce05e 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinOperation.java +++ b/src/main/java/rife/bld/extension/CompileKotlinOperation.java @@ -364,12 +364,12 @@ public class CompileKotlinOperation extends AbstractOperation{@link #buildTestDirectory() buildTestDirectory} *

  • {@link #compileMainClasspath() compileMainClassPath}
  • *
  • {@link #compileTestClasspath() compilesTestClassPath}
  • - *
  • {@link #mainSourceFiles() mainSourceFiles} to the {@code kotlin} directory in + *
  • {@link #mainSourceDirectories()} () mainSourceDirectories} to the {@code kotlin} directory in * {@link BaseProject#srcMainDirectory() srcMainDirectory}
  • - *
  • {@link #testSourceFiles() testSourceFile} to the {@code kotlin} directory in + *
  • {@link #testSourceDirectories() testSourceDirectories} to the {@code kotlin} directory in * {@link BaseProject#srcTestDirectory() srcTestDirectory}
  • - *
  • {@link CompileKotlinOptions#jdkRelease jdkRelease} to {@link BaseProject#javaRelease() javaRelease}
  • - *
  • {@link CompileKotlinOptions#noStdLib(boolean) noStdLib} to {@code true}
  • + *
  • {@link CompileOptions#jdkRelease jdkRelease} to {@link BaseProject#javaRelease() javaRelease}
  • + *
  • {@link CompileOptions#noStdLib(boolean) noStdLib} to {@code true}
  • * * * @param project the project to configure the compile operation from @@ -381,8 +381,8 @@ public class CompileKotlinOperation extends AbstractOperation Date: Wed, 19 Jun 2024 08:07:19 -0700 Subject: [PATCH 04/12] Add compiler plugins to the dependencies --- .../CompileKotlinOperationBuild.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java index a93cbf1..fa05161 100644 --- a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java +++ b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java @@ -48,15 +48,16 @@ public class CompileKotlinOperationBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-scripting-compiler", kotlin)) .include(dependency("org.jetbrains.kotlin", "kotlin-reflect", kotlin)) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib-common", kotlin)) - .include(dependency("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm", version(1, 9, 0 , "RC"))) -// .include(dependency("org.jetbrains.kotlin", "kotlin-allopen-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-assignment-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-serialization-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-lombok-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-allopen-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-noarg-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-power-assert-compiler-plugin", kotlin)) -// .include(dependency("org.jetbrains.kotlin", "kotlin-sam-with-receiver-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm", version(1, 9, 0, "RC"))) + // Compiler Plugins + .include(dependency("org.jetbrains.kotlin", "kotlin-allopen-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-assignment-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-serialization-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-lombok-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-allopen-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-noarg-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-power-assert-compiler-plugin", kotlin)) + .include(dependency("org.jetbrains.kotlin", "kotlin-sam-with-receiver-compiler-plugin", kotlin)) .include(dependency("com.uwyn.rife2", "bld", version(1, 9, 1))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) From 19d662a81f0e3bf7c19054146926e3f40a1b2e7a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Jun 2024 08:09:52 -0700 Subject: [PATCH 05/12] Enable extension logging --- .../src/bld/java/com/example/ExampleBuild.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 51fc4c5..352cb20 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -3,11 +3,9 @@ package com.example; import rife.bld.BuildCommand; import rife.bld.Project; import rife.bld.extension.CompileKotlinOperation; -import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; import java.io.IOException; -import java.nio.file.Path; import java.util.List; import java.util.logging.ConsoleHandler; import java.util.logging.Level; @@ -45,14 +43,14 @@ public class ExampleBuild extends Project { public static void main(String[] args) { // Enable detailed logging for the Kotlin extension -// var level = Level.ALL; -// var logger = Logger.getLogger("rife.bld.extension"); -// var consoleHandler = new ConsoleHandler(); -// -// consoleHandler.setLevel(level); -// logger.addHandler(consoleHandler); -// logger.setLevel(level); -// logger.setUseParentHandlers(false); + var level = Level.ALL; + var logger = Logger.getLogger("rife.bld.extension"); + var consoleHandler = new ConsoleHandler(); + + consoleHandler.setLevel(level); + logger.addHandler(consoleHandler); + logger.setLevel(level); + logger.setUseParentHandlers(false); new ExampleBuild().start(args); } From c151a49935907eb134dfea4266be1155c1c9a6cf Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Jun 2024 08:10:21 -0700 Subject: [PATCH 06/12] Fixed license template --- .idea/copyright/Apache_License.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index ade80da..4446c15 100644 --- a/.idea/copyright/Apache_License.xml +++ b/.idea/copyright/Apache_License.xml @@ -1,6 +1,6 @@ - - + \ No newline at end of file From c5956327324f7649f83f89e1b4d52dc6443e0543 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Jun 2024 08:17:30 -0700 Subject: [PATCH 07/12] Clean up and moved compile options and plugins to sub-package --- .../CompileOptions.java} | 272 +++++++++++++----- .../CompilerPlugin.java} | 22 +- 2 files changed, 219 insertions(+), 75 deletions(-) rename src/main/java/rife/bld/extension/{CompileKotlinOptions.java => kotlin/CompileOptions.java} (68%) rename src/main/java/rife/bld/extension/{CompileKotlinPlugin.java => kotlin/CompilerPlugin.java} (63%) diff --git a/src/main/java/rife/bld/extension/CompileKotlinOptions.java b/src/main/java/rife/bld/extension/kotlin/CompileOptions.java similarity index 68% rename from src/main/java/rife/bld/extension/CompileKotlinOptions.java rename to src/main/java/rife/bld/extension/kotlin/CompileOptions.java index 890f3c0..7703105 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinOptions.java +++ b/src/main/java/rife/bld/extension/kotlin/CompileOptions.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package rife.bld.extension; +package rife.bld.extension.kotlin; + +import rife.bld.extension.CompileKotlinOperation; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import static rife.bld.extension.CompileKotlinOperation.isNotBlank; @@ -30,30 +30,30 @@ import static rife.bld.extension.CompileKotlinOperation.isNotBlank; * @author Erik C. Thauvin * @since 1.0 */ -public class CompileKotlinOptions { - private final List advancedOptions_ = new ArrayList<>(); - private final List argFile_ = new ArrayList<>(); - private final List classpath_ = new ArrayList<>(); - private final List jvmOptions_ = new ArrayList<>(); - private final List optIn_ = new ArrayList<>(); - private final List options_ = new ArrayList<>(); - private final List plugin_ = new ArrayList<>(); - private final List scriptTemplates_ = new ArrayList<>(); +public class CompileOptions { + private final Collection advancedOptions_ = new ArrayList<>(); + private final Collection argFile_ = new ArrayList<>(); + private final Collection classpath_ = new ArrayList<>(); + private final Collection jvmOptions_ = new ArrayList<>(); + private final Collection optIn_ = new ArrayList<>(); + private final Collection options_ = new ArrayList<>(); + private final Collection plugin_ = new ArrayList<>(); + private final Collection scriptTemplates_ = new ArrayList<>(); private String apiVersion_; private String expression_; private boolean includeRuntime_; private boolean javaParameters_; - private String jdkHome_; + private File jdkHome_; private String jdkRelease_; private String jvmTarget_; - private String kotlinHome_; + private File kotlinHome_; private String languageVersion_; private String moduleName_; private boolean noJdk_; private boolean noReflect_; private boolean noStdLib_; private boolean noWarn_; - private String path_; + private File path_; private boolean progressive_; private boolean verbose_; private boolean wError_; @@ -64,7 +64,7 @@ public class CompileKotlinOptions { * @param options one or more advanced options * @return this operation instance */ - public CompileKotlinOptions advancedOptions(String... options) { + public CompileOptions advancedOptions(String... options) { Collections.addAll(advancedOptions_, options); return this; } @@ -75,18 +75,27 @@ public class CompileKotlinOptions { * @param options list of compiler options * @return this operation instance */ - public CompileKotlinOptions advancedOptions(Collection options) { + public CompileOptions advancedOptions(Collection options) { advancedOptions_.addAll(options); return this; } + /** + * Retrieves advanced compiler options. + * + * @return the advanced compiler options + */ + public Collection advancedOptions() { + return advancedOptions_; + } + /** * Allow using declarations only from the specified version of Kotlin bundled libraries. * * @param version the api version * @return this operation instance */ - public CompileKotlinOptions apiVersion(String version) { + public CompileOptions apiVersion(String version) { apiVersion_ = version; return this; } @@ -97,7 +106,7 @@ public class CompileKotlinOptions { * @param version the api version * @return this operation instance */ - public CompileKotlinOptions apiVersion(int version) { + public CompileOptions apiVersion(int version) { apiVersion_ = String.valueOf(version); return this; } @@ -120,11 +129,37 @@ public class CompileKotlinOptions { * @param files one or more files * @return this operation instance */ - public CompileKotlinOptions argFile(String... files) { + public CompileOptions argFile(String... files) { + Collections.addAll(argFile_, Arrays.stream(files) + .map(File::new) + .toArray(File[]::new)); + return this; + } + + /** + * Read the compiler options from the given files. + *

    + * Such a file can contain compiler options with values and paths to the source files. + * Options and paths should be separated by whitespaces. For example: + *

      + *
    • {@code -include-runtime -d hello.jar hello.kt}
    • + *
    + * To pass values that contain whitespaces, surround them with single ({@code '}) or double ({@code "}) quotes. + * If a value contains quotation marks in it, escape them with a backslash (\). + *
      + *
    • {@code -include-runtime -d 'My folder'}
    • + *
    + * If the files reside in locations different from the current directory, use relative paths. + * + * @param files one or more files + * @return this operation instance + */ + public CompileOptions argFile(File... files) { Collections.addAll(argFile_, files); return this; } + /** * Read the compiler options from the given files. * @@ -132,11 +167,20 @@ public class CompileKotlinOptions { * @return this operation instance * @see #argFile(String...) */ - public CompileKotlinOptions argFile(Collection files) { + public CompileOptions argFile(Collection files) { argFile_.addAll(files); return this; } + /** + * Retrieves the files containing compiler options. + * + * @return the list of files + */ + public Collection argFile() { + return argFile_; + } + /** * Returns the formatted arguments. * @@ -153,13 +197,13 @@ public class CompileKotlinOptions { // @argfile if (!argFile_.isEmpty()) { - argFile_.forEach(f -> args.add("@" + f)); + argFile_.forEach(f -> args.add("@" + f.getAbsolutePath())); } // classpath if (!classpath_.isEmpty()) { args.add("-classpath"); - args.add(String.join(File.pathSeparator, classpath_)); + args.add(classpath_.stream().map(File::getAbsolutePath).collect(Collectors.joining(File.pathSeparator))); } // expression @@ -185,9 +229,9 @@ public class CompileKotlinOptions { } // jdk-home - if (isNotBlank(jdkHome_)) { + if (jdkHome_ != null) { args.add("-jdk-home"); - args.add(jdkHome_); + args.add(jdkHome_.getAbsolutePath()); } // jdk-release @@ -201,9 +245,9 @@ public class CompileKotlinOptions { } // kotlin-home - if (isNotBlank(kotlinHome_)) { + if (kotlinHome_ != null) { args.add("-kotlin-home"); - args.add(kotlinHome_); + args.add(kotlinHome_.getAbsolutePath()); } // language-version @@ -250,9 +294,9 @@ public class CompileKotlinOptions { } // path - if (isNotBlank(path_)) { + if (path_ != null) { args.add("-d"); - args.add(path_); + args.add(path_.getAbsolutePath()); } // plugin @@ -298,7 +342,22 @@ public class CompileKotlinOptions { * @param paths one pr more paths * @return this operation instance */ - public CompileKotlinOptions classpath(String... paths) { + public CompileOptions classpath(String... paths) { + Collections.addAll(classpath_, Arrays.stream(paths) + .map(File::new) + .toArray(File[]::new)); + return this; + } + + /** + * Search for class files in the specified paths. + *

    + * The classpath can contain file and directory paths, ZIP, or JAR files. + * + * @param paths one or more path + * @return this operation instance + */ + public CompileOptions classpath(File... paths) { Collections.addAll(classpath_, paths); return this; } @@ -311,18 +370,27 @@ public class CompileKotlinOptions { * @param paths the list of paths * @return this operation instance */ - public CompileKotlinOptions classpath(Collection paths) { + public CompileOptions classpath(Collection paths) { classpath_.addAll(paths); return this; } + /** + * Retrieves the class files classpath. + * + * @return the list of classpath + */ + public Collection classpath() { + return classpath_; + } + /** * Evaluate the given string as a Kotlin script. * * @param expression the expression * @return this operation instance */ - public CompileKotlinOptions expression(String expression) { + public CompileOptions expression(String expression) { expression_ = expression; return this; } @@ -343,18 +411,27 @@ public class CompileKotlinOptions { * @param includeRuntime {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions includeRuntime(boolean includeRuntime) { + public CompileOptions includeRuntime(boolean includeRuntime) { includeRuntime_ = includeRuntime; return this; } + /** + * Indicates whether {@link #verbose(boolean)} was set. + * + * @return {@code true} if verbose was set; or {@code false} otherwise + */ + public boolean isVerbose() { + return verbose_; + } + /** * Generate metadata for Java 1.8 reflection on method parameters. * * @param javaParameters {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions javaParameters(boolean javaParameters) { + public CompileOptions javaParameters(boolean javaParameters) { javaParameters_ = javaParameters; return this; } @@ -365,7 +442,18 @@ public class CompileKotlinOptions { * @param jdkHome the JDK home path * @return this operation instance */ - public CompileKotlinOptions jdkHome(String jdkHome) { + public CompileOptions jdkHome(String jdkHome) { + jdkHome_ = new File(jdkHome); + return this; + } + + /** + * Use a custom JDK home directory to include into the classpath if it differs from the default {@code JAVA_HOME}. + * + * @param jdkHome the JDK home path + * @return this operation instance + */ + public CompileOptions jdkHome(File jdkHome) { jdkHome_ = jdkHome; return this; } @@ -381,7 +469,7 @@ public class CompileKotlinOptions { * @param version the target version * @return this operation instance */ - public CompileKotlinOptions jdkRelease(String version) { + public CompileOptions jdkRelease(String version) { jdkRelease_ = version; return this; } @@ -393,7 +481,7 @@ public class CompileKotlinOptions { * @return this operation instance * @see #jdkRelease(String) */ - public CompileKotlinOptions jdkRelease(int version) { + public CompileOptions jdkRelease(int version) { jdkRelease_ = String.valueOf(version); return this; } @@ -404,18 +492,27 @@ public class CompileKotlinOptions { * @param jvmOptions one or more JVM option * @return this operation instance */ - public CompileKotlinOptions jvmOptions(String... jvmOptions) { + public CompileOptions jvmOptions(String... jvmOptions) { Collections.addAll(jvmOptions_, jvmOptions); return this; } + /** + * Retrieves the JVM options. + * + * @return the list of options + */ + public Collection jvmOptions() { + return jvmOptions_; + } + /** * Pass an option directly to JVM * * @param jvmOptions the list JVM options * @return this operation instance */ - public CompileKotlinOptions jvmOptions(Collection jvmOptions) { + public CompileOptions jvmOptions(Collection jvmOptions) { jvmOptions_.addAll(jvmOptions); return this; } @@ -428,7 +525,7 @@ public class CompileKotlinOptions { * @param target the target version * @return this operation instance */ - public CompileKotlinOptions jvmTarget(String target) { + public CompileOptions jvmTarget(String target) { jvmTarget_ = target; return this; } @@ -440,7 +537,7 @@ public class CompileKotlinOptions { * @return this operation instance * @see #jvmTarget(String) */ - public CompileKotlinOptions jvmTarget(int target) { + public CompileOptions jvmTarget(int target) { jvmTarget_ = String.valueOf(target); return this; } @@ -451,18 +548,29 @@ public class CompileKotlinOptions { * @param path the Kotlin home path * @return this operation instance */ - public CompileKotlinOptions kotlinHome(String path) { + public CompileOptions kotlinHome(File path) { kotlinHome_ = path; return this; } + /** + * Specify a custom path to the Kotlin compiler used for the discovery of runtime libraries. + * + * @param path the Kotlin home path + * @return this operation instance + */ + public CompileOptions kotlinHome(String path) { + kotlinHome_ = new File(path); + return this; + } + /** * Provide source compatibility with the specified version of Kotlin. * * @param version the language version * @return this operation instance */ - public CompileKotlinOptions languageVersion(String version) { + public CompileOptions languageVersion(String version) { languageVersion_ = version; return this; } @@ -473,7 +581,7 @@ public class CompileKotlinOptions { * @param name the module name * @return this operation instance */ - public CompileKotlinOptions moduleName(String name) { + public CompileOptions moduleName(String name) { moduleName_ = name; return this; } @@ -484,7 +592,7 @@ public class CompileKotlinOptions { * @param noJdk {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions noJdk(boolean noJdk) { + public CompileOptions noJdk(boolean noJdk) { noJdk_ = noJdk; return this; } @@ -495,7 +603,7 @@ public class CompileKotlinOptions { * @param noReflect {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions noReflect(boolean noReflect) { + public CompileOptions noReflect(boolean noReflect) { noReflect_ = noReflect; return this; } @@ -507,7 +615,7 @@ public class CompileKotlinOptions { * @param noStdLib {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions noStdLib(boolean noStdLib) { + public CompileOptions noStdLib(boolean noStdLib) { noStdLib_ = noStdLib; return this; } @@ -518,7 +626,7 @@ public class CompileKotlinOptions { * @param noWarn {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions noWarn(boolean noWarn) { + public CompileOptions noWarn(boolean noWarn) { noWarn_ = noWarn; return this; } @@ -529,18 +637,27 @@ public class CompileKotlinOptions { * @param annotations one or more annotation names * @return this operation instance */ - public CompileKotlinOptions optIn(String... annotations) { + public CompileOptions optIn(String... annotations) { Collections.addAll(optIn_, annotations); return this; } + /** + * Retrieves the opt-in fully qualified names. + * + * @return the list of fully qualified names + */ + public Collection optIn() { + return optIn_; + } + /** * Enable usages of API that requires opt-in with a requirement annotation with the given fully qualified name. * * @param annotations list of annotation names * @return this operation instance */ - public CompileKotlinOptions optIn(Collection annotations) { + public CompileOptions optIn(Collection annotations) { optIn_.addAll(annotations); return this; } @@ -551,18 +668,27 @@ public class CompileKotlinOptions { * @param options one or more compiler options * @return this operation instance */ - public CompileKotlinOptions options(String... options) { + public CompileOptions options(String... options) { Collections.addAll(options_, options); return this; } + /** + * Retrieves additional compiler options. + * + * @return the list of options + */ + public Collection options() { + return options_; + } + /** * Specify additional compiler options. * * @param options list of compiler options * @return this operation instance */ - public CompileKotlinOptions options(Collection options) { + public CompileOptions options(Collection options) { options_.addAll(options); return this; } @@ -575,8 +701,8 @@ public class CompileKotlinOptions { * @param path the location path * @return this operation instance */ - public CompileKotlinOptions path(File path) { - path_ = path.getAbsolutePath(); + public CompileOptions path(File path) { + path_ = path; return this; } @@ -588,8 +714,8 @@ public class CompileKotlinOptions { * @param path the location path * @return this operation instance */ - public CompileKotlinOptions path(String path) { - path_ = path; + public CompileOptions path(String path) { + path_ = new File(path); return this; } @@ -601,18 +727,27 @@ public class CompileKotlinOptions { * @param value the plugin option value * @return this operation instance */ - public CompileKotlinOptions plugin(String id, String optionName, String value) { + public CompileOptions plugin(String id, String optionName, String value) { plugin_.add(id + ':' + optionName + ':' + value); return this; } + /** + * Retrieves the plugin options. + * + * @return the list ofoptions. + */ + public Collection plugin() { + return plugin_; + } + /** * Allow using declarations only from the specified version of Kotlin bundled libraries. * * @param progressive {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions progressive(boolean progressive) { + public CompileOptions progressive(boolean progressive) { progressive_ = progressive; return this; } @@ -625,11 +760,20 @@ public class CompileKotlinOptions { * @param classNames one or more class names * @return this operation instance */ - public CompileKotlinOptions scriptTemplates(String... classNames) { + public CompileOptions scriptTemplates(String... classNames) { Collections.addAll(scriptTemplates_, classNames); return this; } + /** + * Retrieves the script templates. + * + * @return the list of templates. + */ + public Collection scriptTemplates() { + return scriptTemplates_; + } + /** * Script definition template classes. *

    @@ -638,7 +782,7 @@ public class CompileKotlinOptions { * @param classNames the list class names * @return this operation instance */ - public CompileKotlinOptions scriptTemplates(Collection classNames) { + public CompileOptions scriptTemplates(Collection classNames) { scriptTemplates_.addAll(classNames); return this; } @@ -649,7 +793,7 @@ public class CompileKotlinOptions { * @param verbose {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions verbose(boolean verbose) { + public CompileOptions verbose(boolean verbose) { verbose_ = verbose; return this; } @@ -660,7 +804,7 @@ public class CompileKotlinOptions { * @param wError {@code true} or {@code false} * @return this operation instance */ - public CompileKotlinOptions wError(boolean wError) { + public CompileOptions wError(boolean wError) { wError_ = wError; return this; } diff --git a/src/main/java/rife/bld/extension/CompileKotlinPlugin.java b/src/main/java/rife/bld/extension/kotlin/CompilerPlugin.java similarity index 63% rename from src/main/java/rife/bld/extension/CompileKotlinPlugin.java rename to src/main/java/rife/bld/extension/kotlin/CompilerPlugin.java index 16c0424..7a3d94e 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinPlugin.java +++ b/src/main/java/rife/bld/extension/kotlin/CompilerPlugin.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package rife.bld.extension; +package rife.bld.extension.kotlin; /** * Defines the known Kotlin compiler plugins match (regex) strings. @@ -22,18 +22,18 @@ package rife.bld.extension; * @author Erik C. Thauvin * @since 1.0 */ -public enum CompileKotlinPlugin { - ALL_OPEN("^allopen-compiler-plugin-.*$"), - ASSIGNMENT("^assignment-compiler-plugin-.*$"), +public enum CompilerPlugin { + ALL_OPEN("^kotlin-allopen-compiler-plugin-.*$"), + ASSIGNMENT("^kotlin-assignment-compiler-plugin-.*$"), KOTLIN_SERIALIZATION("^kotlin-serialization-compiler-plugin-.*$"), - LOMBOK("^lombok-compiler-plugin-.*$"), - NOARG("^noarg-compiler-plugin-.*$"), - POWER_ASSERT("^power-assert-compiler-plugin-.*$"), - SAM_WITH_RECEIVER("^sam-with-receiver-compiler-plugin-.*$"); + LOMBOK("^kotlin-lombok-compiler-plugin-.*$"), + NOARG("^kotlin-noarg-compiler-plugin-.*$"), + POWER_ASSERT("^kotlin-power-assert-compiler-plugin-.*$"), + SAM_WITH_RECEIVER("^kotlin-sam-with-receiver-compiler-plugin-.*$"); - public final String label; + public final String regex; - CompileKotlinPlugin(String label) { - this.label = label; + CompilerPlugin(String regex) { + this.regex = regex; } } From c54672a7a0bf1987499ad9672f752fb4c609172d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Jun 2024 08:18:32 -0700 Subject: [PATCH 08/12] Add string array parameters to overloaded methods where applicable --- .../bld/extension/CompileKotlinOperation.java | 150 ++++++++++++------ 1 file changed, 99 insertions(+), 51 deletions(-) diff --git a/src/main/java/rife/bld/extension/CompileKotlinOperation.java b/src/main/java/rife/bld/extension/CompileKotlinOperation.java index f8ce05e..cc28873 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinOperation.java +++ b/src/main/java/rife/bld/extension/CompileKotlinOperation.java @@ -18,6 +18,8 @@ package rife.bld.extension; import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler; import rife.bld.BaseProject; +import rife.bld.extension.kotlin.CompileOptions; +import rife.bld.extension.kotlin.CompilerPlugin; import rife.bld.operations.AbstractOperation; import rife.tools.FileUtils; @@ -26,7 +28,6 @@ import java.io.IOException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Pattern; /** * Compiles main and test Kotlin sources in the relevant build directories. @@ -35,10 +36,6 @@ import java.util.regex.Pattern; * @since 1.0 */ public class CompileKotlinOperation extends AbstractOperation { - /** - * The Kotlin file (.kt) pattern. - */ - public static final Pattern KOTLIN_FILE_PATTERN = Pattern.compile("^.*\\.kt$"); private static final Logger LOGGER = Logger.getLogger(CompileKotlinOperation.class.getName()); private final Collection compileMainClasspath_ = new ArrayList<>(); private final Collection compileTestClasspath_ = new ArrayList<>(); @@ -49,7 +46,7 @@ public class CompileKotlinOperation extends AbstractOperation testSourceFiles_ = new ArrayList<>(); private File buildMainDirectory_; private File buildTestDirectory_; - private CompileKotlinOptions compileOptions_ = new CompileKotlinOptions(); + private CompileOptions compileOptions_ = new CompileOptions(); private BaseProject project_; /** @@ -77,26 +74,6 @@ public class CompileKotlinOperation extends AbstractOperation getKotlinFileList(File directory) { - if (directory == null) { - return Collections.emptyList(); - } else if (!directory.exists()) { - if (LOGGER.isLoggable(Level.WARNING)) { - LOGGER.warning("Directory not found: " + directory.getAbsolutePath()); - } - return Collections.emptyList(); - } else { - return FileUtils.getFileList(directory, KOTLIN_FILE_PATTERN, null).stream().map((file) -> - new File(directory, file)).toList(); - } - } - /** * Determines if the given string is not blank. * @@ -121,7 +98,7 @@ public class CompileKotlinOperation extends AbstractOperation compileMainClasspath() { return compileMainClasspath_; @@ -181,9 +158,9 @@ public class CompileKotlinOperation extends AbstractOperation compileTestClasspath() { return compileTestClasspath_; @@ -317,7 +294,7 @@ public class CompileKotlinOperation extends AbstractOperation mainSourceDirectories() { return mainSourceDirectories_; @@ -433,6 +423,19 @@ public class CompileKotlinOperation extends AbstractOperation mainSourceFiles() { return mainSourceFiles_; @@ -464,6 +467,15 @@ public class CompileKotlinOperation extends AbstractOperation plugins() { + return plugins_; + } + /** * Provides compiler plugins. * @@ -482,9 +494,22 @@ public class CompileKotlinOperation extends AbstractOperation jars, CompileKotlinPlugin... plugins) { + public CompileKotlinOperation plugins(Collection jars, CompilerPlugin... plugins) { jars.forEach(jar -> { for (var plugin : plugins) { - if (jar.getName().matches(plugin.label)) { + if (jar.getName().matches(plugin.regex)) { plugins_.add(jar.getAbsolutePath()); break; } @@ -512,10 +537,7 @@ public class CompileKotlinOperation extends AbstractOperation sources(Collection files, Collection directories) { var sources = new ArrayList<>(files); - for (var directory : directories) { - sources.addAll(getKotlinFileList(directory)); - } - + sources.addAll(directories); return sources; } @@ -530,6 +552,19 @@ public class CompileKotlinOperation extends AbstractOperation testSourceDirectories() { return testSourceDirectories_; @@ -561,6 +596,19 @@ public class CompileKotlinOperation extends AbstractOperation new File[files.length])); + return this; + } + /** * Provides a list of test files that should be compiled. * @@ -573,9 +621,9 @@ public class CompileKotlinOperation extends AbstractOperation testSourceFiles() { return testSourceFiles_; From c901065b3a0a00e5b5e4f86940153bda32140909 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Jun 2024 08:19:34 -0700 Subject: [PATCH 09/12] Improved code and tests Bumped Exec extension to 1.0.1 Bumped PMD extension to 1.1.0 --- .idea/misc.xml | 11 ++ lib/bld/bld-wrapper.properties | 6 +- .../CompileKotlinOperationBuild.java | 1 + .../bld/extension/CompileKotlinOperation.java | 101 ++++++------ .../bld/extension/kotlin/CompileOptions.java | 59 ++++--- .../extension/CompileKotlinOperationTest.java | 46 ++++++ .../CompileOptionsTest.java} | 148 ++++++++++++------ 7 files changed, 235 insertions(+), 137 deletions(-) rename src/test/java/rife/bld/extension/{CompileKotlinOptionsTest.java => kotlin/CompileOptionsTest.java} (56%) diff --git a/.idea/misc.xml b/.idea/misc.xml index b386dc0..4e456d4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,18 @@ + + + + + + + + + + +

    * The classpath can contain file and directory paths, ZIP, or JAR files. * - * @param paths the list of paths + * @param paths the search paths * @return this operation instance */ public CompileOptions classpath(Collection paths) { @@ -378,7 +377,7 @@ public class CompileOptions { /** * Retrieves the class files classpath. * - * @return the list of classpath + * @return the class files classpath */ public Collection classpath() { return classpath_; @@ -493,23 +492,23 @@ public class CompileOptions { * @return this operation instance */ public CompileOptions jvmOptions(String... jvmOptions) { - Collections.addAll(jvmOptions_, jvmOptions); + jvmOptions_.addAll(List.of(jvmOptions)); return this; } /** - * Retrieves the JVM options. + * Retrieves the Java Virtual Machine options. * - * @return the list of options + * @return the JVM options */ public Collection jvmOptions() { return jvmOptions_; } /** - * Pass an option directly to JVM + * Pass an option directly to Java Virtual Machine * - * @param jvmOptions the list JVM options + * @param jvmOptions the JVM options * @return this operation instance */ public CompileOptions jvmOptions(Collection jvmOptions) { @@ -638,14 +637,14 @@ public class CompileOptions { * @return this operation instance */ public CompileOptions optIn(String... annotations) { - Collections.addAll(optIn_, annotations); + optIn_.addAll(List.of(annotations)); return this; } /** * Retrieves the opt-in fully qualified names. * - * @return the list of fully qualified names + * @return the fully qualified names */ public Collection optIn() { return optIn_; @@ -654,7 +653,7 @@ public class CompileOptions { /** * Enable usages of API that requires opt-in with a requirement annotation with the given fully qualified name. * - * @param annotations list of annotation names + * @param annotations the annotation names * @return this operation instance */ public CompileOptions optIn(Collection annotations) { @@ -669,14 +668,14 @@ public class CompileOptions { * @return this operation instance */ public CompileOptions options(String... options) { - Collections.addAll(options_, options); + options_.addAll(List.of(options)); return this; } /** * Retrieves additional compiler options. * - * @return the list of options + * @return the compiler options */ public Collection options() { return options_; @@ -685,7 +684,7 @@ public class CompileOptions { /** * Specify additional compiler options. * - * @param options list of compiler options + * @param options the compiler options * @return this operation instance */ public CompileOptions options(Collection options) { @@ -735,7 +734,7 @@ public class CompileOptions { /** * Retrieves the plugin options. * - * @return the list ofoptions. + * @return the plugin ofoptions. */ public Collection plugin() { return plugin_; @@ -761,14 +760,14 @@ public class CompileOptions { * @return this operation instance */ public CompileOptions scriptTemplates(String... classNames) { - Collections.addAll(scriptTemplates_, classNames); + scriptTemplates_.addAll(List.of(classNames)); return this; } /** * Retrieves the script templates. * - * @return the list of templates. + * @return the script templates. */ public Collection scriptTemplates() { return scriptTemplates_; @@ -779,7 +778,7 @@ public class CompileOptions { *

    * Use fully qualified class names. * - * @param classNames the list class names + * @param classNames the class names * @return this operation instance */ public CompileOptions scriptTemplates(Collection classNames) { diff --git a/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java b/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java index f64e6d3..45c8580 100644 --- a/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java +++ b/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java @@ -18,7 +18,10 @@ package rife.bld.extension; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import rife.bld.Project; import rife.bld.blueprints.BaseProjectBlueprint; +import rife.bld.extension.kotlin.CompileOptions; +import rife.bld.extension.kotlin.CompilerPlugin; import rife.tools.FileUtils; import java.io.File; @@ -26,6 +29,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.logging.ConsoleHandler; @@ -46,6 +50,48 @@ class CompileKotlinOperationTest { logger.setUseParentHandlers(false); } + @Test + void testCollections() { + var op = new CompileKotlinOperation() + .fromProject(new Project()) + .compileMainClasspath("path1", "path2") + .compileOptions(new CompileOptions().jdkRelease("17").verbose(true)) + .mainSourceDirectories("dir1", "dir2") + .mainSourceDirectories(List.of(new File("dir3"), new File("dir4"))) + .mainSourceFiles("file1", "file2") + .mainSourceFiles(List.of(new File("file3"), new File("file4"))) + .mainSourceFiles(new File("file5"), new File("file6")) + .testSourceDirectories("tdir1", "tdir2") + .testSourceDirectories(List.of(new File("tdir3"), new File("tdir4"))) + .testSourceFiles("tfile1", "tfile2") + .testSourceFiles(List.of(new File("tfile3"), new File("tfile4"))) + .testSourceFiles(new File("tfile5"), new File("tfile6")) + .plugins("plugin1", "plugin2") + .plugins(CompilerPlugin.KOTLIN_SERIALIZATION, CompilerPlugin.ASSIGNMENT) + .plugins(new File("lib/compile"), CompilerPlugin.LOMBOK, CompilerPlugin.POWER_ASSERT) + .plugins(List.of("plugin3", "plugin4")) + .plugins(Arrays.stream(Objects.requireNonNull(new File("lib/compile").listFiles())).toList(), + CompilerPlugin.ALL_OPEN, CompilerPlugin.SAM_WITH_RECEIVER); + + assertThat(op.compileMainClasspath()).as("compileMainClassPath") + .containsAll(List.of("path1", "path2")); + assertThat(op.compileOptions().hasRelease()).as("hasRelease").isTrue(); + assertThat(op.compileOptions().isVerbose()).as("isVerbose").isTrue(); + assertThat(op.mainSourceDirectories()).as("mainSourceDirectories").containsExactly( + Path.of("src", "main", "kotlin").toFile().getAbsoluteFile(), new File("dir1"), + new File("dir2"), new File("dir3"), new File("dir4")); + assertThat(op.testSourceDirectories()).as("testSourceDirectories").containsOnly( + Path.of("src", "test", "kotlin").toFile().getAbsoluteFile(), new File("tdir1"), + new File("tdir2"), new File("tdir3"), new File("tdir4")); + assertThat(op.mainSourceFiles()).as("mainSourceFiles").containsOnly( + new File("file1"), new File("file2"), new File("file3"), + new File("file4"), new File("file5"), new File("file6")); + assertThat(op.testSourceFiles()).as("testSourceFiles").containsOnly( + new File("tfile1"), new File("tfile2"), new File("tfile3"), + new File("tfile4"), new File("tfile5"), new File("tfile6")); + assertThat(op.plugins()).hasSize(10); + } + @Test void testExecute() throws IOException { var tmpDir = Files.createTempDirectory("bld-kotlin").toFile(); diff --git a/src/test/java/rife/bld/extension/CompileKotlinOptionsTest.java b/src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java similarity index 56% rename from src/test/java/rife/bld/extension/CompileKotlinOptionsTest.java rename to src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java index 5c075fb..25df90b 100644 --- a/src/test/java/rife/bld/extension/CompileKotlinOptionsTest.java +++ b/src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package rife.bld.extension; +package rife.bld.extension.kotlin; import org.junit.jupiter.api.Test; @@ -23,61 +23,39 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; @SuppressWarnings("PMD.AvoidDuplicateLiterals") -class CompileKotlinOptionsTest { - @Test - void argsCollectionTest() { - var args = new CompileKotlinOptions() - .advancedOptions(List.of("Xoption1", "Xoption2")) - .argFile(List.of("arg1.txt", "arg2.txt")) - .classpath(List.of("path1", "path2")) - .jvmOptions(List.of("option1", "option2")) - .noStdLib(false) - .optIn(List.of("opt1", "opt2")) - .options(List.of("-foo", "-bar")) - .scriptTemplates(List.of("temp1", "temp2")) - .args(); - var matches = List.of( - "@arg1.txt", "@arg2.txt", - "-classpath", "path1:path2", - "-Joption1", "-Joption2", - "-opt-in", "opt1", - "-opt-in", "opt2", - "-foo", "-bar", - "-script-templates", - "temp1,temp2", - "-XXoption1", "-XXoption2"); - - for (var arg : args) { - var found = false; - for (var match : matches) { - if (match.equals(arg)) { - found = true; - break; - } - } - assertThat(found).as(arg).isTrue(); - } +class CompileOptionsTest { + /** + * Returns the local path of the given file names. + * + * @param fileNames The file names + * @return the local path + */ + private String localPath(String... fileNames) { + return Arrays.stream(fileNames).map(it -> new File(it).getAbsolutePath()) + .collect(Collectors.joining(File.pathSeparator)); } - @Test - void argsTest() { - var options = new CompileKotlinOptions() + @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") + void testArgs() { + var options = new CompileOptions() .apiVersion("11") - .argFile("file.txt", "file2.txt") - .classpath("path1", "path2") + .argFile(new File("file.txt"), new File("file2.txt")) + .classpath(new File("path1"), new File("path2")) .javaParameters(true) .jvmTarget("11") .includeRuntime(true) - .jdkHome("path") + .jdkHome(new File("path")) .jdkRelease("11") - .kotlinHome("path") + .kotlinHome(new File("path")) .languageVersion("1.0") .moduleName("module") .noJdk(true) @@ -94,14 +72,14 @@ class CompileKotlinOptionsTest { var matches = List.of( "-api-version", "11", - "@file.txt", "@file2.txt", - "-classpath", "path1" + File.pathSeparator + "path2", + "@" + localPath("file.txt"), "@" + localPath("file2.txt"), + "-classpath", localPath("path1", "path2"), "-java-parameters", "-jvm-target", "11", "-include-runtime", - "-jdk-home", "path", + "-jdk-home", localPath("path"), "-Xjdk-release=11", - "-kotlin-home", "path", + "-kotlin-home", localPath("path"), "-language-version", "1.0", "-module-name", "module", "-no-jdk", @@ -111,7 +89,7 @@ class CompileKotlinOptionsTest { "-opt-in", "opt2", "-foo", "-bar", - "-d", "path", + "-d", localPath("path"), "-P", "plugin:id:name:value", "-progressive", "-script-templates", "name,name2", @@ -123,18 +101,86 @@ class CompileKotlinOptionsTest { args.add(options.apiVersion(11).jvmTarget(11).args()); for (var a : args) { - assertThat(a).hasSize(matches.size()); IntStream.range(0, a.size()).forEach(i -> assertThat(a.get(i)).isEqualTo(matches.get(i))); } } @Test - void checkAllParamsTest() throws IOException { + void testArgsCollections() { + var advanceOptions = List.of("Xoption1", "Xoption2"); + var argFile = List.of(new File("arg1.txt"), new File("arg2.txt")); + var classpath = List.of(new File("path1"), new File("path2")); + var jvmOptions = List.of("option1", "option2"); + var optIn = List.of("opt1", "opt2"); + var options = List.of("-foo", "-bar"); + var plugin = List.of("id:name:value", "id2:name2:value2"); + var scriptTemplates = List.of("temp1", "temp2"); + + var op = new CompileOptions() + .advancedOptions(advanceOptions) + .argFile(argFile) + .classpath(classpath) + .jvmOptions(jvmOptions) + .noStdLib(false) + .optIn(optIn) + .options(options) + .scriptTemplates(scriptTemplates); + + plugin.forEach(it -> { + var p = it.split(":"); + op.plugin(p[0], p[1], p[2]); + }); + + assertThat(op.advancedOptions()).as("advancedOptions") + .hasSize(advanceOptions.size()).containsAll(advanceOptions); + assertThat(op.argFile()).as("argFile") + .hasSize(argFile.size()).containsAll(argFile); + assertThat(op.classpath()).as("classpath") + .hasSize(classpath.size()).containsAll(classpath); + assertThat(op.jvmOptions()).as("jvmOptions") + .hasSize(jvmOptions.size()).containsAll(jvmOptions); + assertThat(op.optIn()).as("optIn") + .hasSize(optIn.size()).containsAll(optIn); + assertThat(op.options()).as("options") + .hasSize(options.size()).containsAll(options); + assertThat(op.plugin()).as("plugin") + .hasSize(plugin.size()).containsAll(plugin); + assertThat(op.scriptTemplates()).as("scriptTemplates") + .hasSize(scriptTemplates.size()).containsAll(scriptTemplates); + + var matches = List.of( + '@' + localPath("arg1.txt"), '@' + localPath("arg2.txt"), + "-classpath", localPath("path1", "path2"), + "-Joption1", "-Joption2", + "-opt-in", "opt1", + "-opt-in", "opt2", + "-foo", "-bar", + "-script-templates", + "temp1,temp2", + "-XXoption1", "-XXoption2", + "-P", "plugin:id:name:value", + "-P", "plugin:id2:name2:value2"); + + var args = op.args(); + for (var arg : args) { + var found = false; + for (var match : matches) { + if (match.equals(arg)) { + found = true; + break; + } + } + assertThat(found).as(arg).isTrue(); + } + } + + @Test + void testCheckAllParams() throws IOException { var args = Files.readAllLines(Paths.get("src", "test", "resources", "kotlinc-args.txt")); assertThat(args).isNotEmpty(); - var params = new CompileKotlinOptions() + var params = new CompileOptions() .advancedOptions("Xoption") .argFile("file") .classpath("classpath") @@ -152,7 +198,7 @@ class CompileKotlinOptionsTest { .noWarn(true) .optIn("annotation") .options("option") - .path("path") + .path(new File("path")) .plugin("id", "option", "value") .progressive(true) .scriptTemplates("template") From c952b980bba1d5b20afdbd0c36ecc5b3a4cd38b6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Jun 2024 20:13:27 -0700 Subject: [PATCH 10/12] Ensured exit status is set on failure --- README.md | 2 +- .../bld/java/com/example/ExampleBuild.java | 2 +- .../bld/extension/CompileKotlinOperation.java | 25 ++++++++++--------- .../extension/CompileKotlinOperationTest.java | 3 +-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 8c1d080..e1c974a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ To compile the source code located in `src/main/kotlin` and `src/test/kotlin` fr ```java @BuildCommand(summary = "Compiles the Kotlin project") -public void compile() throws IOException { +public void compile() throws Exception { new CompileKotlinOperation() .fromProject(this) .execute(); diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 352cb20..7461aff 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -57,7 +57,7 @@ public class ExampleBuild extends Project { @BuildCommand(summary = "Compiles the Kotlin project") @Override - public void compile() throws IOException { + public void compile() throws Exception { // The source code located in src/main/kotlin and src/test/kotlin will be compiled new CompileKotlinOperation() .fromProject(this) diff --git a/src/main/java/rife/bld/extension/CompileKotlinOperation.java b/src/main/java/rife/bld/extension/CompileKotlinOperation.java index 45aa507..0a69592 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinOperation.java +++ b/src/main/java/rife/bld/extension/CompileKotlinOperation.java @@ -21,6 +21,7 @@ import rife.bld.BaseProject; import rife.bld.extension.kotlin.CompileOptions; import rife.bld.extension.kotlin.CompilerPlugin; import rife.bld.operations.AbstractOperation; +import rife.bld.operations.exceptions.ExitStatusException; import rife.tools.FileUtils; import java.io.File; @@ -214,10 +215,12 @@ public class CompileKotlinOperation extends AbstractOperation classpath, Collection sources, File destination, File friendPaths) - throws IOException { + throws ExitStatusException { if (sources.isEmpty() || destination == null) { return; } @@ -299,18 +301,17 @@ public class CompileKotlinOperation extends AbstractOperation Date: Wed, 10 Jul 2024 12:38:45 -0700 Subject: [PATCH 11/12] Bumped JUnit to version 5.10.3 --- examples/src/bld/java/com/example/ExampleBuild.java | 4 ++-- .../rife/bld/extension/CompileKotlinOperationBuild.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 7461aff..da2b49a 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -34,8 +34,8 @@ public class ExampleBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))); // Include the Kotlin source directory when creating or publishing sources Java Archives jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin")); diff --git a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java index a8a594f..5d0d354 100644 --- a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java +++ b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java @@ -61,9 +61,9 @@ public class CompileKotlinOperationBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-sam-with-receiver-compiler-plugin", kotlin)) .include(dependency("com.uwyn.rife2", "bld", version(1, 9, 1))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))) - .include(dependency("org.assertj", "assertj-core", version(3, 26, 0))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))) + .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); javadocOperation() .javadocOptions() From 1ad14d56c707281ca84575cf8ef2d67693f6a6c7 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 10 Jul 2024 12:39:04 -0700 Subject: [PATCH 12/12] Bumped PMD extension to version 1.1.2 --- lib/bld/bld-wrapper.properties | 2 +- .../java/rife/bld/extension/CompileKotlinOperationBuild.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 80d6f54..34f73c9 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.1 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.0 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.2 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 diff --git a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java index 5d0d354..465a49e 100644 --- a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java +++ b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java @@ -105,7 +105,7 @@ public class CompileKotlinOperationBuild extends Project { } @BuildCommand(summary = "Runs PMD analysis") - public void pmd() { + public void pmd() throws Exception { new PmdOperation() .fromProject(this) .failOnViolation(true)