@@ -401,43 +401,50 @@ mixin template OpEquals(bool print = false)
401
401
{
402
402
override bool opEquals (Object other) const
403
403
{
404
- static if (print)
405
- pragma (msg, generateOpEquals! (typeof (this )));
406
- mixin (generateOpEquals! (typeof (this )));
407
- }
408
- }
409
-
410
- template generateOpEquals (T)
411
- {
412
- template opEqualsPart (p ... )
413
- {
414
- import std.traits : isSomeFunction, isDynamicArray;
415
- import std.algorithm : among;
416
-
417
- static if (p.length > 1 )
418
- {
419
- enum opEqualsPart = opEqualsPart! (p[0 .. $/ 2 ]) ~ opEqualsPart! (p[$/ 2 .. $]);
420
- }
421
- else static if (p.length
422
- && ! __traits(isDeprecated, __traits(getMember, T, p[0 ]))
423
- && ! isSomeFunction! (typeof (__traits(getMember, T, p[0 ])))
424
- && ! p[0 ].among(" comment" , " line" , " column" , " endLocation" , " startLocation" , " index" , " dotLocation" ))
404
+ if (auto obj = cast (typeof (this )) other)
425
405
{
426
- static if (isDynamicArray ! ( typeof (__traits(getMember, T, p[ 0 ]))) )
406
+ foreach (i, field; this .tupleof )
427
407
{
428
- enum opEqualsPart = " \t if (obj." ~ p[0 ] ~ " .length != " ~ p[0 ] ~ " .length) return false;\n "
429
- ~ " \t foreach (i; 0 .. " ~ p[0 ] ~ " .length)\n "
430
- ~ " \t\t if (" ~ p[0 ] ~ " [i] != obj." ~ p[0 ] ~ " [i]) return false;\n " ;
408
+ if (typeof (this ).tupleof[i].stringof.among(
409
+ " comment" , " line" , " column" , " endLocation" , " startLocation" ,
410
+ " index" , " dotLocation"
411
+ ))
412
+ continue ;
413
+
414
+ if (field != obj.tupleof[i])
415
+ return false ;
431
416
}
432
- else
433
- enum opEqualsPart = " \t if (obj." ~ p[0 ] ~ " != " ~ p[0 ] ~ " ) return false;\n " ;
417
+ return true ;
434
418
}
435
- else
436
- enum opEqualsPart = " " ;
419
+ return false ;
437
420
}
438
- enum generateOpEquals = " if (auto obj = cast(" ~ T.stringof ~ " ) other){\n "
439
- ~ opEqualsPart! (__traits(derivedMembers, T))
440
- ~ " \t return true;\n }\n return false;" ;
421
+ }
422
+
423
+ unittest
424
+ {
425
+ auto lhs = new AddExpression();
426
+ auto rhs = new AddExpression();
427
+ assert (lhs == rhs);
428
+ lhs.line = 4 ;
429
+ assert (lhs == rhs);
430
+ lhs.operator = tok! " -" ;
431
+ assert (lhs != rhs);
432
+ rhs.operator = tok! " -" ;
433
+ assert (lhs == rhs);
434
+ }
435
+
436
+ unittest
437
+ {
438
+ auto lhs = new AssertArguments();
439
+ auto rhs = new AssertArguments();
440
+ lhs.assertion = new AddExpression();
441
+ rhs.assertion = new AddExpression();
442
+ lhs.messageParts = [new NewExpression(), new AddExpression()];
443
+ rhs.messageParts = [new NewExpression(), new AddExpression()];
444
+ assert (lhs == rhs);
445
+ lhs.messageParts = [new NewExpression(), new AddExpression()];
446
+ rhs.messageParts = [new AddExpression(), new NewExpression()];
447
+ assert (lhs != rhs);
441
448
}
442
449
443
450
abstract class BaseNode : ASTNode
0 commit comments