From 2d5e084fed84813d7300d46263ca9b5e50b38916 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Oct 2023 11:20:50 +0100 Subject: Order namespaces --- .../java/org/shedlang/compiler/ShedCompiler.java | 41 +++++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java index 6d917f1d..02ec0e28 100644 --- a/src/main/java/org/shedlang/compiler/ShedCompiler.java +++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java @@ -21,10 +21,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import java.util.stream.StreamSupport; import static org.shedlang.compiler.parser.Tokeniser.tokenise; @@ -55,7 +53,7 @@ public class ShedCompiler { Map.entry(ShedBuiltins.PRINT_NAME, ShedBuiltins.PRINT_TYPE) )); - for (var untypedNamespaceNode : untypedNamespaceNodes) { + for (var untypedNamespaceNode : orderSourceFiles(untypedNamespaceNodes)) { var typeCheckNamespaceResult = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext); typeCheckerContext = typeCheckNamespaceResult.context(); @@ -118,4 +116,37 @@ public class ShedCompiler { return untypedNamespaceNodes; } + + private List orderSourceFiles( + List untypedNamespaceNodes + ) { + var nodesByName = untypedNamespaceNodes.stream() + .collect(Collectors.toMap(x -> x.namespaceName(), x -> x)); + + var seen = new HashSet(); + var ordered = new ArrayList(); + + // TODO: test this! + // TODO: handle infinite loops + // TODO: handle missing namespaces + + var adder = new Object() { + private void add(NamespaceName name) { + if (!seen.contains(name)) { + var untypedNamespaceNode = nodesByName.get(name); + for (var import_ : untypedNamespaceNode.imports()) { + add(import_.namespaceName()); + } + seen.add(name); + ordered.add(untypedNamespaceNode); + } + } + }; + + for (var untypedNamespaceNode : untypedNamespaceNodes) { + adder.add(untypedNamespaceNode.namespaceName()); + } + + return ordered; + } } -- cgit v1.2.3