iOS & macOS DevelopmentDocumentedScanned

swiftfindrefs

Use swiftfindrefs (IndexStoreDB) to list every Swift source file referencing a symbol.

Share:

Installation

npx clawhub@latest install swiftfindrefs

View the full skill documentation and source below.

Documentation

SwiftFindRefs

Purpose

Use swiftfindrefs to locate every Swift source file that references a given symbol by querying Xcode’s IndexStore (DerivedData). This skill exists to prevent incomplete refactors caused by text search or heuristics.

Rules

  • Always run swiftfindrefs before editing any files.
  • Only edit files returned by swiftfindrefs.
  • Do not substitute grep, rg, IDE search, or filesystem heuristics for reference discovery.
  • Do not expand the file set manually.
  • If IndexStore/DerivedData resolution fails, stop and report the error. Do not guess.

Preconditions

  • macOS with Xcode installed
  • Project has been built at least once (DerivedData exists)
  • swiftfindrefs available in PATH

Installation

brew tap michaelversus/SwiftFindRefs 
brew install swiftfindrefs

Canonical command

Prefer providing --projectName and --symbolType when possible.
swiftfindrefs \
  --projectName <XcodeProjectName> \
  --symbolName <SymbolName> \
  --symbolType <class|struct|enum|protocol|function|variable>

Optional flags:

  • --dataStorePath : explicit DataStore (or IndexStoreDB) path; skips discovery

  • -v, --verbose: enables verbose output for diagnostic purposes (flag, no value required)


Output contract


  • One absolute file path per line

  • Deduplicated

  • Script-friendly (safe to pipe line-by-line)

  • Ordering is not semantically meaningful


Standard workflows

Workflow A: Find all references

  • Run swiftfindrefs for the symbol.
  • Treat the output as the complete reference set.
  • If more detail is needed, open only the returned files.
  • Workflow B: Fix missing imports after moving a symbol

    Use swiftfindrefs to restrict scope, then add imports only where needed.
    swiftfindrefs -p <Project> -n <Symbol> -t <Type> | while read file; do
      if ! grep -q "^import <ModuleName>$" "$file"; then
        echo "$file"
      fi
    done

    Then for each printed file:

    • Insert import in the imports block at the top.

    • Preserve existing import ordering/grouping.

    • Never add duplicate imports.

    • Do not reformat unrelated code.


    Workflow C: Audit usage before deleting or renaming a symbol


  • Run swiftfindrefs for the symbol.

  • If output is empty, treat the symbol as unused (still validate via build/tests if needed).

  • If non-empty, review the listed files before changing public API.
  • References

    • CLI details: references/cli.md
    • Playbooks: references/workflows.md
    • Troubleshooting: references/troubleshooting.md