From 2d86046067a1db8d6eac019088f511fc192b660c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 20 Dec 2023 18:44:59 +0000 Subject: Extract and test namespace linearisation --- .../java/org/shedlang/compiler/ShedCompiler.java | 44 ++++------------------ 1 file changed, 7 insertions(+), 37 deletions(-) (limited to 'src/main/java/org/shedlang/compiler/ShedCompiler.java') diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java index 8c2407d6..177f6fd5 100644 --- a/src/main/java/org/shedlang/compiler/ShedCompiler.java +++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java @@ -6,9 +6,9 @@ import org.shedlang.compiler.backends.paths.TargetDir; import org.shedlang.compiler.config.ConfigChecker; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.parser.Parser; -import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.shid.ShidCodeGen; import org.shedlang.compiler.shid.ShidNamespace; +import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.typechecker.TypeChecker; import org.shedlang.compiler.typechecker.TypeCheckerContext; import org.shedlang.compiler.types.*; @@ -21,11 +21,14 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import java.util.stream.StreamSupport; import static org.shedlang.compiler.parser.Tokeniser.tokenise; +import static org.shedlang.compiler.typechecker.NamespaceDependencyLineariser.orderNamespaces; public class ShedCompiler { public void compile(Path projectRoot, Backend backend) throws IOException, InterruptedException { @@ -56,7 +59,7 @@ public class ShedCompiler { Map.entry(ShedBuiltins.PRINT_NAME, ShedBuiltins.PRINT_TYPE) )); - for (var untypedNamespaceNode : orderSourceFiles(untypedNamespaceNodes)) { + for (var untypedNamespaceNode : orderNamespaces(untypedNamespaceNodes)) { var typeCheckNamespaceResult = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext); typeCheckerContext = typeCheckNamespaceResult.context(); @@ -128,37 +131,4 @@ 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