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 | |
| parent | f005b283a1b1c74c8b98499069e6afcb5e9a9ade (diff) | |
Remove MethodTypeParameter and adjust Identifier generation
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
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) { |
