From 39a0bc654e643f2a4c16699e2329f42e38d0f46a Mon Sep 17 00:00:00 2001 From: Ashley Scopes <73482956+ascopes@users.noreply.github.com> Date: Wed, 25 Jan 2023 08:30:36 +0000 Subject: [PATCH] Make container groups list collections rather than iterables. --- .../impl/JctCompilationFactoryImpl.java | 9 +++---- .../jct/containers/PackageContainerGroup.java | 6 ++--- .../impl/AbstractPackageContainerGroup.java | 10 +++++--- .../jct/filemanagers/JctFileManager.java | 25 +++++++++++++++++++ .../filemanagers/impl/JctFileManagerImpl.java | 13 ++++------ 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/java-compiler-testing/src/main/java/io/github/ascopes/jct/compilers/impl/JctCompilationFactoryImpl.java b/java-compiler-testing/src/main/java/io/github/ascopes/jct/compilers/impl/JctCompilationFactoryImpl.java index dac04c435..80d829cc5 100644 --- a/java-compiler-testing/src/main/java/io/github/ascopes/jct/compilers/impl/JctCompilationFactoryImpl.java +++ b/java-compiler-testing/src/main/java/io/github/ascopes/jct/compilers/impl/JctCompilationFactoryImpl.java @@ -30,7 +30,7 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Collection; -import java.util.LinkedHashSet; +import java.util.HashSet; import java.util.List; import java.util.Set; import javax.annotation.Nullable; @@ -158,13 +158,10 @@ private Set findCompilationUnits(JctFileManager fileManager) thr ); } - var objects = new LinkedHashSet(); + var objects = new HashSet(); for (var location : locations) { - var items = fileManager.list(location, "", Set.of(Kind.SOURCE), true); - for (var fileObject : items) { - objects.add(fileObject); - } + objects.addAll(fileManager.list(location, "", Set.of(Kind.SOURCE), true)); } if (objects.isEmpty()) { diff --git a/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/PackageContainerGroup.java b/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/PackageContainerGroup.java index f177910f1..84810bbae 100644 --- a/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/PackageContainerGroup.java +++ b/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/PackageContainerGroup.java @@ -193,13 +193,11 @@ public interface PackageContainerGroup extends ContainerGroup { * @param kinds the kinds of file to look for. * @param recurse {@code true} to recurse subpackages, {@code false} to only consider the * given package. - * @param collection the collection to fill. * @throws IOException if the file lookup fails due to an IO exception. */ - void listFileObjects( + Set listFileObjects( String packageName, Set kinds, - boolean recurse, - Collection collection + boolean recurse ) throws IOException; } diff --git a/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/impl/AbstractPackageContainerGroup.java b/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/impl/AbstractPackageContainerGroup.java index a70d31b10..ce37b2d52 100644 --- a/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/impl/AbstractPackageContainerGroup.java +++ b/java-compiler-testing/src/main/java/io/github/ascopes/jct/containers/impl/AbstractPackageContainerGroup.java @@ -28,7 +28,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; @@ -259,15 +259,17 @@ public boolean isEmpty() { } @Override - public void listFileObjects( + public Set listFileObjects( String packageName, Set kinds, - boolean recurse, - Collection collection + boolean recurse ) throws IOException { + // XXX: could this be run in parallel? + var collection = new HashSet(); for (var container : containers) { container.listFileObjects(packageName, kinds, recurse, collection); } + return collection; } /** diff --git a/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/JctFileManager.java b/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/JctFileManager.java index 788001d75..0c355d72f 100644 --- a/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/JctFileManager.java +++ b/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/JctFileManager.java @@ -19,10 +19,14 @@ import io.github.ascopes.jct.containers.OutputContainerGroup; import io.github.ascopes.jct.containers.PackageContainerGroup; import io.github.ascopes.jct.workspaces.PathRoot; +import java.io.IOException; import java.util.Collection; +import java.util.Set; import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.JavaFileObject.Kind; import org.apiguardian.api.API; import org.apiguardian.api.API.Status; @@ -120,4 +124,25 @@ public interface JctFileManager extends JavaFileManager { * @return the output container impl. */ Collection getOutputContainerGroups(); + + /** + * List all file objects in the given location matching the given criteria. + * + * @param location the location to search in. + * @param packageName the package name to search in, or {@code ""} to search in the root + * location. + * @param kinds the kinds of file to return, or + * {@link Set#of} {@code (} {@link Kind#OTHER} {@code )} to find all files. + * @param recurse {@code true} to recurse into subpackages, {@code false} to only check the + * current package. + * @return a collection of unique file objects that were found. + * @throws IOException if an IO error occurs reading the file system. + */ + @Override + Set list( + Location location, + String packageName, + Set kinds, + boolean recurse + ) throws IOException; } diff --git a/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/impl/JctFileManagerImpl.java b/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/impl/JctFileManagerImpl.java index 1a1a56ad9..5931e9f9e 100644 --- a/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/impl/JctFileManagerImpl.java +++ b/java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/impl/JctFileManagerImpl.java @@ -34,6 +34,7 @@ import java.lang.module.ModuleFinder; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -440,7 +441,7 @@ public int isSupportedOption(String option) { } @Override - public Iterable list( + public Set list( Location location, String packageName, Set kinds, @@ -449,13 +450,9 @@ public Iterable list( var group = getExistingPackageOrientedOrOutputGroup(location); - if (group == null) { - return List.of(); - } - - var files = new ArrayList(); - group.listFileObjects(packageName, kinds, recurse, files); - return files; + return group == null + ? Set.of() + : group.listFileObjects(packageName, kinds, recurse); } @Override