aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/ShedCompiler.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-21 11:08:36 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-21 11:08:36 +0100
commitbb7d77def0e86732c440125467b1ffc1648e06bc (patch)
tree9864794831fd72fb0a911260ca566b6d88078ddb /src/main/java/org/shedlang/compiler/ShedCompiler.java
parent9dd1074673930b760e74415e9c9dbacf759b90e2 (diff)
Extract function to parse source files
Diffstat (limited to 'src/main/java/org/shedlang/compiler/ShedCompiler.java')
-rw-r--r--src/main/java/org/shedlang/compiler/ShedCompiler.java28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java
index 7b96a524..02aaf05b 100644
--- a/src/main/java/org/shedlang/compiler/ShedCompiler.java
+++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java
@@ -1,5 +1,6 @@
package org.shedlang.compiler;
+import org.shedlang.compiler.ast.untyped.UntypedNamespaceNode;
import org.shedlang.compiler.backends.Backend;
import org.shedlang.compiler.config.ProjectConfig;
import org.shedlang.compiler.parser.Parser;
@@ -36,6 +37,8 @@ public class ShedCompiler {
var sourceFilePaths = collectSourceFilePaths(sourceRoot);
+ var untypedNamespaceNodes = parseSource(sourceRoot, sourceFilePaths);
+
var namespaces = new ArrayList<StackIrNamespace>();
var typeCheckerContext = TypeCheckerContext.EMPTY
@@ -52,6 +55,23 @@ public class ShedCompiler {
Map.entry(ShedBuiltins.PRINT_NAME, ShedBuiltins.PRINT_TYPE)
));
+ for (var untypedNamespaceNode : untypedNamespaceNodes) {
+ var typeCheckNamespaceResult = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext);
+ typeCheckerContext = typeCheckNamespaceResult.context();
+
+ var stackIrNamespace = StackCompiler.compileNamespace(typeCheckNamespaceResult.value());
+ namespaces.add(stackIrNamespace);
+ }
+
+ backend.compile(config, namespaces, typeCheckerContext.toTypeInfos(), config.targetDir().resolve(backend.name()));
+ }
+
+ private List<UntypedNamespaceNode> parseSource(
+ Path sourceRoot,
+ List<Path> sourceFilePaths
+ ) throws IOException {
+ var untypedNamespaceNodes = new ArrayList<UntypedNamespaceNode>();
+
for (var sourceFilePath : sourceFilePaths) {
var namespaceNameParts = StreamSupport.stream(sourceRoot.relativize(sourceFilePath).spliterator(), false)
.map(element -> {
@@ -67,14 +87,10 @@ public class ShedCompiler {
var tokens = tokenise(source);
var untypedNode = Parser.parseNamespace(tokens, namespaceName);
- var typeCheckNamespaceResult = TypeChecker.typeCheckNamespace(untypedNode, typeCheckerContext);
- typeCheckerContext = typeCheckNamespaceResult.context();
-
- var stackIrNamespace = StackCompiler.compileNamespace(typeCheckNamespaceResult.value());
- namespaces.add(stackIrNamespace);
+ untypedNamespaceNodes.add(untypedNode);
}
- backend.compile(config, namespaces, typeCheckerContext.toTypeInfos(), config.targetDir().resolve(backend.name()));
+ return untypedNamespaceNodes;
}
private List<Path> collectSourceFilePaths(Path sourceRoot) throws IOException {