aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-13 20:35:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-13 20:35:55 +0100
commitf2ab791334abe75807c4bff32b17fa379b466193 (patch)
tree243648c20fc20044fff8129a3ea272d8a9fe80a5 /src/main/java
parent6366198588909777722d4834085ebdf9838f5828 (diff)
Put namespace name onto namespace nodes
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ShedCompiler.java4
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java8
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java5
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java1
-rw-r--r--src/main/java/org/shedlang/compiler/types/NamespaceName.java5
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);