Skip to content

Commit 44e282b

Browse files
authored
Merge pull request #197 from openjavaformat/abashev/Idea-plugin-doesn-t-work-with-native-binary
Run the native formatter in the IntelliJ plugin for any project
2 parents 3cebe5b + ddb2008 commit 44e282b

26 files changed

Lines changed: 1866 additions & 421 deletions

‎gradle-open-java-format/build.gradle‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ tasks.named("test").configure {
162162
// `native` CI jobs, which pass it. Keep this list in sync with the test classes that
163163
// read build/nativeImage.path.
164164
exclude '**/PalantirJavaFormatPluginTest.class'
165-
exclude '**/PalantirJavaFormatIdeaPluginTest.class'
166165
exclude '**/PalantirJavaFormatSpotlessPluginTest.class'
167166
exclude '**/FormatDiffTest.class'
168167
}

‎gradle-open-java-format/src/main/groovy/com/palantir/javaformat/gradle/ConfigureJavaFormatterXml.groovy‎

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import java.lang.module.ModuleDescriptor
2020

2121
class ConfigureJavaFormatterXml {
2222

23-
static void configureJavaFormat(Node rootNode, List<URI> uris, Optional<URI> nativeImageUri) {
23+
static void configureJavaFormat(Node rootNode, List<URI> uris) {
2424
def settings = matchOrCreateChild(rootNode, 'component', [name: 'PalantirJavaFormatSettings'])
2525
// enable
2626
matchOrCreateChild(settings, 'option', [name: 'enabled']).attributes().put('value', 'true')
@@ -31,12 +31,9 @@ class ConfigureJavaFormatterXml {
3131
uris.forEach { URI uri ->
3232
listItems.appendNode('option', [value: uri])
3333
}
34-
// configure nativeImageClasspath
35-
nativeImageUri.ifPresentOrElse({ URI uri ->
36-
matchOrCreateChild(settings, 'option', [name: 'nativeImageClassPath']).attributes().put('value', uri)
37-
}, {
38-
matchChild(settings, 'option', [name: 'nativeImageClassPath']).ifPresent { it.parent().remove(it) }
39-
})
34+
// Earlier versions wrote the native binary for openjavaformat.native.formatter=true. The IDE plugin has a
35+
// setting of its own for that now, useNativeImage, which is left alone, and no longer reads this option.
36+
matchChild(settings, 'option', [name: 'nativeImageClassPath']).ifPresent { it.parent().remove(it) }
4037
}
4138

4239
static void configureWorkspaceXml(Node rootNode) {

‎gradle-open-java-format/src/main/groovy/com/palantir/javaformat/gradle/FileUtils.java‎

Lines changed: 0 additions & 55 deletions
This file was deleted.

‎gradle-open-java-format/src/main/groovy/com/palantir/javaformat/gradle/NativeImageAtomicCopy.java‎

Lines changed: 0 additions & 78 deletions
This file was deleted.

‎gradle-open-java-format/src/main/groovy/com/palantir/javaformat/gradle/PalantirJavaFormatIdeaPlugin.java‎

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,14 @@
1818

1919
import com.google.common.base.Preconditions;
2020
import com.google.common.collect.ImmutableList;
21-
import java.nio.file.Paths;
22-
import java.util.Optional;
2321
import java.util.stream.Stream;
24-
import javax.inject.Inject;
2522
import org.gradle.StartParameter;
2623
import org.gradle.api.Plugin;
2724
import org.gradle.api.Project;
28-
import org.gradle.api.artifacts.Configuration;
29-
import org.gradle.api.artifacts.ConfigurationContainer;
30-
import org.gradle.api.tasks.Nested;
3125
import org.gradle.api.tasks.TaskProvider;
3226

3327
public abstract class PalantirJavaFormatIdeaPlugin implements Plugin<Project> {
3428

35-
@Nested
36-
protected abstract NativeImageSupport getNativeImageSupport();
37-
38-
@Inject
39-
protected abstract ConfigurationContainer getConfigurations();
40-
4129
private static final String MIN_IDEA_PLUGIN_VERSION = "2.57.0";
4230

4331
@Override
@@ -51,26 +39,13 @@ public void apply(Project rootProject) {
5139
TaskProvider<UpdatePalantirJavaFormatIdeaXmlFile> updateOpenJavaFormatXml = rootProject
5240
.getTasks()
5341
.register("updateOpenJavaFormatXml", UpdatePalantirJavaFormatIdeaXmlFile.class, task -> {
42+
// The formatter's classpath only. Whether the IDE runs the native binary is a setting of the
43+
// IDE plugin, for any project: openjavaformat.native.formatter is about this build alone.
5444
task.getXmlOutputFile().set(rootProject.file(".idea/open-java-format.xml"));
5545
task.getImplementationConfig()
5646
.from(rootProject
5747
.getConfigurations()
5848
.getByName(PalantirJavaFormatProviderPlugin.CONFIGURATION_NAME));
59-
maybeGetNativeImplConfiguration().ifPresent(config -> {
60-
task.getNativeImageConfig().from(config);
61-
task.getNativeImageOutputFile()
62-
.fileProvider(rootProject.provider(() -> rootProject
63-
.getGradle()
64-
.getGradleUserHomeDir()
65-
.toPath()
66-
.resolve("open-java-format-caches/")
67-
.resolve(Paths.get(task.getNativeImageConfig()
68-
.getSingleFile()
69-
.toURI())
70-
.getFileName()
71-
.toString())
72-
.toFile()));
73-
});
7449
});
7550

7651
TaskProvider<UpdateWorkspaceXmlFile> updateWorkspaceXml = rootProject
@@ -108,10 +83,4 @@ private static void runWithEveryBuild(Project rootProject, TaskProvider<?>... ta
10883
.addAll(Stream.of(tasks).map(task -> ":" + task.getName()).toList())
10984
.build());
11085
}
111-
112-
private Optional<Configuration> maybeGetNativeImplConfiguration() {
113-
return getNativeImageSupport().isNativeImageConfigured()
114-
? Optional.of(getConfigurations().getByName(NativeImageFormatProviderPlugin.NATIVE_CONFIGURATION_NAME))
115-
: Optional.empty();
116-
}
11786
}

‎gradle-open-java-format/src/main/groovy/com/palantir/javaformat/gradle/UpdatePalantirJavaFormatIdeaXmlFile.java‎

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,13 @@
1818

1919
import java.io.File;
2020
import java.net.URI;
21-
import java.nio.file.Paths;
2221
import java.util.List;
23-
import java.util.Optional;
2422
import org.gradle.api.DefaultTask;
2523
import org.gradle.api.file.ConfigurableFileCollection;
2624
import org.gradle.api.file.RegularFileProperty;
2725
import org.gradle.api.tasks.Classpath;
2826
import org.gradle.api.tasks.InputFiles;
2927
import org.gradle.api.tasks.OutputFile;
30-
import org.gradle.api.tasks.PathSensitive;
31-
import org.gradle.api.tasks.PathSensitivity;
3228
import org.gradle.api.tasks.TaskAction;
3329
import org.gradle.work.DisableCachingByDefault;
3430

@@ -39,31 +35,16 @@ public abstract class UpdatePalantirJavaFormatIdeaXmlFile extends DefaultTask {
3935
@Classpath
4036
public abstract ConfigurableFileCollection getImplementationConfig();
4137

42-
@org.gradle.api.tasks.Optional
43-
@InputFiles
44-
@PathSensitive(PathSensitivity.NAME_ONLY)
45-
public abstract ConfigurableFileCollection getNativeImageConfig();
46-
4738
@org.gradle.api.tasks.Optional
4839
@OutputFile
4940
public abstract RegularFileProperty getXmlOutputFile();
5041

51-
@org.gradle.api.tasks.Optional
52-
@OutputFile
53-
public abstract RegularFileProperty getNativeImageOutputFile();
54-
5542
@TaskAction
5643
public final void updateXml() {
5744
List<URI> uris =
5845
getImplementationConfig().getFiles().stream().map(File::toURI).toList();
59-
Optional<URI> nativeUri = getNativeImageConfig().getFiles().stream()
60-
.findFirst()
61-
.map(File::toURI)
62-
.map(uri -> NativeImageAtomicCopy.copyToCacheDir(
63-
Paths.get(uri),
64-
getNativeImageOutputFile().getAsFile().get().toPath()));
6546
XmlUtils.updateIdeaXmlFile(
6647
getXmlOutputFile().getAsFile().get(),
67-
node -> ConfigureJavaFormatterXml.configureJavaFormat(node, uris, nativeUri));
48+
node -> ConfigureJavaFormatterXml.configureJavaFormat(node, uris));
6849
}
6950
}

‎gradle-open-java-format/src/test/java/com/palantir/javaformat/gradle/ConfigureJavaFormatterXmlTest.java‎

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import java.io.StringWriter;
2626
import java.net.URI;
2727
import java.util.List;
28-
import java.util.Optional;
2928
import java.util.stream.Stream;
3029
import org.intellij.lang.annotations.Language;
3130
import org.junit.jupiter.api.Test;
@@ -68,22 +67,6 @@ final class ConfigureJavaFormatterXmlTest {
6867

6968
@Language("xml")
7069
private static final String EXPECTED = """
71-
<root>
72-
<component name="PalantirJavaFormatSettings">
73-
<option name="enabled" value="true"/>
74-
<option name="implementationClassPath">
75-
<list>
76-
<option value="foo"/>
77-
<option value="bar"/>
78-
</list>
79-
</option>
80-
<option name="nativeImageClassPath" value="nativeFoo"/>
81-
</component>
82-
</root>
83-
""";
84-
85-
@Language("xml")
86-
private static final String EXPECTED_WITHOUT_NATIVE = """
8770
<root>
8871
<component name="PalantirJavaFormatSettings">
8972
<option name="enabled" value="true"/>
@@ -105,8 +88,7 @@ static Stream<String> actionsOnSave() {
10588
void configure_missingEntireBlock_added() {
10689
Node node = parseXml(MISSING_ENTIRE_BLOCK);
10790

108-
ConfigureJavaFormatterXml.configureJavaFormat(
109-
node, List.of(URI.create("foo"), URI.create("bar")), Optional.of(URI.create("nativeFoo")));
91+
ConfigureJavaFormatterXml.configureJavaFormat(node, List.of(URI.create("foo"), URI.create("bar")));
11092

11193
assertThat(xmlToString(node)).isEqualTo(EXPECTED);
11294
}
@@ -115,8 +97,7 @@ void configure_missingEntireBlock_added() {
11597
void configure_missingClassPath_added() {
11698
Node node = parseXml(MISSING_CLASS_PATH);
11799

118-
ConfigureJavaFormatterXml.configureJavaFormat(
119-
node, List.of(URI.create("foo"), URI.create("bar")), Optional.of(URI.create("nativeFoo")));
100+
ConfigureJavaFormatterXml.configureJavaFormat(node, List.of(URI.create("foo"), URI.create("bar")));
120101

121102
String expected = """
122103
<root>
@@ -129,7 +110,6 @@ void configure_missingClassPath_added() {
129110
<option value="bar"/>
130111
</list>
131112
</option>
132-
<option name="nativeImageClassPath" value="nativeFoo"/>
133113
</component>
134114
</root>
135115
""";
@@ -138,23 +118,32 @@ void configure_missingClassPath_added() {
138118
}
139119

140120
@Test
141-
void configure_existingClassPath_modified() {
121+
void configure_existingClassPath_modified_andTheNativeImageOfEarlierVersionsRemoved() {
122+
// Up to 21.0.1 the plugin wrote nativeImageClassPath for openjavaformat.native.formatter=true. The IDE plugin
123+
// switches the native binary on by a setting of its own now, and no longer reads it.
142124
Node node = parseXml(EXISTING_CLASS_PATH);
143125

144-
ConfigureJavaFormatterXml.configureJavaFormat(
145-
node, List.of(URI.create("foo"), URI.create("bar")), Optional.of(URI.create("nativeFoo")));
126+
ConfigureJavaFormatterXml.configureJavaFormat(node, List.of(URI.create("foo"), URI.create("bar")));
146127

147128
assertThat(xmlToString(node)).isEqualTo(EXPECTED);
148129
}
149130

150131
@Test
151-
void configure_noNativeImageClassPath_removal() {
152-
Node node = parseXml(EXISTING_CLASS_PATH);
132+
void configure_leavesTheIdePluginsNativeBinarySettingsAlone() {
133+
Node node = parseXml("""
134+
<root>
135+
<component name="PalantirJavaFormatSettings">
136+
<option name="useNativeImage" value="true"/>
137+
<option name="nativeImagePath" value="/opt/open-java-format"/>
138+
</component>
139+
</root>
140+
""");
153141

154-
ConfigureJavaFormatterXml.configureJavaFormat(
155-
node, List.of(URI.create("foo"), URI.create("bar")), Optional.empty());
142+
ConfigureJavaFormatterXml.configureJavaFormat(node, List.of(URI.create("foo")));
156143

157-
assertThat(xmlToString(node)).isEqualTo(EXPECTED_WITHOUT_NATIVE);
144+
assertThat(xmlToString(node))
145+
.contains("<option name=\"useNativeImage\" value=\"true\"/>")
146+
.contains("<option name=\"nativeImagePath\" value=\"/opt/open-java-format\"/>");
158147
}
159148

160149
@ParameterizedTest

0 commit comments

Comments
 (0)