aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java3
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/Scope.java19
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/JavaProject.java3
-rw-r--r--src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java3
4 files changed, 20 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index 6ce96ba..84ffdbd 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -10,7 +10,6 @@ import org.zwobble.couscous.ast.visitors.DynamicNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.backends.naming.Names;
import org.zwobble.couscous.backends.python.ast.*;
-import org.zwobble.couscous.frontends.java.Scope;
import org.zwobble.couscous.transforms.DesugarSwitchToIfElse;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
@@ -60,7 +59,7 @@ import static org.zwobble.couscous.util.ExtraLists.*;
public class PythonCodeGenerator {
public static PythonModuleNode generateCode(TypeNode sugaredTypeNode) {
- NodeTransformer switchTransformer = DesugarSwitchToIfElse.transformer(Scope.create());
+ NodeTransformer switchTransformer = DesugarSwitchToIfElse.transformer();
TypeNode typeNode = switchTransformer.transformTypeDeclaration(sugaredTypeNode);
Iterator<PythonImportNode> imports = generateImports(typeNode).iterator();
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/Scope.java b/src/main/java/org/zwobble/couscous/frontends/java/Scope.java
index ee8be5f..d4af1f5 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/Scope.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/Scope.java
@@ -10,23 +10,32 @@ import java.util.*;
public class Scope {
public static Scope create() {
- return new Scope(new HashMap<>(), new HashSet<>(), Identifier.TOP, NaturalNumbers.INSTANCE.iterator());
+ return new Scope(
+ new HashMap<>(),
+ new HashSet<>(),
+ Identifier.TOP,
+ "_couscous_tmp_",
+ NaturalNumbers.INSTANCE.iterator()
+ );
}
private final Map<String, VariableDeclaration> variablesByKey;
private final Set<Identifier> identifiers;
private final Identifier identifier;
+ private final String temporaryPrefix;
private final Iterator<Integer> temporaryCounter;
private Scope(
Map<String, VariableDeclaration> variablesByKey,
Set<Identifier> identifiers,
Identifier identifier,
+ String temporaryPrefix,
Iterator<Integer> temporaryCounter)
{
this.variablesByKey = variablesByKey;
this.identifiers = identifiers;
this.identifier = identifier;
+ this.temporaryPrefix = temporaryPrefix;
this.temporaryCounter = temporaryCounter;
}
@@ -34,6 +43,10 @@ public class Scope {
return identifier;
}
+ public Scope temporaryPrefix(String temporaryPrefix) {
+ return new Scope(variablesByKey, identifiers, identifier, temporaryPrefix, temporaryCounter);
+ }
+
public Scope enterClass(ScalarType className) {
return enter(identifier.type(className.getQualifiedName()));
}
@@ -48,7 +61,7 @@ public class Scope {
}
private Scope enter(Identifier newIdentifier) {
- return new Scope(variablesByKey, identifiers, newIdentifier, temporaryCounter);
+ return new Scope(variablesByKey, identifiers, newIdentifier, temporaryPrefix, temporaryCounter);
}
public FormalArgumentNode formalArgument(String name, Type type) {
@@ -85,7 +98,7 @@ public class Scope {
}
public LocalVariableDeclarationNode temporaryVariable(Type type, ExpressionNode initialValue) {
- return localVariable("_couscous_tmp_" + temporaryCounter.next(), type, initialValue);
+ return localVariable(temporaryPrefix + temporaryCounter.next(), type, initialValue);
}
public ExpressionNode reference(String key) {
diff --git a/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java b/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java
index 88c29a6..7b5a0bc 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java
@@ -3,7 +3,6 @@ package org.zwobble.couscous.interpreter;
import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.TypeNode;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
-import org.zwobble.couscous.frontends.java.Scope;
import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.interpreter.types.UserDefinedInterpreterType;
@@ -25,7 +24,7 @@ public class JavaProject {
}
public static Project of(List<TypeNode> classNodes) {
- NodeTransformer transformer = DesugarSwitchToIfElse.transformer(Scope.create());
+ NodeTransformer transformer = DesugarSwitchToIfElse.transformer();
Iterable<InterpreterType> concreteTypes = Iterables.transform(
classNodes,
classNode -> new UserDefinedInterpreterType(transformer.transformTypeDeclaration(classNode))
diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java b/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java
index 810178b..5ecd25d 100644
--- a/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java
+++ b/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java
@@ -28,7 +28,8 @@ import static org.zwobble.couscous.util.UpToAndIncludingIterable.upToAndIncludin
public class DesugarSwitchToIfElse {
// TODO: ensure globally unique IDs, and locally unique variable names
- public static NodeTransformer transformer(Scope scope) {
+ public static NodeTransformer transformer() {
+ Scope scope = Scope.create().temporaryPrefix("_couscous_desugar_switch_to_if");
return NodeTransformer.builder()
.transformStatement(statement -> {
if (statement.type() == NodeTypes.SWITCH) {