Skip to content

Navigate symbols and calls

Start from a known source location with resolve-symbol, or use search-symbols when only a name is known. Check the project and signature before following an overload. Reuse resolve-symbol's data.selector for subsequent symbol queries; see selectors.md for binding locations and snapshots.

Choose the query

Need Tool
Find source types or members search-symbols; narrow by project, kind or namespace.
Bind a source occurrence to its symbol resolve-symbol.
Inspect signature, modifiers, declarations or XML documentation get-symbol-info.
Locate the declaration go-to-definition; metadata results contain no decompiled source.
Read selected source and surrounding lines get-code-context.
Find usages and access classifications find-references.
Trace incoming calls grouped by caller find-callers.
Trace outgoing method/constructor targets find-callees.
Compare signatures in the same containing type find-overloads.

Find the right declaration

search-symbols uses Roslyn name patterns, not regular expressions or full-text search. metadataName is a case-insensitive substring filter; namespace matches the complete namespace exactly. Locals and namespace declarations are excluded.

Read source with get-code-context after finding the symbol. Its optional diagnostics cover compiler findings intersecting the selected span, not the expanded context window or project analyzers.

find-overloads may include the selected callable. It neither resolves supplied arguments to an overload nor collects inherited overloads. For overrides and interface implementations, use structure.md.

Trace usages and calls

Set includeDefinitions: false when counting usages with find-references; declarations otherwise share the result cap.

For find-callers, inspect both the callers collection and each caller's call-site truncation: either can hide relevant calls.

Start find-callees with direct calls; enable includeIndirect for transitive exploration. Results are distinct targets, not call sites or runtime dispatch targets. Each scanned body skips nested lambdas and local-function bodies. Traversal depth is independent of result limits, so an untruncated result can still omit deeper calls.