diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-09 14:21:48 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-09 14:21:59 +0100 |
| commit | 0a550c3bb4e624d76b3876e92a2bd0e235301fba (patch) | |
| tree | ee89fc17f79155f830b3413318cf3c2c76364e2d /src/main/java/org/zwobble/couscous/ast/identifiers | |
| parent | f005b283a1b1c74c8b98499069e6afcb5e9a9ade (diff) | |
Remove MethodTypeParameter and adjust Identifier generation
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/identifiers')
6 files changed, 120 insertions, 48 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java b/src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java new file mode 100644 index 0000000..407c6da --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java @@ -0,0 +1,50 @@ +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 c753034..777a0bb 100644 --- a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java @@ -1,51 +1,5 @@ package org.zwobble.couscous.ast.identifiers; -import com.google.common.collect.ImmutableList; - -import java.util.List; - -import static org.zwobble.couscous.util.ExtraLists.list; - -public class Identifier { - // TODO: Should we have two Identifier classes, one for each namespace? (variables and types) - public static final Identifier TOP = new Identifier(list()); - - private final List<String> parts; - - private Identifier(List<String> parts) { - this.parts = parts; - } - - public List<String> getParts() { - return parts; - } - - public Identifier extend(String name) { - ImmutableList.Builder<String> parts = ImmutableList.builder(); - parts.addAll(this.parts); - parts.add(name); - return new Identifier(parts.build()); - } - - @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(); - } +public interface Identifier { + Iterable<IdentifierPart> getParts(); } diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java b/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java new file mode 100644 index 0000000..5aedcf0 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java @@ -0,0 +1,19 @@ +package org.zwobble.couscous.ast.identifiers; + +public class IdentifierPart { + private final String name; + private final IdentifierType type; + + public IdentifierPart(String name, IdentifierType type) { + this.name = name; + this.type = type; + } + + public String getName() { + return name; + } + + public IdentifierType getType() { + return type; + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierType.java b/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierType.java new file mode 100644 index 0000000..f18334f --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierType.java @@ -0,0 +1,8 @@ +package org.zwobble.couscous.ast.identifiers; + +public enum IdentifierType { + TYPE, + METHOD, + CONSTRUCTOR, + VARIABLE +} diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java new file mode 100644 index 0000000..9beac27 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java @@ -0,0 +1,29 @@ +package org.zwobble.couscous.ast.identifiers; + +public class Identifiers { + public static final Identifier TOP = new TopIdentifier(); + + 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); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java b/src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java new file mode 100644 index 0000000..4776dc1 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java @@ -0,0 +1,12 @@ +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(); + + @Override + public Iterable<IdentifierPart> getParts() { + return list(); + } +} |
