aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast/identifiers
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-09 14:21:48 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-09 14:21:59 +0100
commit0a550c3bb4e624d76b3876e92a2bd0e235301fba (patch)
treeee89fc17f79155f830b3413318cf3c2c76364e2d /src/main/java/org/zwobble/couscous/ast/identifiers
parentf005b283a1b1c74c8b98499069e6afcb5e9a9ade (diff)
Remove MethodTypeParameter and adjust Identifier generation
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/identifiers')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/ExtendedIdentifier.java50
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/Identifier.java50
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierPart.java19
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/IdentifierType.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java29
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/TopIdentifier.java12
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();
+ }
+}