diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-13 20:35:55 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-13 20:35:55 +0100 |
| commit | f2ab791334abe75807c4bff32b17fa379b466193 (patch) | |
| tree | 243648c20fc20044fff8129a3ea272d8a9fe80a5 /src/main/java | |
| parent | 6366198588909777722d4834085ebdf9838f5828 (diff) | |
Put namespace name onto namespace nodes
Diffstat (limited to 'src/main/java')
7 files changed, 20 insertions, 7 deletions
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<TypedNamespaceStatementNode> 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<UntypedNamespaceStatementNode> 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<TokenType> tokens) { + public static UntypedNamespaceNode parseNamespace( + TokenIterator<TokenType> 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<TokenType> 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<Instruction> compileNamespace(TypedNamespaceNode node, NamespaceName namespaceName) { + public static PVector<Instruction> 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<String> parts) { + public static NamespaceName of(String... parts) { + return new NamespaceName(Arrays.asList(parts)); + } + @Override public String toString() { return String.join("/", parts); |
