                 (ov (semantic-tag-overlay tag)))
             (ring-insert
              find-tag-marker-ring (point-marker))
-            (find-file file-name)
+            (when file-name
+              (find-file file-name))
             (goto-char (if (overlayp ov)
                            (overlay-start ov)
                          (aref ov 0)))))

    (moo-select-candidate
     ready-tags
     #'moo-action-jump
     preselect)))

(defun moo-reset-superclasses-cache ()
  "Reset `fa-superclasses'."

        (goto-char
         (cdr tag))))))

(defun moo-complete--candidates (&optional only-class)
  (let ((symbol (moo-ctxt-current-symbol))
        prefix candidates)
    (cond
      ((= (length symbol) 2)
       ;; either var.prefix or var->prefix
       (setq prefix (cadr symbol))
       (setq candidates (moo-complete-candidates-2 prefix (car symbol))))
      ((= (length symbol) 1)
       (setq prefix (car symbol))
       (setq candidates (moo-complete-candidates-1 prefix))
       (when only-class
         (setq candidates
               (moo-filter-tag-by-class 'variable candidates))))
      ((= (length symbol) 3)
       (setq prefix (caddr symbol))
       (setq candidates
             (or (moo-ttype->tmembers
                  (moo-complete-type-member
                   (car (moo-complete-candidates-2 (cadr symbol) (car symbol)))))
                 (semantic-analyze-possible-completions
                  (semantic-analyze-current-context (point)))))))
    (cons prefix candidates)))

(defun moo-complete (arg)
  "Complete current C++ symbol at point.
When ARG is not nil offer only variables as candidates."
  (interactive "P")
  (cl-destructuring-bind (prefix . candidates) (moo-complete--candidates arg)
    (if candidates
        (moo-handle-completion
         prefix
         (cl-delete-duplicates candidates :test #'moo-tag=))
      (semantic-ia-complete-symbol (point)))))

(defun moo-completion-at-point ()
  (let ((bnd (semantic-ctxt-current-symbol-and-bounds))
        beg end)
    (if bnd
        (progn
          (setq beg (caar (cddr bnd)))
          (setq end (cdar (cddr bnd))))
      (setq beg (point))
      (setq end (point)))
    (list
     beg end (mapcar #'semantic-tag-name
                     (cdr (moo-complete--candidates))))))

;; ——— Predicates ——————————————————————————————————————————————————————————————
(defmacro fa-and (&rest predicates)
