Documentation
¶
Overview ¶
Package treesitter implements code analysis using tree-sitter parsers.
ARCHITECTURE: This package is THE backend for code intelligence. LSP was deleted — tree-sitter is the only parser.
CIS Design Document v2.0:
"No LSP as primary layer. LSP is too stateful, too slow, and too single-client to serve concurrent sessions. The compiler runs once at commit time for type validation. Everything else is tree-sitter and graph."
What tree-sitter gives us:
- Single-file, error-tolerant parsing (tolerates syntax errors)
- Incremental parsing (re-parse only changed bytes)
- In-process (no IPC, no language server lifecycle)
- Deterministic (same input → same tree)
- Multi-language (Go, Python, TypeScript, Rust, ...)
What tree-sitter does NOT give us (and we layer on top):
- Type information → compiler at commit time
- Cross-file resolution → symbol index built over tree-sitter output
- Refactoring → agents edit via SymbolPatch
Language support is added by creating a subpackage (e.g. treesitter/golang) that calls Register() in its init() with a *LanguageConfig containing the grammar and a SymbolExtractor. The core package has no per-language code.
Index ¶
- func Register(lang languages.Language, cfg *LanguageConfig)
- type Client
- type DiagnosticResult
- type HoverResult
- type LanguageConfig
- type LocationResult
- type Parser
- func (p *Parser) Config() *LanguageConfig
- func (p *Parser) ParseBytes(ctx context.Context, relPath string, content []byte) ([]*codev0.Symbol, error)
- func (p *Parser) ParseBytesAll(ctx context.Context, relPath string, content []byte) (syms []*codev0.Symbol, tree *sitter.Tree, err error)
- func (p *Parser) ParseBytesWithDiagnostics(ctx context.Context, relPath string, content []byte) (syms []*codev0.Symbol, diags []DiagnosticResult, err error)
- type SymbolExtractor
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Register ¶
func Register(lang languages.Language, cfg *LanguageConfig)
Register adds a language config to the registry. Typically called from a language subpackage's init().
Types ¶
type Client ¶
type Client interface {
// ListSymbols returns symbols defined in a file (or the whole workspace
// when file is empty).
ListSymbols(ctx context.Context, file string) ([]*codev0.Symbol, error)
// NotifyChange is a no-op for tree-sitter: the parser is stateless and
// re-parses on demand.
NotifyChange(ctx context.Context, file string, content string) error
// NotifySave is a no-op for tree-sitter.
NotifySave(ctx context.Context, file string) error
// Diagnostics returns SYNTAX errors (ERROR nodes) for a file or the
// entire workspace (file == "").
Diagnostics(ctx context.Context, file string) ([]DiagnosticResult, error)
// Definition returns the definition location for the identifier at the
// given 1-based (line, col). Uses CIS 7.1 3-step resolution.
Definition(ctx context.Context, file string, line, col int) ([]LocationResult, error)
// References returns all usage locations of the identifier at (line, col).
References(ctx context.Context, file string, line, col int) ([]LocationResult, error)
// Hover returns the node text at (line, col).
Hover(ctx context.Context, file string, line, col int) (*HoverResult, error)
// Close releases parser resources. Safe to call multiple times.
Close(ctx context.Context) error
}
Client is the language-agnostic tree-sitter analysis interface.
type DiagnosticResult ¶
type DiagnosticResult struct {
File string
Line int32
Column int32
EndLine int32
EndColumn int32
Message string
Severity string // always "error" — tree-sitter only emits ERROR nodes
Source string // "tree-sitter"
}
DiagnosticResult is a SYNTAX diagnostic from tree-sitter (ERROR nodes). Type/semantic diagnostics come from the compiler at commit time, not here.
type HoverResult ¶
HoverResult carries the text snippet under the cursor. Tree-sitter alone cannot produce semantic hover (types, docs). Callers that need rich hover layer the symbol index + summary store above this client.
type LanguageConfig ¶
type LanguageConfig struct {
// LanguageID matches the LSP languageId convention ("go", "python").
LanguageID string
// FileExtensions lists source file suffixes (e.g. [".go"], [".py"]).
FileExtensions []string
// SkipDirs are directory names to skip when walking the workspace.
SkipDirs []string
// SkipSuffixes are file suffixes to skip (e.g. "_test.go").
SkipSuffixes []string
// Grammar returns the tree-sitter language grammar. Called once per client.
Grammar func() *sitter.Language
// ExtractSymbols turns a parsed tree into Symbols. Required.
ExtractSymbols SymbolExtractor
}
LanguageConfig holds per-language settings for the tree-sitter client.
func Lookup ¶
func Lookup(lang languages.Language) *LanguageConfig
Lookup returns the registered config for a language, or nil if missing. Exposed for tests and debugging.
type LocationResult ¶
type LocationResult struct {
File string // relative path within the workspace
Line int // 1-based
Column int // 1-based
EndLine int // 1-based
EndColumn int // 1-based
Confidence float32 // 0.0–1.0 per CIS confidence model
Source string // "tree_sitter" | "resolved_explicit" | "resolved_wildcard"
}
LocationResult is a source location returned by tree-sitter resolution.
type Parser ¶
type Parser struct {
// contains filtered or unexported fields
}
Parser is a lightweight, concurrency-safe wrapper that caches one *sitter.Parser per goroutine via a sync.Pool. Reuse cuts allocation overhead to near zero when parsing thousands of files in parallel.
func NewParser ¶
NewParser returns a Parser for a registered language. Returns an error if the language has not been imported (registered).
func (*Parser) Config ¶
func (p *Parser) Config() *LanguageConfig
Config returns the language configuration the parser was built with. Useful to callers that want to inspect file extensions or skip dirs.
func (*Parser) ParseBytes ¶
func (p *Parser) ParseBytes(ctx context.Context, relPath string, content []byte) ([]*codev0.Symbol, error)
ParseBytes parses the given content and extracts symbols via the language's SymbolExtractor. relPath is used to populate Symbol.Location.File. Thread-safe: each call acquires a pooled *sitter.Parser.
func (*Parser) ParseBytesAll ¶
func (p *Parser) ParseBytesAll( ctx context.Context, relPath string, content []byte, ) (syms []*codev0.Symbol, tree *sitter.Tree, err error)
ParseBytesAll returns BOTH the extracted symbols AND the parse tree in a single pass. The caller OWNS the returned tree and must call tree.Close(). Use this when you need to walk the AST after symbol extraction (e.g. building call-graph edges) without re-parsing the file.
func (*Parser) ParseBytesWithDiagnostics ¶
func (p *Parser) ParseBytesWithDiagnostics( ctx context.Context, relPath string, content []byte, ) (syms []*codev0.Symbol, diags []DiagnosticResult, err error)
ParseBytesWithDiagnostics is like ParseBytes but also returns syntax-error diagnostics (ERROR / MISSING nodes). Single parse pass, no extra work.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package golang registers the Go tree-sitter grammar with the treesitter registry.
|
Package golang registers the Go tree-sitter grammar with the treesitter registry. |
|
Package python registers the Python tree-sitter grammar with the treesitter registry.
|
Package python registers the Python tree-sitter grammar with the treesitter registry. |