Fixed equality check for block statements
This commit is contained in:
parent
16de0e1ca1
commit
d12653eef9
36
stdx/d/ast.d
36
stdx/d/ast.d
|
@ -291,14 +291,6 @@ public:
|
||||||
|
|
||||||
immutable string DEFAULT_ACCEPT = q{override void accept(ASTVisitor visitor) const {}};
|
immutable string DEFAULT_ACCEPT = q{override void accept(ASTVisitor visitor) const {}};
|
||||||
|
|
||||||
mixin template OpEquals()
|
|
||||||
{
|
|
||||||
override bool opEquals(Object other) const
|
|
||||||
{
|
|
||||||
mixin (generateOpEquals!(typeof(this)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template visitIfNotNull(fields ...)
|
template visitIfNotNull(fields ...)
|
||||||
{
|
{
|
||||||
static if (fields.length > 1)
|
static if (fields.length > 1)
|
||||||
|
@ -319,6 +311,14 @@ template visitIfNotNull(fields ...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mixin template OpEquals()
|
||||||
|
{
|
||||||
|
override bool opEquals(Object other) const
|
||||||
|
{
|
||||||
|
mixin (generateOpEquals!(typeof(this)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template generateOpEquals(T)
|
template generateOpEquals(T)
|
||||||
{
|
{
|
||||||
template opEqualsPart(p ...)
|
template opEqualsPart(p ...)
|
||||||
|
@ -326,14 +326,26 @@ template generateOpEquals(T)
|
||||||
import std.traits;
|
import std.traits;
|
||||||
static if (p.length == 0)
|
static if (p.length == 0)
|
||||||
enum opEqualsPart = "";
|
enum opEqualsPart = "";
|
||||||
else static if (!isSomeFunction!(__traits(getMember, T, p[0])) && p[0] != "line" && p[0] != "column")
|
else static if (!isSomeFunction!(__traits(getMember, T, p[0]))
|
||||||
enum opEqualsPart = "\n\t&& obj." ~ p[0] ~ " == this." ~ p[0] ~ opEqualsPart!(p[1 .. $]);
|
&& p[0] != "line" && p[0] != "column" && p[0] != "startLocation"
|
||||||
|
&& p[0] != "endLocation")
|
||||||
|
{
|
||||||
|
static if (typeof(__traits(getMember, T, p[0])).stringof[$ - 2 .. $] == "[]")
|
||||||
|
{
|
||||||
|
enum opEqualsPart = "\nif (obj." ~ p[0] ~ ".length != this." ~ p[0] ~ ".length) return false;\n"
|
||||||
|
~ "foreach (i; 0 .. this." ~ p[0] ~ ".length)\n"
|
||||||
|
~ "\tif (this." ~ p[0] ~ "[i] != obj." ~ p[0] ~ "[i]) return false;";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
enum opEqualsPart = "\nif (obj." ~ p[0] ~ " != this." ~ p[0] ~ ") return false;" ~ opEqualsPart!(p[1 .. $]);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
enum opEqualsPart = opEqualsPart!(p[1 .. $]);
|
enum opEqualsPart = opEqualsPart!(p[1 .. $]);
|
||||||
}
|
}
|
||||||
enum generateOpEquals = T.stringof ~ " obj = cast(" ~ T.stringof ~ ") other;\n"
|
enum generateOpEquals = T.stringof ~ " obj = cast(" ~ T.stringof ~ ") other;\n"
|
||||||
~ "return obj !is null"
|
~ "if (obj is null) return false;"
|
||||||
~ opEqualsPart!(__traits(derivedMembers, T)) ~ ";";
|
~ opEqualsPart!(__traits(derivedMembers, T)) ~ "\n"
|
||||||
|
~ "return true;";
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class ExpressionNode : ASTNode
|
abstract class ExpressionNode : ASTNode
|
||||||
|
|
Loading…
Reference in New Issue