From 53c06909bec4b7c3bfb399b5823b356bd5e6b19b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Apr 2016 15:21:39 +0100 Subject: Allow richer description of file list --- .../org/zwobble/couscous/CouscousCompiler.java | 3 +- .../java/org/zwobble/couscous/cli/CouscousCli.java | 7 +-- .../couscous/frontends/java/JavaFrontend.java | 18 +----- .../couscous/frontends/java/JavaReader.java | 6 +- .../java/org/zwobble/couscous/util/FileSet.java | 70 ++++++++++++++++++++++ .../couscous/tests/JavaToInterpreterTests.java | 3 +- 6 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/util/FileSet.java (limited to 'src') diff --git a/src/main/java/org/zwobble/couscous/CouscousCompiler.java b/src/main/java/org/zwobble/couscous/CouscousCompiler.java index 714ac66..7e6b5d8 100644 --- a/src/main/java/org/zwobble/couscous/CouscousCompiler.java +++ b/src/main/java/org/zwobble/couscous/CouscousCompiler.java @@ -2,6 +2,7 @@ package org.zwobble.couscous; import org.zwobble.couscous.ast.TypeNode; import org.zwobble.couscous.frontends.java.JavaFrontend; +import org.zwobble.couscous.util.FileSet; import java.io.IOException; import java.nio.file.Path; @@ -19,7 +20,7 @@ public class CouscousCompiler { } public void compileDirectory(List sourcePaths, Path path) throws IOException { - List classes = frontend.readSourceDirectory(sourcePaths, list(path)); + List classes = frontend.readSourceDirectory(sourcePaths, FileSet.globs(list(path.toString()))); backend.compile(classes); } diff --git a/src/main/java/org/zwobble/couscous/cli/CouscousCli.java b/src/main/java/org/zwobble/couscous/cli/CouscousCli.java index f363384..693b062 100644 --- a/src/main/java/org/zwobble/couscous/cli/CouscousCli.java +++ b/src/main/java/org/zwobble/couscous/cli/CouscousCli.java @@ -3,12 +3,12 @@ package org.zwobble.couscous.cli; import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; -import org.apache.commons.cli.*; import org.zwobble.couscous.Backend; import org.zwobble.couscous.ast.TypeNode; import org.zwobble.couscous.backends.csharp.CsharpBackend; import org.zwobble.couscous.backends.python.PythonBackend; import org.zwobble.couscous.frontends.java.JavaFrontend; +import org.zwobble.couscous.util.FileSet; import java.io.FileReader; import java.io.IOException; @@ -16,8 +16,7 @@ import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.List; -import static java.util.Arrays.asList; -import static org.zwobble.couscous.util.ExtraLists.*; +import static org.zwobble.couscous.util.ExtraLists.eagerMap; public class CouscousCli { public static final String FILES = "files"; @@ -42,7 +41,7 @@ public class CouscousCli { try { List classNodes = frontend.readSourceDirectory( paths(sourcePaths), - paths(files)); + FileSet.globs(files)); backend.compile(classNodes); } catch (IOException exception) { throw new RuntimeException(exception); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java index b633093..651c820 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java @@ -5,38 +5,26 @@ import org.zwobble.couscous.ast.Node; import org.zwobble.couscous.ast.TypeNode; import org.zwobble.couscous.ast.VariableDeclaration; import org.zwobble.couscous.ast.VariableNode; +import org.zwobble.couscous.util.FileSet; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.stream.Collectors; import static org.zwobble.couscous.ast.structure.NodeStructure.descendantNodesAndSelf; import static org.zwobble.couscous.util.Casts.tryCast; -import static org.zwobble.couscous.util.ExtraIterables.iterable; import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; import static org.zwobble.couscous.util.ExtraStreams.toStream; public class JavaFrontend { - public List readSourceDirectory(List sourcePaths, List sourceFiles) throws IOException { - List expandedSourceFiles = eagerFlatMap(sourceFiles, this::findJavaFiles); + public List readSourceDirectory(List sourcePaths, FileSet sourceFiles) throws IOException { + List expandedSourceFiles = sourceFiles.filter(path -> path.toString().endsWith(".java")).files(); List classNodes = JavaReader.readClassesFromFiles(sourcePaths, expandedSourceFiles); ensureDeclarationsAreUnique(classNodes); return classNodes; } - private Iterable findJavaFiles(Path directoryPath) { - return iterable(() -> { - try { - return Files.walk(directoryPath) - .filter(path -> path.toFile().isFile() && path.toString().endsWith(".java")); - } catch (IOException exception) { - throw new RuntimeException(exception); - } - }); - } - private void ensureDeclarationsAreUnique(List classNodes) { List declarations = eagerFlatMap(classNodes, this::findDeclarations); Multimaps.index(declarations, VariableDeclaration::getId) diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 82d9d78..d4366c2 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -59,7 +59,11 @@ public class JavaReader { if (!errors.isEmpty()) { throw new RuntimeException("Errors during parsing:\n\n" + describe(errors)); } - reader.readCompilationUnit(ast); + try { + reader.readCompilationUnit(ast); + } catch (Exception exception) { + throw new RuntimeException("Error reading " + sourceFile, exception); + } } return reader.types(); } diff --git a/src/main/java/org/zwobble/couscous/util/FileSet.java b/src/main/java/org/zwobble/couscous/util/FileSet.java new file mode 100644 index 0000000..c64c1e8 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/util/FileSet.java @@ -0,0 +1,70 @@ +package org.zwobble.couscous.util; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.zwobble.couscous.util.ExtraIterables.iterable; +import static org.zwobble.couscous.util.ExtraLists.*; + +public class FileSet { + public static FileSet globs(List files) { + return new FileSet(() -> { + Set paths = new HashSet<>(); + + for (String file : files) { + if (file.startsWith("!")) { + walkFiles(path(file.substring(1))).forEach(paths::remove); + } else { + walkFiles(path(file)).forEach(paths::add); + } + } + + return paths.stream() + .sorted() + .iterator(); + }, list()); + } + + private static Iterable walkFiles(Path root) { + return iterable(() -> { + try { + return Files.walk(root) + .filter(path -> path.toFile().isFile()); + } catch (IOException exception) { + throw new RuntimeException(exception); + } + }); + } + + private static Path path(String output) { + return FileSystems.getDefault().getPath(output); + } + + public static FileSet directory(Path path) { + return new FileSet(walkFiles(path), list()); + } + + private final Iterable files; + private final List> filters; + + private FileSet(Iterable files, List> filters) { + this.files = files; + this.filters = filters; + } + + public FileSet filter(Predicate predicate) { + return new FileSet(files, cons(predicate, filters)); + } + + public List files() { + return eagerFilter(files, file -> Iterables.all(filters, filter -> filter.apply(file))); + } +} diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java index 77a7305..2c8a1e6 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java @@ -9,6 +9,7 @@ import org.zwobble.couscous.interpreter.Project; import org.zwobble.couscous.interpreter.values.InterpreterValue; import org.zwobble.couscous.interpreter.values.InterpreterValues; import org.zwobble.couscous.types.ScalarType; +import org.zwobble.couscous.util.FileSet; import org.zwobble.couscous.values.PrimitiveValue; import java.io.IOException; @@ -28,7 +29,7 @@ public class JavaToInterpreterTests extends CompilerTests { ScalarType returnType ) throws IOException, InterruptedException { JavaFrontend frontend = new JavaFrontend(); - List classNodes = frontend.readSourceDirectory(list(directory), list(directory)); + List classNodes = frontend.readSourceDirectory(list(directory), FileSet.directory(directory)); Project project = JavaProject.of(classNodes); Interpreter interpreter = new Interpreter(project); -- cgit v1.2.3