From 52712d685c12ecc0c1011a29f2c78d811257a43f Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Wed, 22 Jan 2025 16:31:59 +0100 Subject: [PATCH 01/65] add benchmarks --- build.gradle | 10 +- gradle/gradle-jdks-functions.sh | 4 +- gradle/gradle-jdks-setup.jar | Bin 113255 -> 113259 bytes .../jdks/23/linux-glibc/aarch64/download-url | 1 + gradle/jdks/23/linux-glibc/aarch64/local-path | 1 + .../jdks/23/linux-glibc/x86-64/download-url | 1 + gradle/jdks/23/linux-glibc/x86-64/local-path | 1 + gradle/jdks/23/linux-glibc/x86/download-url | 1 + gradle/jdks/23/linux-glibc/x86/local-path | 1 + .../jdks/23/linux-musl/aarch64/download-url | 1 + gradle/jdks/23/linux-musl/aarch64/local-path | 1 + gradle/jdks/23/linux-musl/x86-64/download-url | 1 + gradle/jdks/23/linux-musl/x86-64/local-path | 1 + gradle/jdks/23/linux-musl/x86/download-url | 1 + gradle/jdks/23/linux-musl/x86/local-path | 1 + gradle/jdks/23/macos/aarch64/download-url | 1 + gradle/jdks/23/macos/aarch64/local-path | 1 + gradle/jdks/23/macos/x86-64/download-url | 1 + gradle/jdks/23/macos/x86-64/local-path | 1 + gradle/jdks/23/macos/x86/download-url | 1 + gradle/jdks/23/macos/x86/local-path | 1 + gradle/jdks/23/windows/aarch64/download-url | 1 + gradle/jdks/23/windows/aarch64/local-path | 1 + gradle/jdks/23/windows/x86-64/download-url | 1 + gradle/jdks/23/windows/x86-64/local-path | 1 + gradle/jdks/23/windows/x86/download-url | 1 + gradle/jdks/23/windows/x86/local-path | 1 + palantir-java-format-benchmarks/build.gradle | 26 +++++ .../javaformat/BenchmarkMultiFiles.java | 109 ++++++++++++++++++ palantir-java-format/build.gradle | 58 ++++++++++ .../META-INF/native-image/jni-config.json | 18 +++ .../predefined-classes-config.json | 8 ++ .../META-INF/native-image/proxy-config.json | 2 + .../META-INF/native-image/reflect-config.json | 50 ++++++++ .../native-image/resource-config.json | 12 ++ .../native-image/serialization-config.json | 8 ++ settings.gradle | 1 + versions.lock | 19 ++- versions.props | 2 + 39 files changed, 344 insertions(+), 7 deletions(-) create mode 100644 gradle/jdks/23/linux-glibc/aarch64/download-url create mode 100644 gradle/jdks/23/linux-glibc/aarch64/local-path create mode 100644 gradle/jdks/23/linux-glibc/x86-64/download-url create mode 100644 gradle/jdks/23/linux-glibc/x86-64/local-path create mode 100644 gradle/jdks/23/linux-glibc/x86/download-url create mode 100644 gradle/jdks/23/linux-glibc/x86/local-path create mode 100644 gradle/jdks/23/linux-musl/aarch64/download-url create mode 100644 gradle/jdks/23/linux-musl/aarch64/local-path create mode 100644 gradle/jdks/23/linux-musl/x86-64/download-url create mode 100644 gradle/jdks/23/linux-musl/x86-64/local-path create mode 100644 gradle/jdks/23/linux-musl/x86/download-url create mode 100644 gradle/jdks/23/linux-musl/x86/local-path create mode 100644 gradle/jdks/23/macos/aarch64/download-url create mode 100644 gradle/jdks/23/macos/aarch64/local-path create mode 100644 gradle/jdks/23/macos/x86-64/download-url create mode 100644 gradle/jdks/23/macos/x86-64/local-path create mode 100644 gradle/jdks/23/macos/x86/download-url create mode 100644 gradle/jdks/23/macos/x86/local-path create mode 100644 gradle/jdks/23/windows/aarch64/download-url create mode 100644 gradle/jdks/23/windows/aarch64/local-path create mode 100644 gradle/jdks/23/windows/x86-64/download-url create mode 100644 gradle/jdks/23/windows/x86-64/local-path create mode 100644 gradle/jdks/23/windows/x86/download-url create mode 100644 gradle/jdks/23/windows/x86/local-path create mode 100644 palantir-java-format-benchmarks/build.gradle create mode 100644 palantir-java-format-benchmarks/src/jmh/java/com/palantir/javaformat/BenchmarkMultiFiles.java create mode 100644 palantir-java-format/src/main/resources/META-INF/native-image/jni-config.json create mode 100644 palantir-java-format/src/main/resources/META-INF/native-image/predefined-classes-config.json create mode 100644 palantir-java-format/src/main/resources/META-INF/native-image/proxy-config.json create mode 100644 palantir-java-format/src/main/resources/META-INF/native-image/reflect-config.json create mode 100644 palantir-java-format/src/main/resources/META-INF/native-image/resource-config.json create mode 100644 palantir-java-format/src/main/resources/META-INF/native-image/serialization-config.json diff --git a/build.gradle b/build.gradle index 96bda06d9..2dd822c16 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ buildscript { repositories { mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } + mavenLocal() } dependencies { @@ -12,7 +13,7 @@ buildscript { classpath 'com.palantir.gradle.externalpublish:gradle-external-publish-plugin:1.19.0' classpath 'com.palantir.gradle.failure-reports:gradle-failure-reports:1.13.0' classpath 'com.palantir.gradle.gitversion:gradle-git-version:3.1.0' - classpath 'com.palantir.gradle.jdks:gradle-jdks:0.59.0' + classpath 'com.palantir.gradle.jdks:gradle-jdks:0.59.0-22-ge6f4332' classpath 'com.palantir.gradle.jdkslatest:gradle-jdks-latest:0.16.0' classpath 'com.palantir.gradle.plugintesting:gradle-plugin-testing:0.5.0' classpath 'com.palantir.javaformat:gradle-palantir-java-format:2.50.0' @@ -20,6 +21,7 @@ buildscript { classpath 'com.palantir.javaformat:gradle-palantir-java-format:2.50.0' classpath 'com.palantir.suppressible-error-prone:gradle-suppressible-error-prone:2.0.0' classpath 'gradle.plugin.org.inferred:gradle-processors:3.7.0' + classpath 'me.champeau.jmh:jmh-gradle-plugin:0.7.2' } } @@ -98,4 +100,10 @@ idea.project.ipr.withXml { xml -> jdks { daemonTarget = 17 + + jdk(23) { + distribution = 'graalvm-ce' + jdkVersion = '23.0.1' + } + } diff --git a/gradle/gradle-jdks-functions.sh b/gradle/gradle-jdks-functions.sh index 3ed798eef..a8405af10 100755 --- a/gradle/gradle-jdks-functions.sh +++ b/gradle/gradle-jdks-functions.sh @@ -141,11 +141,11 @@ install_and_setup_jdks() { case "$distribution_url" in *.zip) distribution_name=${distribution_url##*/} - curl -C - "$distribution_url" -o "$distribution_name" + curl -L -C - "$distribution_url" -o "$distribution_name" tar -xzf "$distribution_name" ;; *) - curl -C - "$distribution_url" | tar -xzf - + curl -L -C - "$distribution_url" | tar -xzf - ;; esac elif command -v wget > /dev/null 2>&1; then diff --git a/gradle/gradle-jdks-setup.jar b/gradle/gradle-jdks-setup.jar index ef84f071e6bfb545b6a65355eee9e3055c0d03d5..978b3b69cf6422ff3adbb7ad3b821334658d1c55 100644 GIT binary patch delta 5020 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 Sp7%d4!UF)XrvHQC0RIEOE{-t( delta 4987 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 filesToFormat = getFilesToFormat(); + + private static List getFilesToFormat() { + Path srcJavaFormatFiles = Paths.get(".") + .toAbsolutePath() + .resolve("../palantir-java-format/src/main/java/com/palantir/javaformat/java"); + try (Stream paths = Files.list(srcJavaFormatFiles) + .filter(Files::isRegularFile) + .map(path -> path.toAbsolutePath().toString())) { + return paths.collect(Collectors.toList()); + } catch (IOException e) { + throw new RuntimeException("Couldn't list src files: " + srcJavaFormatFiles, e); + } + } + } + + @Benchmark + @BenchmarkMode(Mode.All) + @OutputTimeUnit(TimeUnit.SECONDS) + public final void runNativeImage(BenchmarkState state) throws InterruptedException, IOException { + ProcessBuilder p = new ProcessBuilder(); + p.command(Stream.concat( + Stream.of( + Path.of(".") + .toAbsolutePath() + .resolve("../palantir-java-format/build/graal/palantir-java-format") + .toString(), + "-i", + "--palantir"), + state.filesToFormat.stream()) + .collect(Collectors.toList())); + Process process = p.inheritIO().start(); + assertThat(process.waitFor()).isEqualTo(0); + } + + @Benchmark + @BenchmarkMode(Mode.All) + @OutputTimeUnit(TimeUnit.SECONDS) + public final void runJar(BenchmarkState state) throws InterruptedException, IOException { + ProcessBuilder p = new ProcessBuilder(); + p.command(Stream.concat( + Stream.of( + "java", + "-jar", + Paths.get(".") + .toAbsolutePath() + .resolve("build/resources/jmh/palantir-java-format-all.jar") + .toString(), + "-i", + "--palantir"), + state.filesToFormat.stream()) + .collect(Collectors.toList())); + Process process = p.inheritIO().start(); + assertThat(process.waitFor()).isEqualTo(0); + } + + public static void main(String[] _args) throws RunnerException { + new Runner(new OptionsBuilder() + .include(BenchmarkMultiFiles.class.getSimpleName()) + .build()) + .run(); + } +} diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index bef1b8918..9c43bfbc1 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -1,3 +1,14 @@ +buildscript { + repositories { + mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } + gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } + } + dependencies { + classpath 'org.graalvm.buildtools:native-gradle-plugin:0.10.4' + } +} + +apply plugin: 'org.graalvm.buildtools.native' apply plugin: 'application' apply plugin: 'com.palantir.external-publish-jar' @@ -30,6 +41,36 @@ dependencies { annotationProcessor 'org.derive4j:derive4j' } +graalvmNative { + binaries { + main { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(23) + vendor = JvmVendorSpec.GRAAL_VM + } + imageName = 'palantir-java-format' + mainClass = mainClassName + fallback = false + sharedLibrary = false + configurationFileDirectories.from(file('src/main/resources/META-INF/native-image')) + buildArgs.addAll("-H:ConfigurationFileDirectories=${projectDir}/src/main/resources/META-INF/native-image", + '-H:+UnlockExperimentalVMOptions', + '-H:IncludeResourceBundles=com.sun.tools.javac.resources.compiler', + '-H:IncludeResourceBundles=com.sun.tools.javac.resources.javac', + '--no-fallback', + '--initialize-at-build-time=com.sun.tools.javac.file.Locations', + '-H:+ReportExceptionStackTraces', + '-H:-UseContainerSupport', + '-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED', + '-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', + '-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', + '-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', + '-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', + '-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED') + } + } +} + def exports = [ 'jdk.compiler/com.sun.tools.javac.file', 'jdk.compiler/com.sun.tools.javac.main', @@ -89,3 +130,20 @@ tasks.named("jar", Jar) { attributes('Add-Exports': exports.join(' ')) } } + +tasks.register('fatJar', Jar) { + dependsOn tasks.jar, project(':palantir-java-format-spi').tasks.jar + manifest { + attributes 'Main-Class': mainClassName + attributes('Add-Exports': exports.join(' ')) + } + archiveBaseName = 'palantir-java-format-all' + duplicatesStrategy = DuplicatesStrategy.WARN + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} + + +tasks.named("build") { + dependsOn tasks.named("fatJar"), tasks.named("nativeCompile") +} \ No newline at end of file diff --git a/palantir-java-format/src/main/resources/META-INF/native-image/jni-config.json b/palantir-java-format/src/main/resources/META-INF/native-image/jni-config.json new file mode 100644 index 000000000..0e5253816 --- /dev/null +++ b/palantir-java-format/src/main/resources/META-INF/native-image/jni-config.json @@ -0,0 +1,18 @@ +[ +{ + "name":"com.palantir.javaformat.java.Main", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"java.lang.Boolean", + "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"java.lang.String", + "methods":[{"name":"lastIndexOf","parameterTypes":["int"] }, {"name":"substring","parameterTypes":["int"] }] +}, +{ + "name":"java.lang.System", + "methods":[{"name":"getProperty","parameterTypes":["java.lang.String"] }, {"name":"setProperty","parameterTypes":["java.lang.String","java.lang.String"] }] +} +] diff --git a/palantir-java-format/src/main/resources/META-INF/native-image/predefined-classes-config.json b/palantir-java-format/src/main/resources/META-INF/native-image/predefined-classes-config.json new file mode 100644 index 000000000..0e79b2c5d --- /dev/null +++ b/palantir-java-format/src/main/resources/META-INF/native-image/predefined-classes-config.json @@ -0,0 +1,8 @@ +[ + { + "type":"agent-extracted", + "classes":[ + ] + } +] + diff --git a/palantir-java-format/src/main/resources/META-INF/native-image/proxy-config.json b/palantir-java-format/src/main/resources/META-INF/native-image/proxy-config.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/palantir-java-format/src/main/resources/META-INF/native-image/proxy-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/palantir-java-format/src/main/resources/META-INF/native-image/reflect-config.json b/palantir-java-format/src/main/resources/META-INF/native-image/reflect-config.json new file mode 100644 index 000000000..dedb26251 --- /dev/null +++ b/palantir-java-format/src/main/resources/META-INF/native-image/reflect-config.json @@ -0,0 +1,50 @@ +[ +{ + "name":"[Lcom.fasterxml.jackson.databind.deser.Deserializers;" +}, +{ + "name":"[Lcom.fasterxml.jackson.databind.ser.BeanSerializerModifier;" +}, +{ + "name":"[Lcom.fasterxml.jackson.databind.ser.Serializers;" +}, +{ + "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.palantir.javaformat.java.JavacTokens$CommentSavingTokenizer" +}, +{ + "name":"com.palantir.javaformat.java.java14.Java14InputAstVisitor", + "methods":[{"name":"","parameterTypes":["com.palantir.javaformat.OpsBuilder","int"] }] +}, +{ + "name":"com.sun.source.tree.BindingPatternTree", + "methods":[{"name":"getBinding","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }, {"name":"getVariable","parameterTypes":[] }] +}, +{ + "name":"com.sun.source.tree.CaseTree", + "methods":[{"name":"getLabels","parameterTypes":[] }] +}, +{ + "name":"com.sun.source.tree.ClassTree", + "methods":[{"name":"getPermitsClause","parameterTypes":[] }] +}, +{ + "name":"com.sun.source.tree.CompilationUnitTree", + "methods":[{"name":"getModule","parameterTypes":[] }] +}, +{ + "name":"com.sun.tools.javac.parser.JavaTokenizer", + "fields":[{"name":"reader"}] +}, +{ + "name":"com.sun.tools.javac.parser.UnicodeReader", + "methods":[{"name":"getRawCharacters","parameterTypes":["int","int"] }] +}, +{ + "name":"java.util.concurrent.atomic.AtomicReference", + "fields":[{"name":"value"}] +} +] diff --git a/palantir-java-format/src/main/resources/META-INF/native-image/resource-config.json b/palantir-java-format/src/main/resources/META-INF/native-image/resource-config.json new file mode 100644 index 000000000..8e76d16e2 --- /dev/null +++ b/palantir-java-format/src/main/resources/META-INF/native-image/resource-config.json @@ -0,0 +1,12 @@ +{ + "resources":{ + "includes":[{ + "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E" + }, { + "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E" + }]}, + "bundles":[{ + "name":"com.sun.tools.javac.resources.compiler", + "classNames":["com.sun.tools.javac.resources.compiler"] + }] +} diff --git a/palantir-java-format/src/main/resources/META-INF/native-image/serialization-config.json b/palantir-java-format/src/main/resources/META-INF/native-image/serialization-config.json new file mode 100644 index 000000000..f3d7e06e3 --- /dev/null +++ b/palantir-java-format/src/main/resources/META-INF/native-image/serialization-config.json @@ -0,0 +1,8 @@ +{ + "types":[ + ], + "lambdaCapturingTypes":[ + ], + "proxies":[ + ] +} diff --git a/settings.gradle b/settings.gradle index 66f5c9353..f568c01a9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,6 +16,7 @@ include ':idea-plugin' include ':palantir-java-format-spi' include ':palantir-java-format' include ':palantir-java-format-jdk-bootstrap' +include ':palantir-java-format-benchmarks' boolean isCiServer = System.getenv().containsKey('CI') buildCache { diff --git a/versions.lock b/versions.lock index a6f8d7eae..e18e205e1 100644 --- a/versions.lock +++ b/versions.lock @@ -28,6 +28,8 @@ com.squareup.okio:okio:3.6.0 (1 constraints: 530c38fd) com.squareup.okio:okio-jvm:3.6.0 (1 constraints: 500ad3b9) commons-codec:commons-codec:1.16.0 (1 constraints: 780efe5e) dev.equo.ide:solstice:1.7.5 (1 constraints: 7a1168da) +net.sf.jopt-simple:jopt-simple:5.0.4 (1 constraints: be0ad6cc) +org.apache.commons:commons-math3:3.6.1 (1 constraints: bf0adbcc) org.checkerframework:checker-qual:3.43.0 (4 constraints: 6734e847) org.derive4j:derive4j-annotation:1.1.1 (1 constraints: 0505f435) org.eclipse.jdt:org.eclipse.jdt.core:3.23.0 (1 constraints: 3a05423b) @@ -53,6 +55,8 @@ org.jetbrains.kotlin:kotlin-stdlib:1.9.10 (2 constraints: c2210fe1) org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10 (2 constraints: 3f1b4b83) org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10 (1 constraints: e210ffd2) org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (2 constraints: 8118c1c5) +org.openjdk.jmh:jmh-core:1.37 (5 constraints: 52476be6) +org.openjdk.jmh:jmh-generator-annprocess:1.37 (1 constraints: df04fc30) org.slf4j:slf4j-api:1.7.36 (2 constraints: 801849c0) org.tukaani:xz:1.9 (1 constraints: 6b09e995) @@ -67,21 +71,28 @@ com.netflix.nebula:nebula-test:10.0.0 (1 constraints: 3305273b) com.palantir.gradle.plugintesting:plugin-testing-core:0.5.0 (1 constraints: 0705fa35) junit:junit:4.13.2 (7 constraints: da62ac41) net.bytebuddy:byte-buddy:1.14.11 (1 constraints: 7e0bc5ea) -org.apiguardian:apiguardian-api:1.1.2 (7 constraints: 9d791b5f) +org.apiguardian:apiguardian-api:1.1.2 (10 constraints: 8fb0f648) org.assertj:assertj-core:3.25.3 (1 constraints: 3f054b3b) org.codehaus.groovy:groovy:3.0.6 (2 constraints: 1e1b476d) +org.graalvm.buildtools:junit-platform-native:0.10.4 (1 constraints: 3705273b) org.hamcrest:hamcrest:2.2 (1 constraints: d20cdc04) org.hamcrest:hamcrest-core:1.3 (1 constraints: cc05fe3f) -org.junit.jupiter:junit-jupiter:5.10.2 (1 constraints: 3a05433b) +org.junit.jupiter:junit-jupiter:5.10.2 (2 constraints: 8018c494) org.junit.jupiter:junit-jupiter-api:5.10.2 (4 constraints: 39451ef8) org.junit.jupiter:junit-jupiter-engine:5.10.2 (1 constraints: 350eff49) org.junit.jupiter:junit-jupiter-migrationsupport:5.10.2 (1 constraints: 3a05433b) org.junit.jupiter:junit-jupiter-params:5.10.2 (1 constraints: 350eff49) org.junit.platform:junit-platform-commons:1.10.2 (2 constraints: 2f218183) -org.junit.platform:junit-platform-engine:1.10.2 (3 constraints: b02e49c5) +org.junit.platform:junit-platform-console:1.10.2 (1 constraints: 4313543f) +org.junit.platform:junit-platform-engine:1.10.2 (4 constraints: 23412378) +org.junit.platform:junit-platform-launcher:1.10.2 (2 constraints: 3e261868) +org.junit.platform:junit-platform-reporting:1.10.2 (1 constraints: 15129900) org.junit.vintage:junit-vintage-engine:5.10.2 (1 constraints: 3a05433b) org.objenesis:objenesis:2.4 (1 constraints: ea0c8c0a) +org.openjdk.jmh:jmh-generator-asm:1.37 (1 constraints: 2c107598) +org.openjdk.jmh:jmh-generator-bytecode:1.37 (1 constraints: de04fb30) +org.openjdk.jmh:jmh-generator-reflection:1.37 (2 constraints: 491e3064) org.opentest4j:opentest4j:1.3.0 (2 constraints: cf209249) -org.ow2.asm:asm:9.6 (1 constraints: 090aaca4) +org.ow2.asm:asm:9.6 (2 constraints: f417596a) org.spockframework:spock-core:2.0-M4-groovy-3.0 (2 constraints: e822d65a) org.spockframework:spock-junit4:2.0-M4-groovy-3.0 (1 constraints: 25115ddf) diff --git a/versions.props b/versions.props index 46b71c74e..fe5c7e705 100644 --- a/versions.props +++ b/versions.props @@ -20,3 +20,5 @@ org.junit.platform:* = 1.10.2 org.slf4j:* = 1.7.36 com.fasterxml.jackson.*:* = 2.18.2 com.fasterxml.jackson.core:jackson-databind = 2.18.2 +org.openjdk.jmh:* = 1.37 + From 217a7b055d5f77bf24c16103b7ee2abd5b358ac5 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Wed, 22 Jan 2025 16:33:19 +0100 Subject: [PATCH 02/65] . --- .../jmh/java/com/palantir/javaformat/BenchmarkMultiFiles.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/palantir-java-format-benchmarks/src/jmh/java/com/palantir/javaformat/BenchmarkMultiFiles.java b/palantir-java-format-benchmarks/src/jmh/java/com/palantir/javaformat/BenchmarkMultiFiles.java index 9b3f540b0..5c0a79937 100644 --- a/palantir-java-format-benchmarks/src/jmh/java/com/palantir/javaformat/BenchmarkMultiFiles.java +++ b/palantir-java-format-benchmarks/src/jmh/java/com/palantir/javaformat/BenchmarkMultiFiles.java @@ -33,12 +33,13 @@ import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.OptionsBuilder; @Measurement(iterations = 2, time = 2) -//@Warmup(iterations = 2, time = 4) +@Warmup(iterations = 2, time = 4) public class BenchmarkMultiFiles { @State(Scope.Benchmark) From 0618efc8d0736c322655c19a40398aef311fe6a0 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Wed, 22 Jan 2025 16:34:35 +0100 Subject: [PATCH 03/65] . --- palantir-java-format/build.gradle | 2 +- versions.props | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index 9c43bfbc1..489864976 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -146,4 +146,4 @@ tasks.register('fatJar', Jar) { tasks.named("build") { dependsOn tasks.named("fatJar"), tasks.named("nativeCompile") -} \ No newline at end of file +} diff --git a/versions.props b/versions.props index fe5c7e705..a8b6afe04 100644 --- a/versions.props +++ b/versions.props @@ -21,4 +21,3 @@ org.slf4j:* = 1.7.36 com.fasterxml.jackson.*:* = 2.18.2 com.fasterxml.jackson.core:jackson-databind = 2.18.2 org.openjdk.jmh:* = 1.37 - From fa35c6146b890e25f081fd0346cfad661a5aa05a Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 23 Jan 2025 14:42:07 +0100 Subject: [PATCH 04/65] spotlessApply --- gradle-palantir-java-format/build.gradle | 4 ++ .../javaformat/gradle/SpotlessInterop.java | 30 ++++++++- .../NativePalantirJavaFormatStep.java | 62 +++++++++++++++++++ 3 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java diff --git a/gradle-palantir-java-format/build.gradle b/gradle-palantir-java-format/build.gradle index 05886ecb3..a7b12c7ca 100644 --- a/gradle-palantir-java-format/build.gradle +++ b/gradle-palantir-java-format/build.gradle @@ -88,3 +88,7 @@ def writeImplClasspath = tasks.register("writeImplClasspath") { tasks.named("test").configure { dependsOn(writeImplClasspath) } + +tasks.withType(ProcessResources.class).configureEach { + from(project(':palantir-java-format').tasks.named('nativeCompile')) {} +} diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java index dbae64583..bc0bab32c 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java @@ -16,7 +16,14 @@ package com.palantir.javaformat.gradle; import com.diffplug.gradle.spotless.SpotlessExtension; +import com.diffplug.spotless.FormatterStep; +import com.google.common.io.Resources; +import com.palantir.javaformat.gradle.spotless.NativePalantirJavaFormatStep; import com.palantir.javaformat.gradle.spotless.PalantirJavaFormatStep; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.util.Optional; import org.gradle.api.Project; /** @@ -28,8 +35,25 @@ private SpotlessInterop() {} static void addSpotlessJavaStep(Project project, String configurationName) { SpotlessExtension spotlessExtension = project.getExtensions().getByType(SpotlessExtension.class); - spotlessExtension.java(java -> java.addStep(PalantirJavaFormatStep.create( - project.getRootProject().getConfigurations().getByName(configurationName), - project.getRootProject().getExtensions().getByType(JavaFormatExtension.class)))); + spotlessExtension.java(java -> java.addStep(addSpotlessJavaFormatStep(project, configurationName))); + } + + static FormatterStep addSpotlessJavaFormatStep(Project project, String configurationName) { + Boolean legacyFormatter = Optional.ofNullable(project.findProperty("palantir.legacy.formatter")) + .map(value -> Boolean.getBoolean((String) value)) + .orElse(false); + if (legacyFormatter) { + return PalantirJavaFormatStep.create( + project.getRootProject().getConfigurations().getByName(configurationName), + project.getRootProject().getExtensions().getByType(JavaFormatExtension.class)); + } else { + try { + URL resourceUrl = Resources.getResource("palantir-java-format"); + return NativePalantirJavaFormatStep.create( + Path.of(resourceUrl.toURI().getPath()).toFile()); + } catch (URISyntaxException e) { + throw new RuntimeException("Palantir java format native image was not found", e); + } + } } } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java new file mode 100644 index 000000000..6b6bcf98e --- /dev/null +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java @@ -0,0 +1,62 @@ +/* + * (c) Copyright 2025 Palantir Technologies Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.palantir.javaformat.gradle.spotless; + +import com.diffplug.spotless.FileSignature; +import com.diffplug.spotless.FormatterFunc; +import com.diffplug.spotless.FormatterStep; +import com.diffplug.spotless.ProcessRunner; +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.List; + +public class NativePalantirJavaFormatStep { + + private NativePalantirJavaFormatStep() {} + + private static final String NAME = "palantir-java-format"; + + /** Creates a step which formats everything - code, import order, and unused imports. */ + public static FormatterStep create(File pathToExe) { + return FormatterStep.createLazy( + NAME, () -> new State(FileSignature.signAsList(pathToExe)), State::createFormat); + } + + static class State implements Serializable { + private static final long serialVersionUID = 1L; + + final FileSignature pathToExe; + + State(FileSignature pathToExe) { + this.pathToExe = pathToExe; + } + + String format(ProcessRunner runner, String input) throws IOException, InterruptedException { + List argumentsWithPathToExe = + List.of(pathToExe.getOnlyFile().getAbsolutePath(), "--palantir", "-i"); + return runner.exec(input.getBytes(StandardCharsets.UTF_8), argumentsWithPathToExe) + .assertExitZero(StandardCharsets.UTF_8); + } + + FormatterFunc.Closeable createFormat() { + ProcessRunner runner = new ProcessRunner(); + return FormatterFunc.Closeable.of(runner, this::format); + } + } +} From ef7b081d482707270ac0fb3595f2bbec4984ee71 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Fri, 24 Jan 2025 15:40:16 +0100 Subject: [PATCH 05/65] test? --- gradle-palantir-java-format/build.gradle | 3 +- .../PalantirJavaFormatProviderPlugin.java | 31 ++++++++++++++++--- .../javaformat/gradle/SpotlessInterop.java | 21 ++++++------- .../NativePalantirJavaFormatStep.java | 15 ++++++--- palantir-java-format/build.gradle | 22 +++++++++++++ 5 files changed, 70 insertions(+), 22 deletions(-) diff --git a/gradle-palantir-java-format/build.gradle b/gradle-palantir-java-format/build.gradle index a7b12c7ca..873f58d94 100644 --- a/gradle-palantir-java-format/build.gradle +++ b/gradle-palantir-java-format/build.gradle @@ -89,6 +89,7 @@ tasks.named("test").configure { dependsOn(writeImplClasspath) } + tasks.withType(ProcessResources.class).configureEach { from(project(':palantir-java-format').tasks.named('nativeCompile')) {} -} +} \ No newline at end of file diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java index 3fdc94d7e..42f7f82fe 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java @@ -25,6 +25,7 @@ public final class PalantirJavaFormatProviderPlugin implements Plugin { static final String CONFIGURATION_NAME = "palantirJavaFormat"; + static final String CONFIGURATION_NAME_NATIVE = "palantirJavaFormatNative"; @Override public void apply(Project rootProject) { @@ -32,7 +33,7 @@ public void apply(Project rootProject) { rootProject == rootProject.getRootProject(), "May only apply com.palantir.java-format-provider to the root project"); - Configuration configuration = rootProject.getConfigurations().create(CONFIGURATION_NAME, conf -> { + Configuration _configuration = rootProject.getConfigurations().create(CONFIGURATION_NAME, conf -> { conf.setDescription("Internal configuration for resolving the palantir-java-format implementation"); conf.setVisible(false); conf.setCanBeConsumed(false); @@ -41,13 +42,33 @@ public void apply(Project rootProject) { deps.add(rootProject .getDependencies() .create(ImmutableMap.of( - "group", "com.palantir.javaformat", - "name", "palantir-java-format", + "group", + "com.palantir.javaformat", + "name", + "palantir-java-format", "version", - JavaFormatExtension.class.getPackage().getImplementationVersion()))); + JavaFormatExtension.class.getPackage().getImplementationVersion()))); }); }); - rootProject.getExtensions().create("palantirJavaFormat", JavaFormatExtension.class, configuration); + Configuration configuration2 = rootProject.getConfigurations().create(CONFIGURATION_NAME_NATIVE, conf -> { + conf.setDescription("Internal configuration for resolving the palantir-java-format-native implementation"); + conf.setVisible(false); + conf.setCanBeConsumed(false); + + conf.defaultDependencies(deps -> { + deps.add(rootProject + .getDependencies() + .create(ImmutableMap.of( + "group", + "com.palantir.javaformat", + "name", + "palantir-java-format-native", + "version", + JavaFormatExtension.class.getPackage().getImplementationVersion()))); + }); + }); + + rootProject.getExtensions().create("palantirJavaFormat", JavaFormatExtension.class, configuration2); } } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java index bc0bab32c..4ad27baa8 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java @@ -17,21 +17,22 @@ import com.diffplug.gradle.spotless.SpotlessExtension; import com.diffplug.spotless.FormatterStep; -import com.google.common.io.Resources; import com.palantir.javaformat.gradle.spotless.NativePalantirJavaFormatStep; import com.palantir.javaformat.gradle.spotless.PalantirJavaFormatStep; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Path; import java.util.Optional; import org.gradle.api.Project; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; /** * Class that exists only to encapsulate accessing spotless classes, so that Gradle can generate a decorated class for * {@link com.palantir.javaformat.gradle.PalantirJavaFormatSpotlessPlugin} even if spotless is not on the classpath. */ final class SpotlessInterop { - private SpotlessInterop() {} + private static Logger logger = Logging.getLogger(SpotlessInterop.class); + + private SpotlessInterop() { + } static void addSpotlessJavaStep(Project project, String configurationName) { SpotlessExtension spotlessExtension = project.getExtensions().getByType(SpotlessExtension.class); @@ -43,17 +44,13 @@ static FormatterStep addSpotlessJavaFormatStep(Project project, String configura .map(value -> Boolean.getBoolean((String) value)) .orElse(false); if (legacyFormatter) { + logger.info("Using the legacy palantir-java-formatter"); return PalantirJavaFormatStep.create( project.getRootProject().getConfigurations().getByName(configurationName), project.getRootProject().getExtensions().getByType(JavaFormatExtension.class)); } else { - try { - URL resourceUrl = Resources.getResource("palantir-java-format"); - return NativePalantirJavaFormatStep.create( - Path.of(resourceUrl.toURI().getPath()).toFile()); - } catch (URISyntaxException e) { - throw new RuntimeException("Palantir java format native image was not found", e); - } + logger.info("Using the native-image palantir-java-formatter"); + return NativePalantirJavaFormatStep.create(project.getRootProject().getConfigurations().getByName("palantirJavaFormatNative")); } } } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java index 6b6bcf98e..15b4668d7 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java @@ -20,22 +20,29 @@ import com.diffplug.spotless.FormatterFunc; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.ProcessRunner; -import java.io.File; import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.util.List; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; public class NativePalantirJavaFormatStep { + private static Logger logger = Logging.getLogger(NativePalantirJavaFormatStep.class); - private NativePalantirJavaFormatStep() {} + private NativePalantirJavaFormatStep() { + } private static final String NAME = "palantir-java-format"; /** Creates a step which formats everything - code, import order, and unused imports. */ - public static FormatterStep create(File pathToExe) { + public static FormatterStep create(Configuration configuration) { return FormatterStep.createLazy( - NAME, () -> new State(FileSignature.signAsList(pathToExe)), State::createFormat); + NAME, () -> { + logger.info("files {}", configuration.getFiles()); + return new State(FileSignature.signAsSet(configuration.getArtifacts().getFiles().getFiles())); + }, State::createFormat); } static class State implements Serializable { diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index 489864976..c17f804df 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -2,6 +2,7 @@ buildscript { repositories { mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } + mavenLocal() } dependencies { classpath 'org.graalvm.buildtools:native-gradle-plugin:0.10.4' @@ -147,3 +148,24 @@ tasks.register('fatJar', Jar) { tasks.named("build") { dependsOn tasks.named("fatJar"), tasks.named("nativeCompile") } + +configurations { + nativeImage +} +def nativeImageFile = layout.buildDirectory.file('native/nativeCompile/palantir-java-format') +def nativeImageArtifact = artifacts.add('nativeImage', nativeImageFile.get().asFile) { + type = 'nativeImage' + builtBy 'nativeCompile' +} + +publishing { + publications { + nativeImage(MavenPublication) { + artifact(nativeImageArtifact) {} + artifactId = 'palantir-java-format-native' + } + } +} + + + From 25d20ea17d8bd03da5a61a85a64ef57f3222766f Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Mon, 27 Jan 2025 14:12:07 +0100 Subject: [PATCH 06/65] some nativeImage --- .../gradle/PalantirJavaFormatProviderPlugin.java | 5 ++++- .../spotless/NativePalantirJavaFormatStep.java | 15 ++++++++++----- palantir-java-format/build.gradle | 4 +++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java index 42f7f82fe..af84e6d81 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java @@ -55,6 +55,7 @@ public void apply(Project rootProject) { conf.setDescription("Internal configuration for resolving the palantir-java-format-native implementation"); conf.setVisible(false); conf.setCanBeConsumed(false); + conf.setCanBeResolved(true); conf.defaultDependencies(deps -> { deps.add(rootProject @@ -65,7 +66,9 @@ public void apply(Project rootProject) { "name", "palantir-java-format-native", "version", - JavaFormatExtension.class.getPackage().getImplementationVersion()))); + JavaFormatExtension.class.getPackage().getImplementationVersion(), + "classifier", + "nativeImage"))); }); }); diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java index 15b4668d7..1938e820d 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java @@ -24,6 +24,7 @@ import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.stream.Collectors; import org.gradle.api.artifacts.Configuration; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; @@ -31,18 +32,22 @@ public class NativePalantirJavaFormatStep { private static Logger logger = Logging.getLogger(NativePalantirJavaFormatStep.class); - private NativePalantirJavaFormatStep() { - } + private NativePalantirJavaFormatStep() {} private static final String NAME = "palantir-java-format"; /** Creates a step which formats everything - code, import order, and unused imports. */ public static FormatterStep create(Configuration configuration) { return FormatterStep.createLazy( - NAME, () -> { + NAME, + () -> { logger.info("files {}", configuration.getFiles()); - return new State(FileSignature.signAsSet(configuration.getArtifacts().getFiles().getFiles())); - }, State::createFormat); + return new State(FileSignature.signAsSet( + configuration.getResolvedConfiguration().getResolvedArtifacts().stream() + .map(artifact -> artifact.getFile()) + .collect(Collectors.toList()))); + }, + State::createFormat); } static class State implements Serializable { diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index c17f804df..f6079f9cd 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -161,7 +161,9 @@ def nativeImageArtifact = artifacts.add('nativeImage', nativeImageFile.get().asF publishing { publications { nativeImage(MavenPublication) { - artifact(nativeImageArtifact) {} + artifact(nativeImageArtifact) { + classifier="nativeImage" + } artifactId = 'palantir-java-format-native' } } From e5e8492f738f609ea2ebb7807d9655144c408540 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Mon, 27 Jan 2025 15:16:32 +0100 Subject: [PATCH 07/65] execute permissions --- .../PalantirJavaFormatProviderPlugin.java | 4 ++- .../javaformat/gradle/SpotlessInterop.java | 6 ++-- .../NativePalantirJavaFormatStep.java | 28 +++++++++++++++---- palantir-java-format/build.gradle | 1 + 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java index af84e6d81..8f69de39a 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java @@ -68,7 +68,9 @@ public void apply(Project rootProject) { "version", JavaFormatExtension.class.getPackage().getImplementationVersion(), "classifier", - "nativeImage"))); + "nativeImage", + "ext", + "sh"))); }); }); diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java index 4ad27baa8..c798f7593 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java @@ -31,8 +31,7 @@ final class SpotlessInterop { private static Logger logger = Logging.getLogger(SpotlessInterop.class); - private SpotlessInterop() { - } + private SpotlessInterop() {} static void addSpotlessJavaStep(Project project, String configurationName) { SpotlessExtension spotlessExtension = project.getExtensions().getByType(SpotlessExtension.class); @@ -50,7 +49,8 @@ static FormatterStep addSpotlessJavaFormatStep(Project project, String configura project.getRootProject().getExtensions().getByType(JavaFormatExtension.class)); } else { logger.info("Using the native-image palantir-java-formatter"); - return NativePalantirJavaFormatStep.create(project.getRootProject().getConfigurations().getByName("palantirJavaFormatNative")); + return NativePalantirJavaFormatStep.create( + project.getRootProject().getConfigurations().getByName("palantirJavaFormatNative")); } } } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java index 1938e820d..47062974d 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java @@ -23,8 +23,12 @@ import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.attribute.PosixFilePermission; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.gradle.api.artifacts.Configuration; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; @@ -41,11 +45,8 @@ public static FormatterStep create(Configuration configuration) { return FormatterStep.createLazy( NAME, () -> { - logger.info("files {}", configuration.getFiles()); - return new State(FileSignature.signAsSet( - configuration.getResolvedConfiguration().getResolvedArtifacts().stream() - .map(artifact -> artifact.getFile()) - .collect(Collectors.toList()))); + logger.info("files {}", configuration.getSingleFile()); + return new State(FileSignature.signAsSet(configuration.getSingleFile())); }, State::createFormat); } @@ -57,11 +58,26 @@ static class State implements Serializable { State(FileSignature pathToExe) { this.pathToExe = pathToExe; + try { + Set existingPermissions = + Files.getPosixFilePermissions(pathToExe.getOnlyFile().toPath()); + Files.setPosixFilePermissions( + pathToExe.getOnlyFile().toPath(), + Stream.concat( + existingPermissions.stream(), + Stream.of( + PosixFilePermission.OWNER_EXECUTE, + PosixFilePermission.GROUP_EXECUTE, + PosixFilePermission.OTHERS_EXECUTE)) + .collect(Collectors.toSet())); + } catch (IOException e) { + throw new RuntimeException("Failed to set execute permissions", e); + } } String format(ProcessRunner runner, String input) throws IOException, InterruptedException { List argumentsWithPathToExe = - List.of(pathToExe.getOnlyFile().getAbsolutePath(), "--palantir", "-i"); + List.of(pathToExe.getOnlyFile().getAbsolutePath(), "--palantir", "-"); return runner.exec(input.getBytes(StandardCharsets.UTF_8), argumentsWithPathToExe) .assertExitZero(StandardCharsets.UTF_8); } diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index f6079f9cd..187ccff89 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -163,6 +163,7 @@ publishing { nativeImage(MavenPublication) { artifact(nativeImageArtifact) { classifier="nativeImage" + extension="sh" } artifactId = 'palantir-java-format-native' } From a73f12ffbacec382ff1763ed5b8bc859a90eea82 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Mon, 27 Jan 2025 15:44:14 +0100 Subject: [PATCH 08/65] executable --- .../NativePalantirJavaFormatStep.java | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java index 47062974d..cbca0df64 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java @@ -20,10 +20,12 @@ import com.diffplug.spotless.FormatterFunc; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.ProcessRunner; +import java.io.File; import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.attribute.PosixFilePermission; import java.util.List; import java.util.Set; @@ -36,7 +38,8 @@ public class NativePalantirJavaFormatStep { private static Logger logger = Logging.getLogger(NativePalantirJavaFormatStep.class); - private NativePalantirJavaFormatStep() {} + private NativePalantirJavaFormatStep() { + } private static final String NAME = "palantir-java-format"; @@ -45,8 +48,10 @@ public static FormatterStep create(Configuration configuration) { return FormatterStep.createLazy( NAME, () -> { - logger.info("files {}", configuration.getSingleFile()); - return new State(FileSignature.signAsSet(configuration.getSingleFile())); + File execFile = configuration.getSingleFile(); + logger.info("Using native-image at {}", configuration.getSingleFile()); + makeFileExecutable(execFile.toPath()); + return new State(FileSignature.signAsSet(execFile)); }, State::createFormat); } @@ -58,21 +63,6 @@ static class State implements Serializable { State(FileSignature pathToExe) { this.pathToExe = pathToExe; - try { - Set existingPermissions = - Files.getPosixFilePermissions(pathToExe.getOnlyFile().toPath()); - Files.setPosixFilePermissions( - pathToExe.getOnlyFile().toPath(), - Stream.concat( - existingPermissions.stream(), - Stream.of( - PosixFilePermission.OWNER_EXECUTE, - PosixFilePermission.GROUP_EXECUTE, - PosixFilePermission.OTHERS_EXECUTE)) - .collect(Collectors.toSet())); - } catch (IOException e) { - throw new RuntimeException("Failed to set execute permissions", e); - } } String format(ProcessRunner runner, String input) throws IOException, InterruptedException { @@ -87,4 +77,22 @@ FormatterFunc.Closeable createFormat() { return FormatterFunc.Closeable.of(runner, this::format); } } + + private static void makeFileExecutable(Path pathToExe) { + try { + Set existingPermissions = + Files.getPosixFilePermissions(pathToExe); + Files.setPosixFilePermissions( + pathToExe, + Stream.concat( + existingPermissions.stream(), + Stream.of( + PosixFilePermission.OWNER_EXECUTE, + PosixFilePermission.GROUP_EXECUTE, + PosixFilePermission.OTHERS_EXECUTE)) + .collect(Collectors.toSet())); + } catch (IOException e) { + throw new RuntimeException("Failed to set execute permissions on native-image", e); + } + } } From 5de0181db4c5af45534ccdd22a27a9697406e04d Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Tue, 28 Jan 2025 16:17:34 +0100 Subject: [PATCH 09/65] working transforms --- .../gradle/ExecutableTransform.java | 71 +++++++++++++++++++ .../PalantirJavaFormatProviderPlugin.java | 42 ++++++----- .../javaformat/gradle/SpotlessInterop.java | 5 +- .../NativePalantirJavaFormatStep.java | 28 +------- palantir-java-format/build.gradle | 4 +- 5 files changed, 101 insertions(+), 49 deletions(-) create mode 100644 gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/ExecutableTransform.java diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/ExecutableTransform.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/ExecutableTransform.java new file mode 100644 index 000000000..fa5596177 --- /dev/null +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/ExecutableTransform.java @@ -0,0 +1,71 @@ +/* + * (c) Copyright 2025 Palantir Technologies Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.palantir.javaformat.gradle; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFilePermission; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.gradle.api.artifacts.transform.InputArtifact; +import org.gradle.api.artifacts.transform.TransformAction; +import org.gradle.api.artifacts.transform.TransformOutputs; +import org.gradle.api.artifacts.transform.TransformParameters; +import org.gradle.api.file.FileSystemLocation; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; +import org.gradle.api.provider.Provider; + +public abstract class ExecutableTransform implements TransformAction { + + private static Logger logger = Logging.getLogger(ExecutableTransform.class); + + @InputArtifact + public abstract Provider getInputArtifact(); + + @Override + public void transform(TransformOutputs outputs) { + File inputFile = getInputArtifact().get().getAsFile(); + makeFileExecutable(inputFile.toPath()); + logger.info("Output is the input file: {}", inputFile); + outputs.file(inputFile); + logger.info("Output is the input file: {}", outputs); + } + + private static void makeFileExecutable(Path pathToExe) { + try { + Set existingPermissions = Files.getPosixFilePermissions(pathToExe); + Files.setPosixFilePermissions( + pathToExe, + Stream.concat( + existingPermissions.stream(), + Stream.of( + PosixFilePermission.OWNER_EXECUTE, + PosixFilePermission.GROUP_EXECUTE, + PosixFilePermission.OTHERS_EXECUTE)) + .collect(Collectors.toSet())); + logger.info("Marking is the input file as executable: {}", pathToExe); + } catch (IOException e) { + throw new RuntimeException("Failed to set execute permissions on native-image", e); + } + } + + interface Parameters extends TransformParameters {} +} diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java index 8f69de39a..2a6592110 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java @@ -18,27 +18,33 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import java.util.Optional; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.type.ArtifactTypeDefinition; public final class PalantirJavaFormatProviderPlugin implements Plugin { static final String CONFIGURATION_NAME = "palantirJavaFormat"; - static final String CONFIGURATION_NAME_NATIVE = "palantirJavaFormatNative"; @Override public void apply(Project rootProject) { Preconditions.checkState( rootProject == rootProject.getRootProject(), "May only apply com.palantir.java-format-provider to the root project"); + Boolean legacyFormatter = Optional.ofNullable(rootProject.findProperty("palantir.legacy.formatter")) + .map(value -> Boolean.getBoolean((String) value)) + .orElse(false); - Configuration _configuration = rootProject.getConfigurations().create(CONFIGURATION_NAME, conf -> { - conf.setDescription("Internal configuration for resolving the palantir-java-format implementation"); - conf.setVisible(false); - conf.setCanBeConsumed(false); + Configuration configuration = rootProject.getConfigurations().create(CONFIGURATION_NAME); + configuration.setDescription("Internal configuration for resolving the palantir-java-format implementation"); + configuration.setVisible(false); + configuration.setCanBeConsumed(false); + configuration.setCanBeResolved(true); - conf.defaultDependencies(deps -> { + if (legacyFormatter) { + configuration.defaultDependencies(deps -> { deps.add(rootProject .getDependencies() .create(ImmutableMap.of( @@ -49,15 +55,8 @@ public void apply(Project rootProject) { "version", JavaFormatExtension.class.getPackage().getImplementationVersion()))); }); - }); - - Configuration configuration2 = rootProject.getConfigurations().create(CONFIGURATION_NAME_NATIVE, conf -> { - conf.setDescription("Internal configuration for resolving the palantir-java-format-native implementation"); - conf.setVisible(false); - conf.setCanBeConsumed(false); - conf.setCanBeResolved(true); - - conf.defaultDependencies(deps -> { + } else { + configuration.defaultDependencies(deps -> { deps.add(rootProject .getDependencies() .create(ImmutableMap.of( @@ -72,8 +71,17 @@ public void apply(Project rootProject) { "ext", "sh"))); }); - }); + configuration + .getAttributes() + .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "executable-nativeImage"); + rootProject.getDependencies().registerTransform(ExecutableTransform.class, transformSpec -> { + transformSpec.getFrom().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "sh"); + transformSpec + .getTo() + .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "executable-nativeImage"); + }); + } - rootProject.getExtensions().create("palantirJavaFormat", JavaFormatExtension.class, configuration2); + rootProject.getExtensions().create("palantirJavaFormat", JavaFormatExtension.class, configuration); } } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java index c798f7593..b2eec715a 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java @@ -31,7 +31,8 @@ final class SpotlessInterop { private static Logger logger = Logging.getLogger(SpotlessInterop.class); - private SpotlessInterop() {} + private SpotlessInterop() { + } static void addSpotlessJavaStep(Project project, String configurationName) { SpotlessExtension spotlessExtension = project.getExtensions().getByType(SpotlessExtension.class); @@ -50,7 +51,7 @@ static FormatterStep addSpotlessJavaFormatStep(Project project, String configura } else { logger.info("Using the native-image palantir-java-formatter"); return NativePalantirJavaFormatStep.create( - project.getRootProject().getConfigurations().getByName("palantirJavaFormatNative")); + project.getRootProject().getConfigurations().getByName(configurationName)); } } } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java index cbca0df64..b44dff538 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/spotless/NativePalantirJavaFormatStep.java @@ -24,13 +24,7 @@ import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.attribute.PosixFilePermission; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.gradle.api.artifacts.Configuration; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; @@ -38,8 +32,7 @@ public class NativePalantirJavaFormatStep { private static Logger logger = Logging.getLogger(NativePalantirJavaFormatStep.class); - private NativePalantirJavaFormatStep() { - } + private NativePalantirJavaFormatStep() {} private static final String NAME = "palantir-java-format"; @@ -50,7 +43,6 @@ public static FormatterStep create(Configuration configuration) { () -> { File execFile = configuration.getSingleFile(); logger.info("Using native-image at {}", configuration.getSingleFile()); - makeFileExecutable(execFile.toPath()); return new State(FileSignature.signAsSet(execFile)); }, State::createFormat); @@ -77,22 +69,4 @@ FormatterFunc.Closeable createFormat() { return FormatterFunc.Closeable.of(runner, this::format); } } - - private static void makeFileExecutable(Path pathToExe) { - try { - Set existingPermissions = - Files.getPosixFilePermissions(pathToExe); - Files.setPosixFilePermissions( - pathToExe, - Stream.concat( - existingPermissions.stream(), - Stream.of( - PosixFilePermission.OWNER_EXECUTE, - PosixFilePermission.GROUP_EXECUTE, - PosixFilePermission.OTHERS_EXECUTE)) - .collect(Collectors.toSet())); - } catch (IOException e) { - throw new RuntimeException("Failed to set execute permissions on native-image", e); - } - } } diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index 187ccff89..25ae4a1d2 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -166,9 +166,7 @@ publishing { extension="sh" } artifactId = 'palantir-java-format-native' + } } } - - - From c475f83fd94bd56ee4c4d700f69ddbf8d4b8fdaf Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 30 Jan 2025 10:10:47 +0100 Subject: [PATCH 10/65] add replacement reflect classes for native-image --- .../gradle/ConfigureJavaFormatterXml.groovy | 9 +- .../gradle/PalantirJavaFormatIdeaPlugin.java | 30 +++-- .../PalantirJavaFormatProviderPlugin.java | 85 ++++++------ .../PalantirJavaFormatSpotlessPlugin.java | 3 +- .../javaformat/gradle/SpotlessInterop.java | 10 +- .../ConfigureJavaFormatterXmlTest.groovy | 8 +- .../intellij/FormatterProvider.java | 24 +++- .../intellij/PalantirJavaFormatSettings.java | 40 +++++- .../BootstrappingFormatterService.java | 29 ++-- .../bootstrap/FormatterServiceWithArgs.java | 21 +++ .../NativeImageFormatterService.java | 127 ++++++++++++++++++ .../javaformat/bootstrap/RangeUtils.java | 36 +++++ .../META-INF/native-image/reflect-config.json | 6 + 13 files changed, 341 insertions(+), 87 deletions(-) create mode 100644 palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/FormatterServiceWithArgs.java create mode 100644 palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/NativeImageFormatterService.java create mode 100644 palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/RangeUtils.java diff --git a/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXml.groovy b/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXml.groovy index 90fe0711d..db8c15a10 100644 --- a/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXml.groovy +++ b/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXml.groovy @@ -17,7 +17,8 @@ package com.palantir.javaformat.gradle class ConfigureJavaFormatterXml { - static void configureJavaFormat(Node rootNode, List uris) { + + static void configureJavaFormat(Node rootNode, List uris, URI nativeImageUri, Boolean useLegacyUris) { def settings = matchOrCreateChild(rootNode, 'component', [name: 'PalantirJavaFormatSettings']) // enable matchOrCreateChild(settings, 'option', [name: 'enabled']).attributes().put('value', 'true') @@ -28,6 +29,12 @@ class ConfigureJavaFormatterXml { uris.forEach { URI uri -> listItems.appendNode('option', [value: uri]) } + // configure nativeImageClasspath + matchOrCreateChild(settings, 'option', [name: 'nativeImageClassPath']).attributes().put('value', nativeImageUri) + + // configure default classPath to use + String defaultClassPath = useLegacyUris ? "implementationClassPath" : "nativeImageClassPath" + matchOrCreateChild(settings, 'option', [name: 'defaultClassPath']).attributes().put('value', defaultClassPath) } static void configureExternalDependencies(Node rootNode) { diff --git a/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/PalantirJavaFormatIdeaPlugin.java b/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/PalantirJavaFormatIdeaPlugin.java index 9a78f2077..bf0e3b97e 100644 --- a/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/PalantirJavaFormatIdeaPlugin.java +++ b/gradle-palantir-java-format/src/main/groovy/com/palantir/javaformat/gradle/PalantirJavaFormatIdeaPlugin.java @@ -29,6 +29,7 @@ import java.net.URI; import java.nio.charset.Charset; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import java.util.stream.Collectors; import javax.xml.parsers.ParserConfigurationException; @@ -47,23 +48,31 @@ public void apply(Project rootProject) { "May only apply com.palantir.java-format-idea to the root project"); rootProject.getPlugins().apply(PalantirJavaFormatProviderPlugin.class); - + Boolean useLegacyFormatter = Optional.ofNullable(rootProject.findProperty("palantir.legacy.formatter")) + .map(value -> Boolean.getBoolean((String) value)) + .orElse(false); rootProject.getPluginManager().withPlugin("idea", ideaPlugin -> { Configuration implConfiguration = rootProject.getConfigurations().getByName(PalantirJavaFormatProviderPlugin.CONFIGURATION_NAME); - configureLegacyIdea(rootProject, implConfiguration); - configureIntelliJImport(rootProject, implConfiguration); + Configuration nativeImplConfiguration = rootProject + .getConfigurations() + .getByName(PalantirJavaFormatProviderPlugin.NATIVE_CONFIGURATION_NAME); + + configureLegacyIdea(rootProject, implConfiguration, nativeImplConfiguration, useLegacyFormatter); + configureIntelliJImport(rootProject, implConfiguration, nativeImplConfiguration, useLegacyFormatter); }); } - private static void configureLegacyIdea(Project project, Configuration implConfiguration) { + private static void configureLegacyIdea( + Project project, Configuration implConfiguration, Configuration nativeImplConfiguration, Boolean useLegacyFormatter) { IdeaModel ideaModel = project.getExtensions().getByType(IdeaModel.class); ideaModel.getProject().getIpr().withXml(xmlProvider -> { // this block is lazy List uris = implConfiguration.getFiles().stream().map(File::toURI).collect(Collectors.toList()); - ConfigureJavaFormatterXml.configureJavaFormat(xmlProvider.asNode(), uris); + URI nativeUri = nativeImplConfiguration.getSingleFile().toURI(); + ConfigureJavaFormatterXml.configureJavaFormat(xmlProvider.asNode(), uris, nativeUri, useLegacyFormatter); ConfigureJavaFormatterXml.configureExternalDependencies(xmlProvider.asNode()); }); @@ -72,7 +81,8 @@ private static void configureLegacyIdea(Project project, Configuration implConfi }); } - private static void configureIntelliJImport(Project project, Configuration implConfiguration) { + private static void configureIntelliJImport( + Project project, Configuration implConfiguration, Configuration nativeImplConfiguration, Boolean useLegacyFormatter) { // Note: we tried using 'org.jetbrains.gradle.plugin.idea-ext' and afterSync triggers, but these are currently // very hard to manage as the tasks feel disconnected from the Sync operation, and you can't remove them once // you've added them. For that reason, we accept that we have to resolve this configuration at @@ -84,9 +94,11 @@ private static void configureIntelliJImport(Project project, Configuration implC List uris = implConfiguration.getFiles().stream().map(File::toURI).collect(Collectors.toList()); + URI nativeImageUri = nativeImplConfiguration.getSingleFile().toURI(); + createOrUpdateIdeaXmlFile( project.file(".idea/palantir-java-format.xml"), - node -> ConfigureJavaFormatterXml.configureJavaFormat(node, uris)); + node -> ConfigureJavaFormatterXml.configureJavaFormat(node, uris, nativeImageUri, useLegacyFormatter)); createOrUpdateIdeaXmlFile( project.file(".idea/externalDependencies.xml"), node -> ConfigureJavaFormatterXml.configureExternalDependencies(node)); @@ -95,7 +107,7 @@ private static void configureIntelliJImport(Project project, Configuration implC // Still configure legacy idea if using intellij import updateIdeaXmlFileIfExists(project.file(project.getName() + ".ipr"), node -> { - ConfigureJavaFormatterXml.configureJavaFormat(node, uris); + ConfigureJavaFormatterXml.configureJavaFormat(node, uris, nativeImageUri, useLegacyFormatter); ConfigureJavaFormatterXml.configureExternalDependencies(node); }); updateIdeaXmlFileIfExists(project.file(project.getName() + ".iws"), node -> { @@ -130,7 +142,7 @@ private static void updateIdeaXmlFile(File configurationFile, Consumer con configure.accept(rootNode); try (BufferedWriter writer = Files.newWriter(configurationFile, Charset.defaultCharset()); - PrintWriter printWriter = new PrintWriter(writer)) { + PrintWriter printWriter = new PrintWriter(writer)) { XmlNodePrinter nodePrinter = new XmlNodePrinter(printWriter); nodePrinter.setPreserveWhitespace(true); nodePrinter.print(rootNode); diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java index 2a6592110..80265200b 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatProviderPlugin.java @@ -18,7 +18,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import java.util.Optional; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; @@ -28,59 +27,61 @@ public final class PalantirJavaFormatProviderPlugin implements Plugin { static final String CONFIGURATION_NAME = "palantirJavaFormat"; + static final String NATIVE_CONFIGURATION_NAME = "palantirJavaFormatNative"; + @Override public void apply(Project rootProject) { Preconditions.checkState( rootProject == rootProject.getRootProject(), "May only apply com.palantir.java-format-provider to the root project"); - Boolean legacyFormatter = Optional.ofNullable(rootProject.findProperty("palantir.legacy.formatter")) - .map(value -> Boolean.getBoolean((String) value)) - .orElse(false); + + String implementationVersion = JavaFormatExtension.class.getPackage().getImplementationVersion(); Configuration configuration = rootProject.getConfigurations().create(CONFIGURATION_NAME); configuration.setDescription("Internal configuration for resolving the palantir-java-format implementation"); configuration.setVisible(false); configuration.setCanBeConsumed(false); configuration.setCanBeResolved(true); + configuration.defaultDependencies(deps -> { + deps.add(rootProject + .getDependencies() + .create(ImmutableMap.of( + "group", + "com.palantir.javaformat", + "name", + "palantir-java-format", + "version", + implementationVersion))); + }); - if (legacyFormatter) { - configuration.defaultDependencies(deps -> { - deps.add(rootProject - .getDependencies() - .create(ImmutableMap.of( - "group", - "com.palantir.javaformat", - "name", - "palantir-java-format", - "version", - JavaFormatExtension.class.getPackage().getImplementationVersion()))); - }); - } else { - configuration.defaultDependencies(deps -> { - deps.add(rootProject - .getDependencies() - .create(ImmutableMap.of( - "group", - "com.palantir.javaformat", - "name", - "palantir-java-format-native", - "version", - JavaFormatExtension.class.getPackage().getImplementationVersion(), - "classifier", - "nativeImage", - "ext", - "sh"))); - }); - configuration - .getAttributes() - .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "executable-nativeImage"); - rootProject.getDependencies().registerTransform(ExecutableTransform.class, transformSpec -> { - transformSpec.getFrom().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "sh"); - transformSpec - .getTo() - .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "executable-nativeImage"); - }); - } + Configuration nativeConfiguration = rootProject.getConfigurations().create(NATIVE_CONFIGURATION_NAME); + nativeConfiguration.setDescription( + "Internal configuration for resolving the palantir-java-format implementation"); + nativeConfiguration.setVisible(false); + nativeConfiguration.setCanBeConsumed(false); + nativeConfiguration.setCanBeResolved(true); + nativeConfiguration.defaultDependencies(deps -> { + deps.add(rootProject + .getDependencies() + .create(ImmutableMap.of( + "group", + "com.palantir.javaformat", + "name", + "palantir-java-format-native", + "version", + implementationVersion, + "classifier", + "nativeImage", + "ext", + "sh"))); + }); + nativeConfiguration + .getAttributes() + .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "executable-nativeImage"); + rootProject.getDependencies().registerTransform(ExecutableTransform.class, transformSpec -> { + transformSpec.getFrom().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "sh"); + transformSpec.getTo().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, "executable-nativeImage"); + }); rootProject.getExtensions().create("palantirJavaFormat", JavaFormatExtension.class, configuration); } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatSpotlessPlugin.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatSpotlessPlugin.java index 03f92f69c..d091163af 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatSpotlessPlugin.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/PalantirJavaFormatSpotlessPlugin.java @@ -31,8 +31,7 @@ public void apply(Project project) { project.getPluginManager().withPlugin("java", _javaPlugin -> { SPOTLESS_PLUGINS.forEach( spotlessPluginId -> project.getPluginManager().withPlugin(spotlessPluginId, _spotlessPlugin -> { - SpotlessInterop.addSpotlessJavaStep( - project, PalantirJavaFormatProviderPlugin.CONFIGURATION_NAME); + SpotlessInterop.addSpotlessJavaStep(project); })); }); } diff --git a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java index b2eec715a..b7edebdbc 100644 --- a/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java +++ b/gradle-palantir-java-format/src/main/java/com/palantir/javaformat/gradle/SpotlessInterop.java @@ -34,24 +34,24 @@ final class SpotlessInterop { private SpotlessInterop() { } - static void addSpotlessJavaStep(Project project, String configurationName) { + static void addSpotlessJavaStep(Project project) { SpotlessExtension spotlessExtension = project.getExtensions().getByType(SpotlessExtension.class); - spotlessExtension.java(java -> java.addStep(addSpotlessJavaFormatStep(project, configurationName))); + spotlessExtension.java(java -> java.addStep(addSpotlessJavaFormatStep(project))); } - static FormatterStep addSpotlessJavaFormatStep(Project project, String configurationName) { + static FormatterStep addSpotlessJavaFormatStep(Project project) { Boolean legacyFormatter = Optional.ofNullable(project.findProperty("palantir.legacy.formatter")) .map(value -> Boolean.getBoolean((String) value)) .orElse(false); if (legacyFormatter) { logger.info("Using the legacy palantir-java-formatter"); return PalantirJavaFormatStep.create( - project.getRootProject().getConfigurations().getByName(configurationName), + project.getRootProject().getConfigurations().getByName(PalantirJavaFormatProviderPlugin.CONFIGURATION_NAME), project.getRootProject().getExtensions().getByType(JavaFormatExtension.class)); } else { logger.info("Using the native-image palantir-java-formatter"); return NativePalantirJavaFormatStep.create( - project.getRootProject().getConfigurations().getByName(configurationName)); + project.getRootProject().getConfigurations().getByName(PalantirJavaFormatProviderPlugin.NATIVE_CONFIGURATION_NAME)); } } } diff --git a/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy b/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy index 91c0faed5..11f94a90e 100644 --- a/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy +++ b/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy @@ -58,6 +58,7 @@ class ConfigureJavaFormatterXmlTest extends Specification { + +

- + @@ -18,7 +18,7 @@ - + @@ -67,6 +67,22 @@ + + + + + + + + + + + + + + + + diff --git a/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatConfigurable.java b/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatConfigurable.java index 0dd857bb9..832d23082 100644 --- a/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatConfigurable.java +++ b/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatConfigurable.java @@ -21,11 +21,7 @@ import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; -import com.intellij.uiDesigner.core.GridConstraints; -import com.intellij.uiDesigner.core.GridLayoutManager; -import com.intellij.uiDesigner.core.Spacer; import com.palantir.javaformat.intellij.PalantirJavaFormatSettings.EnabledState; -import java.awt.Insets; import javax.annotation.Nullable; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -44,6 +40,7 @@ class PalantirJavaFormatConfigurable extends BaseConfigurable implements Searcha @SuppressWarnings("for-rollout:RawTypes") private JComboBox styleComboBox; + private JLabel isUsingNativeImage; private JLabel formatterVersion; private JLabel pluginVersion; @@ -103,6 +100,7 @@ public void reset() { styleComboBox.setSelectedItem(UiFormatterStyle.convert(settings.getStyle())); pluginVersion.setText(settings.getImplementationVersion().orElse("unknown")); formatterVersion.setText(getFormatterVersionText(settings)); + isUsingNativeImage.setText(isUsingNativeImage(settings)); } @Override @@ -115,6 +113,12 @@ public boolean isModified() { @Override public void disposeUIResources() {} + private static String isUsingNativeImage(PalantirJavaFormatSettings settings) { + return settings.getUseNativeImageClassPath() + ? "Native image formatter (`palantir.native.formatter` gradle property is enabled)" + : "(Default setup) Java-based formatter"; + } + private static String getFormatterVersionText(PalantirJavaFormatSettings settings) { String suffix = settings.injectedVersionIsOutdated() ? " (using bundled)" : " (using injected)"; return settings.computeFormatterVersion().orElse("(bundled)") + suffix; @@ -123,171 +127,4 @@ private static String getFormatterVersionText(PalantirJavaFormatSettings setting private void createUIComponents() { styleComboBox = new ComboBox<>(UiFormatterStyle.values()); } - - { - // GUI initializer generated by IntelliJ IDEA GUI Designer - // >>> IMPORTANT!! <<< - // DO NOT EDIT OR ADD ANY CODE HERE! - $$$setupUI$$$(); - } - - /** - * Method generated by IntelliJ IDEA GUI Designer >>> IMPORTANT!! <<< DO NOT edit this method OR call it in your - * code! - * - * @noinspection ALL - */ - @SuppressWarnings("for-rollout:InvalidBlockTag") - private void $$$setupUI$$$() { - createUIComponents(); - panel = new JPanel(); - panel.setLayout(new GridLayoutManager(5, 2, new Insets(0, 0, 0, 0), -1, -1)); - enable = new JCheckBox(); - enable.setText("Enable palantir-java-format"); - panel.add( - enable, - new GridConstraints( - 0, - 0, - 1, - 2, - GridConstraints.ANCHOR_WEST, - GridConstraints.FILL_NONE, - GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 0, - false)); - final Spacer spacer1 = new Spacer(); - panel.add( - spacer1, - new GridConstraints( - 4, - 0, - 1, - 2, - GridConstraints.ANCHOR_CENTER, - GridConstraints.FILL_VERTICAL, - 1, - GridConstraints.SIZEPOLICY_WANT_GROW, - null, - null, - null, - 0, - false)); - final JLabel label1 = new JLabel(); - label1.setText("Code style"); - panel.add( - label1, - new GridConstraints( - 1, - 0, - 1, - 1, - GridConstraints.ANCHOR_WEST, - GridConstraints.FILL_NONE, - GridConstraints.SIZEPOLICY_FIXED, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 0, - false)); - panel.add( - styleComboBox, - new GridConstraints( - 1, - 1, - 1, - 1, - GridConstraints.ANCHOR_WEST, - GridConstraints.FILL_HORIZONTAL, - GridConstraints.SIZEPOLICY_CAN_GROW, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 1, - false)); - final JLabel label2 = new JLabel(); - label2.setText("Implementation version"); - panel.add( - label2, - new GridConstraints( - 3, - 0, - 1, - 1, - GridConstraints.ANCHOR_WEST, - GridConstraints.FILL_NONE, - GridConstraints.SIZEPOLICY_FIXED, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 0, - false)); - formatterVersion = new JLabel(); - formatterVersion.setText("what version are we running with?"); - panel.add( - formatterVersion, - new GridConstraints( - 3, - 1, - 1, - 1, - GridConstraints.ANCHOR_CENTER, - GridConstraints.FILL_HORIZONTAL, - GridConstraints.SIZEPOLICY_CAN_GROW, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 1, - false)); - final JLabel label3 = new JLabel(); - label3.setText("Plugin version"); - panel.add( - label3, - new GridConstraints( - 2, - 0, - 1, - 1, - GridConstraints.ANCHOR_WEST, - GridConstraints.FILL_NONE, - GridConstraints.SIZEPOLICY_FIXED, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 0, - false)); - pluginVersion = new JLabel(); - pluginVersion.setText("plugin version"); - panel.add( - pluginVersion, - new GridConstraints( - 2, - 1, - 1, - 1, - GridConstraints.ANCHOR_WEST, - GridConstraints.FILL_NONE, - GridConstraints.SIZEPOLICY_FIXED, - GridConstraints.SIZEPOLICY_FIXED, - null, - null, - null, - 1, - false)); - } - - /** @noinspection ALL */ - @SuppressWarnings({"for-rollout:InvalidBlockTag", "for-rollout:MissingSummary"}) - public JComponent $$$getRootComponent$$$() { - return panel; - } } diff --git a/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatSettings.java b/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatSettings.java index 820ea59ee..634389f9e 100644 --- a/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatSettings.java +++ b/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatSettings.java @@ -101,8 +101,8 @@ Optional getNativeImageClassPath() { /** * Whether to use the legacy implementation(getImplementationClassPath) or the new implementation(getNativeImageClassPath) */ - Boolean getUseLegacyClassPath() { - return state.useLegacyClassPath; + Boolean getUseNativeImageClassPath() { + return state.useNativeImageClassPath; } boolean injectedVersionIsOutdated() { @@ -154,7 +154,7 @@ static class State { private EnabledState enabled = EnabledState.UNKNOWN; private Optional> implementationClassPath = Optional.empty(); private Optional nativeImageClassPath = Optional.empty(); - private Boolean useLegacyClassPath = false; + private Boolean useNativeImageClassPath = false; public JavaFormatterOptions.Style style = JavaFormatterOptions.Style.PALANTIR; @@ -178,12 +178,12 @@ public String getNativeImageClassPath() { return nativeImageClassPath.map(URI::toString).orElse(null); } - public void setUseLegacyClassPath(@Nullable String value) { - useLegacyClassPath = Boolean.parseBoolean(value); + public void setUseNativeImageClassPath(@Nullable String value) { + useNativeImageClassPath = Boolean.parseBoolean(value); } - public String getUseLegacyClassPath() { - return useLegacyClassPath.toString(); + public String getUseNativeImageClassPath() { + return useNativeImageClassPath.toString(); } // enabled used to be a boolean so we use bean property methods for backwards compatibility @@ -218,8 +218,8 @@ public String toString() { + implementationClassPath + ", nativeImageClassPath=" + nativeImageClassPath - + ", useLegacyClassPath=" - + useLegacyClassPath + + ", useNativeImageClassPath=" + + useNativeImageClassPath + ", style=" + style + '}'; diff --git a/palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/NativeImageFormatterService.java b/palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/NativeImageFormatterService.java index 93840beb4..368cd9baa 100644 --- a/palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/NativeImageFormatterService.java +++ b/palantir-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/NativeImageFormatterService.java @@ -58,7 +58,7 @@ public ImmutableList getFormatReplacements(String input, Collection } return MAPPER.readValue(output.get(), new TypeReference<>() {}); } catch (IOException e) { - throw new RuntimeException("Error running formatter command", e); + throw new RuntimeException("Error running the native image command", e); } } @@ -67,7 +67,7 @@ public String formatSourceReflowStringsAndFixImports(String input) { try { return runFormatterCommand(input); } catch (IOException e) { - throw new RuntimeException("Error running formatter command", e); + throw new RuntimeException("Error running the native image command", e); } } @@ -76,7 +76,7 @@ public String fixImports(String input) { try { return runFormatterCommand(input); } catch (IOException e) { - throw new RuntimeException("Error running formatter command", e); + throw new RuntimeException("Error running the native image command", e); } } From 2b0d8f9d0086c1298f6181e7861db39a9d56b3ad Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Mon, 3 Feb 2025 16:58:14 +0100 Subject: [PATCH 20/65] fix tests --- .../gradle/ConfigureJavaFormatterXmlTest.groovy | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy b/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy index 11f94a90e..567253549 100644 --- a/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy +++ b/gradle-palantir-java-format/src/test/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.groovy @@ -59,6 +59,7 @@ class ConfigureJavaFormatterXmlTest extends Specification {