aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-21 11:20:50 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-21 11:20:50 +0100
commit2d5e084fed84813d7300d46263ca9b5e50b38916 (patch)
tree08271c1200f8b47d0b1a7df80a3dc2b4520a6475 /src/main/java
parent3b15ac23fad859b1ad25a57c006095b4911742e6 (diff)
Order namespaces
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ShedCompiler.java41
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;
+ }
}