aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-13 20:41:06 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-13 20:41:06 +0000
commit6b3248373262ca30fff70728e24852bde8131042 (patch)
treeb5b96b583fbb5e4ec2fa771502328e6cc7a75d9f
parent6150fa0b469e54b7a211d0a4e585d3e37794df23 (diff)
Generate unique names for temporary variables
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/Scope.java31
-rw-r--r--src/main/java/org/zwobble/couscous/util/NaturalNumbers.java24
2 files changed, 44 insertions, 11 deletions
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 de0a7b6..1ca8599 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/Scope.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/Scope.java
@@ -2,38 +2,47 @@ package org.zwobble.couscous.frontends.java;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.identifiers.Identifier;
+import org.zwobble.couscous.util.NaturalNumbers;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
public class Scope {
public static Scope create() {
- return new Scope(new HashMap<>(), new HashSet<>(), Identifier.TOP);
+ return new Scope(new HashMap<>(), new HashSet<>(), Identifier.TOP, NaturalNumbers.INSTANCE.iterator());
}
private final Map<String, VariableDeclaration> variablesByKey;
private final Set<Identifier> identifiers;
private final Identifier identifier;
-
- private Scope(Map<String, VariableDeclaration> variablesByKey, Set<Identifier> identifiers, Identifier identifier) {
+ private final Iterator<Integer> temporaryCounter;
+
+ private Scope(
+ Map<String, VariableDeclaration> variablesByKey,
+ Set<Identifier> identifiers,
+ Identifier identifier,
+ Iterator<Integer> temporaryCounter)
+ {
this.variablesByKey = variablesByKey;
this.identifiers = identifiers;
this.identifier = identifier;
+ this.temporaryCounter = temporaryCounter;
}
public Scope enterClass(TypeName className) {
- return new Scope(variablesByKey, identifiers, identifier.extend("class#" + className.getQualifiedName()));
+ return enter("class#" + className.getQualifiedName());
}
public Scope enterConstructor() {
- return new Scope(variablesByKey, identifiers, identifier.extend("constructor"));
+ return enter("constructor");
}
public Scope enterMethod(String name) {
// TODO: distinguish overloads
- return new Scope(variablesByKey, identifiers, identifier.extend("method#" + name));
+ return enter("method#" + name);
+ }
+
+ private Scope enter(String name) {
+ return new Scope(variablesByKey, identifiers, identifier.extend(name), temporaryCounter);
}
public FormalArgumentNode formalArgument(String name, TypeName type) {
@@ -66,7 +75,7 @@ public class Scope {
}
public LocalVariableDeclarationNode temporaryVariable(TypeName type, ExpressionNode initialValue) {
- return localVariable("_couscous_tmp_0", type, initialValue);
+ return localVariable("_couscous_tmp_" + temporaryCounter.next(), type, initialValue);
}
public ExpressionNode reference(String key) {
diff --git a/src/main/java/org/zwobble/couscous/util/NaturalNumbers.java b/src/main/java/org/zwobble/couscous/util/NaturalNumbers.java
new file mode 100644
index 0000000..1a4b284
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/util/NaturalNumbers.java
@@ -0,0 +1,24 @@
+package org.zwobble.couscous.util;
+
+import java.util.Iterator;
+
+public class NaturalNumbers implements Iterable<Integer> {
+ public static final Iterable<Integer> INSTANCE = new NaturalNumbers();
+
+ @Override
+ public Iterator<Integer> iterator() {
+ return new Iterator<Integer>() {
+ private int next = 0;
+
+ @Override
+ public boolean hasNext() {
+ return true;
+ }
+
+ @Override
+ public Integer next() {
+ return next++;
+ }
+ };
+ }
+}