diff options
Diffstat (limited to 'src/main/java/org/shedlang/compiler/ShedCompiler.java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ShedCompiler.java | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java index 6f252776..ebf97bdc 100644 --- a/src/main/java/org/shedlang/compiler/ShedCompiler.java +++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java @@ -36,6 +36,18 @@ public class ShedCompiler { var namespaces = new LinkedHashMap<NamespaceName, List<Instruction>>(); + var typeCheckerContext = TypeCheckerContext.EMPTY + .enter(P.map( + Map.entry("Io", Types.effectType(Effects.IO)), + Map.entry("Unit", Types.metaType(Types.UNIT)), + + Map.entry("print", new FunctionType( + List.of(Types.STRING), + List.of(), + Types.UNIT + )) + )); + for (var sourceFilePath : sourceFilePaths) { var namespaceNameParts = StreamSupport.stream(sourceRoot.relativize(sourceFilePath).spliterator(), false) .map(element -> { @@ -51,25 +63,14 @@ public class ShedCompiler { var tokens = tokenise(source); var untypedNode = Parser.parseNamespace(tokens, namespaceName); + var typeCheckNamespaceResult = TypeChecker.typeCheckNamespace(untypedNode, typeCheckerContext); + typeCheckerContext = typeCheckNamespaceResult.context(); - var context = TypeCheckerContext.EMPTY - .enter(P.map( - Map.entry("Io", Types.effectType(Effects.IO)), - Map.entry("Unit", Types.metaType(Types.UNIT)), - - Map.entry("print", new FunctionType( - List.of(Types.STRING), - List.of(), - Types.UNIT - )) - )); - var typedNode = TypeChecker.typeCheckNamespace(untypedNode, context); - - var instructions = StackCompiler.compileNamespace(typedNode.value()); + var instructions = StackCompiler.compileNamespace(typeCheckNamespaceResult.value()); namespaces.put(namespaceName, instructions); } - backend.compile(config, namespaces); + backend.compile(config, namespaces, typeCheckerContext.toTypeInfo()); } private List<Path> collectSourceFilePaths(Path sourceRoot) throws IOException { |
