@SuppressWarnings("cast")
        private int compareEqualPosition(Declaration d1, Declaration d2) {
            assert
                (d1.getPosition() == d2.getPosition()) || // Handles d1 == d2 == null
                (d1.getPosition().file().compareTo(d2.getPosition().file()) == 0 &&
                 d1.getPosition().line()   == d2.getPosition().line() &&
                 d1.getPosition().column() == d2.getPosition().column());

            DeclPartialOrder dpo1 = new DeclPartialOrder();
            DeclPartialOrder dpo2 = new DeclPartialOrder();

            d1.accept(dpo1);
            d2.accept(dpo2);

            int difference = dpo1.getValue() - dpo2.getValue();
            if (difference != 0)
                return difference;
            else {
                int result = d1.getSimpleName().compareTo(d2.getSimpleName());
                if (result != 0)
                    return result;
                return (int)( Long.signum((long)System.identityHashCode(d1) -
                                          (long)System.identityHashCode(d2)));
            }
        }