From f2ab791334abe75807c4bff32b17fa379b466193 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 13 Jun 2023 20:35:55 +0100 Subject: Put namespace name onto namespace nodes --- src/main/java/org/shedlang/compiler/ShedCompiler.java | 4 ++-- .../java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java | 2 ++ .../org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java | 2 ++ src/main/java/org/shedlang/compiler/parser/Parser.java | 8 ++++++-- src/main/java/org/shedlang/compiler/stackir/StackCompiler.java | 5 ++--- src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 1 + src/main/java/org/shedlang/compiler/types/NamespaceName.java | 5 +++++ 7 files changed, 20 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java index 932ca148..dd553f45 100644 --- a/src/main/java/org/shedlang/compiler/ShedCompiler.java +++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java @@ -50,7 +50,7 @@ public class ShedCompiler { var tokens = tokenise(source); - var untypedNode = Parser.parseNamespace(tokens); + var untypedNode = Parser.parseNamespace(tokens, namespaceName); var context = TypeCheckerContext.EMPTY .enter(P.map( @@ -65,7 +65,7 @@ public class ShedCompiler { )); var typedNode = TypeChecker.typeCheckNamespace(untypedNode, context); - var instructions = StackCompiler.compileNamespace(typedNode, namespaceName); + var instructions = StackCompiler.compileNamespace(typedNode); namespaces.put(namespaceName, instructions); } diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java index 50964784..d03b5ff5 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java @@ -1,10 +1,12 @@ package org.shedlang.compiler.ast.typed; import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.types.NamespaceName; import java.util.List; public record TypedNamespaceNode( + NamespaceName namespaceName, List body, Source source ) implements TypedNode { diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java index 2386ff57..8b3e175b 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java @@ -1,10 +1,12 @@ package org.shedlang.compiler.ast.untyped; import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.types.NamespaceName; import java.util.List; public record UntypedNamespaceNode( + NamespaceName namespaceName, List body, Source source ) implements UntypedNode { diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 0f79cc28..8b180044 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -4,6 +4,7 @@ import org.shedlang.compiler.ast.untyped.*; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.tokeniser.TokenIterator; import org.shedlang.compiler.tokeniser.UnexpectedTokenException; +import org.shedlang.compiler.types.NamespaceName; import java.util.ArrayList; import java.util.List; @@ -240,7 +241,10 @@ public class Parser { return new UntypedTypeLevelReferenceNode(name, source); } - public static UntypedNamespaceNode parseNamespace(TokenIterator tokens) { + public static UntypedNamespaceNode parseNamespace( + TokenIterator tokens, + NamespaceName namespaceName + ) { var start = tokens.position(); var body = parseMany( @@ -252,7 +256,7 @@ public class Parser { var end = tokens.position(); var source = start.to(end); - return new UntypedNamespaceNode(body, source); + return new UntypedNamespaceNode(namespaceName, body, source); } private static UntypedExpressionNode parseReference(TokenIterator tokens) { diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index c579ac69..8e66db30 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -3,7 +3,6 @@ package org.shedlang.compiler.stackir; import org.pcollections.PVector; import org.shedlang.compiler.ast.typed.*; import org.shedlang.compiler.stackir.instructions.*; -import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.util.P; import java.util.stream.Collectors; @@ -103,7 +102,7 @@ public class StackCompiler { return P.vector(new PushIntInstruction(node.value(), node.source())); } - public static PVector compileNamespace(TypedNamespaceNode node, NamespaceName namespaceName) { + public static PVector compileNamespace(TypedNamespaceNode node) { var instructions = node.body().stream() .map(statement -> compileNamespaceStatement(statement)) .reduce(P.vector(), PVector::plusAll); @@ -115,7 +114,7 @@ public class StackCompiler { instructions = instructions .plus(new LocalLoadInstruction(functionDefinition.name(), functionDefinition.source())) .plus(new NamespaceFieldStoreInstruction( - namespaceName, + node.namespaceName(), functionDefinition.name(), functionDefinition.source() )); diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index db922eb5..4e89e97f 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -254,6 +254,7 @@ public class TypeChecker { TypeCheckerContext context ) { return new TypedNamespaceNode( + untyped.namespaceName(), untyped.body().stream() .map(statement -> typeCheckNamespaceStatement(statement, context)) .toList(), diff --git a/src/main/java/org/shedlang/compiler/types/NamespaceName.java b/src/main/java/org/shedlang/compiler/types/NamespaceName.java index a064d699..b0d45000 100644 --- a/src/main/java/org/shedlang/compiler/types/NamespaceName.java +++ b/src/main/java/org/shedlang/compiler/types/NamespaceName.java @@ -1,8 +1,13 @@ package org.shedlang.compiler.types; +import java.util.Arrays; import java.util.List; public record NamespaceName(List parts) { + public static NamespaceName of(String... parts) { + return new NamespaceName(Arrays.asList(parts)); + } + @Override public String toString() { return String.join("/", parts); -- cgit v1.2.3