From 317f6fa18dfb5dd0020a086d2815c538fcb558ff Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Oct 2023 13:44:25 +0100 Subject: Generate stack IR for imports --- .../compiler/ast/typed/TypedImportNode.java | 3 ++ .../compiler/ast/typed/TypedNamespaceNode.java | 51 ++++++++++++++++++++++ .../shedlang/compiler/stackir/StackCompiler.java | 18 +++++++- 3 files changed, 70 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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 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 imports, + PVector body, + PVector boundVariableNames, + PVector 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; -- cgit v1.2.3