diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-21 11:20:50 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-21 11:20:50 +0100 |
| commit | 2d5e084fed84813d7300d46263ca9b5e50b38916 (patch) | |
| tree | 08271c1200f8b47d0b1a7df80a3dc2b4520a6475 /src/main/java | |
| parent | 3b15ac23fad859b1ad25a57c006095b4911742e6 (diff) | |
Order namespaces
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ShedCompiler.java | 41 |
1 files changed, 36 insertions, 5 deletions
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<UntypedNamespaceNode> orderSourceFiles( + List<UntypedNamespaceNode> untypedNamespaceNodes + ) { + var nodesByName = untypedNamespaceNodes.stream() + .collect(Collectors.toMap(x -> x.namespaceName(), x -> x)); + + var seen = new HashSet<NamespaceName>(); + var ordered = new ArrayList<UntypedNamespaceNode>(); + + // 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; + } } |
