@Override
    public void visitBinaryExpression(@NotNull GrBinaryExpression expression) {
      IElementType tokenType = expression.getOperationTokenType();
      if (!EQUALITY_OPERATORS.contains(tokenType)) return;

      PsiType leftType = expression.getLeftType();
      if (leftType == null) return;

      PsiType rightType = expression.getRightType();
      if (rightType == null) return;

      if (TypeUtils.areConvertible(rightType, leftType)) return;
      if (isInheritor(leftType, JAVA_LANG_NUMBER)) {
        if (isInheritor(rightType, JAVA_LANG_NUMBER)) return;
        if (isInheritor(rightType, JAVA_LANG_CHARACTER)) return;
        if (isInheritor(rightType, JAVA_LANG_STRING)) return; // Number == "1"
      }
      else if (isInheritor(leftType, JAVA_LANG_CHARACTER)) {
        if (isInheritor(rightType, JAVA_LANG_NUMBER)) return;
        if (isInheritor(rightType, JAVA_LANG_STRING)) return; // Character == "1"
      }
      else if (isInheritor(leftType, JAVA_LANG_STRING)) {
        if (isInheritor(rightType, JAVA_LANG_NUMBER)) return; // "1" : Number
        if (isInheritor(rightType, JAVA_LANG_CHARACTER)) return;
        if (isInheritor(rightType, GROOVY_LANG_GSTRING)) return;
      }
      else if (isInheritor(leftType, GROOVY_LANG_GSTRING)) {
        if (isInheritor(rightType, JAVA_LANG_STRING)) return;
      }

      registerError(expression.getOperationToken(), tokenType, leftType.getPresentableText(), rightType.getPresentableText());
    }
@Override
    public void visitBinaryExpression(@NotNull GrBinaryExpression expression)