aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
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
parentf005b283a1b1c74c8b98499069e6afcb5e9a9ade (diff)
Remove MethodTypeParameter and adjust Identifier generation
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java3
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java30
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java3
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodSignature.java10
-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
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java6
11 files changed, 151 insertions, 69 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
index 734a6a2..4bd432f 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
@@ -3,6 +3,7 @@ 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;
@@ -40,7 +41,7 @@ public class ClassNodeBuilder {
}
public ClassNodeBuilder addTypeParameter(String name) {
- this.typeParameters.add(formalTypeParameter(name));
+ this.typeParameters.add(formalTypeParameter(Identifiers.forType(this.name.getQualifiedName()), name));
return this;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java b/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java
index 4582719..3147d1d 100644
--- a/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java
@@ -1,25 +1,35 @@
package org.zwobble.couscous.ast;
+import org.zwobble.couscous.ast.identifiers.Identifier;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.TypeParameter;
public class FormalTypeParameterNode implements Node {
- public static FormalTypeParameterNode formalTypeParameter(String name) {
- return new FormalTypeParameterNode(name);
+ public static FormalTypeParameterNode formalTypeParameter(Identifier declaringScope, String name) {
+ return new FormalTypeParameterNode(new TypeParameter(declaringScope, name));
}
- private final String name;
+ public static FormalTypeParameterNode formalTypeParameter(TypeParameter type) {
+ return new FormalTypeParameterNode(type);
+ }
+
+ private final TypeParameter type;
+
+ public FormalTypeParameterNode(TypeParameter type) {
+ this.type = type;
+ }
- public FormalTypeParameterNode(String name) {
- this.name = name;
+ public TypeParameter getType() {
+ return type;
}
public String getName() {
- return name;
+ return type.getName();
}
public FormalTypeParameterNode transform(NodeTransformer transformer) {
- return this;
+ return new FormalTypeParameterNode(transformer.transform(type));
}
@Override
@@ -30,7 +40,7 @@ public class FormalTypeParameterNode implements Node {
@Override
public String toString() {
return "FormalTypeParameterNode(" +
- "name=" + name +
+ "type=" + type +
')';
}
@@ -41,12 +51,12 @@ public class FormalTypeParameterNode implements Node {
FormalTypeParameterNode that = (FormalTypeParameterNode) o;
- return name.equals(that.name);
+ return type.equals(that.type);
}
@Override
public int hashCode() {
- return name.hashCode();
+ return type.hashCode();
}
}
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index de86a15..0f91024 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -10,7 +10,6 @@ import java.util.List;
import java.util.Optional;
import java.util.function.Function;
-import static org.zwobble.couscous.types.MethodTypeParameter.methodTypeParameter;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -174,7 +173,7 @@ public class MethodNode implements Node {
public MethodSignature signature() {
return new MethodSignature(
name,
- eagerMap(typeParameters, parameter -> methodTypeParameter(parameter.getName())),
+ eagerMap(typeParameters, parameter -> parameter.getType()),
eagerMap(arguments, argument -> argument.getType()),
returnType);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodSignature.java b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
index 8c907e3..d6c42ab 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
@@ -1,7 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.MethodTypeParameter;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.TypeParameter;
import org.zwobble.couscous.types.Types;
import java.util.List;
@@ -14,16 +14,16 @@ public class MethodSignature {
return signature(name, list(), arguments, returnType);
}
- public static MethodSignature signature(String name, List<MethodTypeParameter> typeParameters, List<Type> arguments, Type returnType) {
+ public static MethodSignature signature(String name, List<TypeParameter> typeParameters, List<Type> arguments, Type returnType) {
return new MethodSignature(name, typeParameters, arguments, returnType);
}
private final String name;
- private final List<MethodTypeParameter> typeParameters;
+ private final List<TypeParameter> typeParameters;
private final List<Type> arguments;
private final Type returnType;
- public MethodSignature(String name, List<MethodTypeParameter> typeParameters, List<Type> arguments, Type returnType) {
+ public MethodSignature(String name, List<TypeParameter> typeParameters, List<Type> arguments, Type returnType) {
this.name = name;
this.typeParameters = typeParameters;
this.arguments = arguments;
@@ -34,7 +34,7 @@ public class MethodSignature {
return name;
}
- public List<MethodTypeParameter> getTypeParameters() {
+ public List<TypeParameter> getTypeParameters() {
return typeParameters;
}
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();
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
index afa1681..6e63059 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -5,9 +5,9 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.types.MethodTypeParameter;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.TypeParameter;
import java.util.List;
import java.util.Map;
@@ -221,8 +221,8 @@ public class NodeTransformer {
return (ScalarType)transformType.apply(type);
}
- public MethodTypeParameter transform(MethodTypeParameter type) {
- return (MethodTypeParameter)transformType.apply(type);
+ public TypeParameter transform(TypeParameter type) {
+ return (TypeParameter)transformType.apply(type);
}
public String transformMethodName(MethodSignature signature) {