From 5057fff1967f958a9d096e04d00da2e9275410f9 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 17:54:04 +1000 Subject: [PATCH 01/12] vcs: update .gitattributes and .gitignore --- .gitattributes | 48 ++++++++++++++++++++++++++++++++---------------- .gitignore | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/.gitattributes b/.gitattributes index 0ceb8a9..9356af0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,18 +1,34 @@ -# Auto detect text files and perform LF normalization -* text=auto -*.bat text=crlf +* text=auto eol=lf +# Force Batch files to CRLF +*.bat eol=crlf -text -# Custom for Visual Studio -*.cs diff=csharp +# Java sources +*.java text diff=java +*.kt text diff=java +*.gradle text diff=java +*.gradle.kts text diff=java -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain +# These files are text and should be normalized (Convert crlf => lf) +*.css text diff=css +*.df text +*.htm text diff=html +*.html text diff=html +*.js text +*.jsp text +*.jspf text +*.jspx text +*.properties text +*.tld text +*.tag text +*.tagx text +*.xml text + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.class binary +*.dll binary +*.ear binary +*.jar binary +*.so binary +*.war binary +*.jks binary \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0f35681..9a9297a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,50 @@ -# gradle .gradle/ +.kotlin/ build/ -libs/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ -*.log* +### IntelliJ IDEA ### +.fleet/ +.idea/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +nbproject/ +nbbuild/ +nbdist/ +dist/ +!**/src/main/**/dist/ +!**/src/test/**/dist/ +.nb-gradle/ + +### VS Code ### +.vscode/ + +### Vim ### +.*.sw[a-p] + +### Mac OS ### +.DS_Store +.DS_Store/ + +### Linux ### +*~ \ No newline at end of file From 79b4e6639fdbf3dc0ecc0a27a5a88f73c6453193 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 17:59:56 +1000 Subject: [PATCH 02/12] build: update Gradle to 9.2.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 12 ++++-------- gradlew.bat | 3 +-- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37546 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 E2i+$nF8}}l delta 35416 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 }= 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 W&_bn9Oj`ws8{~cjfVQhE>Hh&Of~0W( diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6..adff685 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9b42019..e509b2d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 068fb12b2eb543a32c11069ea205815b82dc6be9 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 18:00:42 +1000 Subject: [PATCH 03/12] build: use WE build-logic model --- build-logic/build.gradle.kts | 16 ++ build-logic/settings.gradle.kts | 7 + .../kotlin/buildlogic.artifactory.gradle.kts | 39 +++++ .../main/kotlin/buildlogic.common.gradle.kts | 122 +++++++++++++++ .../main/kotlin/buildlogic.core-ap.gradle.kts | 5 + .../main/kotlin/buildlogic/GradleExtras.kt | 19 +++ build.gradle.kts | 39 ++--- buildSrc/build.gradle.kts | 21 --- buildSrc/src/main/kotlin/Libs.kt | 23 --- buildSrc/src/main/kotlin/common.kt | 142 ------------------ core-ap/annotations/build.gradle.kts | 4 +- core-ap/processor/build.gradle.kts | 33 ++-- core-ap/runtime/build.gradle.kts | 6 +- core/build.gradle.kts | 16 +- default-impl/build.gradle.kts | 16 +- gradle.properties | 5 +- gradle/gradle-daemon-jvm.properties | 2 + gradle/libs.versions.toml | 54 +++++++ settings.gradle.kts | 28 +++- 19 files changed, 344 insertions(+), 253 deletions(-) create mode 100644 build-logic/build.gradle.kts create mode 100644 build-logic/settings.gradle.kts create mode 100644 build-logic/src/main/kotlin/buildlogic.artifactory.gradle.kts create mode 100644 build-logic/src/main/kotlin/buildlogic.common.gradle.kts create mode 100644 build-logic/src/main/kotlin/buildlogic.core-ap.gradle.kts create mode 100644 build-logic/src/main/kotlin/buildlogic/GradleExtras.kt delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/Libs.kt delete mode 100644 buildSrc/src/main/kotlin/common.kt create mode 100644 gradle/gradle-daemon-jvm.properties create mode 100644 gradle/libs.versions.toml diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts new file mode 100644 index 0000000..5ab7883 --- /dev/null +++ b/build-logic/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() + maven { + name = "EngineHub Repository" + url = uri("https://maven.enginehub.org/repo/") + } +} + +dependencies { + implementation(libs.levelHeadered) + implementation(libs.jfrog.buildinfo) +} \ No newline at end of file diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 0000000..fa8bc74 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,7 @@ +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} \ No newline at end of file diff --git a/build-logic/src/main/kotlin/buildlogic.artifactory.gradle.kts b/build-logic/src/main/kotlin/buildlogic.artifactory.gradle.kts new file mode 100644 index 0000000..c53c253 --- /dev/null +++ b/build-logic/src/main/kotlin/buildlogic.artifactory.gradle.kts @@ -0,0 +1,39 @@ +import org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention +import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask + +plugins { + id("maven-publish") + id("com.jfrog.artifactory") +} + +val ARTIFACTORY_CONTEXT_URL = "artifactory_contextUrl" +val ARTIFACTORY_USER = "artifactory_user" +val ARTIFACTORY_PASSWORD = "artifactory_password" + +if (!project.hasProperty(ARTIFACTORY_CONTEXT_URL)) ext[ARTIFACTORY_CONTEXT_URL] = "http://localhost" +if (!project.hasProperty(ARTIFACTORY_USER)) ext[ARTIFACTORY_USER] = "guest" +if (!project.hasProperty(ARTIFACTORY_PASSWORD)) ext[ARTIFACTORY_PASSWORD] = "" + +configure { + setContextUrl("${project.property(ARTIFACTORY_CONTEXT_URL)}") + clientConfig.publisher.run { + repoKey = when { + "${project.version}".contains("SNAPSHOT") -> "libs-snapshot-local" + else -> "libs-release-local" + } + username = "${project.property(ARTIFACTORY_USER)}" + password = "${project.property(ARTIFACTORY_PASSWORD)}" + isMaven = true + isIvy = false + } + publish { + defaults { + publications("maven") + setPublishArtifacts(true) + } + } +} + +tasks.named("artifactoryPublish") { + skip = true +} \ No newline at end of file diff --git a/build-logic/src/main/kotlin/buildlogic.common.gradle.kts b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts new file mode 100644 index 0000000..84ec5b0 --- /dev/null +++ b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts @@ -0,0 +1,122 @@ +import buildlogic.getLibrary +import buildlogic.stringyLibs +import net.octyl.levelheadered.LevelHeaderedExtension +import org.gradle.plugins.ide.idea.model.IdeaModel + +plugins { + id("eclipse") + id("idea") + id("net.octyl.level-headered") + id("java-library") + id("maven-publish") +} + +group = rootProject.group +version = rootProject.version + +configurations.all { + resolutionStrategy { + cacheChangingModulesFor(1, TimeUnit.DAYS) + } +} + +dependencies { + for (conf in listOf("implementation", "api")) { + if (!configurations.names.contains(conf)) { + continue + } + + add(conf, platform(stringyLibs.getLibrary("log4j-bom")).map { + val dep = create(it) + dep.because("Mojang provides Log4j") + dep + }) + + constraints { + add(conf, stringyLibs.getLibrary("guava")) { + because("Mojang provides Guava") + } + add(conf, stringyLibs.getLibrary("gson")) { + because("Mojang provides Gson") + } + add(conf, stringyLibs.getLibrary("fastutil")) { + because("Mojang provides FastUtil") + } + } + } + + "api"(stringyLibs.getLibrary("jsr305")) + "testImplementation"(platform(stringyLibs.getLibrary("junit-bom"))) + "testImplementation"(stringyLibs.getLibrary("junit-jupiter-api")) + "testImplementation"(stringyLibs.getLibrary("junit-jupiter-params")) + "testImplementation"(platform(stringyLibs.getLibrary("mockito-bom"))) + "testImplementation"(stringyLibs.getLibrary("mockito-core")) + "testImplementation"(stringyLibs.getLibrary("mockito-junit-jupiter")) + "testRuntimeOnly"(stringyLibs.getLibrary("junit-jupiter-engine")) + "testRuntimeOnly"(stringyLibs.getLibrary("junit-platform-launcher")) +} + +configure { + headerTemplate(rootProject.file("HEADER.txt")) +} + +configure { + toolchain.languageVersion = JavaLanguageVersion.of(17) + withJavadocJar() + withSourcesJar() +} + +configure { + publications { + register("maven") { + from(components["java"]) + + versionMapping { + usage("java-api") { + fromResolutionOf("runtimeClasspath") + } + usage("java-runtime") { + fromResolutionResult() + } + } + } + } +} + +configure { + module { + isDownloadSources = true + isDownloadJavadoc = true + } +} + +tasks { + withType().configureEach { + options.encoding = "UTF-8" + } + + withType().configureEach { + useJUnitPlatform { + includeEngines("junit-jupiter") + } + } + + // Java 8 turns on doclint which we fail + withType().configureEach { + options.encoding = "UTF-8" + (options as StandardJavadocDocletOptions).apply { + addBooleanOption("Werror", true) + addBooleanOption("Xdoclint:all", true) + addBooleanOption("Xdoclint:-missing", true) + tags( + "apiNote:a:API Note:", + "implSpec:a:Implementation Requirements:", + "implNote:a:Implementation Note:" + ) + } + } + + named("processTestResources") { + from(rootProject.file("common-test-resources")) + } +} \ No newline at end of file diff --git a/build-logic/src/main/kotlin/buildlogic.core-ap.gradle.kts b/build-logic/src/main/kotlin/buildlogic.core-ap.gradle.kts new file mode 100644 index 0000000..5e9d56a --- /dev/null +++ b/build-logic/src/main/kotlin/buildlogic.core-ap.gradle.kts @@ -0,0 +1,5 @@ +plugins { + id("buildlogic.common") +} + +group = "${group}.core-ap" \ No newline at end of file diff --git a/build-logic/src/main/kotlin/buildlogic/GradleExtras.kt b/build-logic/src/main/kotlin/buildlogic/GradleExtras.kt new file mode 100644 index 0000000..4242800 --- /dev/null +++ b/build-logic/src/main/kotlin/buildlogic/GradleExtras.kt @@ -0,0 +1,19 @@ +package buildlogic + +import org.gradle.api.Project +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.api.plugins.ExtraPropertiesExtension +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.getByType + +val Project.ext: ExtraPropertiesExtension + get() = extensions.getByType() + +val Project.stringyLibs: VersionCatalog + get() = extensions.getByType().named("libs") + +fun VersionCatalog.getLibrary(name: String): Provider = findLibrary(name).orElseThrow { + error("Library $name not found in version catalog") +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 595a3db..7b3115d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,47 +1,32 @@ plugins { - id("net.researchgate.release") version "3.0.2" - id("org.enginehub.codecov") jacoco -} - -configureArtifactory() - -repositories { - mavenCentral() -} - -release { - tagTemplate = "v\${version}" - buildTasks = listOf() - git.requireBranch = "master" + id("buildlogic.common") + id("buildlogic.artifactory") } val totalReport = tasks.register("jacocoTotalReport") { - subprojects.forEach { proj -> - proj.plugins.withId("java") { - executionData( - fileTree(proj.layout.buildDirectory.get().asFile.absolutePath).include("**/jacoco/*.exec") - ) + for (proj in subprojects) { + proj.apply(plugin = "jacoco") + proj.plugins.withType { + executionData(fileTree(proj.layout.buildDirectory).include("**/jacoco/*.exec")) sourceSets(proj.the().sourceSets["main"]) reports { - xml.required = true - xml.outputLocation = rootProject.layout.buildDirectory.file("reports/jacoco/report.xml") - html.required = true + xml.required.set(true) + xml.outputLocation.set(rootProject.layout.buildDirectory.file("reports/jacoco/report.xml")) + html.required.set(true) } dependsOn(proj.tasks.named("test")) } } } + afterEvaluate { totalReport.configure { classDirectories.setFrom(classDirectories.files.map { fileTree(it).apply { exclude("**/*AutoValue_*") + exclude("**/*Registration.*") } }) } -} - -codecov { - reportTask.set(totalReport) -} +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index b6f84aa..0000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - `kotlin-dsl` - kotlin("jvm") version embeddedKotlinVersion -} - -repositories { - mavenCentral() - gradlePluginPortal() - maven { - name = "EngineHub Repository" - url = uri("https://maven.enginehub.org/repo/") - } -} - -dependencies { - implementation(gradleApi()) - implementation(gradleKotlinDsl()) - implementation("org.enginehub.gradle:gradle-codecov-plugin:0.2.1-SNAPSHOT") - implementation("gradle.plugin.org.cadixdev.gradle:licenser:0.6.1") - implementation("org.jfrog.buildinfo:build-info-extractor-gradle:5.1.14") -} diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt deleted file mode 100644 index c4660dd..0000000 --- a/buildSrc/src/main/kotlin/Libs.kt +++ /dev/null @@ -1,23 +0,0 @@ -object Libs { - private const val junitVersion = "5.10.3" - const val junitApi = "org.junit.jupiter:junit-jupiter-api:$junitVersion" - const val junitEngine = "org.junit.jupiter:junit-jupiter-engine:$junitVersion" - const val junitVintageEngine = "org.junit.vintage:junit-vintage-engine:$junitVersion" - const val guava = "com.google.guava:guava:32.1.3-jre" - private const val kyoriTextVersion = "3.0.4" - const val kyoriText = "net.kyori:text-api:$kyoriTextVersion" - const val kyoriTextPlain = "net.kyori:text-serializer-plain:$kyoriTextVersion" - const val autoCommon = "com.google.auto:auto-common:1.2.2" - private const val autoValueVersion = "1.11.0" - const val autoValueAnnotations = "com.google.auto.value:auto-value-annotations:$autoValueVersion" - const val autoValueProcessor = "com.google.auto.value:auto-value:$autoValueVersion" - const val autoService = "com.google.auto.service:auto-service:1.1.1" - const val javapoet = "com.squareup:javapoet:1.13.0" - // Sync with Mojang's Log4j - private const val log4jVersion = "2.19.0" - const val log4jApi = "org.apache.logging.log4j:log4j-api:$log4jVersion" - const val log4jCore = "org.apache.logging.log4j:log4j-core:$log4jVersion" - const val javaxAnnotations = "com.google.code.findbugs:jsr305:3.0.2" - const val compileTesting = "com.google.testing.compile:compile-testing:0.21.0" - const val mockito = "org.mockito:mockito-core:5.12.0" -} diff --git a/buildSrc/src/main/kotlin/common.kt b/buildSrc/src/main/kotlin/common.kt deleted file mode 100644 index 4709483..0000000 --- a/buildSrc/src/main/kotlin/common.kt +++ /dev/null @@ -1,142 +0,0 @@ -import org.cadixdev.gradle.licenser.LicenseExtension -import org.gradle.api.JavaVersion -import org.gradle.api.Project -import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.SourceSetContainer -import org.gradle.api.tasks.bundling.Jar -import org.gradle.api.tasks.compile.JavaCompile -import org.gradle.api.tasks.javadoc.Javadoc -import org.gradle.api.tasks.testing.Test -import org.gradle.external.javadoc.CoreJavadocOptions -import org.gradle.jvm.toolchain.JavaLanguageVersion -import org.gradle.kotlin.dsl.apply -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.delegateClosureOf -import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.named -import org.gradle.kotlin.dsl.register -import org.gradle.kotlin.dsl.repositories -import org.gradle.kotlin.dsl.the -import org.gradle.kotlin.dsl.withType -import org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention -import org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig -import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask - -fun Project.applyCommonConfig( - group: String = rootProject.group.toString() -) { - apply(plugin = "java-library") - apply(plugin = "java") - apply(plugin = "org.cadixdev.licenser") - apply(plugin = "maven-publish") - apply(plugin = "com.jfrog.artifactory") - apply(plugin = "jacoco") - - project.group = group - - configure { - setHeader(rootProject.file("HEADER.txt")) - exclude("**/META-INF/**") - exclude("**/*.properties") - } - - tasks.withType().configureEach { - useJUnitPlatform() - } - - repositories { - mavenCentral() - } - - tasks.named("processTestResources") { - from(rootProject.file("common-test-resources")) - } - - configure { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) - } - tasks.named("compileJava") { - options.encoding = "UTF-8" - } - tasks.named("compileTestJava") { - options.encoding = "UTF-8" - } - tasks.withType().configureEach { - (options as CoreJavadocOptions).addStringOption("Xdoclint:none", "-quiet") - } - - dependencies { - "testImplementation"(Libs.junitApi) - "testImplementation"(Libs.junitEngine) - } - - addExtraArchiveArtifacts() - - configureMavenPublish() - - val build = tasks.named("build") - rootProject.tasks.named("afterReleaseBuild").configure { - dependsOn(build) - } -} - -private fun Project.addExtraArchiveArtifacts() { - configure { - withSourcesJar() - withJavadocJar() - } -} - -private fun Project.configureMavenPublish() { - configure { - publications { - register("maven") { - groupId = project.group.toString() - artifactId = project.name - version = project.version.toString() - - from(components["java"]) - } - } - } -} - -fun Project.configureArtifactory() { - apply(plugin = "maven-publish") - apply(plugin = "com.jfrog.artifactory") - val ext = extensions.extraProperties - if (!project.hasProperty("artifactory_contextUrl")) - ext["artifactory_contextUrl"] = "http://localhost" - if (!project.hasProperty("artifactory_user")) - ext["artifactory_user"] = "guest" - if (!project.hasProperty("artifactory_password")) - ext["artifactory_password"] = "" - configure { - publish { - contextUrl = project.property("artifactory_contextUrl").toString() - repository { - repoKey = when { - "SNAPSHOT" in project.version.toString() -> "libs-snapshot-local" - else -> "libs-release-local" - } - username = project.property("artifactory_user").toString() - password = project.property("artifactory_password").toString() - } - defaults { - publications("maven") - setPublishArtifacts(true) - } - } - } - tasks.named("artifactoryPublish") { - skip = true - } -} - -fun Project.applyCoreApConfig() { - applyCommonConfig(group = rootProject.group.toString() + ".core-ap") -} diff --git a/core-ap/annotations/build.gradle.kts b/core-ap/annotations/build.gradle.kts index 5c33ba3..55984ba 100644 --- a/core-ap/annotations/build.gradle.kts +++ b/core-ap/annotations/build.gradle.kts @@ -1,4 +1,6 @@ -applyCoreApConfig() +plugins { + id("buildlogic.core-ap") +} dependencies { "api"(project(":core")) diff --git a/core-ap/processor/build.gradle.kts b/core-ap/processor/build.gradle.kts index 35bd63f..00491c9 100644 --- a/core-ap/processor/build.gradle.kts +++ b/core-ap/processor/build.gradle.kts @@ -1,10 +1,9 @@ plugins { - kotlin("jvm") version "2.0.0" - kotlin("kapt") version "2.0.0" + kotlin("jvm") version "2.3.0" + kotlin("kapt") version "2.3.0" + id("buildlogic.core-ap") } -applyCoreApConfig() - kapt.includeCompileClasspath = false tasks.test { @@ -20,26 +19,24 @@ dependencies { "implementation"(project(":core")) "implementation"(project(":core-ap:annotations")) "implementation"(project(":core-ap:runtime")) - "implementation"(Libs.guava) - "implementation"(Libs.javapoet) - "implementation"(Libs.autoCommon) - "compileOnly"(Libs.autoValueAnnotations) - "kapt"(Libs.autoValueProcessor) - "compileOnly"(Libs.autoService) - "kapt"(Libs.autoService) + "implementation"(libs.guava) + "implementation"(libs.javapoet) + "implementation"(libs.autoCommon) + "compileOnly"(libs.autoValue.annotations) + "kapt"(libs.autoValue) + "compileOnly"(libs.autoService) + "kapt"(libs.autoService) "testImplementation"(kotlin("stdlib-jdk8")) - "testRuntimeOnly"(Libs.junitVintageEngine) - "testImplementation"(Libs.compileTesting) { + "testImplementation"(libs.compileTesting) { exclude("junit", "junit") } - "testImplementation"(Libs.guava) + "testImplementation"(libs.guava) - "testImplementation"(Libs.mockito) - "testRuntimeOnly"(Libs.log4jCore) + "testRuntimeOnly"(libs.log4j.core) "testImplementation"(project(":default-impl")) - "testCompileOnly"(Libs.autoService) - "kaptTest"(Libs.autoService) + "testCompileOnly"(libs.autoService) + "kaptTest"(libs.autoService) "kaptTest"(project(":core-ap:processor")) } diff --git a/core-ap/runtime/build.gradle.kts b/core-ap/runtime/build.gradle.kts index 4bbfbec..bb9ef78 100644 --- a/core-ap/runtime/build.gradle.kts +++ b/core-ap/runtime/build.gradle.kts @@ -1,7 +1,7 @@ -applyCoreApConfig() +plugins { + id("buildlogic.core-ap") +} dependencies { "api"(project(":core")) - - "testImplementation"(Libs.mockito) } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 3609940..cebcac3 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,11 +1,11 @@ -applyCommonConfig() +plugins { + id("buildlogic.common") +} dependencies { - "api"(Libs.guava) - "api"(Libs.kyoriText) - "api"(Libs.javaxAnnotations) - "implementation"(Libs.kyoriTextPlain) - "compileOnly"(Libs.autoValueAnnotations) - "annotationProcessor"(Libs.autoValueProcessor) - "testImplementation"(Libs.mockito) + "api"(libs.guava) + "api"(libs.kyoriText.api) + "implementation"(libs.kyoriText.serializer.plain) + "compileOnly"(libs.autoValue.annotations) + "annotationProcessor"(libs.autoValue) } diff --git a/default-impl/build.gradle.kts b/default-impl/build.gradle.kts index 95ac7fb..308a6ee 100644 --- a/default-impl/build.gradle.kts +++ b/default-impl/build.gradle.kts @@ -1,11 +1,13 @@ -applyCommonConfig() +plugins { + id("buildlogic.common") +} dependencies { "api"(project(":core")) - "implementation"(Libs.log4jApi) - "compileOnly"(Libs.autoValueAnnotations) - "annotationProcessor"(Libs.autoValueProcessor) - "compileOnlyApi"(Libs.autoService) - "annotationProcessor"(Libs.autoService) - "testRuntimeOnly"(Libs.log4jCore) + "implementation"(libs.log4j.api) + "compileOnly"(libs.autoValue.annotations) + "annotationProcessor"(libs.autoValue) + "compileOnlyApi"(libs.autoService) + "annotationProcessor"(libs.autoService) + "testRuntimeOnly"(libs.log4j.core) } diff --git a/gradle.properties b/gradle.properties index b03a3ef..2849994 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,5 @@ group=org.enginehub.piston -version=0.5.11-SNAPSHOT +version=0.5.12-SNAPSHOT +org.gradle.parallel=true +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true \ No newline at end of file diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..2ed82eb --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,2 @@ +#This file is generated by updateDaemonJvm +toolchainVersion=21 \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..0212c12 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,54 @@ +[versions] +kyoriText = "3.0.4" +autoValue = "1.11.1" + +[libraries] +jfrog-buildinfo = "org.jfrog.buildinfo:build-info-extractor-gradle:5.2.0" +levelHeadered = "net.octyl.level-headered:net.octyl.level-headered.gradle.plugin:0.1.1" + +autoCommon = "com.google.auto:auto-common:1.2.2" +autoService = "com.google.auto.service:auto-service:1.1.1" +compileTesting = "com.google.testing.compile:compile-testing:0.23.0" +javapoet = "com.squareup:javapoet:1.13.0" + +jsr305 = "com.google.code.findbugs:jsr305:3.0.2" +jetbrains-annotations = "org.jetbrains:annotations:26.0.2-1" + +junit-bom = "org.junit:junit-bom:6.0.1" +junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api" } +junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params" } +junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine" } +junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } + +mockito-bom = "org.mockito:mockito-bom:5.21.0" +mockito-core.module = "org.mockito:mockito-core" +mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter" } + +# Mojang-provided libraries, CHECK AGAINST MINECRAFT for versions +guava = "com.google.guava:guava:33.3.1-jre!!" +log4j-bom = "org.apache.logging.log4j:log4j-bom:2.24.1!!" +log4j-api = { module = "org.apache.logging.log4j:log4j-api" } +log4j-core = { module = "org.apache.logging.log4j:log4j-core" } +gson = "com.google.code.gson:gson:2.11.0!!" +fastutil = "it.unimi.dsi:fastutil:8.5.18!!" + +# Bukkit-provided libraries, CHECK AGAINST SPIGOT for versions +# Note that we need to balance support for older MC versus working at all on newer ones, so the exact versions here +# may not be the same as the ones in the latest Bukkit API. +snakeyaml = "org.yaml:snakeyaml:2.0" + +[libraries.kyoriText-api] +module = "net.kyori:text-api" +version.ref = "kyoriText" + +[libraries.kyoriText-serializer-plain] +module = "net.kyori:text-serializer-plain" +version.ref = "kyoriText" + +[libraries.autoValue] +module = "com.google.auto.value:auto-value" +version.ref = "autoValue" + +[libraries.autoValue-annotations] +module = "com.google.auto.value:auto-value-annotations" +version.ref = "autoValue" \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index fcc3fdf..6fa1812 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,30 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = "EngineHub" + url = uri("https://maven.enginehub.org/repo/") + } + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} + +@Suppress("UnstableApiUsage") +dependencyResolutionManagement { + repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS + pluginManagement.repositories.forEach { repositories.add(it) } + repositories.mavenCentral() +} + rootProject.name = "piston" -include(":core", ":default-impl") +includeBuild("build-logic") + +include("core", "default-impl") + listOf("annotations", "processor", "runtime").forEach { - include(":core-ap:$it") + include("core-ap:$it") } From 9a53244df9bc318b6a2c9d37590ad4a23f705414 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 19:30:24 +1000 Subject: [PATCH 04/12] refactor: use Plantir's JavaPoet --- .../gen/CommandParameterInterpreter.java | 8 +++---- .../piston/gen/CommandProcessor.java | 2 +- .../gen/CommandRegistrationGenerator.java | 20 ++++++++-------- .../piston/gen/ConditionGenerator.java | 4 ++-- .../piston/gen/GenerationSupport.java | 6 ++--- .../piston/gen/GenerationSupportImpl.java | 6 ++--- .../piston/gen/util/CodeBlockUtil.java | 4 ++-- .../enginehub/piston/gen/util/SafeName.java | 14 +++++------ .../piston/gen/util/TypeNameUtil.java | 16 ++++++------- .../piston/gen/value/CommandCondInfo.java | 2 +- .../piston/gen/value/CommandParamInfo.java | 4 ++-- .../piston/gen/value/ExtractSpec.java | 4 ++-- .../enginehub/piston/gen/value/KeyInfo.java | 24 +++++++++---------- .../piston/gen/value/RegistrationInfo.java | 2 +- .../piston/gen/value/RequiredVariable.java | 4 ++-- .../enginehub/piston/gen/BadGenerationTest.kt | 6 ++--- .../piston/gen/GoodGenerationTest.kt | 17 ++++++------- .../enginehub/piston/gen/NestedClassTest.kt | 6 ++--- .../kotlin/org/enginehub/piston/gen/Utils.kt | 14 +++++------ .../gen/util/AnnoValueExtractionTest.kt | 4 ++-- .../piston/gen/util/TypeNameUtilTest.kt | 4 ++-- .../piston/gen/value/ExtractSpecTest.kt | 2 +- .../piston/util/PreloadTypeNameExtension.kt | 2 +- gradle/libs.versions.toml | 2 +- 24 files changed, 89 insertions(+), 88 deletions(-) diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java index 10b1324..653f0a8 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java @@ -22,10 +22,10 @@ import com.google.auto.common.MoreElements; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.AnnotationSpec; +import com.palantir.javapoet.ClassName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import org.enginehub.piston.CommandParameters; import org.enginehub.piston.CommandValue; import org.enginehub.piston.annotation.param.Arg; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandProcessor.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandProcessor.java index 1f69015..9cbe19c 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandProcessor.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandProcessor.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Sets; -import com.squareup.javapoet.ClassName; +import com.palantir.javapoet.ClassName; import org.enginehub.piston.annotation.Command; import org.enginehub.piston.annotation.CommandCondition; import org.enginehub.piston.annotation.CommandContainer; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java index ba6cfdc..524b617 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java @@ -20,16 +20,16 @@ package org.enginehub.piston.gen; import com.google.common.collect.ImmutableList; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.FieldSpec; -import com.squareup.javapoet.JavaFile; -import com.squareup.javapoet.MethodSpec; -import com.squareup.javapoet.ParameterSpec; -import com.squareup.javapoet.ParameterizedTypeName; -import com.squareup.javapoet.TypeName; -import com.squareup.javapoet.TypeSpec; +import com.palantir.javapoet.AnnotationSpec; +import com.palantir.javapoet.ClassName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.FieldSpec; +import com.palantir.javapoet.JavaFile; +import com.palantir.javapoet.MethodSpec; +import com.palantir.javapoet.ParameterSpec; +import com.palantir.javapoet.ParameterizedTypeName; +import com.palantir.javapoet.TypeName; +import com.palantir.javapoet.TypeSpec; import org.enginehub.piston.CommandManager; import org.enginehub.piston.CommandParameters; import org.enginehub.piston.gen.util.CodeBlockUtil; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/ConditionGenerator.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/ConditionGenerator.java index 953728b..6d4250e 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/ConditionGenerator.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/ConditionGenerator.java @@ -19,8 +19,8 @@ package org.enginehub.piston.gen; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import org.enginehub.piston.Command; import org.enginehub.piston.gen.util.CodeBlockUtil; import org.enginehub.piston.gen.util.ProcessingException; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupport.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupport.java index f994ea0..9f92143 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupport.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupport.java @@ -19,9 +19,9 @@ package org.enginehub.piston.gen; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.AnnotationSpec; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import org.enginehub.piston.inject.Key; import javax.annotation.Nullable; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java index a23659b..3778676 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java @@ -19,9 +19,9 @@ package org.enginehub.piston.gen; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.AnnotationSpec; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import org.enginehub.piston.gen.value.KeyInfo; import org.enginehub.piston.gen.value.RegistrationInfo; import org.enginehub.piston.gen.value.RequiredVariable; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java index 883150c..411bfad 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java @@ -20,8 +20,8 @@ package org.enginehub.piston.gen.util; import com.google.common.collect.ImmutableList; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import net.kyori.text.TextComponent; import net.kyori.text.TranslatableComponent; import org.enginehub.piston.internal.RegistrationUtil; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java index a1acbef..ac51ba3 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java @@ -19,10 +19,10 @@ package org.enginehub.piston.gen.util; -import com.squareup.javapoet.ArrayTypeName; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.ParameterizedTypeName; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.ArrayTypeName; +import com.palantir.javapoet.ClassName; +import com.palantir.javapoet.ParameterizedTypeName; +import com.palantir.javapoet.TypeName; import org.enginehub.piston.util.CaseHelper; /** @@ -63,17 +63,17 @@ private static CharSequence getNameAsIdentifierRaw(TypeName typeName) { } else if (typeName instanceof ParameterizedTypeName) { // append the type parameters ParameterizedTypeName pt = (ParameterizedTypeName) typeName; - ClassName raw = pt.rawType; + ClassName raw = pt.rawType(); StringBuilder result = new StringBuilder( getNameAsIdentifierRaw(raw) ); - for (TypeName typeArgument : pt.typeArguments) { + for (TypeName typeArgument : pt.typeArguments()) { result.append('$').append(getNameAsIdentifierRaw(typeArgument)); } return result; } else if (typeName instanceof ArrayTypeName) { // append Array to the name - CharSequence base = getNameAsIdentifierRaw(((ArrayTypeName) typeName).componentType); + CharSequence base = getNameAsIdentifierRaw(((ArrayTypeName) typeName).componentType()); return new StringBuilder(base).append("$Array"); } // just use toString() as a last resort diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/TypeNameUtil.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/TypeNameUtil.java index 7bf6efe..2985834 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/TypeNameUtil.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/TypeNameUtil.java @@ -19,10 +19,10 @@ package org.enginehub.piston.gen.util; -import com.squareup.javapoet.ArrayTypeName; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.ParameterizedTypeName; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.ArrayTypeName; +import com.palantir.javapoet.ClassName; +import com.palantir.javapoet.ParameterizedTypeName; +import com.palantir.javapoet.TypeName; public class TypeNameUtil { @@ -30,9 +30,9 @@ public static TypeName rawType(TypeName typeName) { if (typeName instanceof ClassName) { return typeName; } else if (typeName instanceof ArrayTypeName) { - return ArrayTypeName.of(rawType(((ArrayTypeName) typeName).componentType)); + return ArrayTypeName.of(rawType(((ArrayTypeName) typeName).componentType())); } else if (typeName instanceof ParameterizedTypeName) { - return ((ParameterizedTypeName) typeName).rawType; + return ((ParameterizedTypeName) typeName).rawType(); } else if (typeName.isPrimitive()) { return typeName; } @@ -42,9 +42,9 @@ public static TypeName rawType(TypeName typeName) { public static TypeName firstTypeArg(TypeName typeName) { if (typeName instanceof ParameterizedTypeName) { - return ((ParameterizedTypeName) typeName).typeArguments.get(0); + return ((ParameterizedTypeName) typeName).typeArguments().get(0); } - return TypeName.OBJECT; + return ClassName.OBJECT; } private TypeNameUtil() { diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandCondInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandCondInfo.java index d7c3c81..afe8483 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandCondInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandCondInfo.java @@ -20,7 +20,7 @@ package org.enginehub.piston.gen.value; import com.google.auto.value.AutoValue; -import com.squareup.javapoet.CodeBlock; +import com.palantir.javapoet.CodeBlock; /** * Information that can be used to supply the condition for a diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandParamInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandParamInfo.java index b48721a..cb0bc92 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandParamInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandParamInfo.java @@ -20,8 +20,8 @@ package org.enginehub.piston.gen.value; import com.google.auto.value.AutoValue; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import org.enginehub.piston.CommandParameters; import javax.annotation.Nullable; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java index 38af778..6ee0e8c 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java @@ -21,8 +21,8 @@ import com.google.auto.value.AutoValue; import com.google.auto.value.extension.memoized.Memoized; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.TypeName; import javax.annotation.Nullable; import java.util.Objects; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java index 3fe98dd..8621a5c 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java @@ -21,14 +21,14 @@ import com.google.auto.value.AutoValue; import com.google.common.reflect.TypeToken; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.MethodSpec; -import com.squareup.javapoet.ParameterSpec; -import com.squareup.javapoet.ParameterizedTypeName; -import com.squareup.javapoet.TypeName; -import com.squareup.javapoet.TypeSpec; +import com.palantir.javapoet.AnnotationSpec; +import com.palantir.javapoet.ClassName; +import com.palantir.javapoet.CodeBlock; +import com.palantir.javapoet.MethodSpec; +import com.palantir.javapoet.ParameterSpec; +import com.palantir.javapoet.ParameterizedTypeName; +import com.palantir.javapoet.TypeName; +import com.palantir.javapoet.TypeSpec; import org.enginehub.piston.gen.util.CodeBlockUtil; import org.enginehub.piston.gen.util.SafeName; import org.enginehub.piston.inject.Key; @@ -73,9 +73,9 @@ public final String getVariableName() { private String getSpecName(AnnotationSpec spec) { StringBuilder name = new StringBuilder(); - name.append(SafeName.getNameAsIdentifier(spec.type)); + name.append(SafeName.getNameAsIdentifier(spec.type())); for (Iterator>> iterator - = spec.members.entrySet().iterator(); + = spec.members().entrySet().iterator(); iterator.hasNext(); ) { Map.Entry> entry = iterator.next(); if (!entry.getKey().equals("value")) { @@ -122,8 +122,8 @@ private CodeBlock getAnnotationArgumentCode() { if (spec == null) { return null; } - if (spec.members.isEmpty()) { - return CodeBlock.of("$T.class", spec.type); + if (spec.members().isEmpty()) { + return CodeBlock.of("$T.class", spec.type()); } return runtimeAnnotationExtractor(spec); } diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java index 3f3b40b..b19fd39 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java @@ -22,7 +22,7 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.squareup.javapoet.ClassName; +import com.palantir.javapoet.ClassName; import javax.annotation.Nullable; import javax.lang.model.element.Modifier; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RequiredVariable.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RequiredVariable.java index 1544480..6ad60e0 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RequiredVariable.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RequiredVariable.java @@ -21,8 +21,8 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.TypeName; +import com.palantir.javapoet.AnnotationSpec; +import com.palantir.javapoet.TypeName; import java.util.Collection; diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt index 42bbdc0..197ab7f 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt @@ -20,9 +20,9 @@ package org.enginehub.piston.gen import com.google.testing.compile.CompilationSubject.assertThat -import com.squareup.javapoet.AnnotationSpec -import com.squareup.javapoet.MethodSpec -import com.squareup.javapoet.ParameterSpec +import com.palantir.javapoet.AnnotationSpec +import com.palantir.javapoet.MethodSpec +import com.palantir.javapoet.ParameterSpec import org.enginehub.piston.CommandValue import org.enginehub.piston.annotation.Command import org.enginehub.piston.annotation.param.Arg diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt index c729099..1dc7cc4 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt @@ -21,13 +21,14 @@ package org.enginehub.piston.gen import com.google.testing.compile.CompilationSubject.assertThat import com.google.testing.compile.JavaFileObjects -import com.squareup.javapoet.AnnotationSpec -import com.squareup.javapoet.MethodSpec -import com.squareup.javapoet.ParameterSpec -import com.squareup.javapoet.ParameterizedTypeName -import com.squareup.javapoet.TypeName -import com.squareup.javapoet.TypeSpec -import com.squareup.javapoet.WildcardTypeName +import com.palantir.javapoet.AnnotationSpec +import com.palantir.javapoet.ClassName +import com.palantir.javapoet.MethodSpec +import com.palantir.javapoet.ParameterSpec +import com.palantir.javapoet.ParameterizedTypeName +import com.palantir.javapoet.TypeName +import com.palantir.javapoet.TypeSpec +import com.palantir.javapoet.WildcardTypeName import org.enginehub.piston.CommandParameters import org.enginehub.piston.CommandValue import org.enginehub.piston.annotation.Command @@ -162,7 +163,7 @@ class GenerationTest { .addParameter( ParameterSpec.builder(ParameterizedTypeName.get( className>(), - WildcardTypeName.subtypeOf(TypeName.OBJECT) + WildcardTypeName.subtypeOf(ClassName.OBJECT) ), "arg") .addAnnotation(AnnotationSpec.builder(Arg::class.java) .addMember("desc", "\$S", "ARG DESCRIPTION") diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt index cd2cba8..96855c5 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt @@ -21,9 +21,9 @@ package org.enginehub.piston.gen import com.google.testing.compile.CompilationSubject.assertThat import com.google.testing.compile.JavaFileObjects -import com.squareup.javapoet.AnnotationSpec -import com.squareup.javapoet.MethodSpec -import com.squareup.javapoet.TypeSpec +import com.palantir.javapoet.AnnotationSpec +import com.palantir.javapoet.MethodSpec +import com.palantir.javapoet.TypeSpec import org.enginehub.piston.annotation.Command import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt index d714e62..a1ac2a5 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt @@ -21,12 +21,12 @@ package org.enginehub.piston.gen import com.google.testing.compile.Compiler import com.google.testing.compile.JavaFileObjects -import com.squareup.javapoet.ClassName -import com.squareup.javapoet.JavaFile -import com.squareup.javapoet.MethodSpec -import com.squareup.javapoet.ParameterizedTypeName -import com.squareup.javapoet.TypeName -import com.squareup.javapoet.TypeSpec +import com.palantir.javapoet.ClassName +import com.palantir.javapoet.JavaFile +import com.palantir.javapoet.MethodSpec +import com.palantir.javapoet.ParameterizedTypeName +import com.palantir.javapoet.TypeName +import com.palantir.javapoet.TypeSpec import org.enginehub.piston.annotation.CommandContainer import javax.tools.JavaFileObject @@ -48,7 +48,7 @@ fun commands(name: String, specs: List): JavaFileObject { fun TypeSpec.toFileInPackage(pkg: String = PACKAGE): JavaFileObject { val source = JavaFile.builder(pkg, this).build().toString() return JavaFileObjects.forSourceString( - "$pkg.$name", source + "$pkg.${name()}", source ) } diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt index 9798a07..43d2e59 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt @@ -27,8 +27,8 @@ import com.google.common.collect.ImmutableSet import com.google.common.collect.ImmutableSetMultimap import com.google.testing.compile.Compilation import com.google.testing.compile.CompilationSubject.assertThat -import com.squareup.javapoet.AnnotationSpec -import com.squareup.javapoet.TypeSpec +import com.palantir.javapoet.AnnotationSpec +import com.palantir.javapoet.TypeSpec import org.enginehub.piston.gen.className import org.enginehub.piston.gen.compiler import org.enginehub.piston.gen.toFileInPackage diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/TypeNameUtilTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/TypeNameUtilTest.kt index 878f973..0501912 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/TypeNameUtilTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/TypeNameUtilTest.kt @@ -21,8 +21,8 @@ package org.enginehub.piston.gen.util import com.google.common.primitives.Primitives import com.google.common.truth.Truth -import com.squareup.javapoet.ArrayTypeName -import com.squareup.javapoet.TypeName +import com.palantir.javapoet.ArrayTypeName +import com.palantir.javapoet.TypeName import org.enginehub.piston.gen.className import org.enginehub.piston.gen.parametrize import org.junit.jupiter.api.Assertions.assertEquals diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt index d7bb24d..82f67b7 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt @@ -19,7 +19,7 @@ package org.enginehub.piston.gen.value -import com.squareup.javapoet.CodeBlock +import com.palantir.javapoet.CodeBlock import org.enginehub.piston.gen.className import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNotEquals diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt index 57e6c3b..f8313bc 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt @@ -20,7 +20,7 @@ package org.enginehub.piston.util import com.google.auto.service.AutoService -import com.squareup.javapoet.TypeName +import com.palantir.javapoet.TypeName import org.junit.jupiter.api.extension.BeforeAllCallback import org.junit.jupiter.api.extension.Extension import org.junit.jupiter.api.extension.ExtensionContext diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0212c12..79d5f9d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ levelHeadered = "net.octyl.level-headered:net.octyl.level-headered.gradle.plugin autoCommon = "com.google.auto:auto-common:1.2.2" autoService = "com.google.auto.service:auto-service:1.1.1" compileTesting = "com.google.testing.compile:compile-testing:0.23.0" -javapoet = "com.squareup:javapoet:1.13.0" +javapoet = "com.palantir.javapoet:javapoet:0.9.0" jsr305 = "com.google.code.findbugs:jsr305:3.0.2" jetbrains-annotations = "org.jetbrains:annotations:26.0.2-1" From 1a384140822fe4cff577f76ea797ebcc364843c0 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:25:41 +1000 Subject: [PATCH 05/12] refactor: use records and instanceof pattern matching --- .../gen/CommandParameterInterpreter.java | 8 +-- .../gen/CommandRegistrationGenerator.java | 2 +- .../piston/gen/GenerationSupportImpl.java | 35 +++++------- .../piston/gen/util/AnnoValueExtraction.java | 11 +--- .../enginehub/piston/gen/util/SafeName.java | 3 +- .../piston/gen/value/ExtractSpec.java | 3 +- .../piston/config/ConfigRenderer.java | 6 +- .../enginehub/piston/inject/Annotations.java | 55 +++++++++---------- .../piston/config/ConfigHolderTest.java | 11 +--- .../enginehub/piston/impl/CommandInfo.java | 26 ++------- .../enginehub/piston/impl/CommandParser.java | 24 ++++---- 11 files changed, 66 insertions(+), 118 deletions(-) diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java index 653f0a8..1076606 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java @@ -172,7 +172,7 @@ private void addArgTypes(VariableElement parameter, CodeBlock.Builder constructi private ExtractSpec getArgExtractSpec(VariableElement parameter) { TypeMirror parameterType = parameter.asType(); return ExtractSpec.builder() - .name("extract$" + parameter.getSimpleName().toString()) + .name("extract$" + parameter.getSimpleName()) .type(TypeName.get(parameterType)) .extractMethodBody(var -> { CodeBlock.Builder builder = CodeBlock.builder(); @@ -221,7 +221,7 @@ private CommandParamInfo switchTransform(VariableElement parameter) { "$T.flag('$L', $L).build()", CommandParts.class, name, textCompOf(desc))) .extractSpec(ExtractSpec.builder() - .name("extract$" + parameter.getSimpleName().toString()) + .name("extract$" + parameter.getSimpleName()) .type(TypeName.get(parameter.asType())) .extractMethodBody(var -> CodeBlock.builder() .addStatement("return $L.in($L)", @@ -241,7 +241,7 @@ private CommandParamInfo untransformedParameter(VariableElement parameter) { private CommandParamInfo commandParameterValue(VariableElement parameter) { return CommandParamInfo.builder() .extractSpec(ExtractSpec.builder() - .name("extract$" + parameter.getSimpleName().toString()) + .name("extract$" + parameter.getSimpleName()) .type(TypeName.get(parameter.asType())) .extractMethodBody(var -> CodeBlock.of("$[return $L;\n$]", ReservedNames.PARAMETERS)) @@ -252,7 +252,7 @@ private CommandParamInfo commandParameterValue(VariableElement parameter) { private CommandParamInfo injectableValue(VariableElement parameter) { return CommandParamInfo.builder() .extractSpec(ExtractSpec.builder() - .name("extract$" + parameter.getSimpleName().toString()) + .name("extract$" + parameter.getSimpleName()) .type(TypeName.get(parameter.asType())) .extractMethodBody(var -> { CodeBlock paramKey = asKeyType(parameter); diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java index 524b617..c244b8c 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java @@ -170,7 +170,7 @@ void generate(Element originalElement, String pkgName, Filer filer) throws IOExc spec.addSuperinterface(TypeName.get(superType.asType())); } else { throw new IllegalStateException("Not a possible super-type: " - + superType.getKind() + " " + superType.getQualifiedName().toString()); + + superType.getKind() + " " + superType.getQualifiedName()); } } diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java index 3778676..4e5758a 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java @@ -33,31 +33,22 @@ class GenerationSupportImpl implements GenerationSupport { - private static final class ShareKey { - private final TypeName type; - private final String name; - private final Object shareKey; - - ShareKey(TypeName type, String name, Object shareKey) { - this.type = type; - this.name = name; - this.shareKey = shareKey; - } + private record ShareKey(TypeName type, String name, Object shareKey) { @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ShareKey shareKey1 = (ShareKey) o; - return type.equals(shareKey1.type) && - name.equals(shareKey1.name) && - shareKey.equals(shareKey1.shareKey); - } + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ShareKey shareKey1 = (ShareKey) o; + return type.equals(shareKey1.type) && + name.equals(shareKey1.name) && + shareKey.equals(shareKey1.shareKey); + } - @Override - public int hashCode() { - return Objects.hash(type, name, shareKey); - } } private final IdentifierTracker identifierTracker; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java index b6c6370..e41fc64 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java @@ -40,16 +40,7 @@ */ public class AnnoValueExtraction { - private static final class GeneralResult { - @Nullable - private final Object good; - @Nullable - private final Object bad; - - public GeneralResult(@Nullable Object good, @Nullable Object bad) { - this.good = good; - this.bad = bad; - } + private record GeneralResult(@Nullable Object good, @Nullable Object bad) { } private static final AnnotationValueVisitor> GENERAL_VISITOR = diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java index ac51ba3..d4b90f6 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/SafeName.java @@ -60,9 +60,8 @@ private static CharSequence getNameAsIdentifierRaw(TypeName typeName) { if (typeName instanceof ClassName) { // good, just the raw name works here return ((ClassName) typeName).simpleName(); - } else if (typeName instanceof ParameterizedTypeName) { + } else if (typeName instanceof ParameterizedTypeName pt) { // append the type parameters - ParameterizedTypeName pt = (ParameterizedTypeName) typeName; ClassName raw = pt.rawType(); StringBuilder result = new StringBuilder( getNameAsIdentifierRaw(raw) diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java index 6ee0e8c..0dafc29 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java @@ -91,10 +91,9 @@ public final boolean equals(Object obj) { if (this == obj) { return true; } - if (!(obj instanceof ExtractSpec)) { + if (!(obj instanceof ExtractSpec spec)) { return false; } - ExtractSpec spec = (ExtractSpec) obj; boolean fastChecks = Objects.equals(getName(), spec.getName()) && Objects.equals(getType(), spec.getType()); if (!fastChecks) { diff --git a/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java b/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java index 11f4b7f..5abf23f 100644 --- a/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java +++ b/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java @@ -47,9 +47,8 @@ private ConfigRenderer() { @Override public @NonNull Component render(@NonNull Component component, @NonNull ConfigHolder context) { component = replaceSubcomponents(component, context); - if (component instanceof TranslatableComponent) { + if (component instanceof TranslatableComponent tc) { // check if replacing - TranslatableComponent tc = (TranslatableComponent) component; Config config = context.getConfigs().get(tc.key()); if (config != null) { component = config.apply(tc); @@ -59,8 +58,7 @@ private ConfigRenderer() { } private Component replaceSubcomponents(Component component, ConfigHolder context) { - if (component instanceof TranslatableComponent) { - TranslatableComponent tc = (TranslatableComponent) component; + if (component instanceof TranslatableComponent tc) { List originalArgs = tc.args(); List replacementArgs = renderList(originalArgs, context); if (originalArgs != replacementArgs) { diff --git a/core/src/main/java/org/enginehub/piston/inject/Annotations.java b/core/src/main/java/org/enginehub/piston/inject/Annotations.java index af94371..b1edbcb 100644 --- a/core/src/main/java/org/enginehub/piston/inject/Annotations.java +++ b/core/src/main/java/org/enginehub/piston/inject/Annotations.java @@ -39,39 +39,36 @@ class Annotations { - private static final class MethodKey { - static MethodKey from(Method method) { - return of(method.getReturnType(), method.getName(), method.getParameterTypes()); - } - - static MethodKey of(Class rtype, String name, Class... ptypes) { - return new MethodKey(name, ImmutableList.>builder() - .add(rtype) - .add(ptypes) - .build()); - } + private record MethodKey(String name, ImmutableList> signature) { + static MethodKey from(Method method) { + return of(method.getReturnType(), method.getName(), method.getParameterTypes()); + } - private final String name; - private final ImmutableList> signature; + static MethodKey of(Class rtype, String name, Class... ptypes) { + return new MethodKey(name, ImmutableList.>builder() + .add(rtype) + .add(ptypes) + .build()); + } - private MethodKey(String name, List> signature) { - this.name = name; - this.signature = ImmutableList.copyOf(signature); - } + private MethodKey(String name, List> signature) { + this.name = name; + this.signature = ImmutableList.copyOf(signature); + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - MethodKey methodKey = (MethodKey) o; - return name.equals(methodKey.name) && - signature.equals(methodKey.signature); - } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MethodKey methodKey = (MethodKey) o; + return name.equals(methodKey.name) && + signature.equals(methodKey.signature); + } - @Override - public int hashCode() { - return Objects.hash(name, signature); - } } @FunctionalInterface diff --git a/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java b/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java index 9b958c6..211c1ee 100644 --- a/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java +++ b/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java @@ -38,16 +38,7 @@ @DisplayName("A ConfigHolder") public class ConfigHolderTest { - private static final class TestCase { - private final String name; - private final Component input; - private final Component expected; - - private TestCase(String name, Component input, Component expected) { - this.name = name; - this.input = input; - this.expected = expected; - } + private record TestCase(String name, Component input, Component expected) { } private final ConfigRenderer renderer = ConfigRenderer.getInstance(); diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandInfo.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandInfo.java index 9c806dc..e1e4f63 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandInfo.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandInfo.java @@ -37,7 +37,9 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; -class CommandInfo { +record CommandInfo(ImmutableList arguments, + ImmutableList defaultProvided, ImmutableMap flags, + ImmutableTable subCommandTable, int requiredParts) { static CommandInfo from(Command command) { ImmutableList.Builder arguments = ImmutableList.builder(); @@ -62,13 +64,12 @@ static CommandInfo from(Command command) { seenOptionalArg = true; } arguments.add((ArgConsumingCommandPart) part); - } else if (part instanceof SubCommandPart) { + } else if (part instanceof SubCommandPart subCommandPart) { if (part.isRequired()) { checkState(i + 1 >= parts.size(), "Required sub-command must be last part."); seenRequiredSubCommand = true; } - SubCommandPart subCommandPart = (SubCommandPart) part; for (Command cmd : subCommandPart.getCommands()) { subCommandTable.put(subCommandPart, cmd.getName(), cmd); for (String alias : cmd.getAliases()) { @@ -82,8 +83,7 @@ static CommandInfo from(Command command) { if (part.isRequired()) { requiredParts++; } - if (part instanceof ArgAcceptingCommandPart) { - ArgAcceptingCommandPart argPart = (ArgAcceptingCommandPart) part; + if (part instanceof ArgAcceptingCommandPart argPart) { if (argPart.getDefaults().size() > 0) { defaultProvided.add(argPart); } @@ -111,20 +111,4 @@ static CommandInfo from(Command command) { requiredParts); } - final ImmutableList arguments; - final ImmutableList defaultProvided; - final ImmutableMap flags; - final ImmutableTable subCommandTable; - final int requiredParts; - - CommandInfo(ImmutableList arguments, - ImmutableList defaultProvided, - ImmutableMap flags, - ImmutableTable subCommandTable, int requiredParts) { - this.arguments = arguments; - this.defaultProvided = defaultProvided; - this.flags = flags; - this.subCommandTable = subCommandTable; - this.requiredParts = requiredParts; - } } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java index 23c6271..0037506 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java @@ -102,17 +102,17 @@ private static final class PerCommandDetails { private PerCommandDetails(CommandInfo commandInfo) { this.commandInfo = commandInfo; - this.defaultsNeeded = new HashSet<>(commandInfo.defaultProvided); + this.defaultsNeeded = new HashSet<>(commandInfo.defaultProvided()); // collect argument flags that don't have default values // we'll provide `null` for them in this case. this.argFlagsNeeded = StreamHelper.cast( - commandInfo.flags.values().stream(), + commandInfo.flags().values().stream(), ArgAcceptingCommandFlag.class ) .filter(arg -> !defaultsNeeded.contains(arg)) .collect(Collectors.toCollection(HashSet::new)); - this.partIter = commandInfo.arguments.listIterator(); - this.remainingRequiredParts = commandInfo.requiredParts; + this.partIter = commandInfo.arguments().listIterator(); + this.remainingRequiredParts = commandInfo.requiredParts(); } } @@ -367,12 +367,12 @@ private boolean isFlag(String token) { return token.codePoints() .skip(1) - .allMatch(cp -> perCommandDetails().commandInfo.flags.containsKey((char) cp)); + .allMatch(cp -> perCommandDetails().commandInfo.flags().containsKey((char) cp)); } private boolean parseSubCommand(SubCommandPart part, String token) { CommandInfo commandInfo = perCommandDetails().commandInfo; - ImmutableMap subCommands = commandInfo.subCommandTable.row(part); + ImmutableMap subCommands = commandInfo.subCommandTable().row(part); Command sub = subCommands.get(token); if (sub == null) { return false; @@ -409,8 +409,7 @@ private boolean parseRegularArgument(String token) { CommandArgument lastFailedOptionalLocal = null; while (hasNextPart()) { ArgConsumingCommandPart nextArg = nextPart(); - if (nextArg instanceof SubCommandPart) { - SubCommandPart subCommandPart = (SubCommandPart) nextArg; + if (nextArg instanceof SubCommandPart subCommandPart) { if (parseSubCommand(subCommandPart, token)) { return true; } @@ -418,7 +417,7 @@ private boolean parseRegularArgument(String token) { throw usageException( invalidSubCommandMessage( token, - details.commandInfo.subCommandTable.row(subCommandPart) + details.commandInfo.subCommandTable().row(subCommandPart) )); } continue; @@ -438,7 +437,7 @@ private boolean parseRegularArgument(String token) { ))); return true; } else { - if (details.commandInfo.subCommandTable.isEmpty()) { + if (details.commandInfo.subCommandTable().isEmpty()) { // No sub-commands -- we can fill optionals based on remaining argument count int remainingArguments = remainingNonFlagArguments(); int diff = remainingArguments - details.remainingRequiredParts; @@ -530,7 +529,7 @@ private AcceptInfo getAcceptInfoFromTypeParsers(ArgAcceptingCommandPart part, private void parseFlags(String flags) { for (int i = 0; i < flags.length(); i++) { char c = flags.charAt(i); - CommandFlag flag = perCommandDetails().commandInfo.flags.get(c); + CommandFlag flag = perCommandDetails().commandInfo.flags().get(c); if (flag == null) { buildParseResult(); throw new NoSuchFlagException(getResult(), c); @@ -541,14 +540,13 @@ private void parseFlags(String flags) { .append(" has already been specified.") .build()); } - if (flag instanceof ArgAcceptingCommandFlag) { + if (flag instanceof ArgAcceptingCommandFlag argPart) { if (i + 1 < flags.length()) { // Only allow argument-flags at the end of flag-combos. throw usageException(TextComponent.of("Argument-accepting flags must be " + "at the end of combined flag groups.")); } bind(flag, true); - ArgAcceptingCommandFlag argPart = (ArgAcceptingCommandFlag) flag; if (!hasNextArgument()) { throw notEnoughArgumentsException(); } From ac0b44256023935ecf15acabed0642ae5b02307b Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:33:47 +1000 Subject: [PATCH 06/12] refactor: use checkstyle --- .../main/kotlin/buildlogic.common.gradle.kts | 10 + config/checkstyle/checkstyle.xml | 193 ++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 config/checkstyle/checkstyle.xml diff --git a/build-logic/src/main/kotlin/buildlogic.common.gradle.kts b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts index 84ec5b0..fb7cac7 100644 --- a/build-logic/src/main/kotlin/buildlogic.common.gradle.kts +++ b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts @@ -7,6 +7,7 @@ plugins { id("eclipse") id("idea") id("net.octyl.level-headered") + id("checkstyle") id("java-library") id("maven-publish") } @@ -60,6 +61,11 @@ configure { headerTemplate(rootProject.file("HEADER.txt")) } +configure { + configFile = rootProject.file("config/checkstyle/checkstyle.xml") + toolVersion = "10.16.0" +} + configure { toolchain.languageVersion = JavaLanguageVersion.of(17) withJavadocJar() @@ -119,4 +125,8 @@ tasks { named("processTestResources") { from(rootProject.file("common-test-resources")) } + + named("check").configure { + dependsOn("checkstyleMain", "checkstyleTest") + } } \ No newline at end of file diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000..74a0146 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2720e69e093e50a400c06113ba869e878639cb1b Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:35:25 +1000 Subject: [PATCH 07/12] style: optimize imports --- .../gen/CommandParameterInterpreter.java | 8 ++--- .../gen/CommandRegistrationGenerator.java | 12 +++---- .../piston/gen/GenerationSupportImpl.java | 3 +- .../piston/gen/util/AnnoValueExtraction.java | 6 ++-- .../piston/gen/util/CodeBlockUtil.java | 4 +-- .../piston/gen/value/CommandInfo.java | 4 +-- .../piston/gen/value/ExtractSpec.java | 2 +- .../enginehub/piston/gen/value/KeyInfo.java | 2 +- .../piston/gen/value/RegistrationInfo.java | 2 +- .../java/org/enginehub/piston/Command.java | 2 +- .../piston/DefaultCommandManagerService.java | 2 +- .../piston/NoInputCommandParameters.java | 2 +- .../enginehub/piston/config/ColorConfig.java | 2 +- .../org/enginehub/piston/config/Config.java | 2 +- .../piston/converter/MultiKeyConverter.java | 2 +- .../piston/inject/AnnotationWrapper.java | 2 +- .../enginehub/piston/inject/Annotations.java | 2 +- .../inject/InstanceAnnotationWrapper.java | 2 +- .../java/org/enginehub/piston/inject/Key.java | 2 +- .../piston/inject/NullAnnotationWrapper.java | 2 +- .../piston/inject/TypeAnnotationWrapper.java | 2 +- .../piston/util/ComponentHelper.java | 2 +- .../piston/util/NonnullByDefault.java | 4 +-- .../enginehub/piston/util/ValueProvider.java | 2 +- .../enginehub/piston/impl/CommandImpl.java | 8 +---- .../piston/impl/CommandManagerImpl.java | 2 +- .../enginehub/piston/impl/CommandParser.java | 31 +++++++++---------- 27 files changed, 54 insertions(+), 62 deletions(-) diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java index 1076606..b8c2d0c 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandParameterInterpreter.java @@ -43,6 +43,10 @@ import org.enginehub.piston.part.CommandParts; import org.enginehub.piston.part.NoArgCommandFlag; +import java.lang.annotation.Annotation; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -50,10 +54,6 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; import static com.google.auto.common.MoreElements.asType; import static com.google.auto.common.MoreElements.getAnnotationMirror; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java index c244b8c..b74bec8 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/CommandRegistrationGenerator.java @@ -43,12 +43,6 @@ import org.enginehub.piston.internal.RegistrationUtil; import org.enginehub.piston.part.CommandParts; -import javax.annotation.processing.Filer; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; import java.io.IOException; import java.lang.reflect.Method; import java.time.Instant; @@ -56,6 +50,12 @@ import java.util.Objects; import java.util.function.Function; import java.util.stream.Stream; +import javax.annotation.processing.Filer; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java index 4e5758a..07e9ea6 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/GenerationSupportImpl.java @@ -26,10 +26,9 @@ import org.enginehub.piston.gen.value.RegistrationInfo; import org.enginehub.piston.gen.value.RequiredVariable; -import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; -import java.util.Objects; +import javax.annotation.Nullable; class GenerationSupportImpl implements GenerationSupport { diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java index e41fc64..083345f 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/AnnoValueExtraction.java @@ -22,15 +22,15 @@ import com.google.common.collect.ImmutableList; import com.google.common.primitives.Primitives; +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; import javax.annotation.Nullable; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.AnnotationValueVisitor; import javax.lang.model.element.Element; import javax.lang.model.util.SimpleAnnotationValueVisitor8; -import java.util.List; -import java.util.Objects; -import java.util.function.Predicate; import static com.google.auto.common.AnnotationMirrors.getAnnotationValue; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java index 411bfad..6546d07 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/util/CodeBlockUtil.java @@ -26,12 +26,12 @@ import net.kyori.text.TranslatableComponent; import org.enginehub.piston.internal.RegistrationUtil; -import javax.annotation.Nullable; -import javax.lang.model.element.ExecutableElement; import java.lang.reflect.Method; import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Stream; +import javax.annotation.Nullable; +import javax.lang.model.element.ExecutableElement; import static java.util.Objects.requireNonNull; import static org.enginehub.piston.gen.util.TypeNameUtil.rawType; diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandInfo.java index c0aed66..3c0e8d5 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/CommandInfo.java @@ -22,10 +22,10 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; -import javax.annotation.Nullable; -import javax.lang.model.element.ExecutableElement; import java.util.Collection; import java.util.Optional; +import javax.annotation.Nullable; +import javax.lang.model.element.ExecutableElement; @AutoValue public abstract class CommandInfo { diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java index 0dafc29..30fce67 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/ExtractSpec.java @@ -24,8 +24,8 @@ import com.palantir.javapoet.CodeBlock; import com.palantir.javapoet.TypeName; -import javax.annotation.Nullable; import java.util.Objects; +import javax.annotation.Nullable; /** * Specification for extracting a value. diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java index 8621a5c..84b174d 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/KeyInfo.java @@ -34,13 +34,13 @@ import org.enginehub.piston.inject.Key; import org.enginehub.piston.util.CaseHelper; -import javax.annotation.Nullable; import java.lang.annotation.Annotation; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Stream; +import javax.annotation.Nullable; @AutoValue public abstract class KeyInfo { diff --git a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java index b19fd39..fe4a78d 100644 --- a/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java +++ b/core-ap/processor/src/main/java/org/enginehub/piston/gen/value/RegistrationInfo.java @@ -24,10 +24,10 @@ import com.google.common.collect.ImmutableSet; import com.palantir.javapoet.ClassName; +import java.util.Collection; import javax.annotation.Nullable; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; -import java.util.Collection; @AutoValue public abstract class RegistrationInfo { diff --git a/core/src/main/java/org/enginehub/piston/Command.java b/core/src/main/java/org/enginehub/piston/Command.java index 3bbad75..fa3052e 100644 --- a/core/src/main/java/org/enginehub/piston/Command.java +++ b/core/src/main/java/org/enginehub/piston/Command.java @@ -26,9 +26,9 @@ import org.enginehub.piston.suggestion.SuggestionProvider; import org.enginehub.piston.util.HelpGenerator; -import javax.annotation.Nullable; import java.util.Collection; import java.util.Optional; +import javax.annotation.Nullable; /** * Represents a command. Commands can be modified using {@code with/add} functions, diff --git a/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java b/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java index 0ec9e7e..35bb16e 100644 --- a/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java +++ b/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java @@ -19,10 +19,10 @@ package org.enginehub.piston; -import javax.annotation.Nullable; import java.util.ServiceLoader; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Streams.stream; diff --git a/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java b/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java index 4096517..69c080b 100644 --- a/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java +++ b/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java @@ -26,9 +26,9 @@ import org.enginehub.piston.part.ArgAcceptingCommandPart; import org.enginehub.piston.part.CommandPart; -import javax.annotation.Nullable; import java.util.NoSuchElementException; import java.util.Optional; +import javax.annotation.Nullable; /** * An implementation of {@link CommandParameters} for situations where it is needed, diff --git a/core/src/main/java/org/enginehub/piston/config/ColorConfig.java b/core/src/main/java/org/enginehub/piston/config/ColorConfig.java index 6b33c0e..1e4b1f0 100644 --- a/core/src/main/java/org/enginehub/piston/config/ColorConfig.java +++ b/core/src/main/java/org/enginehub/piston/config/ColorConfig.java @@ -26,10 +26,10 @@ import net.kyori.text.format.Style; import net.kyori.text.format.TextColor; -import javax.annotation.Nullable; import java.util.Arrays; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; /** * Color configuration. diff --git a/core/src/main/java/org/enginehub/piston/config/Config.java b/core/src/main/java/org/enginehub/piston/config/Config.java index 65dd85f..f3b54d6 100644 --- a/core/src/main/java/org/enginehub/piston/config/Config.java +++ b/core/src/main/java/org/enginehub/piston/config/Config.java @@ -23,12 +23,12 @@ import net.kyori.text.Component; import net.kyori.text.TranslatableComponent; -import javax.annotation.Nullable; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; +import javax.annotation.Nullable; public abstract class Config { diff --git a/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java b/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java index 059ea95..0eb6077 100644 --- a/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java +++ b/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java @@ -29,12 +29,12 @@ import org.enginehub.piston.config.ColorConfig; import org.enginehub.piston.inject.InjectedValueAccess; -import javax.annotation.Nullable; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.function.Function; import java.util.function.UnaryOperator; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Multimaps.asMap; diff --git a/core/src/main/java/org/enginehub/piston/inject/AnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/AnnotationWrapper.java index 8ae11ca..265e3a0 100644 --- a/core/src/main/java/org/enginehub/piston/inject/AnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/AnnotationWrapper.java @@ -19,8 +19,8 @@ package org.enginehub.piston.inject; -import javax.annotation.Nullable; import java.lang.annotation.Annotation; +import javax.annotation.Nullable; /** * Defines comparision strategies for {@link Key}. diff --git a/core/src/main/java/org/enginehub/piston/inject/Annotations.java b/core/src/main/java/org/enginehub/piston/inject/Annotations.java index b1edbcb..fe9f871 100644 --- a/core/src/main/java/org/enginehub/piston/inject/Annotations.java +++ b/core/src/main/java/org/enginehub/piston/inject/Annotations.java @@ -24,7 +24,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; -import javax.annotation.Nullable; import java.lang.annotation.Annotation; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; @@ -34,6 +33,7 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Stream; +import javax.annotation.Nullable; import static java.util.stream.Collectors.toMap; diff --git a/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java index 5080575..34b56cc 100644 --- a/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java @@ -21,8 +21,8 @@ import com.google.auto.value.AutoValue; -import javax.annotation.Nonnull; import java.lang.annotation.Annotation; +import javax.annotation.Nonnull; @AutoValue abstract class InstanceAnnotationWrapper implements AnnotationWrapper { diff --git a/core/src/main/java/org/enginehub/piston/inject/Key.java b/core/src/main/java/org/enginehub/piston/inject/Key.java index 3e0856d..4ef4366 100644 --- a/core/src/main/java/org/enginehub/piston/inject/Key.java +++ b/core/src/main/java/org/enginehub/piston/inject/Key.java @@ -23,13 +23,13 @@ import com.google.common.base.MoreObjects; import com.google.common.reflect.TypeToken; -import javax.annotation.Nullable; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; import java.util.Objects; import java.util.stream.Stream; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java index a0f3444..e054670 100644 --- a/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java @@ -19,8 +19,8 @@ package org.enginehub.piston.inject; -import javax.annotation.Nullable; import java.lang.annotation.Annotation; +import javax.annotation.Nullable; final class NullAnnotationWrapper implements AnnotationWrapper { private static final NullAnnotationWrapper INSTANCE = new NullAnnotationWrapper(); diff --git a/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java index 8f7ccc7..efafe14 100644 --- a/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java @@ -21,9 +21,9 @@ import com.google.auto.value.AutoValue; +import java.lang.annotation.Annotation; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.lang.annotation.Annotation; @AutoValue abstract class TypeAnnotationWrapper implements AnnotationWrapper { diff --git a/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java b/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java index c35c3be..acfa839 100644 --- a/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java +++ b/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java @@ -23,8 +23,8 @@ import net.kyori.text.TextComponent; import org.enginehub.piston.config.ColorConfig; -import javax.annotation.Nullable; import java.util.stream.Collector; +import javax.annotation.Nullable; public class ComponentHelper { diff --git a/core/src/main/java/org/enginehub/piston/util/NonnullByDefault.java b/core/src/main/java/org/enginehub/piston/util/NonnullByDefault.java index 859cf20..9f8fb13 100644 --- a/core/src/main/java/org/enginehub/piston/util/NonnullByDefault.java +++ b/core/src/main/java/org/enginehub/piston/util/NonnullByDefault.java @@ -19,13 +19,13 @@ package org.enginehub.piston.util; -import javax.annotation.Nonnull; -import javax.annotation.meta.TypeQualifierDefault; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; /** * Marks a package, class, or method as having all elements {@link Nonnull} by default. diff --git a/core/src/main/java/org/enginehub/piston/util/ValueProvider.java b/core/src/main/java/org/enginehub/piston/util/ValueProvider.java index b7890cb..bcaf926 100644 --- a/core/src/main/java/org/enginehub/piston/util/ValueProvider.java +++ b/core/src/main/java/org/enginehub/piston/util/ValueProvider.java @@ -19,8 +19,8 @@ package org.enginehub.piston.util; -import javax.annotation.Nullable; import java.util.Optional; +import javax.annotation.Nullable; /** * Provides a value, given a context argument. diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java index 83175c4..2714576 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java @@ -22,21 +22,15 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import net.kyori.text.Component; -import net.kyori.text.TextComponent; import org.enginehub.piston.Command; -import org.enginehub.piston.part.CommandArgument; -import org.enginehub.piston.part.CommandFlag; import org.enginehub.piston.part.CommandPart; import org.enginehub.piston.suggestion.DefaultSuggestionProvider; import org.enginehub.piston.suggestion.SuggestionProvider; -import javax.annotation.Nullable; import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkState; -import static net.kyori.text.TextComponent.newline; import static org.enginehub.piston.Command.Action.NULL_ACTION; @AutoValue diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandManagerImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandManagerImpl.java index 3b55c0b..b6cf871 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandManagerImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandManagerImpl.java @@ -36,7 +36,6 @@ import org.enginehub.piston.part.SubCommandPart; import org.enginehub.piston.suggestion.Suggestion; -import javax.annotation.Nullable; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -47,6 +46,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; import java.util.stream.Stream; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkState; import static org.enginehub.piston.converter.SuggestionHelper.byPrefix; diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java index 0037506..3250a98 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java @@ -19,22 +19,6 @@ package org.enginehub.piston.impl; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static java.util.Objects.requireNonNull; - - -import javax.annotation.Nullable; -import java.util.HashSet; -import java.util.Iterator; -import java.util.ListIterator; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; -import java.util.function.Consumer; -import java.util.stream.Collectors; - import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -69,6 +53,21 @@ import org.enginehub.piston.util.ComponentHelper; import org.enginehub.piston.util.StreamHelper; +import java.util.HashSet; +import java.util.Iterator; +import java.util.ListIterator; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + class CommandParser { private static final Logger LOGGER = LogManagerCompat.getLogger(); From ce28df079687e5490233fc3c2593f334f288982f Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 22:18:03 +1000 Subject: [PATCH 08/12] style: conform to checkstyle requirements --- README.md | 4 +- .../junit-platform.properties | 11 +- config/checkstyle/checkstyle.xml | 18 +- .../piston/annotation/CommandContainer.java | 18 +- .../piston/annotation/param/ArgFlag.java | 4 +- .../gen/CommandParameterInterpreter.java | 48 +- .../piston/gen/CommandProcessor.java | 53 +- .../gen/CommandRegistrationGenerator.java | 40 +- .../piston/gen/ConditionGenerator.java | 5 +- .../piston/gen/GenerationSupport.java | 14 +- .../piston/gen/GenerationSupportImpl.java | 36 +- .../piston/gen/IdentifierTracker.java | 6 +- .../gen/optimize/CollectionOptimization.java | 2 - .../piston/gen/optimize/Optimization.java | 2 - .../piston/gen/util/AnnoValueExtraction.java | 6 +- .../piston/gen/util/ProcessingEnvValues.java | 6 +- .../piston/gen/util/TypeNameUtil.java | 9 +- .../piston/gen/value/CommandCondInfo.java | 20 +- .../piston/gen/value/CommandInfo.java | 42 +- .../piston/gen/value/CommandParamInfo.java | 28 +- .../piston/gen/value/ExtractSpec.java | 48 +- .../enginehub/piston/gen/value/KeyInfo.java | 28 +- .../piston/gen/value/RegistrationInfo.java | 40 +- .../piston/gen/value/RequiredVariable.java | 28 +- .../org/enginehub/piston/BasicCommandTest.kt | 19 +- .../org/enginehub/piston/MoreAssertions.kt | 6 +- .../org/enginehub/piston/RegressionTest.kt | 57 +- .../org/enginehub/piston/TestSupport.kt | 19 +- .../enginehub/piston/gen/BadGenerationTest.kt | 132 ++-- .../piston/gen/GoodGenerationTest.kt | 618 ++++++++++-------- .../enginehub/piston/gen/NestedClassTest.kt | 26 +- .../kotlin/org/enginehub/piston/gen/Utils.kt | 7 +- .../gen/util/AnnoValueExtractionTest.kt | 10 +- .../piston/gen/util/TypeNameUtilTest.kt | 32 +- .../piston/gen/value/ExtractSpecTest.kt | 4 +- .../suggestion/ManagerSuggestionTest.kt | 157 +++-- .../piston/suggestion/SuggestingCommand.kt | 18 +- .../piston/util/HelpGeneratorTest.kt | 152 +++-- .../gen/CollectionArgRegistration.java | 35 +- .../gen/CommandValueArgRegistration.java | 31 +- .../test/resources/gen/FlagsRegistration.java | 33 +- .../resources/gen/IntArgRegistration.java | 45 +- .../test/resources/gen/NoArgRegistration.java | 21 +- .../gen/NonArgParametersRegistration.java | 24 +- .../gen/Outer_BasicNestedRegistration.java | 21 +- .../resources/gen/SuperTypeRegistration.java | 13 +- .../gen/WildcardArgRegistration.java | 38 +- .../processor/src/test/resources/logback.xml | 16 +- .../piston/gen/CommandCallListener.java | 8 +- .../piston/internal/RegistrationUtil.java | 8 +- .../piston/util/RegistrationUtilTest.java | 29 +- .../java/org/enginehub/piston/ArgBinding.java | 3 +- .../java/org/enginehub/piston/Command.java | 54 +- .../org/enginehub/piston/CommandManager.java | 11 +- .../piston/DefaultCommandManagerService.java | 33 +- .../piston/NoInputCommandParameters.java | 30 +- .../enginehub/piston/config/ColorConfig.java | 8 +- .../org/enginehub/piston/config/Config.java | 3 +- .../enginehub/piston/config/ConfigHolder.java | 8 +- .../piston/config/ConfigRenderer.java | 6 +- .../enginehub/piston/config/TextConfig.java | 8 +- .../converter/ArgumentConverterStore.java | 4 +- .../piston/converter/ArgumentConverters.java | 120 ++-- .../piston/converter/ConversionResult.java | 2 +- .../enginehub/piston/converter/Converter.java | 2 +- .../piston/converter/FailedConversion.java | 26 +- .../converter/FailedConversionMapper.java | 6 +- .../converter/MapArgumentConverter.java | 12 +- .../piston/converter/MultiKeyConverter.java | 110 ++-- .../converter/SimpleArgumentConverter.java | 20 +- .../converter/SuccessfulConversion.java | 32 +- .../piston/converter/SuggestionHelper.java | 6 +- .../piston/converter/SuggestionProvider.java | 2 +- .../piston/exception/CommandException.java | 2 +- .../exception/ConversionFailedException.java | 26 +- .../piston/exception/NoSuchFlagException.java | 14 +- .../piston/exception/UsageException.java | 2 +- .../enginehub/piston/inject/Annotations.java | 80 ++- .../piston/inject/InjectedValueStore.java | 4 +- .../inject/InstanceAnnotationWrapper.java | 6 +- .../piston/inject/MapBackedValueStore.java | 12 +- .../piston/inject/MemoizingValueAccess.java | 14 +- .../piston/inject/MergedValueAccess.java | 12 +- .../piston/inject/NullAnnotationWrapper.java | 6 +- .../piston/inject/TypeAnnotationWrapper.java | 6 +- .../piston/part/ArgAcceptingCommandFlag.java | 32 +- .../piston/part/CommandArgument.java | 64 +- .../enginehub/piston/part/CommandParts.java | 6 +- .../piston/part/NoArgCommandFlag.java | 24 +- .../enginehub/piston/part/SubCommandPart.java | 30 +- .../suggestion/DefaultSuggestionProvider.java | 6 +- .../piston/suggestion/Suggestion.java | 28 +- .../piston/suggestion/SuggestionProvider.java | 2 +- .../piston/util/ComponentHelper.java | 6 +- .../enginehub/piston/util/HelpGenerator.java | 12 +- .../enginehub/piston/util/StreamHelper.java | 6 +- .../org/enginehub/piston/util/TextHelper.java | 7 +- .../org/enginehub/piston/ConditionTest.java | 9 +- .../piston/config/ConfigHolderTest.java | 6 +- .../enginehub/piston/impl/ArgBindingImpl.java | 26 +- .../enginehub/piston/impl/CommandImpl.java | 6 +- .../piston/impl/CommandMetadataImpl.java | 18 +- .../piston/impl/CommandParametersImpl.java | 58 +- .../piston/impl/CommandParseResultImpl.java | 24 +- .../enginehub/piston/impl/CommandParser.java | 110 ++-- .../piston/impl/CommandValueImpl.java | 48 +- .../piston/impl/LogManagerCompat.java | 6 +- .../enginehub/piston/impl/package-info.java | 1 + default-impl/src/test/resources/logback.xml | 16 +- 109 files changed, 1700 insertions(+), 1636 deletions(-) diff --git a/README.md b/README.md index bb647e2..d7bae31 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ A generic command system, with tie-ins to many Minecraft platforms such as Bukki Forge, and Sponge. ### Experimental Status -Piston is, as indicated by the Semantic Version, experimental, and all APIs are subject to break on minor version changes. + +Piston is, as indicated by the Semantic Version, experimental, and all APIs are subject to break on minor version +changes. It is recommended to not use Piston in the wild. ![Build Status](https://ci.enginehub.org/app/rest/builds/buildType:Piston_Build/statusIcon) diff --git a/common-test-resources/junit-platform.properties b/common-test-resources/junit-platform.properties index 4fba76b..6b92307 100644 --- a/common-test-resources/junit-platform.properties +++ b/common-test-resources/junit-platform.properties @@ -1,6 +1,5 @@ -junit.jupiter.execution.parallel.enabled = true -junit.jupiter.execution.parallel.mode.default = concurrent -junit.jupiter.execution.parallel.mode.classes.default = concurrent -junit.jupiter.execution.parallel.config.strategy = dynamic - -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file +junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.mode.default=concurrent +junit.jupiter.execution.parallel.mode.classes.default=concurrent +junit.jupiter.execution.parallel.config.strategy=dynamic +junit.jupiter.extensions.autodetection.enabled=true \ No newline at end of file diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 74a0146..8a818b8 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -1,5 +1,6 @@ - + - - - [%thread/%level{5}][%logger{1}]: %msg%rEx%n - - + + + [%thread/%level{5}][%logger{1}]: %msg%rEx%n + + - - - + + + \ No newline at end of file diff --git a/core-ap/runtime/src/main/java/org/enginehub/piston/gen/CommandCallListener.java b/core-ap/runtime/src/main/java/org/enginehub/piston/gen/CommandCallListener.java index 92ee125..2d74db2 100644 --- a/core-ap/runtime/src/main/java/org/enginehub/piston/gen/CommandCallListener.java +++ b/core-ap/runtime/src/main/java/org/enginehub/piston/gen/CommandCallListener.java @@ -32,7 +32,7 @@ public interface CommandCallListener { * Called before invoking the actual command method. * * @param commandMethod the method - * @param parameters the full parameters for the command + * @param parameters the full parameters for the command */ default void beforeCall(Method commandMethod, CommandParameters parameters) { } @@ -42,7 +42,7 @@ default void beforeCall(Method commandMethod, CommandParameters parameters) { * if it was successful. * * @param commandMethod the method - * @param parameters the full parameters for the command + * @param parameters the full parameters for the command */ default void afterCall(Method commandMethod, CommandParameters parameters) { } @@ -52,8 +52,8 @@ default void afterCall(Method commandMethod, CommandParameters parameters) { * if it threw an exception. * * @param commandMethod the method - * @param error the exception thrown by the method - * @param parameters the full parameters for the command + * @param error the exception thrown by the method + * @param parameters the full parameters for the command */ default void afterThrow(Method commandMethod, CommandParameters parameters, Throwable error) { } diff --git a/core-ap/runtime/src/main/java/org/enginehub/piston/internal/RegistrationUtil.java b/core-ap/runtime/src/main/java/org/enginehub/piston/internal/RegistrationUtil.java index 3ff35e9..a9c0c49 100644 --- a/core-ap/runtime/src/main/java/org/enginehub/piston/internal/RegistrationUtil.java +++ b/core-ap/runtime/src/main/java/org/enginehub/piston/internal/RegistrationUtil.java @@ -32,6 +32,10 @@ */ public class RegistrationUtil { + private RegistrationUtil() { + throw new RuntimeException(); + } + public static T requireOptional(Key type, String name, Optional optional) { return optional.orElseThrow(() -> new IllegalStateException("No injected value for " + name + " (type " + type + ")") @@ -71,8 +75,4 @@ public static void listenersAfterThrow(List listeners, } } - private RegistrationUtil() { - throw new RuntimeException(); - } - } diff --git a/core-ap/runtime/src/test/java/org/enginehub/piston/util/RegistrationUtilTest.java b/core-ap/runtime/src/test/java/org/enginehub/piston/util/RegistrationUtilTest.java index de29d12..767ec36 100644 --- a/core-ap/runtime/src/test/java/org/enginehub/piston/util/RegistrationUtilTest.java +++ b/core-ap/runtime/src/test/java/org/enginehub/piston/util/RegistrationUtilTest.java @@ -43,6 +43,19 @@ @DisplayName("RegistrationUtil") public class RegistrationUtilTest { + private final Method fakeCommandMethod; + private final CommandParameters parameters = NoInputCommandParameters.builder() + .build(); + private final CommandCallListener listener = mock(CommandCallListener.class); + + { + try { + fakeCommandMethod = getClass().getDeclaredMethod("requireOptional"); + } catch (NoSuchMethodException e) { + throw new IllegalStateException(e); + } + } + @Test void noConstruction() throws Exception { Constructor constructor = RegistrationUtil.class.getDeclaredConstructor(); @@ -61,16 +74,6 @@ void requireOptional() { assertTrue(ex.getMessage().contains(Key.of(String.class).toString())); } - private final Method fakeCommandMethod; - - { - try { - fakeCommandMethod = getClass().getDeclaredMethod("requireOptional"); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } - @Test void getCommandMethod() { assertEquals(fakeCommandMethod, @@ -80,10 +83,6 @@ void getCommandMethod() { assertTrue(ex.getMessage().contains("Missing command method")); } - private final CommandParameters parameters = NoInputCommandParameters.builder() - .build(); - private final CommandCallListener listener = mock(CommandCallListener.class); - @Test void listenersBeforeCall() { RegistrationUtil.listenersBeforeCall(ImmutableList.of(listener), fakeCommandMethod, parameters); @@ -91,6 +90,7 @@ void listenersBeforeCall() { verify(listener).beforeCall(fakeCommandMethod, parameters); verifyNoMoreInteractions(listener); } + @Test void listenersAfterCall() { RegistrationUtil.listenersAfterCall(ImmutableList.of(listener), fakeCommandMethod, parameters); @@ -98,6 +98,7 @@ void listenersAfterCall() { verify(listener).afterCall(fakeCommandMethod, parameters); verifyNoMoreInteractions(listener); } + @Test void listenersAfterThrow() { Throwable ex = new RuntimeException(); diff --git a/core/src/main/java/org/enginehub/piston/ArgBinding.java b/core/src/main/java/org/enginehub/piston/ArgBinding.java index f156cbd..5153d0c 100644 --- a/core/src/main/java/org/enginehub/piston/ArgBinding.java +++ b/core/src/main/java/org/enginehub/piston/ArgBinding.java @@ -20,7 +20,6 @@ package org.enginehub.piston; import com.google.common.collect.ImmutableSet; -import org.enginehub.piston.converter.SuccessfulConversion; import org.enginehub.piston.part.CommandPart; public interface ArgBinding { @@ -31,7 +30,7 @@ public interface ArgBinding { String getInput(); /** - * Did we match the given part exactly? + * Check if we match the given part exactly. * * @param part the part, must be contained in the parts returned by {@link #getParts()} * @since 0.5.8 diff --git a/core/src/main/java/org/enginehub/piston/Command.java b/core/src/main/java/org/enginehub/piston/Command.java index fa3052e..14973ad 100644 --- a/core/src/main/java/org/enginehub/piston/Command.java +++ b/core/src/main/java/org/enginehub/piston/Command.java @@ -41,6 +41,32 @@ */ public interface Command { + String getName(); + + ImmutableList getAliases(); + + Component getDescription(); + + Optional getFooter(); + + ImmutableList getParts(); + + Condition getCondition(); + + Action getAction(); + + SuggestionProvider getSuggester(); + + Builder toBuilder(); + + default Component getUsage() { + return HelpGenerator.create(ImmutableList.of(this)).getUsage(); + } + + default Component getFullHelp() { + return HelpGenerator.create(ImmutableList.of(this)).getFullHelp(); + } + /** * Represents what a command does. An action usually does one or more things, * and those should be counted and returned for user feedback. @@ -101,7 +127,7 @@ default Condition not() { * Retrieve this condition as a more specific type, if possible. * * @param type the class to cast to - * @param the type of the output + * @param the type of the output * @return this as {@code T}, if possible */ default Optional as(Class type) { @@ -144,30 +170,4 @@ interface Builder { } - String getName(); - - ImmutableList getAliases(); - - Component getDescription(); - - Optional getFooter(); - - ImmutableList getParts(); - - Condition getCondition(); - - Action getAction(); - - SuggestionProvider getSuggester(); - - Builder toBuilder(); - - default Component getUsage() { - return HelpGenerator.create(ImmutableList.of(this)).getUsage(); - } - - default Component getFullHelp() { - return HelpGenerator.create(ImmutableList.of(this)).getFullHelp(); - } - } diff --git a/core/src/main/java/org/enginehub/piston/CommandManager.java b/core/src/main/java/org/enginehub/piston/CommandManager.java index 9a86f4b..09eed42 100644 --- a/core/src/main/java/org/enginehub/piston/CommandManager.java +++ b/core/src/main/java/org/enginehub/piston/CommandManager.java @@ -60,7 +60,7 @@ public interface CommandManager extends ArgumentConverterStore { /** * Register a command that initially has the given name, and then is configured by a function. * - * @param name the name of the command + * @param name the name of the command * @param registrationProcess a function that will build the command */ default void register(String name, Consumer registrationProcess) { @@ -100,8 +100,7 @@ default boolean containsCommand(String name) { *

Includes aliases.

* * @param name the name to check - * @return {@link Optional#of(Object)} the command if registered, - * otherwise {@link Optional#empty()} + * @return {@link Optional#of(Object)} the command if registered, otherwise {@link Optional#empty()} */ Optional getCommand(String name); @@ -110,7 +109,7 @@ default boolean containsCommand(String name) { * entire command line, so that partial parsing may occur. * * @param context the injected value context - * @param args the command line to suggest into + * @param args the command line to suggest into * @return the suggestions */ ImmutableSet getSuggestions(InjectedValueAccess context, List args); @@ -133,7 +132,7 @@ default boolean containsCommand(String name) { *

* * @param context the injected value context - * @param args the arguments to include + * @param args the arguments to include * @return the parsing output */ CommandParseResult parse(InjectedValueAccess context, List args); @@ -147,7 +146,7 @@ default boolean containsCommand(String name) { *

* * @param context the injected value context - * @param args the arguments to include + * @param args the arguments to include * @return the count from the executed command */ default int execute(InjectedValueAccess context, List args) { diff --git a/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java b/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java index 35bb16e..5774168 100644 --- a/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java +++ b/core/src/main/java/org/enginehub/piston/DefaultCommandManagerService.java @@ -39,6 +39,14 @@ public class DefaultCommandManagerService implements CommandManagerService { private static final DefaultCommandManagerService INSTANCE = new DefaultCommandManagerService(getDefaultService()); + private final Lock sealLock = new ReentrantLock(); + private CommandManagerService defaultService; + @Nullable + private CommandManagerService sealedDefaultService; + + private DefaultCommandManagerService(CommandManagerService defaultService) { + this.defaultService = defaultService; + } public static DefaultCommandManagerService getInstance() { return INSTANCE; @@ -54,13 +62,14 @@ private static CommandManagerService getDefaultService() { .orElseThrow(() -> new IllegalStateException("No default service available.")); } - private final Lock sealLock = new ReentrantLock(); - private CommandManagerService defaultService; - @Nullable - private CommandManagerService sealedDefaultService; - - private DefaultCommandManagerService(CommandManagerService defaultService) { - this.defaultService = defaultService; + public void setDefaultService(CommandManagerService defaultService) { + sealLock.lock(); + try { + checkState(sealedDefaultService == null, "Piston default service is sealed"); + this.defaultService = defaultService; + } finally { + sealLock.unlock(); + } } private CommandManagerService sealDelegate() { @@ -82,16 +91,6 @@ private CommandManagerService sealDelegate() { return sealedDefaultService; } - public void setDefaultService(CommandManagerService defaultService) { - sealLock.lock(); - try { - checkState(sealedDefaultService == null, "Piston default service is sealed"); - this.defaultService = defaultService; - } finally { - sealLock.unlock(); - } - } - @Override public String id() { return sealDelegate().id(); diff --git a/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java b/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java index 69c080b..3d1260c 100644 --- a/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java +++ b/core/src/main/java/org/enginehub/piston/NoInputCommandParameters.java @@ -37,27 +37,15 @@ @AutoValue public abstract class NoInputCommandParameters implements CommandParameters { + NoInputCommandParameters() { + } + public static Builder builder() { return new AutoValue_NoInputCommandParameters.Builder() .injectedValues(InjectedValueAccess.EMPTY) .converters(ArgumentConverterAccess.EMPTY); } - @AutoValue.Builder - public interface Builder { - - Builder injectedValues(InjectedValueAccess values); - - Builder metadata(@Nullable CommandMetadata metadata); - - Builder converters(ArgumentConverterAccess access); - - NoInputCommandParameters build(); - } - - NoInputCommandParameters() { - } - abstract InjectedValueAccess injectedValues(); @Nullable @@ -91,4 +79,16 @@ public Optional injectedValue(Key key, InjectedValueAccess context) { return injectedValues().injectedValue(key, context); } + @AutoValue.Builder + public interface Builder { + + Builder injectedValues(InjectedValueAccess values); + + Builder metadata(@Nullable CommandMetadata metadata); + + Builder converters(ArgumentConverterAccess access); + + NoInputCommandParameters build(); + } + } diff --git a/core/src/main/java/org/enginehub/piston/config/ColorConfig.java b/core/src/main/java/org/enginehub/piston/config/ColorConfig.java index 1e4b1f0..0c0f2d1 100644 --- a/core/src/main/java/org/enginehub/piston/config/ColorConfig.java +++ b/core/src/main/java/org/enginehub/piston/config/ColorConfig.java @@ -49,6 +49,10 @@ public class ColorConfig extends Config { Style.Merge.DECORATIONS, Style.Merge.INSERTION, Style.Merge.EVENTS ); + private ColorConfig(String key, @Nullable TextColor color) { + super(key, color); + } + /** * Color for text that modifies the main text. */ @@ -77,10 +81,6 @@ public static ColorConfig partWrapping() { return PART_WRAPPING; } - private ColorConfig(String key, @Nullable TextColor color) { - super(key, color); - } - @Override protected Config copyForDefault() { return new ColorConfig(getKey(), getValue()); diff --git a/core/src/main/java/org/enginehub/piston/config/Config.java b/core/src/main/java/org/enginehub/piston/config/Config.java index f3b54d6..6ed6ed5 100644 --- a/core/src/main/java/org/enginehub/piston/config/Config.java +++ b/core/src/main/java/org/enginehub/piston/config/Config.java @@ -53,8 +53,7 @@ public String getKey() { return key; } - public @Nullable - T getValue() { + public @Nullable T getValue() { return value; } diff --git a/core/src/main/java/org/enginehub/piston/config/ConfigHolder.java b/core/src/main/java/org/enginehub/piston/config/ConfigHolder.java index 85e0d00..5ebbff2 100644 --- a/core/src/main/java/org/enginehub/piston/config/ConfigHolder.java +++ b/core/src/main/java/org/enginehub/piston/config/ConfigHolder.java @@ -32,16 +32,16 @@ public class ConfigHolder { TextConfig.commandPrefix(); } - public static ConfigHolder create() { - return new ConfigHolder(Config.defaultInstances); - } - private final Map> configs = new HashMap<>(); private ConfigHolder(Map> configs) { this.configs.putAll(configs); } + public static ConfigHolder create() { + return new ConfigHolder(Config.defaultInstances); + } + public Map> getConfigs() { return configs; } diff --git a/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java b/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java index 5abf23f..e50771a 100644 --- a/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java +++ b/core/src/main/java/org/enginehub/piston/config/ConfigRenderer.java @@ -34,6 +34,9 @@ public class ConfigRenderer implements ComponentRenderer { private static final ConfigRenderer INSTANCE = new ConfigRenderer(); + private ConfigRenderer() { + } + /** * Get an instance of the renderer. */ @@ -41,9 +44,6 @@ public static ConfigRenderer getInstance() { return INSTANCE; } - private ConfigRenderer() { - } - @Override public @NonNull Component render(@NonNull Component component, @NonNull ConfigHolder context) { component = replaceSubcomponents(component, context); diff --git a/core/src/main/java/org/enginehub/piston/config/TextConfig.java b/core/src/main/java/org/enginehub/piston/config/TextConfig.java index 3aa77b0..2f8bfeb 100644 --- a/core/src/main/java/org/enginehub/piston/config/TextConfig.java +++ b/core/src/main/java/org/enginehub/piston/config/TextConfig.java @@ -35,6 +35,10 @@ public class TextConfig extends Config { private static final TextConfig COMMAND_PREFIX = new TextConfig("piston.text.command.prefix"); + private TextConfig(String key) { + super(key, ""); + } + /** * Output command prefix -- all commands will be output with this prefix before their name. */ @@ -46,10 +50,6 @@ public static Component commandPrefixValue() { return commandPrefix().value(); } - private TextConfig(String key) { - super(key, ""); - } - @Override protected Config copyForDefault() { return new TextConfig(getKey()); diff --git a/core/src/main/java/org/enginehub/piston/converter/ArgumentConverterStore.java b/core/src/main/java/org/enginehub/piston/converter/ArgumentConverterStore.java index 9673d54..cf0b4b7 100644 --- a/core/src/main/java/org/enginehub/piston/converter/ArgumentConverterStore.java +++ b/core/src/main/java/org/enginehub/piston/converter/ArgumentConverterStore.java @@ -29,9 +29,9 @@ public interface ArgumentConverterStore extends ArgumentConverterAccess { /** * Register a converter for a given key. * - * @param key the key to register the converter under + * @param key the key to register the converter under * @param converter the converter to register - * @param the type of value returned by the converter + * @param the type of value returned by the converter */ void registerConverter(Key key, ArgumentConverter converter); diff --git a/core/src/main/java/org/enginehub/piston/converter/ArgumentConverters.java b/core/src/main/java/org/enginehub/piston/converter/ArgumentConverters.java index a7777cc..3334bbf 100644 --- a/core/src/main/java/org/enginehub/piston/converter/ArgumentConverters.java +++ b/core/src/main/java/org/enginehub/piston/converter/ArgumentConverters.java @@ -47,6 +47,62 @@ public class ArgumentConverters { private static final ArgumentConverter STRING_ARGUMENT_CONVERTER = SimpleArgumentConverter.from((s, c) -> SuccessfulConversion.fromSingle(s), "any text"); + private static final String CONVERTER_CONVERT = "convert"; + private static final MethodType HANDLE_TO_CONVERTER = methodType(Converter.class, MethodHandle.class); + private static final MethodType CONVERTER_SIG = methodType(ConversionResult.class, String.class, InjectedValueAccess.class); + private static final MethodHandle HANDLE_TO_CONVERTER_CONVERTER; + private static final MethodHandle SUCCESSFUL_CONVERSION_FROM; + private static final MethodHandle FAILED_CONVERSION_FROM; + private static final List> PROVIDERS = ImmutableList.of( + ArgumentConverters::valueOfConverters, + ArgumentConverters::constructorConverters, + type -> { + if (Objects.equals(type.wrap().getRawType(), Character.class)) { + return Optional.of(SimpleArgumentConverter.from( + (s, c) -> SuccessfulConversion.fromSingle(s.charAt(0)), + "any character" + )); + } + return Optional.empty(); + } + ); + + static { + MethodHandle handleInvoker = MethodHandles.invoker(CONVERTER_SIG); + try { + HANDLE_TO_CONVERTER_CONVERTER = LambdaMetafactory.metafactory( + MethodHandles.lookup(), + // Implementing Converter.convert + CONVERTER_CONVERT, + // Take a handle, to be converter to Converter + HANDLE_TO_CONVERTER, + // Raw signature for SAM type + CONVERTER_SIG, + // Handle to call the captured handle. + handleInvoker, + // Actual signature at invoke time + CONVERTER_SIG + ).dynamicInvoker(); + } catch (LambdaConversionException e) { + throw new IllegalStateException("Failed to load ArgumentConverter MetaFactory", e); + } + } + + static { + try { + SUCCESSFUL_CONVERSION_FROM = MethodHandles.lookup() + .findStatic(SuccessfulConversion.class, "fromSingle", + methodType(SuccessfulConversion.class, Object.class)); + FAILED_CONVERSION_FROM = MethodHandles.lookup() + .findStatic(FailedConversion.class, "from", + methodType(FailedConversion.class, Throwable.class)); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + + private ArgumentConverters() { + } public static ArgumentConverter forString() { return STRING_ARGUMENT_CONVERTER; @@ -99,33 +155,6 @@ private static MethodHandle noContextConverter(MethodHandle noContextHandle) { return dropArguments(noContextHandle, 1, InjectedValueAccess.class); } - private static final String CONVERTER_CONVERT = "convert"; - private static final MethodType HANDLE_TO_CONVERTER = methodType(Converter.class, MethodHandle.class); - private static final MethodType CONVERTER_SIG = methodType(ConversionResult.class, String.class, InjectedValueAccess.class); - - private static final MethodHandle HANDLE_TO_CONVERTER_CONVERTER; - - static { - MethodHandle handleInvoker = MethodHandles.invoker(CONVERTER_SIG); - try { - HANDLE_TO_CONVERTER_CONVERTER = LambdaMetafactory.metafactory( - MethodHandles.lookup(), - // Implementing Converter.convert - CONVERTER_CONVERT, - // Take a handle, to be converter to Converter - HANDLE_TO_CONVERTER, - // Raw signature for SAM type - CONVERTER_SIG, - // Handle to call the captured handle. - handleInvoker, - // Actual signature at invoke time - CONVERTER_SIG - ).dynamicInvoker(); - } catch (LambdaConversionException e) { - throw new IllegalStateException("Failed to load ArgumentConverter MetaFactory", e); - } - } - @SuppressWarnings("unchecked") private static SimpleArgumentConverter converterForHandle(MethodHandle handle, Class type) { MethodType mType = handle.type(); @@ -149,22 +178,6 @@ private static SimpleArgumentConverter converterForHandle(MethodHandle ha ); } - private static final MethodHandle SUCCESSFUL_CONVERSION_FROM; - private static final MethodHandle FAILED_CONVERSION_FROM; - - static { - try { - SUCCESSFUL_CONVERSION_FROM = MethodHandles.lookup() - .findStatic(SuccessfulConversion.class, "fromSingle", - methodType(SuccessfulConversion.class, Object.class)); - FAILED_CONVERSION_FROM = MethodHandles.lookup() - .findStatic(FailedConversion.class, "from", - methodType(FailedConversion.class, Throwable.class)); - } catch (NoSuchMethodException | IllegalAccessException e) { - throw new IllegalStateException(e); - } - } - /** * Wrap the handle to return the result using {@link ConversionResult}. */ @@ -178,24 +191,6 @@ private static MethodHandle augmentHandleForConversionResult(MethodHandle delega return result; } - private interface ACProvider { - Optional> provideAc(TypeToken type); - } - - private static final List> PROVIDERS = ImmutableList.of( - ArgumentConverters::valueOfConverters, - ArgumentConverters::constructorConverters, - type -> { - if (Objects.equals(type.wrap().getRawType(), Character.class)) { - return Optional.of(SimpleArgumentConverter.from( - (s, c) -> SuccessfulConversion.fromSingle(s.charAt(0)), - "any character" - )); - } - return Optional.empty(); - } - ); - public static ArgumentConverter get(TypeToken type) { if (type.getRawType().equals(String.class)) { @SuppressWarnings("unchecked") @@ -216,7 +211,8 @@ public static ArgumentConverter get(TypeToken type) { return result; } - private ArgumentConverters() { + private interface ACProvider { + Optional> provideAc(TypeToken type); } } diff --git a/core/src/main/java/org/enginehub/piston/converter/ConversionResult.java b/core/src/main/java/org/enginehub/piston/converter/ConversionResult.java index 46550f8..5c65c1a 100644 --- a/core/src/main/java/org/enginehub/piston/converter/ConversionResult.java +++ b/core/src/main/java/org/enginehub/piston/converter/ConversionResult.java @@ -71,7 +71,7 @@ public abstract class ConversionResult { *

* * @param mapper the function to call if successful - * @param the new type + * @param the new type * @return the new result */ public abstract ConversionResult map(Function, ? extends Collection> mapper); diff --git a/core/src/main/java/org/enginehub/piston/converter/Converter.java b/core/src/main/java/org/enginehub/piston/converter/Converter.java index f2361f7..8c88533 100644 --- a/core/src/main/java/org/enginehub/piston/converter/Converter.java +++ b/core/src/main/java/org/enginehub/piston/converter/Converter.java @@ -37,7 +37,7 @@ public interface Converter { *

* * @param argument the argument input to convert - * @param context the context to convert in + * @param context the context to convert in * @return the result of attempting to convert the argument */ ConversionResult convert(String argument, InjectedValueAccess context); diff --git a/core/src/main/java/org/enginehub/piston/converter/FailedConversion.java b/core/src/main/java/org/enginehub/piston/converter/FailedConversion.java index bed94da..20919c6 100644 --- a/core/src/main/java/org/enginehub/piston/converter/FailedConversion.java +++ b/core/src/main/java/org/enginehub/piston/converter/FailedConversion.java @@ -28,14 +28,6 @@ public final class FailedConversion extends ConversionResult { - public static FailedConversion from(Throwable error) { - return from(error, ImmutableSet.of()); - } - - public static FailedConversion from(Throwable error, Collection> otherFailures) { - return new FailedConversion<>(error, otherFailures); - } - private final Throwable error; private final ImmutableSet> otherFailures; @@ -45,6 +37,13 @@ public FailedConversion(Throwable error, this.otherFailures = ImmutableSet.copyOf(otherFailures); } + public static FailedConversion from(Throwable error) { + return from(error, ImmutableSet.of()); + } + + public static FailedConversion from(Throwable error, Collection> otherFailures) { + return new FailedConversion<>(error, otherFailures); + } @Override public boolean isSuccessful() { @@ -88,11 +87,14 @@ public Collection get() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } FailedConversion that = (FailedConversion) o; - return error.equals(that.error) && - otherFailures.equals(that.otherFailures); + return error.equals(that.error) && otherFailures.equals(that.otherFailures); } @Override diff --git a/core/src/main/java/org/enginehub/piston/converter/FailedConversionMapper.java b/core/src/main/java/org/enginehub/piston/converter/FailedConversionMapper.java index 0551476..16f06bd 100644 --- a/core/src/main/java/org/enginehub/piston/converter/FailedConversionMapper.java +++ b/core/src/main/java/org/enginehub/piston/converter/FailedConversionMapper.java @@ -22,6 +22,9 @@ import java.util.function.Supplier; public class FailedConversionMapper { + private FailedConversionMapper() { + } + public static X mapOnto(Supplier newThrowable, FailedConversion conversion) { X error = newThrowable.get(); error.initCause(conversion.getError()); @@ -30,7 +33,4 @@ public static X mapOnto(Supplier newThrowable, FailedCo ); return error; } - - private FailedConversionMapper() { - } } diff --git a/core/src/main/java/org/enginehub/piston/converter/MapArgumentConverter.java b/core/src/main/java/org/enginehub/piston/converter/MapArgumentConverter.java index 9adfec3..1ed4809 100644 --- a/core/src/main/java/org/enginehub/piston/converter/MapArgumentConverter.java +++ b/core/src/main/java/org/enginehub/piston/converter/MapArgumentConverter.java @@ -36,6 +36,12 @@ */ public final class MapArgumentConverter implements ArgumentConverter { + private final ImmutableMap map; + + private MapArgumentConverter(Map map) { + this.map = ImmutableMap.copyOf(map); + } + /** * Construct a converter for simple string choices from a set. */ @@ -49,12 +55,6 @@ public static MapArgumentConverter from(Map map) { return new MapArgumentConverter<>(map); } - private final ImmutableMap map; - - private MapArgumentConverter(Map map) { - this.map = ImmutableMap.copyOf(map); - } - @Override public ConversionResult convert(String argument, InjectedValueAccess context) { T result = map.get(argument); diff --git a/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java b/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java index 0eb6077..ac98155 100644 --- a/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java +++ b/core/src/main/java/org/enginehub/piston/converter/MultiKeyConverter.java @@ -43,6 +43,32 @@ public class MultiKeyConverter implements ArgumentConverter { + private final Component choices; + private final ImmutableSet primaryKeys; + private final ImmutableMap map; + @Nullable + private final E unknownValue; + private final UnaryOperator errorMessage; + + private MultiKeyConverter(Arguments arguments) { + ImmutableSortedMap.Builder map = ImmutableSortedMap.orderedBy(String.CASE_INSENSITIVE_ORDER); + ImmutableSet.Builder primaryKeysBuilder = ImmutableSet.builder(); + asMap(arguments.items()).forEach((item, keys) -> { + checkState(keys.size() > 0, "No lookup keys for value %s", item); + primaryKeysBuilder.add(keys.iterator().next()); + for (String key : keys) { + map.put(key, item); + } + }); + this.primaryKeys = primaryKeysBuilder.build(); + this.choices = primaryKeys.stream() + .map(ColorConfig.mainText()::wrap) + .collect(joiningWithBar()); + this.map = map.build(); + this.unknownValue = arguments.unknownValue(); + this.errorMessage = arguments.errorMessage(); + } + public static Builder builder(SetMultimap items) { return new AutoValue_MultiKeyConverter_Arguments.Builder() .errorMessage(arg -> "Not a valid argument: " + arg) @@ -78,6 +104,28 @@ public static MultiKeyConverter from(Collection items, return builder(items, lookupKeys).unknownValue(unknownValue).build(); } + @Override + public Component describeAcceptableArguments() { + return choices; + } + + @Override + public List getSuggestions(String input, InjectedValueAccess context) { + return limitByPrefix(primaryKeys.stream(), input); + } + + @Override + public ConversionResult convert(String argument, InjectedValueAccess context) { + E result = map.get(argument); + if (result == null) { + if (unknownValue != null) { + return SuccessfulConversion.fromSingle(unknownValue, false); + } + return FailedConversion.from(new IllegalArgumentException(errorMessage.apply(argument))); + } + return SuccessfulConversion.fromSingle(result); + } + public interface Builder { Builder items(SetMultimap items); @@ -91,6 +139,13 @@ public interface Builder { @AutoValue abstract static class Arguments { + abstract ImmutableSetMultimap items(); + + @Nullable + abstract E unknownValue(); + + abstract UnaryOperator errorMessage(); + @AutoValue.Builder interface Builder extends MultiKeyConverter.Builder { @@ -111,60 +166,5 @@ default MultiKeyConverter build() { } } - abstract ImmutableSetMultimap items(); - - @Nullable - abstract E unknownValue(); - - abstract UnaryOperator errorMessage(); - - } - - private final Component choices; - private final ImmutableSet primaryKeys; - private final ImmutableMap map; - @Nullable - private final E unknownValue; - private final UnaryOperator errorMessage; - - private MultiKeyConverter(Arguments arguments) { - ImmutableSortedMap.Builder map = ImmutableSortedMap.orderedBy(String.CASE_INSENSITIVE_ORDER); - ImmutableSet.Builder primaryKeysBuilder = ImmutableSet.builder(); - asMap(arguments.items()).forEach((item, keys) -> { - checkState(keys.size() > 0, "No lookup keys for value %s", item); - primaryKeysBuilder.add(keys.iterator().next()); - for (String key : keys) { - map.put(key, item); - } - }); - this.primaryKeys = primaryKeysBuilder.build(); - this.choices = primaryKeys.stream() - .map(ColorConfig.mainText()::wrap) - .collect(joiningWithBar()); - this.map = map.build(); - this.unknownValue = arguments.unknownValue(); - this.errorMessage = arguments.errorMessage(); - } - - @Override - public Component describeAcceptableArguments() { - return choices; - } - - @Override - public List getSuggestions(String input, InjectedValueAccess context) { - return limitByPrefix(primaryKeys.stream(), input); - } - - @Override - public ConversionResult convert(String argument, InjectedValueAccess context) { - E result = map.get(argument); - if (result == null) { - if (unknownValue != null) { - return SuccessfulConversion.fromSingle(unknownValue, false); - } - return FailedConversion.from(new IllegalArgumentException(errorMessage.apply(argument))); - } - return SuccessfulConversion.fromSingle(result); } } diff --git a/core/src/main/java/org/enginehub/piston/converter/SimpleArgumentConverter.java b/core/src/main/java/org/enginehub/piston/converter/SimpleArgumentConverter.java index 7ba79f2..adfe602 100644 --- a/core/src/main/java/org/enginehub/piston/converter/SimpleArgumentConverter.java +++ b/core/src/main/java/org/enginehub/piston/converter/SimpleArgumentConverter.java @@ -31,6 +31,14 @@ */ public class SimpleArgumentConverter implements ArgumentConverter { + private final Converter converter; + private final Component description; + + private SimpleArgumentConverter(Converter converter, Component description) { + this.converter = converter; + this.description = description; + } + public static SimpleArgumentConverter from(Converter converter, String description) { return from(converter, TextComponent.of(description)); } @@ -40,23 +48,15 @@ public static SimpleArgumentConverter from(Converter converter, String * function, and supplies the provided description for * {@link ArgumentConverter#describeAcceptableArguments()}. * - * @param converter the converter function + * @param converter the converter function * @param description the acceptable arguments description - * @param the type of the argument + * @param the type of the argument * @return a converter using the given function and description */ public static SimpleArgumentConverter from(Converter converter, Component description) { return new SimpleArgumentConverter<>(converter, description); } - private final Converter converter; - private final Component description; - - private SimpleArgumentConverter(Converter converter, Component description) { - this.converter = converter; - this.description = description; - } - @Override public ConversionResult convert(String argument, InjectedValueAccess context) { return converter.convert(argument, context); diff --git a/core/src/main/java/org/enginehub/piston/converter/SuccessfulConversion.java b/core/src/main/java/org/enginehub/piston/converter/SuccessfulConversion.java index 059bb25..b88d70f 100644 --- a/core/src/main/java/org/enginehub/piston/converter/SuccessfulConversion.java +++ b/core/src/main/java/org/enginehub/piston/converter/SuccessfulConversion.java @@ -27,6 +27,14 @@ public final class SuccessfulConversion extends ConversionResult { + private final Collection result; + private final boolean exactMatch; + + private SuccessfulConversion(Collection result, boolean exactMatch) { + this.result = result; + this.exactMatch = exactMatch; + } + public static SuccessfulConversion fromSingle(T result) { return from(ImmutableList.of(result)); } @@ -43,21 +51,11 @@ public static SuccessfulConversion from(Collection result, boolean exa return new SuccessfulConversion<>(result, exactMatch); } - private final Collection result; - private final boolean exactMatch; - - private SuccessfulConversion(Collection result, boolean exactMatch) { - this.result = result; - this.exactMatch = exactMatch; - } - /** - * Is this conversion an exact match for a complete input? + * Check if this conversion an exact match for a complete input. * - *

- * This may be {@code false} if the conversion is a partial match, or if the input was - * unknown and the conversion was a fallback. - *

+ *

This may be {@code false} if the conversion is a partial match, or if the input was + * unknown and the conversion was a fallback.

* * @return {@code true} if this conversion is an exact match * @since 0.5.8 @@ -102,8 +100,12 @@ public Collection get() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } SuccessfulConversion that = (SuccessfulConversion) o; return result.equals(that.result); } diff --git a/core/src/main/java/org/enginehub/piston/converter/SuggestionHelper.java b/core/src/main/java/org/enginehub/piston/converter/SuggestionHelper.java index 15a2d89..f6279ce 100644 --- a/core/src/main/java/org/enginehub/piston/converter/SuggestionHelper.java +++ b/core/src/main/java/org/enginehub/piston/converter/SuggestionHelper.java @@ -26,6 +26,9 @@ public class SuggestionHelper { + private SuggestionHelper() { + } + public static List limitByPrefix(Stream choices, String input) { return choices.filter(byPrefix(input)) .collect(Collectors.toList()); @@ -40,7 +43,4 @@ public static Predicate byPrefix(String input) { private static boolean startsWithIgnoreCase(String whole, String prefix) { return whole.regionMatches(true, 0, prefix, 0, prefix.length()); } - - private SuggestionHelper() { - } } diff --git a/core/src/main/java/org/enginehub/piston/converter/SuggestionProvider.java b/core/src/main/java/org/enginehub/piston/converter/SuggestionProvider.java index d35dbd3..bbe5338 100644 --- a/core/src/main/java/org/enginehub/piston/converter/SuggestionProvider.java +++ b/core/src/main/java/org/enginehub/piston/converter/SuggestionProvider.java @@ -32,7 +32,7 @@ public interface SuggestionProvider { /** * Given {@code input} as the current input, provide some suggestions for the user. * - * @param input the user's current input + * @param input the user's current input * @param context the context for the current command * @return suggestions for the user */ diff --git a/core/src/main/java/org/enginehub/piston/exception/CommandException.java b/core/src/main/java/org/enginehub/piston/exception/CommandException.java index 289cd50..88f69a3 100644 --- a/core/src/main/java/org/enginehub/piston/exception/CommandException.java +++ b/core/src/main/java/org/enginehub/piston/exception/CommandException.java @@ -29,8 +29,8 @@ * Parent class for all command-related exceptions. */ public class CommandException extends RuntimeException { - private final Component message; protected final ImmutableList commands; + private final Component message; public CommandException(ImmutableList commands) { this.message = TextComponent.empty(); diff --git a/core/src/main/java/org/enginehub/piston/exception/ConversionFailedException.java b/core/src/main/java/org/enginehub/piston/exception/ConversionFailedException.java index cbf47ff..d6d5101 100644 --- a/core/src/main/java/org/enginehub/piston/exception/ConversionFailedException.java +++ b/core/src/main/java/org/enginehub/piston/exception/ConversionFailedException.java @@ -34,6 +34,19 @@ */ public class ConversionFailedException extends UsageException { + private final ArgumentConverter converter; + private final FailedConversion conversion; + + public ConversionFailedException(CommandParseResult parseResult, + Component conversionTarget, + ArgumentConverter converter, + FailedConversion conversion) { + super(getMessage(conversionTarget, converter, conversion), parseResult); + this.converter = converter; + this.conversion = conversion; + FailedConversionMapper.mapOnto(() -> this, conversion); + } + private static Component getMessage(Component conversionTarget, ArgumentConverter converter, FailedConversion conversion) { TextComponent.Builder builder = TextComponent.builder("") @@ -48,19 +61,6 @@ private static Component getMessage(Component conversionTarget, ArgumentConverte .build(); } - private final ArgumentConverter converter; - private final FailedConversion conversion; - - public ConversionFailedException(CommandParseResult parseResult, - Component conversionTarget, - ArgumentConverter converter, - FailedConversion conversion) { - super(getMessage(conversionTarget, converter, conversion), parseResult); - this.converter = converter; - this.conversion = conversion; - FailedConversionMapper.mapOnto(() -> this, conversion); - } - public FailedConversion getConversion() { return conversion; } diff --git a/core/src/main/java/org/enginehub/piston/exception/NoSuchFlagException.java b/core/src/main/java/org/enginehub/piston/exception/NoSuchFlagException.java index b5d0fe0..fdf9318 100644 --- a/core/src/main/java/org/enginehub/piston/exception/NoSuchFlagException.java +++ b/core/src/main/java/org/enginehub/piston/exception/NoSuchFlagException.java @@ -34,6 +34,13 @@ public class NoSuchFlagException extends UsageException { + private final char requestedFlag; + + public NoSuchFlagException(CommandParseResult parseResult, char requestedFlag) { + super(getMessage(parseResult, requestedFlag), parseResult); + this.requestedFlag = requestedFlag; + } + private static String getAllFlags(ImmutableList commands) { return cast(Iterables.getLast(commands).getParts().stream(), CommandFlag.class) .map(f -> String.valueOf(f.getName())) @@ -56,13 +63,6 @@ private static Component getMessage(CommandParseResult parseResult, char request return message.build(); } - private final char requestedFlag; - - public NoSuchFlagException(CommandParseResult parseResult, char requestedFlag) { - super(getMessage(parseResult, requestedFlag), parseResult); - this.requestedFlag = requestedFlag; - } - public char getRequestedFlag() { return requestedFlag; } diff --git a/core/src/main/java/org/enginehub/piston/exception/UsageException.java b/core/src/main/java/org/enginehub/piston/exception/UsageException.java index 698c59e..a69f7e3 100644 --- a/core/src/main/java/org/enginehub/piston/exception/UsageException.java +++ b/core/src/main/java/org/enginehub/piston/exception/UsageException.java @@ -25,7 +25,7 @@ /** * Parent class for all usage-related exceptions. * - * Provides a partially complete parsing result to assist in providing better help messages. + *

Provides a partially complete parsing result to assist in providing better help messages.

*/ public class UsageException extends CommandException { private final CommandParseResult commandParseResult; diff --git a/core/src/main/java/org/enginehub/piston/inject/Annotations.java b/core/src/main/java/org/enginehub/piston/inject/Annotations.java index fe9f871..44f366e 100644 --- a/core/src/main/java/org/enginehub/piston/inject/Annotations.java +++ b/core/src/main/java/org/enginehub/piston/inject/Annotations.java @@ -39,47 +39,7 @@ class Annotations { - private record MethodKey(String name, ImmutableList> signature) { - static MethodKey from(Method method) { - return of(method.getReturnType(), method.getName(), method.getParameterTypes()); - } - - static MethodKey of(Class rtype, String name, Class... ptypes) { - return new MethodKey(name, ImmutableList.>builder() - .add(rtype) - .add(ptypes) - .build()); - } - - private MethodKey(String name, List> signature) { - this.name = name; - this.signature = ImmutableList.copyOf(signature); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - MethodKey methodKey = (MethodKey) o; - return name.equals(methodKey.name) && - signature.equals(methodKey.signature); - } - - } - - @FunctionalInterface - private interface AnnoMethod { - Object invoke(Class type, - Map members, - Object[] args) throws Exception; - } - private static final Joiner.MapJoiner JOINER = Joiner.on(", ").withKeyValueSeparator("="); - private static final Map ANNOTATION_METHODS = ImmutableMap.of( MethodKey.of(Class.class, "annotationType"), (type, members, args) -> type, @@ -117,6 +77,7 @@ Object invoke(Class type, return output.append(')').toString(); } ); + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); private static String valueToString(@Nullable Object value) { if (value == null) { @@ -128,8 +89,6 @@ private static String valueToString(@Nullable Object value) { return value.toString(); } - private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - static Annotation allDefaultsAnnotation(Class annotationType) { Map members = Stream.of(annotationType.getDeclaredMethods()) .collect(toMap( @@ -152,4 +111,41 @@ static Annotation allDefaultsAnnotation(Class annotationTy } ); } + + @FunctionalInterface + private interface AnnoMethod { + Object invoke(Class type, + Map members, + Object[] args) throws Exception; + } + + private record MethodKey(String name, ImmutableList> signature) { + private MethodKey(String name, List> signature) { + this(name, ImmutableList.copyOf(signature)); + } + + static MethodKey from(Method method) { + return of(method.getReturnType(), method.getName(), method.getParameterTypes()); + } + + static MethodKey of(Class rtype, String name, Class... ptypes) { + return new MethodKey(name, ImmutableList.>builder() + .add(rtype) + .add(ptypes) + .build()); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MethodKey methodKey = (MethodKey) o; + return name.equals(methodKey.name) && signature.equals(methodKey.signature); + } + + } } diff --git a/core/src/main/java/org/enginehub/piston/inject/InjectedValueStore.java b/core/src/main/java/org/enginehub/piston/inject/InjectedValueStore.java index e4ffe45..a32cf75 100644 --- a/core/src/main/java/org/enginehub/piston/inject/InjectedValueStore.java +++ b/core/src/main/java/org/enginehub/piston/inject/InjectedValueStore.java @@ -29,9 +29,9 @@ public interface InjectedValueStore extends InjectedValueAccess { * Inject a value into this store. It will be provided by * {@link InjectedValueAccess#injectedValue(Key)}. * - * @param key the key for the value + * @param key the key for the value * @param provider the provider of the value - * @param the type of the value + * @param the type of the value */ void injectValue(Key key, ValueProvider provider); } diff --git a/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java index 34b56cc..3b901ff 100644 --- a/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/InstanceAnnotationWrapper.java @@ -27,11 +27,11 @@ @AutoValue abstract class InstanceAnnotationWrapper implements AnnotationWrapper { - static InstanceAnnotationWrapper from(Annotation annotationInstance) { - return new AutoValue_InstanceAnnotationWrapper(annotationInstance); + InstanceAnnotationWrapper() { } - InstanceAnnotationWrapper() { + static InstanceAnnotationWrapper from(Annotation annotationInstance) { + return new AutoValue_InstanceAnnotationWrapper(annotationInstance); } @Nonnull diff --git a/core/src/main/java/org/enginehub/piston/inject/MapBackedValueStore.java b/core/src/main/java/org/enginehub/piston/inject/MapBackedValueStore.java index 6a96b6b..c721a0d 100644 --- a/core/src/main/java/org/enginehub/piston/inject/MapBackedValueStore.java +++ b/core/src/main/java/org/enginehub/piston/inject/MapBackedValueStore.java @@ -30,6 +30,12 @@ */ public final class MapBackedValueStore implements InjectedValueStore { + private final Map, ValueProvider> providers; + + private MapBackedValueStore(Map, ValueProvider> providers) { + this.providers = providers; + } + public static MapBackedValueStore create() { return create(new ConcurrentHashMap<>()); } @@ -38,12 +44,6 @@ public static MapBackedValueStore create(Map, ValueProvider, ValueProvider> providers; - - private MapBackedValueStore(Map, ValueProvider> providers) { - this.providers = providers; - } - @Override public void injectValue(Key key, ValueProvider provider) { providers.put(key, provider); diff --git a/core/src/main/java/org/enginehub/piston/inject/MemoizingValueAccess.java b/core/src/main/java/org/enginehub/piston/inject/MemoizingValueAccess.java index a21a9e2..506406e 100644 --- a/core/src/main/java/org/enginehub/piston/inject/MemoizingValueAccess.java +++ b/core/src/main/java/org/enginehub/piston/inject/MemoizingValueAccess.java @@ -33,13 +33,6 @@ */ public final class MemoizingValueAccess implements InjectedValueAccess { - public static MemoizingValueAccess wrap(InjectedValueAccess delegate) { - if (delegate instanceof MemoizingValueAccess) { - return (MemoizingValueAccess) delegate; - } - return new MemoizingValueAccess(delegate); - } - private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final Map, Optional> memory = new HashMap<>(); private final InjectedValueAccess delegate; @@ -48,6 +41,13 @@ private MemoizingValueAccess(InjectedValueAccess delegate) { this.delegate = delegate; } + public static MemoizingValueAccess wrap(InjectedValueAccess delegate) { + if (delegate instanceof MemoizingValueAccess) { + return (MemoizingValueAccess) delegate; + } + return new MemoizingValueAccess(delegate); + } + /** * Snapshot the current memory for reading. */ diff --git a/core/src/main/java/org/enginehub/piston/inject/MergedValueAccess.java b/core/src/main/java/org/enginehub/piston/inject/MergedValueAccess.java index ee76568..792550e 100644 --- a/core/src/main/java/org/enginehub/piston/inject/MergedValueAccess.java +++ b/core/src/main/java/org/enginehub/piston/inject/MergedValueAccess.java @@ -34,6 +34,12 @@ */ public final class MergedValueAccess implements InjectedValueAccess { + private final ImmutableList delegates; + + private MergedValueAccess(Collection delegates) { + this.delegates = ImmutableList.copyOf(delegates); + } + public static MergedValueAccess of(InjectedValueAccess... delegates) { return of(ImmutableList.copyOf(delegates)); } @@ -42,12 +48,6 @@ public static MergedValueAccess of(Collection del return new MergedValueAccess(delegates); } - private final ImmutableList delegates; - - private MergedValueAccess(Collection delegates) { - this.delegates = ImmutableList.copyOf(delegates); - } - @Override public Optional injectedValue(Key key, InjectedValueAccess context) { return delegates.stream() diff --git a/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java index e054670..1245d75 100644 --- a/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/NullAnnotationWrapper.java @@ -25,11 +25,11 @@ final class NullAnnotationWrapper implements AnnotationWrapper { private static final NullAnnotationWrapper INSTANCE = new NullAnnotationWrapper(); - static NullAnnotationWrapper getInstance() { - return INSTANCE; + private NullAnnotationWrapper() { } - private NullAnnotationWrapper() { + static NullAnnotationWrapper getInstance() { + return INSTANCE; } @Nullable diff --git a/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java b/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java index efafe14..23ccb04 100644 --- a/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java +++ b/core/src/main/java/org/enginehub/piston/inject/TypeAnnotationWrapper.java @@ -28,11 +28,11 @@ @AutoValue abstract class TypeAnnotationWrapper implements AnnotationWrapper { - static TypeAnnotationWrapper from(Class annotationType) { - return new AutoValue_TypeAnnotationWrapper(annotationType); + TypeAnnotationWrapper() { } - TypeAnnotationWrapper() { + static TypeAnnotationWrapper from(Class annotationType) { + return new AutoValue_TypeAnnotationWrapper(annotationType); } @Nonnull diff --git a/core/src/main/java/org/enginehub/piston/part/ArgAcceptingCommandFlag.java b/core/src/main/java/org/enginehub/piston/part/ArgAcceptingCommandFlag.java index 2e068c4..49a94a6 100644 --- a/core/src/main/java/org/enginehub/piston/part/ArgAcceptingCommandFlag.java +++ b/core/src/main/java/org/enginehub/piston/part/ArgAcceptingCommandFlag.java @@ -32,6 +32,9 @@ @AutoValue public abstract class ArgAcceptingCommandFlag implements CommandFlag, ArgAcceptingCommandPart { + ArgAcceptingCommandFlag() { + } + public static Builder builder(char name, Component description) { return new AutoValue_ArgAcceptingCommandFlag.Builder() .named(name) @@ -40,6 +43,19 @@ public static Builder builder(char name, Component description) { .ofTypes(ImmutableList.of()); } + @Override + public Component getTextRepresentation() { + return ColorConfig.partWrapping().wrap( + TextComponent.of("["), + ColorConfig.mainText().wrap("-" + getName()), + TextComponent.space(), + TextComponent.of("<"), + ColorConfig.mainText().wrap(getArgumentName()), + TextComponent.of(">"), + TextComponent.of("]") + ); + } + @AutoValue.Builder public abstract static class Builder { @@ -83,20 +99,4 @@ public final Builder argNamed(TranslatableComponent name) { public abstract ArgAcceptingCommandFlag build(); } - - ArgAcceptingCommandFlag() { - } - - @Override - public Component getTextRepresentation() { - return ColorConfig.partWrapping().wrap( - TextComponent.of("["), - ColorConfig.mainText().wrap("-" + getName()), - TextComponent.space(), - TextComponent.of("<"), - ColorConfig.mainText().wrap(getArgumentName()), - TextComponent.of(">"), - TextComponent.of("]") - ); - } } diff --git a/core/src/main/java/org/enginehub/piston/part/CommandArgument.java b/core/src/main/java/org/enginehub/piston/part/CommandArgument.java index 62d02ab..7d6ec95 100644 --- a/core/src/main/java/org/enginehub/piston/part/CommandArgument.java +++ b/core/src/main/java/org/enginehub/piston/part/CommandArgument.java @@ -42,6 +42,38 @@ public static Builder builder(TranslatableComponent name, Component description) .variable(false); } + /** + * Check if this argument a variable argument. + * + *

That is, does it accept a variable amount of inputs, rather than one?

+ */ + public abstract boolean isVariable(); + + /** + * {@inheritDoc} + * + *

+ * Arguments are always required when they have no defaults. + * To provide a {@code null} default, use the empty string. + *

+ */ + @Override + public final boolean isRequired() { + return getDefaults().isEmpty(); + } + + @Override + public Component getTextRepresentation() { + ImmutableList.Builder builder = ImmutableList.builder(); + builder.add(TextComponent.of(isRequired() ? "<" : "[")); + builder.add(ColorConfig.mainText().wrap(getArgumentName())); + if (isVariable()) { + builder.add(ColorConfig.textModifier().wrap("...")); + } + builder.add(TextComponent.of(isRequired() ? ">" : "]")); + return ColorConfig.partWrapping().wrap(builder.build()); + } + @AutoValue.Builder public abstract static class Builder { @@ -82,36 +114,4 @@ public final Builder ofTypes(Collection> types) { public abstract CommandArgument build(); } - /** - * Check if this argument a variable argument. - * - * That is, does it accept a variable amount of inputs, rather than one? - */ - public abstract boolean isVariable(); - - /** - * {@inheritDoc} - * - *

- * Arguments are always required when they have no defaults. - * To provide a {@code null} default, use the empty string. - *

- */ - @Override - public final boolean isRequired() { - return getDefaults().isEmpty(); - } - - @Override - public Component getTextRepresentation() { - ImmutableList.Builder builder = ImmutableList.builder(); - builder.add(TextComponent.of(isRequired() ? "<" : "[")); - builder.add(ColorConfig.mainText().wrap(getArgumentName())); - if (isVariable()) { - builder.add(ColorConfig.textModifier().wrap("...")); - } - builder.add(TextComponent.of(isRequired() ? ">" : "]")); - return ColorConfig.partWrapping().wrap(builder.build()); - } - } diff --git a/core/src/main/java/org/enginehub/piston/part/CommandParts.java b/core/src/main/java/org/enginehub/piston/part/CommandParts.java index 313ccdb..3b7f0fd 100644 --- a/core/src/main/java/org/enginehub/piston/part/CommandParts.java +++ b/core/src/main/java/org/enginehub/piston/part/CommandParts.java @@ -24,6 +24,9 @@ public class CommandParts { + private CommandParts() { + } + public static NoArgCommandFlag.Builder flag(char flag, Component description) { return NoArgCommandFlag.builder(flag, description); } @@ -31,7 +34,4 @@ public static NoArgCommandFlag.Builder flag(char flag, Component description) { public static CommandArgument.Builder arg(TranslatableComponent name, Component description) { return CommandArgument.builder(name, description); } - - private CommandParts() { - } } diff --git a/core/src/main/java/org/enginehub/piston/part/NoArgCommandFlag.java b/core/src/main/java/org/enginehub/piston/part/NoArgCommandFlag.java index c836509..ba606a8 100644 --- a/core/src/main/java/org/enginehub/piston/part/NoArgCommandFlag.java +++ b/core/src/main/java/org/enginehub/piston/part/NoArgCommandFlag.java @@ -27,6 +27,9 @@ @AutoValue public abstract class NoArgCommandFlag implements CommandFlag { + NoArgCommandFlag() { + } + public static NoArgCommandFlag.Builder builder(char name, String description) { return builder(name, TextComponent.of(description)); @@ -39,6 +42,15 @@ public static NoArgCommandFlag.Builder builder(char name, .describedBy(description); } + @Override + public Component getTextRepresentation() { + return ColorConfig.partWrapping().wrap( + TextComponent.of("["), + ColorConfig.mainText().wrap("-" + getName()), + TextComponent.of("]") + ); + } + @AutoValue.Builder public abstract static class Builder { @@ -69,16 +81,4 @@ public final ArgAcceptingCommandFlag.Builder withRequiredArg() { public abstract NoArgCommandFlag build(); } - - NoArgCommandFlag() { - } - - @Override - public Component getTextRepresentation() { - return ColorConfig.partWrapping().wrap( - TextComponent.of("["), - ColorConfig.mainText().wrap("-" + getName()), - TextComponent.of("]") - ); - } } diff --git a/core/src/main/java/org/enginehub/piston/part/SubCommandPart.java b/core/src/main/java/org/enginehub/piston/part/SubCommandPart.java index 3c119c7..1b28e57 100644 --- a/core/src/main/java/org/enginehub/piston/part/SubCommandPart.java +++ b/core/src/main/java/org/enginehub/piston/part/SubCommandPart.java @@ -40,6 +40,21 @@ public static Builder builder(TranslatableComponent name, Component description) .describedBy(description); } + public abstract ImmutableList getCommands(); + + @Override + public Component getTextRepresentation() { + ImmutableList.Builder builder = ImmutableList.builder(); + builder.add(TextComponent.of(isRequired() ? "<" : "[")); + builder.addAll(getCommands().stream() + .map(Command::getName) + .map(ColorConfig.mainText()::wrap) + .collect(joiningWithBar()) + .children()); + builder.add(TextComponent.of(isRequired() ? ">" : "]")); + return ColorConfig.partWrapping().wrap(builder.build()); + } + @AutoValue.Builder public abstract static class Builder { @@ -78,19 +93,4 @@ public final Builder optional() { public abstract SubCommandPart build(); } - public abstract ImmutableList getCommands(); - - @Override - public Component getTextRepresentation() { - ImmutableList.Builder builder = ImmutableList.builder(); - builder.add(TextComponent.of(isRequired() ? "<" : "[")); - builder.addAll(getCommands().stream() - .map(Command::getName) - .map(ColorConfig.mainText()::wrap) - .collect(joiningWithBar()) - .children()); - builder.add(TextComponent.of(isRequired() ? ">" : "]")); - return ColorConfig.partWrapping().wrap(builder.build()); - } - } diff --git a/core/src/main/java/org/enginehub/piston/suggestion/DefaultSuggestionProvider.java b/core/src/main/java/org/enginehub/piston/suggestion/DefaultSuggestionProvider.java index 81c2039..8da4ea8 100644 --- a/core/src/main/java/org/enginehub/piston/suggestion/DefaultSuggestionProvider.java +++ b/core/src/main/java/org/enginehub/piston/suggestion/DefaultSuggestionProvider.java @@ -52,11 +52,11 @@ public class DefaultSuggestionProvider implements SuggestionProvider { private static final SuggestionProvider INSTANCE = new DefaultSuggestionProvider(); - public static SuggestionProvider getInstance() { - return INSTANCE; + private DefaultSuggestionProvider() { } - private DefaultSuggestionProvider() { + public static SuggestionProvider getInstance() { + return INSTANCE; } @Override diff --git a/core/src/main/java/org/enginehub/piston/suggestion/Suggestion.java b/core/src/main/java/org/enginehub/piston/suggestion/Suggestion.java index 64f4a09..1121c38 100644 --- a/core/src/main/java/org/enginehub/piston/suggestion/Suggestion.java +++ b/core/src/main/java/org/enginehub/piston/suggestion/Suggestion.java @@ -27,22 +27,11 @@ @AutoValue public abstract class Suggestion { - public static Builder builder() { - return new AutoValue_Suggestion.Builder(); - } - - @AutoValue.Builder - public interface Builder { - - Builder suggestion(String suggestion); - - Builder replacedArgument(int replaced); - - Suggestion build(); - + Suggestion() { } - Suggestion() { + public static Builder builder() { + return new AutoValue_Suggestion.Builder(); } /** @@ -63,4 +52,15 @@ public interface Builder { */ public abstract Builder toBuilder(); + @AutoValue.Builder + public interface Builder { + + Builder suggestion(String suggestion); + + Builder replacedArgument(int replaced); + + Suggestion build(); + + } + } diff --git a/core/src/main/java/org/enginehub/piston/suggestion/SuggestionProvider.java b/core/src/main/java/org/enginehub/piston/suggestion/SuggestionProvider.java index 570f711..a8b0516 100644 --- a/core/src/main/java/org/enginehub/piston/suggestion/SuggestionProvider.java +++ b/core/src/main/java/org/enginehub/piston/suggestion/SuggestionProvider.java @@ -40,7 +40,7 @@ public interface SuggestionProvider { * {@code args.size()} in this case, to signify it replaces outside of the list. *

* - * @param args the original arguments passed + * @param args the original arguments passed * @param parseResult the result of parsing the arguments * @return the suggestions */ diff --git a/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java b/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java index acfa839..e8f1b43 100644 --- a/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java +++ b/core/src/main/java/org/enginehub/piston/util/ComponentHelper.java @@ -28,6 +28,9 @@ public class ComponentHelper { + private ComponentHelper() { + } + /** * Join components together with a `|`, coloring the bar with {@link * ColorConfig#partWrapping()}. @@ -102,7 +105,4 @@ public Component finish() { } } - - private ComponentHelper() { - } } diff --git a/core/src/main/java/org/enginehub/piston/util/HelpGenerator.java b/core/src/main/java/org/enginehub/piston/util/HelpGenerator.java index 3eb874b..5af779d 100644 --- a/core/src/main/java/org/enginehub/piston/util/HelpGenerator.java +++ b/core/src/main/java/org/enginehub/piston/util/HelpGenerator.java @@ -47,6 +47,12 @@ public class HelpGenerator { + private final CommandParseResult parseResult; + + private HelpGenerator(CommandParseResult parseResult) { + this.parseResult = parseResult; + } + public static HelpGenerator create(Iterable commands) { ImmutableList executionPath = ImmutableList.copyOf(commands); return create(new CommandParseResult() { @@ -73,12 +79,6 @@ public static HelpGenerator create(CommandParseResult parseResult) { return new HelpGenerator(parseResult); } - private final CommandParseResult parseResult; - - private HelpGenerator(CommandParseResult parseResult) { - this.parseResult = parseResult; - } - /** * Generate a name for the set of commands as a whole. */ diff --git a/core/src/main/java/org/enginehub/piston/util/StreamHelper.java b/core/src/main/java/org/enginehub/piston/util/StreamHelper.java index 5fec2ca..43d01e1 100644 --- a/core/src/main/java/org/enginehub/piston/util/StreamHelper.java +++ b/core/src/main/java/org/enginehub/piston/util/StreamHelper.java @@ -23,10 +23,10 @@ public final class StreamHelper { - public static Stream cast(Stream stream, Class type) { - return stream.filter(type::isInstance).map(type::cast); + private StreamHelper() { } - private StreamHelper() { + public static Stream cast(Stream stream, Class type) { + return stream.filter(type::isInstance).map(type::cast); } } diff --git a/core/src/main/java/org/enginehub/piston/util/TextHelper.java b/core/src/main/java/org/enginehub/piston/util/TextHelper.java index fbeacf5..48fb089 100644 --- a/core/src/main/java/org/enginehub/piston/util/TextHelper.java +++ b/core/src/main/java/org/enginehub/piston/util/TextHelper.java @@ -32,6 +32,7 @@ public class TextHelper { + private static final ConfigHolder CONFIG = ConfigHolder.create(); private static final PlainComponentSerializer PLAIN_COMPONENT_SERIALIZER = new PlainComponentSerializer( KeybindComponent::keybind, translatableComponent -> { @@ -41,7 +42,8 @@ public class TextHelper { } ); - private static final ConfigHolder CONFIG = ConfigHolder.create(); + private TextHelper() { + } public static String reduceToText(Component component) { StringBuilder text = new StringBuilder(); @@ -70,7 +72,4 @@ private static void appendTranslatableTo(StringBuilder builder, TranslatableComp } } - private TextHelper() { - } - } diff --git a/core/src/test/java/org/enginehub/piston/ConditionTest.java b/core/src/test/java/org/enginehub/piston/ConditionTest.java index 05464d3..cc968a1 100644 --- a/core/src/test/java/org/enginehub/piston/ConditionTest.java +++ b/core/src/test/java/org/enginehub/piston/ConditionTest.java @@ -19,7 +19,6 @@ package org.enginehub.piston; -import org.enginehub.piston.inject.InjectedValueAccess; import org.junit.jupiter.api.Test; import static org.enginehub.piston.Command.Condition.FALSE; @@ -53,10 +52,6 @@ void or() { assertTrue(TRUE.or(TRUE).satisfied(EMPTY)); } - interface ConditionSubtype extends Command.Condition { - - } - @Test void as() { assertFalse(FALSE.as(ConditionSubtype.class).isPresent()); @@ -64,4 +59,8 @@ void as() { assertEquals(st, st.as(ConditionSubtype.class).orElse(null)); } + interface ConditionSubtype extends Command.Condition { + + } + } diff --git a/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java b/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java index 211c1ee..e83d543 100644 --- a/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java +++ b/core/src/test/java/org/enginehub/piston/config/ConfigHolderTest.java @@ -38,9 +38,6 @@ @DisplayName("A ConfigHolder") public class ConfigHolderTest { - private record TestCase(String name, Component input, Component expected) { - } - private final ConfigRenderer renderer = ConfigRenderer.getInstance(); private final ConfigHolder holder = ConfigHolder.create(); private final Component inputWithStyles = ColorConfig.helpText() @@ -73,4 +70,7 @@ Stream test() { ); } + private record TestCase(String name, Component input, Component expected) { + } + } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/ArgBindingImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/ArgBindingImpl.java index 7e00296..8797541 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/ArgBindingImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/ArgBindingImpl.java @@ -30,21 +30,11 @@ @AutoValue abstract class ArgBindingImpl implements ArgBinding { - static Builder builder() { - return new AutoValue_ArgBindingImpl.Builder(); - } - - @AutoValue.Builder - interface Builder { - - Builder input(String name); - - Builder partsMap(Map parts); - - ArgBindingImpl build(); + ArgBindingImpl() { } - ArgBindingImpl() { + static Builder builder() { + return new AutoValue_ArgBindingImpl.Builder(); } @Override @@ -66,4 +56,14 @@ public final ImmutableSet getParts() { return getPartsMap().keySet(); } + @AutoValue.Builder + interface Builder { + + Builder input(String name); + + Builder partsMap(Map parts); + + ArgBindingImpl build(); + } + } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java index 2714576..f304c3a 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandImpl.java @@ -47,6 +47,9 @@ static Builder builder(String name) { .suggester(DefaultSuggestionProvider.getInstance()); } + @Override + public abstract Builder toBuilder(); + @AutoValue.Builder interface Builder extends Command.Builder { @@ -105,7 +108,4 @@ default CommandImpl build() { } - @Override - public abstract Builder toBuilder(); - } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandMetadataImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandMetadataImpl.java index 0e13445..18b8b98 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandMetadataImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandMetadataImpl.java @@ -28,10 +28,19 @@ @AutoValue abstract class CommandMetadataImpl implements CommandMetadata { + CommandMetadataImpl() { + } + static Builder builder() { return new AutoValue_CommandMetadataImpl.Builder(); } + @Override + public abstract String getCalledName(); + + @Override + public abstract ImmutableList getArguments(); + @AutoValue.Builder interface Builder { @@ -41,13 +50,4 @@ interface Builder { CommandMetadataImpl build(); } - - CommandMetadataImpl() { - } - - @Override - public abstract String getCalledName(); - - @Override - public abstract ImmutableList getArguments(); } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParametersImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParametersImpl.java index e84f57c..5fa0174 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParametersImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParametersImpl.java @@ -37,37 +37,11 @@ @AutoValue abstract class CommandParametersImpl implements CommandParameters { - static Builder builder() { - return new AutoValue_CommandParametersImpl.Builder(); - } - - @AutoValue.Builder - interface Builder { - - default Builder addPresentPart(CommandPart part) { - presentPartsBuilder().add(part); - return this; - } - - ImmutableSet.Builder presentPartsBuilder(); - - default Builder addValue(CommandPart part, CommandValue value) { - valuesBuilder().put(part, value); - return this; - } - - ImmutableMap.Builder valuesBuilder(); - - Builder injectedValues(InjectedValueAccess values); - - Builder metadata(CommandMetadata metadata); - - Builder converters(ArgumentConverterAccess converters); - - CommandParametersImpl build(); + CommandParametersImpl() { } - CommandParametersImpl() { + static Builder builder() { + return new AutoValue_CommandParametersImpl.Builder(); } abstract ImmutableSet presentParts(); @@ -108,4 +82,30 @@ public ArgumentConverterAccess getConverters() { public final Optional injectedValue(Key key, InjectedValueAccess context) { return injectedValues().injectedValue(key, context); } + + @AutoValue.Builder + interface Builder { + + default Builder addPresentPart(CommandPart part) { + presentPartsBuilder().add(part); + return this; + } + + ImmutableSet.Builder presentPartsBuilder(); + + default Builder addValue(CommandPart part, CommandValue value) { + valuesBuilder().put(part, value); + return this; + } + + ImmutableMap.Builder valuesBuilder(); + + Builder injectedValues(InjectedValueAccess values); + + Builder metadata(CommandMetadata metadata); + + Builder converters(ArgumentConverterAccess converters); + + CommandParametersImpl build(); + } } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParseResultImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParseResultImpl.java index c67dff1..9d3bf3f 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParseResultImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParseResultImpl.java @@ -29,10 +29,22 @@ @AutoValue abstract class CommandParseResultImpl implements CommandParseResult { + CommandParseResultImpl() { + } + static Builder builder() { return new AutoValue_CommandParseResultImpl.Builder(); } + @Override + public abstract ImmutableList getExecutionPath(); + + @Override + public abstract ImmutableList getBoundArguments(); + + @Override + public abstract CommandParameters getParameters(); + @AutoValue.Builder abstract static class Builder { @@ -56,16 +68,4 @@ public final Builder addArgument(ArgBinding argBinding) { public abstract CommandParseResultImpl build(); } - - CommandParseResultImpl() { - } - - @Override - public abstract ImmutableList getExecutionPath(); - - @Override - public abstract ImmutableList getBoundArguments(); - - @Override - public abstract CommandParameters getParameters(); } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java index 3250a98..e2703df 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandParser.java @@ -73,48 +73,6 @@ class CommandParser { private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final ThreadLocal PARSE_ID = new ThreadLocal<>(); - - private static void log(String message, Object... args) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("[" + PARSE_ID.get() + "]: " + message, args); - } - } - - private static String newId() { - long rng = ThreadLocalRandom.current().nextLong(0, Long.MAX_VALUE); - return Strings.padStart(Long.toString(rng, 36), 13, '0'); - } - - private static void logParseStart() { - PARSE_ID.set(newId()); - log("started parsing"); - } - - private static final class PerCommandDetails { - - final CommandInfo commandInfo; - final Set defaultsNeeded; - final Set argFlagsNeeded; - final ListIterator partIter; - boolean canMatchFlags = true; - int remainingRequiredParts; - - private PerCommandDetails(CommandInfo commandInfo) { - this.commandInfo = commandInfo; - this.defaultsNeeded = new HashSet<>(commandInfo.defaultProvided()); - // collect argument flags that don't have default values - // we'll provide `null` for them in this case. - this.argFlagsNeeded = StreamHelper.cast( - commandInfo.flags().values().stream(), - ArgAcceptingCommandFlag.class - ) - .filter(arg -> !defaultsNeeded.contains(arg)) - .collect(Collectors.toCollection(HashSet::new)); - this.partIter = commandInfo.arguments().listIterator(); - this.remainingRequiredParts = commandInfo.requiredParts(); - } - } - private final ArgumentConverterAccess converters; private final CommandMetadata metadata; private final CommandParseResultImpl.Builder parseResult = CommandParseResultImpl.builder(); @@ -144,6 +102,22 @@ private PerCommandDetails(CommandInfo commandInfo) { switchToCommand(initial); } + private static void log(String message, Object... args) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("[" + PARSE_ID.get() + "]: " + message, args); + } + } + + private static String newId() { + long rng = ThreadLocalRandom.current().nextLong(0, Long.MAX_VALUE); + return Strings.padStart(Long.toString(rng, 36), 13, '0'); + } + + private static void logParseStart() { + PARSE_ID.set(newId()); + log("started parsing"); + } + private void buildParseResult() { checkState(result == null, "Multiple calls to build final result"); if (argBindings.build().size() > 0 && argIter.hasPrevious()) { @@ -484,24 +458,13 @@ private ImmutableList consumeArguments(CommandArgument nextArg, String f return result.build(); } - private enum AcceptInfo { - REJECTED, - ACCEPTED_INEXACT, - ACCEPTED_EXACT, - ; - - boolean isAccepted() { - return this != REJECTED; - } - } - /** * Check if {@code part} has type converters attached, and if so, return * {@code true} iff any of them will convert {@code next}. If there are no * type converters, also return {@code true}. */ private AcceptInfo getAcceptInfoFromTypeParsers(ArgAcceptingCommandPart part, - String next) { + String next) { ImmutableSet> types = part.getTypes(); if (types.isEmpty()) { return AcceptInfo.ACCEPTED_EXACT; @@ -542,8 +505,7 @@ private void parseFlags(String flags) { if (flag instanceof ArgAcceptingCommandFlag argPart) { if (i + 1 < flags.length()) { // Only allow argument-flags at the end of flag-combos. - throw usageException(TextComponent.of("Argument-accepting flags must be " + - "at the end of combined flag groups.")); + throw usageException(TextComponent.of("Argument-accepting flags must be at the end of combined flag groups.")); } bind(flag, true); if (!hasNextArgument()) { @@ -581,4 +543,40 @@ private void addValueFull(CommandPart part, .build()); } + private enum AcceptInfo { + REJECTED, + ACCEPTED_INEXACT, + ACCEPTED_EXACT, + ; + + boolean isAccepted() { + return this != REJECTED; + } + } + + private static final class PerCommandDetails { + + final CommandInfo commandInfo; + final Set defaultsNeeded; + final Set argFlagsNeeded; + final ListIterator partIter; + boolean canMatchFlags = true; + int remainingRequiredParts; + + private PerCommandDetails(CommandInfo commandInfo) { + this.commandInfo = commandInfo; + this.defaultsNeeded = new HashSet<>(commandInfo.defaultProvided()); + // collect argument flags that don't have default values + // we'll provide `null` for them in this case. + this.argFlagsNeeded = StreamHelper.cast( + commandInfo.flags().values().stream(), + ArgAcceptingCommandFlag.class + ) + .filter(arg -> !defaultsNeeded.contains(arg)) + .collect(Collectors.toCollection(HashSet::new)); + this.partIter = commandInfo.arguments().listIterator(); + this.remainingRequiredParts = commandInfo.requiredParts(); + } + } + } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/CommandValueImpl.java b/default-impl/src/main/java/org/enginehub/piston/impl/CommandValueImpl.java index fafadb4..02959f3 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/CommandValueImpl.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/CommandValueImpl.java @@ -42,32 +42,11 @@ @AutoValue abstract class CommandValueImpl implements CommandValue { - static Builder builder() { - return new AutoValue_CommandValueImpl.Builder(); - } - - @AutoValue.Builder - interface Builder { - - Builder manager(ArgumentConverterAccess manager); - - Builder commandContextSupplier(Supplier ctx); - - Builder partContext(CommandPart ctx); - - Builder injectedValues(InjectedValueAccess injectedValues); - - default Builder value(String value) { - return values(ImmutableList.of(value)); - } - - Builder values(Collection values); - - CommandValueImpl build(); - + CommandValueImpl() { } - CommandValueImpl() { + static Builder builder() { + return new AutoValue_CommandValueImpl.Builder(); } abstract ArgumentConverterAccess manager(); @@ -110,4 +89,25 @@ public ImmutableList asMultiple(Key key) { } return values.build(); } + + @AutoValue.Builder + interface Builder { + + Builder manager(ArgumentConverterAccess manager); + + Builder commandContextSupplier(Supplier ctx); + + Builder partContext(CommandPart ctx); + + Builder injectedValues(InjectedValueAccess injectedValues); + + default Builder value(String value) { + return values(ImmutableList.of(value)); + } + + Builder values(Collection values); + + CommandValueImpl build(); + + } } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/LogManagerCompat.java b/default-impl/src/main/java/org/enginehub/piston/impl/LogManagerCompat.java index 76305ad..4f765be 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/LogManagerCompat.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/LogManagerCompat.java @@ -29,10 +29,10 @@ public class LogManagerCompat { private static final StackWalker WALKER = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); - public static Logger getLogger() { - return LogManager.getLogger(WALKER.getCallerClass()); + private LogManagerCompat() { } - private LogManagerCompat() { + public static Logger getLogger() { + return LogManager.getLogger(WALKER.getCallerClass()); } } diff --git a/default-impl/src/main/java/org/enginehub/piston/impl/package-info.java b/default-impl/src/main/java/org/enginehub/piston/impl/package-info.java index 7b2f040..564f207 100644 --- a/default-impl/src/main/java/org/enginehub/piston/impl/package-info.java +++ b/default-impl/src/main/java/org/enginehub/piston/impl/package-info.java @@ -25,5 +25,6 @@ * as well as one way to hook them into the Piston core library loader. *

*/ + @org.enginehub.piston.util.NonnullByDefault package org.enginehub.piston.impl; diff --git a/default-impl/src/test/resources/logback.xml b/default-impl/src/test/resources/logback.xml index 6da048b..296caa1 100644 --- a/default-impl/src/test/resources/logback.xml +++ b/default-impl/src/test/resources/logback.xml @@ -18,13 +18,13 @@ --> - - - [%thread/%level{5}][%logger{1}]: %msg%rEx%n - - + + + [%thread/%level{5}][%logger{1}]: %msg%rEx%n + + - - - + + + \ No newline at end of file From 36a1517e64d7260833bc9d477f443792d722295c Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 22:34:26 +1000 Subject: [PATCH 09/12] refactor: resolve compiler warnings --- .../kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt | 2 +- .../src/test/kotlin/org/enginehub/piston/gen/Utils.kt | 2 +- .../org/enginehub/piston/util/PreloadTypeNameExtension.kt | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt index a889bfc..0d8da36 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt @@ -237,7 +237,7 @@ class GenerationTest { ) .returns(Void.TYPE) .addParameter( - ParameterSpec.builder(Object::class.java, "arg") + ParameterSpec.builder(Any::class.java, "arg") // Changed from [Object] to [Any] per compiler warnings .addAnnotation( AnnotationSpec.builder(Arg::class.java) .addMember("desc", "\$S", "ARG DESCRIPTION") diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt index a65907d..c8c5234 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/Utils.kt @@ -47,7 +47,7 @@ fun TypeSpec.toFileInPackage(pkg: String = PACKAGE): JavaFileObject { ) } -fun compiler() = Compiler.javac().withProcessors(CommandProcessor())!! +fun compiler(): Compiler = Compiler.javac().withProcessors(CommandProcessor()) // Removed [!!] per compiler warnings inline fun className(): ClassName = ClassName.get(T::class.java) diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt index f8313bc..f4a6692 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/util/PreloadTypeNameExtension.kt @@ -38,8 +38,7 @@ class PreloadTypeNameExtension : Extension, BeforeAllCallback { private val loadLock = ReentrantLock() - override fun beforeAll(context: ExtensionContext?) = loadLock.withLock { - TypeName.get(Object::class.java) - Unit + override fun beforeAll(context: ExtensionContext): Unit = loadLock.withLock { + TypeName.get(Any::class.java) // Changed from [Object] to [Any] per compiler warnings } } From 0d3bb0d20b20b82d82156632ce4c06203ca7ddc2 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Sun, 28 Dec 2025 23:09:31 +1000 Subject: [PATCH 10/12] style: use string interpolation prefix --- .../enginehub/piston/gen/BadGenerationTest.kt | 20 ++-- .../piston/gen/GoodGenerationTest.kt | 110 +++++++++--------- .../enginehub/piston/gen/NestedClassTest.kt | 4 +- .../gen/util/AnnoValueExtractionTest.kt | 4 +- .../piston/gen/value/ExtractSpecTest.kt | 4 +- 5 files changed, 71 insertions(+), 71 deletions(-) diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt index 8fe1936..ea0677d 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/BadGenerationTest.kt @@ -41,8 +41,8 @@ class BadGenerationTest { MethodSpec.methodBuilder("multiInject") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "multiInject") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "multiInject") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -71,8 +71,8 @@ class BadGenerationTest { MethodSpec.methodBuilder("multiArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "multiArg") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "multiArg") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -80,13 +80,13 @@ class BadGenerationTest { ParameterSpec.builder(CommandValue::class.java, "arg") .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .addAnnotation( AnnotationSpec.builder(Switch::class.java) .addMember("name", "'f'") - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -110,8 +110,8 @@ class BadGenerationTest { MethodSpec.methodBuilder("multiArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "multiArg") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "multiArg") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -120,13 +120,13 @@ class BadGenerationTest { .addAnnotation( AnnotationSpec.builder(Switch::class.java) .addMember("name", "'f'") - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .addAnnotation( AnnotationSpec.builder(ArgFlag::class.java) .addMember("name", "'f'") - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt index 0d8da36..3ac0ef3 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/GoodGenerationTest.kt @@ -47,8 +47,8 @@ class GenerationTest { MethodSpec.methodBuilder("noArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "noArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "noArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -57,9 +57,9 @@ class GenerationTest { MethodSpec.methodBuilder("noArgFooter") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "noArgumentFooter") - .addMember("desc", "\$S", "DESCRIPTION") - .addMember("descFooter", "\$S", "DESC FOOTER") + .addMember("name", $$"$S", "noArgumentFooter") + .addMember("desc", $$"$S", "DESCRIPTION") + .addMember("descFooter", $$"$S", "DESC FOOTER") .build() ) .returns(Void.TYPE) @@ -67,8 +67,8 @@ class GenerationTest { MethodSpec.methodBuilder("noArgCondition") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "noArgumentCondition") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "noArgumentCondition") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .addAnnotation(AlwaysTrueCondition::class.java) @@ -77,8 +77,8 @@ class GenerationTest { MethodSpec.methodBuilder("noArgStatic") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "noArgumentStatic") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "noArgumentStatic") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .addModifiers(Modifier.STATIC) @@ -102,8 +102,8 @@ class GenerationTest { MethodSpec.methodBuilder("nonArgCommandParameters") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "nonArgCommandParameters") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "nonArgCommandParameters") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -112,8 +112,8 @@ class GenerationTest { MethodSpec.methodBuilder("nonArgInjected") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "nonArgInjected") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "nonArgInjected") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -139,8 +139,8 @@ class GenerationTest { MethodSpec.methodBuilder("valueArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "valueArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "valueArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -148,7 +148,7 @@ class GenerationTest { ParameterSpec.builder(CommandValue::class.java, "arg") .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -172,8 +172,8 @@ class GenerationTest { MethodSpec.methodBuilder("valueArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "wildcardArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "wildcardArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -186,7 +186,7 @@ class GenerationTest { ) .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -210,8 +210,8 @@ class GenerationTest { MethodSpec.methodBuilder("collectionArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "collectionArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "collectionArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -221,7 +221,7 @@ class GenerationTest { ) .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -231,8 +231,8 @@ class GenerationTest { MethodSpec.methodBuilder("objectArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "objectArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "objectArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) @@ -240,7 +240,7 @@ class GenerationTest { ParameterSpec.builder(Any::class.java, "arg") // Changed from [Object] to [Any] per compiler warnings .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -264,8 +264,8 @@ class GenerationTest { MethodSpec.methodBuilder("intArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "intArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "intArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.INT) @@ -273,7 +273,7 @@ class GenerationTest { ParameterSpec.builder(TypeName.INT, "arg") .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -283,8 +283,8 @@ class GenerationTest { MethodSpec.methodBuilder("annotatedIntArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "annotatedIntArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "annotatedIntArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -292,12 +292,12 @@ class GenerationTest { ParameterSpec.builder(TypeName.INT, "arg") .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .addAnnotation( AnnotationSpec.builder(InjectGamma::class.java) - .addMember("value", "\$S", "something to match") + .addMember("value", $$"$S", "something to match") .build() ) .build() @@ -306,8 +306,8 @@ class GenerationTest { MethodSpec.methodBuilder("annotatedIntArg2") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "annotatedIntArgument2") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "annotatedIntArgument2") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -315,7 +315,7 @@ class GenerationTest { ParameterSpec.builder(TypeName.INT, "delta") .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .addAnnotation( @@ -331,8 +331,8 @@ class GenerationTest { MethodSpec.methodBuilder("annotatedIntArg3") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "annotatedIntArgument3") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "annotatedIntArgument3") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -340,7 +340,7 @@ class GenerationTest { ParameterSpec.builder(TypeName.INT, "alpha") .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .addAnnotation(InjectAlpha::class.java) @@ -350,8 +350,8 @@ class GenerationTest { MethodSpec.methodBuilder("variableIntArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "variableIntArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "variableIntArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -361,8 +361,8 @@ class GenerationTest { ) .addAnnotation( AnnotationSpec.builder(Arg::class.java) - .addMember("name", "\$S", "args") - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("name", $$"$S", "args") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .addMember("variable", "true") .build() ) @@ -387,8 +387,8 @@ class GenerationTest { MethodSpec.methodBuilder("booleanFlag") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "booleanFlag") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "booleanFlag") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -397,7 +397,7 @@ class GenerationTest { .addAnnotation( AnnotationSpec.builder(Switch::class.java) .addMember("name", "'f'") - .addMember("desc", "\$S", "ARG DESCRIPTION") + .addMember("desc", $$"$S", "ARG DESCRIPTION") .build() ) .build() @@ -406,8 +406,8 @@ class GenerationTest { MethodSpec.methodBuilder("stringArgFlag") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "stringArgFlag") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "stringArgFlag") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -416,8 +416,8 @@ class GenerationTest { .addAnnotation( AnnotationSpec.builder(ArgFlag::class.java) .addMember("name", "'f'") - .addMember("desc", "\$S", "ARG DESCRIPTION") - .addMember("def", "\$S", "DEFAULT") + .addMember("desc", $$"$S", "ARG DESCRIPTION") + .addMember("def", $$"$S", "DEFAULT") .build() ) .build() @@ -426,8 +426,8 @@ class GenerationTest { MethodSpec.methodBuilder("stringArgFlagCustom") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "stringArgFlagCustom") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "stringArgFlagCustom") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(TypeName.VOID) @@ -436,9 +436,9 @@ class GenerationTest { .addAnnotation( AnnotationSpec.builder(ArgFlag::class.java) .addMember("name", "'f'") - .addMember("argName", "\$S", "ARG NAME") - .addMember("desc", "\$S", "ARG DESCRIPTION") - .addMember("def", "\$S", "DEFAULT") + .addMember("argName", $$"$S", "ARG NAME") + .addMember("desc", $$"$S", "ARG DESCRIPTION") + .addMember("def", $$"$S", "DEFAULT") .build() ) .build() @@ -461,7 +461,7 @@ class GenerationTest { .addAnnotation( AnnotationSpec.builder(className()) .addMember( - "superTypes", "{ \$T.class, \$T.class }", + "superTypes", $$"{ $T.class, $T.class }", className(), className() ) .build() diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt index a5b526d..a909f4f 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/NestedClassTest.kt @@ -38,8 +38,8 @@ class NestedClassTest { MethodSpec.methodBuilder("noArg") .addAnnotation( AnnotationSpec.builder(Command::class.java) - .addMember("name", "\$S", "noArgument") - .addMember("desc", "\$S", "DESCRIPTION") + .addMember("name", $$"$S", "noArgument") + .addMember("desc", $$"$S", "DESCRIPTION") .build() ) .returns(Void.TYPE) diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt index 6b90575..ef639da 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/util/AnnoValueExtractionTest.kt @@ -47,8 +47,8 @@ class AnnoValueExtractionTest { private val annoCode = TypeSpec.classBuilder("AnnoContainer") .addAnnotation( AnnotationSpec.builder(className()) - .addMember("value", "\$S", value) - .addMember("many", "{ \$S, \$S }", value, value2) + .addMember("value", $$"$S", value) + .addMember("many", $$"{ $S, $S }", value, value2) .build() ) .build() diff --git a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt index 7cfdb93..8625dd3 100644 --- a/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt +++ b/core-ap/processor/src/test/kotlin/org/enginehub/piston/gen/value/ExtractSpecTest.kt @@ -31,7 +31,7 @@ class ExtractSpecTest { private val extractSpec = ExtractSpec.builder() .name("foo") .type(className()) - .extractMethodBody { name -> CodeBlock.of("\$S", "My name is $name") } + .extractMethodBody { name -> CodeBlock.of($$"$S", "My name is $name") } .build() @DisplayName("is equal to itself") @@ -66,7 +66,7 @@ class ExtractSpecTest { @Test fun isNotEqualDifferentGenerator() { val copy = extractSpec.toBuilder().extractMethodBody { name -> - CodeBlock.of("\$S", "I'm a different $name") + CodeBlock.of($$"$S", "I'm a different $name") }.build() assertNotEquals(extractSpec, copy) } From f993e9bc17d2407e974b04b3809b66013df47249 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Mon, 29 Dec 2025 00:25:17 +1000 Subject: [PATCH 11/12] build(test): add missing com.sun.tools.javac exports --- core-ap/processor/build.gradle.kts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/core-ap/processor/build.gradle.kts b/core-ap/processor/build.gradle.kts index 00491c9..d480120 100644 --- a/core-ap/processor/build.gradle.kts +++ b/core-ap/processor/build.gradle.kts @@ -8,11 +8,14 @@ kapt.includeCompileClasspath = false tasks.test { // Crack open the compiler for compile testing - jvmArgs( - "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", - "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", - "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", - ) + listOf( + "api", + "file", + "main", + "parser", + "tree", + "util" + ).forEach { jvmArgs("--add-exports=jdk.compiler/com.sun.tools.javac.${it}=ALL-UNNAMED") } } dependencies { From dcaca20fc936c8cc312bae5f2544a2fe07929303 Mon Sep 17 00:00:00 2001 From: Mitchell <13673076+mishyy@users.noreply.github.com> Date: Mon, 29 Dec 2025 01:04:56 +1000 Subject: [PATCH 12/12] style(test): revert processor resources/gen Revert applying checkstyle to :core-ap:processor/test/resources/gen --- config/checkstyle/checkstyle-suppression.xml | 6 +++ config/checkstyle/checkstyle.xml | 3 ++ .../gen/CollectionArgRegistration.java | 35 ++++++++++----- .../gen/CommandValueArgRegistration.java | 31 ++++++++----- .../test/resources/gen/FlagsRegistration.java | 33 +++++++++----- .../resources/gen/IntArgRegistration.java | 45 ++++++++++++------- .../test/resources/gen/NoArgRegistration.java | 21 +++++---- .../gen/NonArgParametersRegistration.java | 24 +++++----- .../gen/Outer_BasicNestedRegistration.java | 21 +++++---- .../resources/gen/SuperTypeRegistration.java | 13 +++++- .../gen/WildcardArgRegistration.java | 38 ++++++++++------ 11 files changed, 177 insertions(+), 93 deletions(-) create mode 100644 config/checkstyle/checkstyle-suppression.xml diff --git a/config/checkstyle/checkstyle-suppression.xml b/config/checkstyle/checkstyle-suppression.xml new file mode 100644 index 0000000..6bd14bd --- /dev/null +++ b/config/checkstyle/checkstyle-suppression.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 8a818b8..dd64c18 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -196,4 +196,7 @@ Checks based on Google Checks, modified for EngineHub.
+ + +
\ No newline at end of file diff --git a/core-ap/processor/src/test/resources/gen/CollectionArgRegistration.java b/core-ap/processor/src/test/resources/gen/CollectionArgRegistration.java index 5095b3d..448e1e2 100644 --- a/core-ap/processor/src/test/resources/gen/CollectionArgRegistration.java +++ b/core-ap/processor/src/test/resources/gen/CollectionArgRegistration.java @@ -19,7 +19,22 @@ package eh; + +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.Object; +import java.lang.String; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; import net.kyori.text.TextComponent; import net.kyori.text.TranslatableComponent; import org.enginehub.piston.CommandManager; @@ -29,30 +44,26 @@ import org.enginehub.piston.inject.Key; import org.enginehub.piston.part.CommandArgument; -import java.lang.reflect.Method; -import java.util.Collection; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; -import static org.enginehub.piston.part.CommandParts.arg; - @SuppressWarnings({"deprecation", "removal"}) final class CollectionArgRegistration implements CommandRegistration { private static final Key string_Key = Key.of(String.class); private static final Key object_Key = Key.of(Object.class); + + private CommandManager commandManager; + + private CollectionArg containerInstance; + + private ImmutableList listeners; + private final CommandArgument argPart = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(string_Key)) .build(); + private final CommandArgument argPart2 = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(object_Key)) .build(); - private CommandManager commandManager; - private CollectionArg containerInstance; - private ImmutableList listeners; private CollectionArgRegistration() { this.listeners = ImmutableList.of(); diff --git a/core-ap/processor/src/test/resources/gen/CommandValueArgRegistration.java b/core-ap/processor/src/test/resources/gen/CommandValueArgRegistration.java index 31fb12a..c1b79a2 100644 --- a/core-ap/processor/src/test/resources/gen/CommandValueArgRegistration.java +++ b/core-ap/processor/src/test/resources/gen/CommandValueArgRegistration.java @@ -19,7 +19,20 @@ package eh; + +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; import net.kyori.text.TextComponent; import net.kyori.text.TranslatableComponent; import org.enginehub.piston.CommandManager; @@ -29,24 +42,18 @@ import org.enginehub.piston.gen.CommandRegistration; import org.enginehub.piston.part.CommandArgument; -import java.lang.reflect.Method; -import java.util.Collection; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; -import static org.enginehub.piston.part.CommandParts.arg; - @SuppressWarnings({"deprecation", "removal"}) final class CommandValueArgRegistration implements CommandRegistration { - private final CommandArgument argPart = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) - .defaultsTo(ImmutableList.of()) - .build(); private CommandManager commandManager; + private CommandValueArg containerInstance; + private ImmutableList listeners; + private final CommandArgument argPart = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) + .defaultsTo(ImmutableList.of()) + .build(); + private CommandValueArgRegistration() { this.listeners = ImmutableList.of(); } diff --git a/core-ap/processor/src/test/resources/gen/FlagsRegistration.java b/core-ap/processor/src/test/resources/gen/FlagsRegistration.java index e2ca363..db62afb 100644 --- a/core-ap/processor/src/test/resources/gen/FlagsRegistration.java +++ b/core-ap/processor/src/test/resources/gen/FlagsRegistration.java @@ -19,7 +19,20 @@ package eh; +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.String; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; import net.kyori.text.TextComponent; import net.kyori.text.TranslatableComponent; import org.enginehub.piston.CommandManager; @@ -30,34 +43,30 @@ import org.enginehub.piston.part.ArgAcceptingCommandFlag; import org.enginehub.piston.part.NoArgCommandFlag; -import java.lang.reflect.Method; -import java.util.Collection; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; -import static org.enginehub.piston.part.CommandParts.flag; - @SuppressWarnings({"deprecation", "removal"}) final class FlagsRegistration implements CommandRegistration { private static final Key string_Key = Key.of(String.class); + private CommandManager commandManager; + + private Flags containerInstance; + + private ImmutableList listeners; + private final NoArgCommandFlag flagPart = flag('f', TextComponent.of("ARG DESCRIPTION")).build(); + private final ArgAcceptingCommandFlag flagPart2 = flag('f', TextComponent.of("ARG DESCRIPTION")) .withRequiredArg() .argNamed(TranslatableComponent.of("piston.argument.flag")) .defaultsTo(ImmutableList.of("DEFAULT")) .ofTypes(ImmutableList.of(string_Key)) .build(); + private final ArgAcceptingCommandFlag flagPart3 = flag('f', TextComponent.of("ARG DESCRIPTION")) .withRequiredArg() .argNamed(TranslatableComponent.of("piston.argument.ARG NAME")) .defaultsTo(ImmutableList.of("DEFAULT")) .ofTypes(ImmutableList.of(string_Key)) .build(); - private CommandManager commandManager; - private Flags containerInstance; - private ImmutableList listeners; private FlagsRegistration() { this.listeners = ImmutableList.of(); diff --git a/core-ap/processor/src/test/resources/gen/IntArgRegistration.java b/core-ap/processor/src/test/resources/gen/IntArgRegistration.java index 0722e62..998dd67 100644 --- a/core-ap/processor/src/test/resources/gen/IntArgRegistration.java +++ b/core-ap/processor/src/test/resources/gen/IntArgRegistration.java @@ -19,7 +19,25 @@ package eh; +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.Integer; +import java.lang.NoSuchMethodException; +import java.lang.Object; +import java.lang.RuntimeException; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.List; import net.kyori.text.TextComponent; import net.kyori.text.TranslatableComponent; import org.enginehub.piston.CommandManager; @@ -32,17 +50,6 @@ import org.enginehub.piston.inject.Key; import org.enginehub.piston.part.CommandArgument; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.List; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; -import static org.enginehub.piston.part.CommandParts.arg; - @SuppressWarnings({"deprecation", "removal"}) final class IntArgRegistration implements CommandRegistration { private static final Key integer_Key = Key.of(Integer.class); @@ -56,7 +63,7 @@ Annotation a(@InjectGamma("something to match") Object ah) { } }.a(null)); private static final Key integer_injectDeltaQux45$Baz32$Thq1099_Key = Key.of(Integer.class, new Object() { - Annotation a(@InjectDelta(qux = 45, baz = 32, thq = {10, 99}) Object ah) { + Annotation a(@InjectDelta(qux = 45, baz = 32, thq = { 10, 99 }) Object ah) { try { return getClass().getDeclaredMethod("a", Object.class).getParameterAnnotations()[0][0]; } catch (NoSuchMethodException e) { @@ -65,30 +72,38 @@ Annotation a(@InjectDelta(qux = 45, baz = 32, thq = {10, 99}) Object ah) { } }.a(null)); private static final Key integer_injectAlpha_Key = Key.of(Integer.class, InjectAlpha.class); + + private CommandManager commandManager; + + private IntArg containerInstance; + + private ImmutableList listeners; + private final CommandArgument argPart = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(integer_Key)) .build(); + private final CommandArgument argPart2 = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(integer_injectGamma_something_to_match__Key)) .build(); + private final CommandArgument deltaPart = arg(TranslatableComponent.of("piston.argument.delta"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(integer_injectDeltaQux45$Baz32$Thq1099_Key)) .build(); + private final CommandArgument alphaPart = arg(TranslatableComponent.of("piston.argument.alpha"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(integer_injectAlpha_Key)) .build(); + private final CommandArgument argPart3 = arg(TranslatableComponent.of("piston.argument.args"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(integer_Key)) .variable(true) .build(); - private CommandManager commandManager; - private IntArg containerInstance; - private ImmutableList listeners; private IntArgRegistration() { this.listeners = ImmutableList.of(); diff --git a/core-ap/processor/src/test/resources/gen/NoArgRegistration.java b/core-ap/processor/src/test/resources/gen/NoArgRegistration.java index 5d6fa61..9ed3873 100644 --- a/core-ap/processor/src/test/resources/gen/NoArgRegistration.java +++ b/core-ap/processor/src/test/resources/gen/NoArgRegistration.java @@ -19,7 +19,20 @@ package eh; +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.Exception; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; import net.kyori.text.TextComponent; import org.enginehub.piston.Command; import org.enginehub.piston.CommandManager; @@ -28,14 +41,6 @@ import org.enginehub.piston.gen.CommandCallListener; import org.enginehub.piston.gen.CommandRegistration; -import java.lang.reflect.Method; -import java.util.Collection; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; - @SuppressWarnings({"deprecation", "removal"}) final class NoArgRegistration implements CommandRegistration { private CommandManager commandManager; diff --git a/core-ap/processor/src/test/resources/gen/NonArgParametersRegistration.java b/core-ap/processor/src/test/resources/gen/NonArgParametersRegistration.java index d35d2f0..819caa9 100644 --- a/core-ap/processor/src/test/resources/gen/NonArgParametersRegistration.java +++ b/core-ap/processor/src/test/resources/gen/NonArgParametersRegistration.java @@ -19,8 +19,22 @@ package eh; +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; import com.google.common.reflect.TypeToken; +import java.lang.Object; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.concurrent.Callable; import net.kyori.text.TextComponent; import org.enginehub.piston.CommandManager; import org.enginehub.piston.CommandParameters; @@ -28,16 +42,6 @@ import org.enginehub.piston.gen.CommandRegistration; import org.enginehub.piston.inject.Key; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.concurrent.Callable; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; -import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; - @SuppressWarnings({"deprecation", "removal"}) final class NonArgParametersRegistration implements CommandRegistration { private static final Key> callable$Object_Key = Key.of(new TypeToken>() { diff --git a/core-ap/processor/src/test/resources/gen/Outer_BasicNestedRegistration.java b/core-ap/processor/src/test/resources/gen/Outer_BasicNestedRegistration.java index 18b323e..e0fa670 100644 --- a/core-ap/processor/src/test/resources/gen/Outer_BasicNestedRegistration.java +++ b/core-ap/processor/src/test/resources/gen/Outer_BasicNestedRegistration.java @@ -19,21 +19,26 @@ package eh; +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.Exception; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; import net.kyori.text.TextComponent; import org.enginehub.piston.CommandManager; import org.enginehub.piston.CommandParameters; import org.enginehub.piston.gen.CommandCallListener; import org.enginehub.piston.gen.CommandRegistration; -import java.lang.reflect.Method; -import java.util.Collection; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; - @SuppressWarnings({"deprecation", "removal"}) final class Outer_BasicNestedRegistration implements CommandRegistration { private CommandManager commandManager; diff --git a/core-ap/processor/src/test/resources/gen/SuperTypeRegistration.java b/core-ap/processor/src/test/resources/gen/SuperTypeRegistration.java index 84b04e9..9036a46 100644 --- a/core-ap/processor/src/test/resources/gen/SuperTypeRegistration.java +++ b/core-ap/processor/src/test/resources/gen/SuperTypeRegistration.java @@ -19,15 +19,24 @@ package eh; + +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; +import java.lang.SuppressWarnings; +import java.util.Collection; import org.enginehub.piston.CommandManager; import org.enginehub.piston.gen.CommandCallListener; import org.enginehub.piston.gen.CommandRegistration; import org.enginehub.piston.gen.EmptySuperClass; import org.enginehub.piston.gen.EmptySuperInterface; -import java.util.Collection; - @SuppressWarnings({"deprecation", "removal"}) final class SuperTypeRegistration extends EmptySuperClass implements CommandRegistration, EmptySuperInterface { private CommandManager commandManager; diff --git a/core-ap/processor/src/test/resources/gen/WildcardArgRegistration.java b/core-ap/processor/src/test/resources/gen/WildcardArgRegistration.java index 7060da9..099a730 100644 --- a/core-ap/processor/src/test/resources/gen/WildcardArgRegistration.java +++ b/core-ap/processor/src/test/resources/gen/WildcardArgRegistration.java @@ -19,8 +19,21 @@ package eh; +import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; +import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; +import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; +import static org.enginehub.piston.internal.RegistrationUtil.requireOptional; +import static org.enginehub.piston.part.CommandParts.arg; +import static org.enginehub.piston.part.CommandParts.flag; + import com.google.common.collect.ImmutableList; import com.google.common.reflect.TypeToken; +import java.lang.SuppressWarnings; +import java.lang.Throwable; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.function.Consumer; import net.kyori.text.TextComponent; import net.kyori.text.TranslatableComponent; import org.enginehub.piston.CommandManager; @@ -30,27 +43,24 @@ import org.enginehub.piston.inject.Key; import org.enginehub.piston.part.CommandArgument; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.function.Consumer; - -import static org.enginehub.piston.internal.RegistrationUtil.getCommandMethod; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterCall; -import static org.enginehub.piston.internal.RegistrationUtil.listenersAfterThrow; -import static org.enginehub.piston.internal.RegistrationUtil.listenersBeforeCall; -import static org.enginehub.piston.part.CommandParts.arg; - -@SuppressWarnings({"deprecation", "removal"}) +@SuppressWarnings({ + "deprecation", + "removal" +}) final class WildcardArgRegistration implements CommandRegistration { private static final Key> consumer$__Key = Key.of(new TypeToken>() { }); + + private CommandManager commandManager; + + private WildcardArg containerInstance; + + private ImmutableList listeners; + private final CommandArgument argPart = arg(TranslatableComponent.of("piston.argument.arg"), TextComponent.of("ARG DESCRIPTION")) .defaultsTo(ImmutableList.of()) .ofTypes(ImmutableList.of(consumer$__Key)) .build(); - private CommandManager commandManager; - private WildcardArg containerInstance; - private ImmutableList listeners; private WildcardArgRegistration() { this.listeners = ImmutableList.of();