aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-21 13:44:25 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-21 13:44:25 +0100
commit317f6fa18dfb5dd0020a086d2815c538fcb558ff (patch)
tree8b6907bfccf8866a3b2f7987aa05b72ce56ffda8 /src/main/java
parent2759cad35ee775aa655f06598172603797571a9e (diff)
Generate stack IR for imports
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedImportNode.java3
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java51
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java18
3 files changed, 70 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedImportNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedImportNode.java
index e9932300..77a290ba 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedImportNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedImportNode.java
@@ -7,4 +7,7 @@ public record TypedImportNode(
NamespaceName namespaceName,
Source source
) implements TypedNode {
+ public String variableName() {
+ return namespaceName.parts().getLast();
+ }
}
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 26da9e61..abc325ce 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedNamespaceNode.java
@@ -1,7 +1,10 @@
package org.shedlang.compiler.ast.typed;
+import org.pcollections.PVector;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.util.P;
import java.util.List;
@@ -13,4 +16,52 @@ public record TypedNamespaceNode(
List<String> fieldNames,
Source source
) implements TypedNode {
+ public static Builder builder() {
+ return new Builder(
+ NamespaceName.of("Default", "Namespace"),
+ P.vector(),
+ P.vector(),
+ P.vector(),
+ P.vector()
+ );
+ }
+
+ public record Builder(
+ NamespaceName namespaceName,
+ PVector<TypedImportNode> imports,
+ PVector<TypedNamespaceStatementNode> body,
+ PVector<String> boundVariableNames,
+ PVector<String> fieldNames
+ ) {
+ public TypedNamespaceNode build() {
+ return new TypedNamespaceNode(
+ namespaceName,
+ imports,
+ body,
+ boundVariableNames,
+ fieldNames,
+ Sources.NULL
+ );
+ }
+
+ public Builder addImport(TypedImportNode import_) {
+ return new Builder(
+ this.namespaceName,
+ this.imports.plus(import_),
+ this.body,
+ this.boundVariableNames,
+ this.fieldNames
+ );
+ }
+
+ public Builder addBoundVariableName(String variableName) {
+ return new Builder(
+ this.namespaceName,
+ this.imports,
+ this.body,
+ this.boundVariableNames.plus(variableName),
+ this.fieldNames
+ );
+ }
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index 5746fa34..7a9fc502 100644
--- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
+++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
@@ -246,7 +246,7 @@ public class StackCompiler {
context = context.addInstruction(new ReturnInstruction(node.source()));
return context;
}
-
+
public static Context compileFunctionStatement(
TypedFunctionStatementNode node,
Context context
@@ -257,7 +257,7 @@ public class StackCompiler {
case TypedBlockReturnNode blockReturn ->
compileBlockReturn(blockReturn, context);
-
+
case TypedExpressionStatementNode expressionStatement ->
compileExpressionStatement(expressionStatement, context);
@@ -342,6 +342,20 @@ public class StackCompiler {
context = context.addShedVariable(boundVariableName);
}
+ for (var importNode : node.imports()) {
+ var localName = context.shedVariableToLocal(importNode.variableName());
+ context = context
+ .addInstruction(new NamespaceImportInstruction(
+ importNode.namespaceName(),
+ importNode.source()
+ ))
+ .addInstruction(new LocalStoreInstruction(
+ localName,
+ importNode.source()
+ ));
+
+ }
+
var statementsAfterHoisting = Iterables.sortedBy(node.body(), statement -> switch (statement) {
case TypedAssignNode assign ->
1;