@Nullable
    DiffRange getDiffRange(@NotNull Block block) {
      final EquivalenceChecker checker = new TrackingEquivalenceChecker();
      if (block.block != null && this.block != null) {
        if (checker.statementsAreEquivalent(block.block, this.block)) {
          return new DiffRange(block.block, block.block, equalsComments(comments, block.comments)
                                                         ? ProblemHighlightType.WEAK_WARNING
                                                         : ProblemHighlightType.INFORMATION);
        }
        else {
          return null;
        }
      }
      else {
        if (statements.isEmpty()) return null;
        if (statements.size() != block.statements.size()) return null;
        for (int i = 0; i < statements.size(); i++) {
          if (!checker.statementsAreEquivalent(statements.get(i), block.statements.get(i))) {
            return null;
          }
        }
        return new DiffRange(block.statements.get(0), block.statements.get(block.statements.size() - 1),
                             equalsComments(comments, block.comments)
                             ? ProblemHighlightType.WEAK_WARNING
                             : ProblemHighlightType.INFORMATION);
      }
    }
@Nullable
    DiffRange getDiffRange(@NotNull Block block)