diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java | 40 |
1 files changed, 35 insertions, 5 deletions
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 bccd4a8..fa44676 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java @@ -1,25 +1,55 @@ package org.zwobble.couscous.frontends.java; +import com.google.common.collect.Multimaps; +import org.zwobble.couscous.Frontend; +import org.zwobble.couscous.ast.ClassNode; +import org.zwobble.couscous.ast.Node; +import org.zwobble.couscous.ast.VariableDeclaration; +import org.zwobble.couscous.ast.VariableNode; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; -import org.zwobble.couscous.Frontend; -import org.zwobble.couscous.ast.ClassNode; -import org.zwobble.couscous.util.ExtraLists; +import static org.zwobble.couscous.ast.structure.NodeStructure.descendantNodesAndSelf; +import static org.zwobble.couscous.util.Casts.tryCast; +import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; +import static org.zwobble.couscous.util.ExtraLists.flatMap; +import static org.zwobble.couscous.util.ExtraStreams.toStream; public class JavaFrontend implements Frontend { @Override public List<ClassNode> readSourceDirectory(Path directoryPath) throws IOException { - return ExtraLists.flatMap( + List<ClassNode> classNodes = flatMap( findJavaFiles(directoryPath), javaFile -> JavaReader.readClassFromFile(directoryPath, javaFile)); + //ensureDeclarationsAreUnique(classNodes); + return classNodes; } - + private Stream<Path> findJavaFiles(Path directoryPath) throws IOException { return Files.walk(directoryPath) .filter(path -> path.toFile().isFile() && path.toString().endsWith(".java")); } + + private void ensureDeclarationsAreUnique(List<ClassNode> classNodes) { + List<VariableDeclaration> declarations = eagerFlatMap(classNodes, this::findDeclarations); + Multimaps.index(declarations, declaration -> declaration.getId()) + .asMap() + .forEach((id, declarationsWithId) -> { + if (declarationsWithId.size() > 1) { + throw new RuntimeException("Declaration " + id + " is declared more than once"); + } + }); + } + + private List<VariableDeclaration> findDeclarations(Node root) { + return descendantNodesAndSelf(root) + .flatMap(node -> toStream(tryCast(VariableNode.class, node) + .map(VariableNode::getDeclaration))) + .collect(Collectors.toList()); + } }
\ No newline at end of file |
