Skip to content

Commit 460a9e7

Browse files
committed
Make CollectorMutability an error
The ten Collectors.toList() calls are now Stream.toList(), as CLAUDE.md asks of new code, and StringWrapper's Collectors.toMap is toUnmodifiableMap. Nothing changed any of these collections after they were built, and none holds a null, so only their mutability differs: the lists go to command lines, records and assertions, and the map is only read. The previous commit's test round-trips the IntelliJ settings' classpath, the one list that goes through a serializer.
1 parent 26e9358 commit 460a9e7

13 files changed

Lines changed: 32 additions & 17 deletions

File tree

‎build.gradle‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ subprojects {
8383
// Java toolchains, javac and test settings; Error Prone. Both in buildSrc/src/main/groovy.
8484
apply plugin: 'open-java-format.java-conventions'
8585
apply plugin: 'open-java-format.error-prone-conventions'
86+
apply plugin: 'open-java-format.forbidden-apis-conventions'
8687

8788
dependencies {
8889
// Gives a version to the JUnit artifacts that useJUnitJupiter() adds without one.

‎buildSrc/build.gradle‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ repositories {
1313
dependencies {
1414
implementation 'net.ltgt.gradle:gradle-errorprone-plugin:5.1.1'
1515
implementation 'net.ltgt.gradle:gradle-nullaway-plugin:3.3.0'
16+
implementation 'de.thetaphi:forbiddenapis:3.11'
1617
implementation 'org.jreleaser:org.jreleaser.gradle.plugin:1.26.0'
1718
}

‎buildSrc/src/main/groovy/open-java-format.error-prone-conventions.gradle‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ tasks.withType(JavaCompile).configureEach {
2626
handleTestAssertionLibraries = true
2727
}
2828
error('CanonicalAnnotationSyntax')
29+
error('CollectorMutability')
2930
error('DirectReturn')
3031
error('FormatStringConcatenation')
3132
error('JUnitClassModifiers')
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Bans Guava's immutable collections in favour of java.util ones; the list is config/forbidden-apis.
2+
plugins {
3+
id 'java'
4+
id 'de.thetaphi.forbiddenapis'
5+
}
6+
7+
forbiddenApis {
8+
signaturesFiles = files(rootProject.file('config/forbidden-apis/guava-immutables.txt'))
9+
ignoreFailures = true
10+
}
11+
12+
tasks.withType(de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis).configureEach {
13+
ignoreFailures = true
14+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@defaultMessage Use java.util collections: List.of, List.copyOf, Map.of, Stream.toList()
2+
com.google.common.collect.ImmutableList
3+
com.google.common.collect.ImmutableMap
4+
com.google.common.collect.ImmutableSet

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import java.util.List;
3535
import java.util.Locale;
3636
import java.util.concurrent.TimeUnit;
37-
import java.util.stream.Collectors;
3837
import java.util.stream.Stream;
3938
import org.junit.jupiter.api.Test;
4039
import org.junit.jupiter.api.io.TempDir;
@@ -58,7 +57,7 @@ void parsing_git_diff_output_works() throws IOException {
5857

5958
List<String> strings = FormatDiff.parseGitDiffOutput(example1)
6059
.map(FormatDiff.SingleFileDiff::toString)
61-
.collect(Collectors.toList());
60+
.toList();
6261
assertThat(strings)
6362
.containsExactly(
6463
"SingleFileDiff{path=build.gradle, lineRanges=[[24..25), [29..30)]}",
@@ -121,7 +120,7 @@ private static List<Path> getClasspath() throws IOException {
121120
.omitEmptyStrings()
122121
.splitToStream(Files.readString(CLASSPATH_FILE.toPath()))
123122
.map(Path::of)
124-
.collect(Collectors.toList());
123+
.toList();
125124
}
126125

127126
private static Path javaBinPath() {

‎open-java-format-idea-plugin/src/main/java/com/palantir/javaformat/intellij/FormatterProvider.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import java.util.NoSuchElementException;
3737
import java.util.Optional;
3838
import java.util.function.Supplier;
39-
import java.util.stream.Collectors;
4039
import java.util.stream.Stream;
4140

4241
import static java.util.Optional.ofNullable;
@@ -92,7 +91,7 @@ private static Optional<FormatterService> createFormatter(FormatterCacheKey cach
9291
}
9392

9493
private static List<Path> getProvidedImplementationUrls(List<URI> implementationClasspath) {
95-
return implementationClasspath.stream().map(Path::of).collect(Collectors.toList());
94+
return implementationClasspath.stream().map(Path::of).toList();
9695
}
9796

9897
private static List<Path> getBundledImplementationUrls() {
@@ -127,7 +126,7 @@ private static List<Path> getImplementationUrls(
127126

128127
private static List<Path> listDirAsUrlsUnchecked(Path dir) {
129128
try (Stream<Path> list = Files.list(dir)) {
130-
return list.collect(Collectors.toList());
129+
return list.toList();
131130
} catch (IOException e) {
132131
throw new UncheckedIOException("Couldn't list dir: " + dir, e);
133132
}

‎open-java-format-idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatSettings.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import java.util.List;
3333
import java.util.Optional;
3434
import java.util.jar.JarFile;
35-
import java.util.stream.Collectors;
3635
import java.util.stream.Stream;
3736

3837
import static java.util.Optional.ofNullable;
@@ -158,13 +157,13 @@ static class StoredSettings {
158157

159158
public void setImplementationClassPath(@Nullable List<String> value) {
160159
implementationClassPath = Optional.ofNullable(value)
161-
.map(strings -> strings.stream().map(URI::create).collect(Collectors.toList()));
160+
.map(strings -> strings.stream().map(URI::create).toList());
162161
}
163162

164163
@Nullable
165164
public List<String> getImplementationClassPath() {
166165
return implementationClassPath
167-
.map(paths -> paths.stream().map(URI::toString).collect(Collectors.toList()))
166+
.map(paths -> paths.stream().map(URI::toString).toList())
168167
.orElse(null);
169168
}
170169

‎open-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/BootstrappingFormatterService.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ private ImmutableList<Replacement> getFormatReplacementsInternal(String input, C
8484
jvmArgsForVersion(jdkMajorVersion),
8585
implementationClassPath,
8686
/* outputReplacements= */ true,
87-
ranges.stream().map(RangeUtils::toStringRange).collect(Collectors.toList()));
87+
ranges.stream().map(RangeUtils::toStringRange).toList());
8888

8989
Optional<String> output =
9090
FormatterCommandRunner.runWithStdin(command.toArgs(), input, Optional.ofNullable(jdkPath.getParent()));

‎open-java-format-jdk-bootstrap/src/main/java/com/palantir/javaformat/bootstrap/NativeImageFormatterService.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.util.Collection;
3232
import java.util.List;
3333
import java.util.Optional;
34-
import java.util.stream.Collectors;
3534

3635
public class NativeImageFormatterService implements FormatterService {
3736
private static final ObjectMapper MAPPER =
@@ -49,7 +48,7 @@ public ImmutableList<Replacement> getFormatReplacements(String input, Collection
4948
FormatterNativeImageArgs command = new FormatterNativeImageArgs(
5049
nativeImagePath,
5150
/* outputReplacements= */ true,
52-
ranges.stream().map(RangeUtils::toStringRange).collect(Collectors.toList()));
51+
ranges.stream().map(RangeUtils::toStringRange).toList());
5352

5453
output = FormatterCommandRunner.runWithStdin(
5554
command.toArgs(), input, Optional.ofNullable(nativeImagePath.getParent()));

0 commit comments

Comments
 (0)