diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-13 20:41:06 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-13 20:41:06 +0000 |
| commit | 6b3248373262ca30fff70728e24852bde8131042 (patch) | |
| tree | b5b96b583fbb5e4ec2fa771502328e6cc7a75d9f /src/main/java/org | |
| parent | 6150fa0b469e54b7a211d0a4e585d3e37794df23 (diff) | |
Generate unique names for temporary variables
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/Scope.java | 31 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/util/NaturalNumbers.java | 24 |
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++; + } + }; + } +} |
