diff options
Diffstat (limited to 'src/main/java')
11 files changed, 111 insertions, 128 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 4bd432f..a567254 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -3,7 +3,6 @@ package org.zwobble.couscous.ast; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.zwobble.couscous.ast.identifiers.Identifier; -import org.zwobble.couscous.ast.identifiers.Identifiers; import org.zwobble.couscous.types.ScalarType; import org.zwobble.couscous.types.Type; import org.zwobble.couscous.types.Types; @@ -41,7 +40,7 @@ public class ClassNodeBuilder { } public ClassNodeBuilder addTypeParameter(String name) { - this.typeParameters.add(formalTypeParameter(Identifiers.forType(this.name.getQualifiedName()), name)); + this.typeParameters.add(formalTypeParameter(Identifier.forType(this.name.getQualifiedName()), name)); return this; } @@ -178,4 +177,4 @@ public class ClassNodeBuilder { return this.build.apply(this); } } -}
\ No newline at end of file +} diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java b/src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java deleted file mode 100644 index 407c6da..0000000 --- a/src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.zwobble.couscous.ast.identifiers; - -import static org.zwobble.couscous.util.ExtraIterables.lazyAppend; - -public class ExtendedIdentifier implements Identifier { - private final Identifier parent; - private final String part; - private final IdentifierType type; - - ExtendedIdentifier(Identifier parent, String part, IdentifierType type) { - this.parent = parent; - this.part = part; - this.type = type; - } - - @Override - public Iterable<IdentifierPart> getParts() { - return lazyAppend(parent.getParts(), new IdentifierPart(part, type)); - } - - @Override - public String toString() { - return "ExtendedIdentifier(" + - "parent=" + parent + - ", part='" + part + '\'' + - ", type=" + type + - ')'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ExtendedIdentifier that = (ExtendedIdentifier) o; - - if (!parent.equals(that.parent)) return false; - if (!part.equals(that.part)) return false; - return type == that.type; - - } - - @Override - public int hashCode() { - int result = parent.hashCode(); - result = 31 * result + part.hashCode(); - result = 31 * result + type.hashCode(); - return result; - } -} diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java index 777a0bb..07d7933 100644 --- a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java @@ -1,5 +1,73 @@ package org.zwobble.couscous.ast.identifiers; -public interface Identifier { - Iterable<IdentifierPart> getParts(); +import org.zwobble.couscous.types.ScalarType; +import org.zwobble.couscous.util.ExtraLists; + +import java.util.List; + +import static org.zwobble.couscous.util.ExtraLists.list; + +public class Identifier { + public static final Identifier TOP = new Identifier(list()); + + public static Identifier forType(String name) { + return TOP.type(name); + } + + public static Identifier forType(ScalarType type) { + return forType(type.getQualifiedName()); + } + + private final List<IdentifierPart> parts; + + Identifier(List<IdentifierPart> parts) { + this.parts = parts; + } + + public Iterable<IdentifierPart> getParts() { + return parts; + } + + public Identifier type(String name) { + return extend(name, IdentifierType.TYPE); + } + + public Identifier method(String name) { + return extend(name, IdentifierType.METHOD); + } + + public Identifier constructor() { + return extend("", IdentifierType.CONSTRUCTOR); + } + + public Identifier variable(String name) { + return extend(name, IdentifierType.VARIABLE); + } + + private Identifier extend(String name, IdentifierType type) { + return new Identifier(ExtraLists.append(parts, new IdentifierPart(name, type))); + } + + @Override + public String toString() { + return "Identifier(" + + "parts=" + parts + + ')'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Identifier that = (Identifier) o; + + return parts.equals(that.parts); + + } + + @Override + public int hashCode() { + return parts.hashCode(); + } } diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java b/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java index 5aedcf0..ef1f83c 100644 --- a/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java @@ -16,4 +16,31 @@ public class IdentifierPart { public IdentifierType getType() { return type; } + + @Override + public String toString() { + return "IdentifierPart(" + + "name='" + name + '\'' + + ", type=" + type + + ')'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + IdentifierPart that = (IdentifierPart) o; + + if (!name.equals(that.name)) return false; + return type == that.type; + + } + + @Override + public int hashCode() { + int result = name.hashCode(); + result = 31 * result + type.hashCode(); + return result; + } } diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java deleted file mode 100644 index f104674..0000000 --- a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.zwobble.couscous.ast.identifiers; - -import org.zwobble.couscous.types.ScalarType; - -public class Identifiers { - public static final Identifier TOP = TopIdentifier.INSTANCE; - - public static Identifier type(Identifier identifier, String name) { - return extend(identifier, name, IdentifierType.TYPE); - } - - public static Identifier method(Identifier identifier, String name) { - return extend(identifier, name, IdentifierType.METHOD); - } - - public static Identifier constructor(Identifier identifier) { - return extend(identifier, "", IdentifierType.CONSTRUCTOR); - } - - public static Identifier variable(Identifier identifier, String name) { - return extend(identifier, name, IdentifierType.VARIABLE); - } - - private static Identifier extend(Identifier identifier, String name, IdentifierType type) { - return new ExtendedIdentifier(identifier, name, type); - } - - public static Identifier forType(String name) { - return type(TOP, name); - } - - public static Identifier forType(ScalarType type) { - return forType(type.getQualifiedName()); - } -} diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java b/src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java deleted file mode 100644 index 6f578d2..0000000 --- a/src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.zwobble.couscous.ast.identifiers; - -import static org.zwobble.couscous.util.ExtraLists.list; - -public class TopIdentifier implements Identifier { - static final Identifier INSTANCE = new TopIdentifier(); - - private TopIdentifier() { - } - - @Override - public Iterable<IdentifierPart> getParts() { - return list(); - } - - @Override - public String toString() { - return "TOP"; - } -} diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java index 014e4ae..61d353f 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java @@ -5,7 +5,6 @@ import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.zwobble.couscous.ast.MethodSignature; import org.zwobble.couscous.ast.identifiers.Identifier; -import org.zwobble.couscous.ast.identifiers.Identifiers; import org.zwobble.couscous.types.Type; import org.zwobble.couscous.types.TypeParameter; @@ -63,8 +62,6 @@ class JavaMethods { private static Identifier identifierFor(IMethodBinding method) { // TODO: disambiguate overloads - return Identifiers.method( - Identifiers.forType(erasure(typeOf(method.getDeclaringClass()))), - method.getName()); + return Identifier.forType(erasure(typeOf(method.getDeclaringClass()))).method(method.getName()); } } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java index 37cee36..6e6a51b 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java @@ -3,7 +3,6 @@ package org.zwobble.couscous.frontends.java; import com.google.common.collect.ImmutableSet; import org.eclipse.jdt.core.dom.*; import org.zwobble.couscous.ast.identifiers.Identifier; -import org.zwobble.couscous.ast.identifiers.Identifiers; import org.zwobble.couscous.types.*; import org.zwobble.couscous.types.ParameterizedType; import org.zwobble.couscous.types.Type; @@ -66,14 +65,14 @@ public class JavaTypes { if (typeParameter.getDeclaringClass() == null) { IMethodBinding method = typeParameter.getDeclaringMethod(); // TODO: disambiguate overloads - return Identifiers.method(identifierForType(method.getDeclaringClass()), method.getName()); + return identifierForType(method.getDeclaringClass()).method(method.getName()); } else { return identifierForType(typeParameter.getDeclaringClass()); } } private static Identifier identifierForType(ITypeBinding type) { - return Identifiers.forType(erasure(typeOf(type)).getQualifiedName()); + return Identifier.forType(erasure(typeOf(type)).getQualifiedName()); } static Set<Type> superTypes(TypeDeclaration declaration) { @@ -144,7 +143,7 @@ public class JavaTypes { } private static final ScalarType RAW_ITERATOR = ScalarType.of("java.util.Iterator"); - public static TypeParameter ITERATOR_TYPE_PARAMETER = typeParameter(Identifiers.type(Identifiers.TOP, RAW_ITERATOR.getQualifiedName()), "T"); + public static TypeParameter ITERATOR_TYPE_PARAMETER = typeParameter(Identifier.TOP.type(RAW_ITERATOR.getQualifiedName()), "T"); public static Type iterator(Type elementType) { return parameterizedType(RAW_ITERATOR, list(elementType)); 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 21745c6..ee8be5f 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/Scope.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/Scope.java @@ -2,7 +2,6 @@ package org.zwobble.couscous.frontends.java; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.identifiers.Identifier; -import org.zwobble.couscous.ast.identifiers.Identifiers; import org.zwobble.couscous.types.ScalarType; import org.zwobble.couscous.types.Type; import org.zwobble.couscous.util.NaturalNumbers; @@ -11,7 +10,7 @@ import java.util.*; public class Scope { public static Scope create() { - return new Scope(new HashMap<>(), new HashSet<>(), Identifiers.TOP, NaturalNumbers.INSTANCE.iterator()); + return new Scope(new HashMap<>(), new HashSet<>(), Identifier.TOP, NaturalNumbers.INSTANCE.iterator()); } private final Map<String, VariableDeclaration> variablesByKey; @@ -36,16 +35,16 @@ public class Scope { } public Scope enterClass(ScalarType className) { - return enter(Identifiers.type(identifier, className.getQualifiedName())); + return enter(identifier.type(className.getQualifiedName())); } public Scope enterConstructor() { - return enter(Identifiers.constructor(identifier)); + return enter(identifier.constructor()); } public Scope enterMethod(String name) { // TODO: distinguish overloads - return enter(Identifiers.method(identifier, name)); + return enter(identifier.method(name)); } private Scope enter(Identifier newIdentifier) { @@ -112,10 +111,10 @@ public class Scope { } private Identifier generateVariableIdentifier(String name) { - Identifier identifier = Identifiers.variable(this.identifier, name); + Identifier identifier = this.identifier.variable(name); int index = 0; while (identifiers.contains(identifier)) { - identifier = Identifiers.variable(this.identifier, name + "_" + index); + identifier = this.identifier.variable(name + "_" + index); index++; } identifiers.add(identifier); diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java b/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java index 3ffaad5..810178b 100644 --- a/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java +++ b/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java @@ -84,7 +84,6 @@ public class DesugarSwitchToIfElse { } private static boolean isEndOfCase(StatementNode statement) { - // TODO: add attribute onto statement node to detect exit return statement.type() == NodeTypes.RETURN; } } diff --git a/src/main/java/org/zwobble/couscous/util/ExtraLists.java b/src/main/java/org/zwobble/couscous/util/ExtraLists.java index d52c099..147fe00 100644 --- a/src/main/java/org/zwobble/couscous/util/ExtraLists.java +++ b/src/main/java/org/zwobble/couscous/util/ExtraLists.java @@ -33,8 +33,8 @@ public class ExtraLists { return concat(list(value), list); } - public static <T> List<T> append(List<? extends T> list, T value) { - return Stream.concat(list.stream(), Stream.of(value)).collect(Collectors.toList()); + public static <T> List<T> append(Iterable<? extends T> iterable, T value) { + return Stream.concat(ExtraIterables.stream(iterable), Stream.of(value)).collect(Collectors.toList()); } public static <T> List<T> concat(Iterable<? extends T> first, Iterable<? extends T> second) { |
