@NotNull HashCodeModel tryReplaceDouble() {
      @Nullable PsiExpression expression = PsiUtil.skipParenthesizedExprDown(argument);
      if (!(expression instanceof PsiReferenceExpression referenceExpression)) return this;
      if (!(referenceExpression.resolve() instanceof PsiLocalVariable local)) return this;
      PsiExpression definition = PsiUtil.skipParenthesizedExprDown(DeclarationSearchUtils.findDefinition(referenceExpression, local));
      if (!(definition instanceof PsiMethodCallExpression call)) return this;
      if (!DOUBLE_TO_LONG_BITS.matches(call)) return this;
      PsiStatement statement = PsiTreeUtil.getParentOfType(definition, PsiStatement.class);
      PsiElement nextStatement = PsiTreeUtil.skipWhitespacesAndCommentsForward(statement);
      if (!PsiTreeUtil.isAncestor(nextStatement, completeExpression, true)) return this;
      final PsiCodeBlock block = PsiTreeUtil.getParentOfType(local, PsiCodeBlock.class);
      if (block == null || DefUseUtil.getRefs(block, local, definition).length != 2) return this;
      return new HashCodeModel(completeExpression, call.getArgumentList().getExpressions()[0], local, definition, "Double");
    }
@NotNull HashCodeModel tryReplaceDouble()