From a48b9d12118e650c1edac765ba1fb0f9d1ea10c8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 15 Jul 2016 23:30:01 +0100 Subject: Use different temp prefix for switch desugarring --- .../couscous/backends/python/PythonCodeGenerator.java | 3 +-- .../org/zwobble/couscous/frontends/java/Scope.java | 19 ++++++++++++++++--- .../org/zwobble/couscous/interpreter/JavaProject.java | 3 +-- .../couscous/transforms/DesugarSwitchToIfElse.java | 3 ++- 4 files changed, 20 insertions(+), 8 deletions(-) (limited to 'src/main') 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 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 variablesByKey; private final Set identifiers; private final Identifier identifier; + private final String temporaryPrefix; private final Iterator temporaryCounter; private Scope( Map variablesByKey, Set identifiers, Identifier identifier, + String temporaryPrefix, Iterator 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 classNodes) { - NodeTransformer transformer = DesugarSwitchToIfElse.transformer(Scope.create()); + NodeTransformer transformer = DesugarSwitchToIfElse.transformer(); Iterable 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) { -- cgit v1.2.3