feat: add reference

This commit is contained in:
2026-04-15 15:23:11 -04:00
parent 562f4bb073
commit 6168e71e19
4 changed files with 102 additions and 66 deletions

View File

@@ -1,42 +1,58 @@
CREATE TABLE files ( CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
path TEXT NOT NULL UNIQUE, path TEXT NOT NULL UNIQUE,
language TEXT NOT NULL, LANGUAGE TEXT NOT NULL,
package TEXT, package TEXT,
hash TEXT NOT NULL, hash TEXT NOT NULL,
indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
CREATE TABLE symbols ( CREATE TABLE IF NOT EXISTS symbols (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE, file_id INTEGER NOT NULL REFERENCES files (id) ON DELETE CASCADE,
name TEXT NOT NULL, name TEXT NOT NULL,
kind TEXT NOT NULL CHECK(kind IN ( kind TEXT NOT NULL CHECK (
'function', 'method', 'class', 'type', kind IN (
'interface', 'constant', 'variable', 'constructor' 'function',
)), 'method',
line INTEGER NOT NULL, 'class',
line_end INTEGER, 'type',
col INTEGER, 'reference',
col_end INTEGER, 'interface',
exported BOOLEAN, 'constant',
parent_id INTEGER REFERENCES symbols(id), 'variable',
UNIQUE(file_id, name, kind, line) 'constructor'
)
),
line INTEGER NOT NULL,
line_end INTEGER,
col INTEGER,
col_end INTEGER,
exported BOOLEAN,
parent_id INTEGER REFERENCES symbols (id),
UNIQUE (file_id, name, kind, line)
); );
CREATE INDEX idx_symbols_name ON symbols(name); CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols (name);
CREATE INDEX idx_symbols_kind ON symbols(kind);
CREATE INDEX idx_symbols_file_line ON symbols(file_id, line); CREATE INDEX IF NOT EXISTS idx_symbols_kind ON symbols (kind);
CREATE INDEX idx_symbols_parent ON symbols(parent_id);
CREATE INDEX idx_symbols_exported ON symbols(exported, kind); CREATE INDEX IF NOT EXISTS idx_symbols_file_line ON symbols (file_id, line);
CREATE INDEX idx_files_path ON files(path);
CREATE INDEX idx_files_language ON files(language); CREATE INDEX IF NOT EXISTS idx_symbols_parent ON symbols (parent_id);
CREATE INDEX idx_files_package ON files(package);
CREATE INDEX IF NOT EXISTS idx_symbols_exported ON symbols (exported, kind);
CREATE INDEX IF NOT EXISTS idx_files_path ON files (path);
CREATE INDEX IF NOT EXISTS idx_files_language ON files (LANGUAGE);
CREATE INDEX IF NOT EXISTS idx_files_package ON files (package);
-- FTS5 virtual table for full-text search of file contents. -- FTS5 virtual table for full-text search of file contents.
-- content is stored here (not external content), keyed by file_id. -- content is stored here (not external content), keyed by file_id.
CREATE VIRTUAL TABLE file_contents USING fts5( CREATE VIRTUAL TABLE IF NOT EXISTS file_contents USING fts5 (
file_id UNINDEXED, file_id UNINDEXED,
content, content,
tokenize='porter unicode61' tokenize = 'porter unicode61'
); );

View File

@@ -1,42 +1,58 @@
CREATE TABLE files ( CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
path TEXT NOT NULL UNIQUE, path TEXT NOT NULL UNIQUE,
language TEXT NOT NULL, LANGUAGE TEXT NOT NULL,
package TEXT, package TEXT,
hash TEXT NOT NULL, hash TEXT NOT NULL,
indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP
); );
CREATE TABLE symbols ( CREATE TABLE IF NOT EXISTS symbols (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE, file_id INTEGER NOT NULL REFERENCES files (id) ON DELETE CASCADE,
name TEXT NOT NULL, name TEXT NOT NULL,
kind TEXT NOT NULL CHECK(kind IN ( kind TEXT NOT NULL CHECK (
'function', 'method', 'class', 'type', kind IN (
'interface', 'constant', 'variable', 'constructor' 'function',
)), 'method',
line INTEGER NOT NULL, 'class',
line_end INTEGER, 'type',
col INTEGER, 'reference',
col_end INTEGER, 'interface',
exported BOOLEAN, 'constant',
parent_id INTEGER REFERENCES symbols(id), 'variable',
UNIQUE(file_id, name, kind, line) 'constructor'
)
),
line INTEGER NOT NULL,
line_end INTEGER,
col INTEGER,
col_end INTEGER,
exported BOOLEAN,
parent_id INTEGER REFERENCES symbols (id),
UNIQUE (file_id, name, kind, line)
); );
CREATE INDEX idx_symbols_name ON symbols(name); CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols (name);
CREATE INDEX idx_symbols_kind ON symbols(kind);
CREATE INDEX idx_symbols_file_line ON symbols(file_id, line); CREATE INDEX IF NOT EXISTS idx_symbols_kind ON symbols (kind);
CREATE INDEX idx_symbols_parent ON symbols(parent_id);
CREATE INDEX idx_symbols_exported ON symbols(exported, kind); CREATE INDEX IF NOT EXISTS idx_symbols_file_line ON symbols (file_id, line);
CREATE INDEX idx_files_path ON files(path);
CREATE INDEX idx_files_language ON files(language); CREATE INDEX IF NOT EXISTS idx_symbols_parent ON symbols (parent_id);
CREATE INDEX idx_files_package ON files(package);
CREATE INDEX IF NOT EXISTS idx_symbols_exported ON symbols (exported, kind);
CREATE INDEX IF NOT EXISTS idx_files_path ON files (path);
CREATE INDEX IF NOT EXISTS idx_files_language ON files (LANGUAGE);
CREATE INDEX IF NOT EXISTS idx_files_package ON files (package);
-- FTS5 virtual table for full-text search of file contents. -- FTS5 virtual table for full-text search of file contents.
-- content is stored here (not external content), keyed by file_id. -- content is stored here (not external content), keyed by file_id.
CREATE VIRTUAL TABLE file_contents USING fts5( CREATE VIRTUAL TABLE IF NOT EXISTS file_contents USING fts5 (
file_id UNINDEXED, file_id UNINDEXED,
content, content,
tokenize='porter unicode61' tokenize = 'porter unicode61'
); );

View File

@@ -21,6 +21,7 @@
devShells.default = pkgs.mkShell { devShells.default = pkgs.mkShell {
packages = with pkgs; [ packages = with pkgs; [
go go
gopls
gnumake gnumake
]; ];
}; };

View File

@@ -15,7 +15,6 @@ import (
"codexis/db" "codexis/db"
) )
// ProgressFunc is called for each file being processed. // ProgressFunc is called for each file being processed.
// current is the 1-based index, total is the total file count, path is the file being processed. // current is the 1-based index, total is the total file count, path is the file being processed.
type ProgressFunc func(current, total int, path string) type ProgressFunc func(current, total int, path string)
@@ -260,7 +259,7 @@ func buildSymbolDefs(tags []gotreesitter.Tag, fileID int64, langName string) []s
for _, tag := range tags { for _, tag := range tags {
kind := tagKind(tag.Kind) kind := tagKind(tag.Kind)
if kind == "" { if kind == "" {
continue // skip references and unknown kinds continue
} }
exported := IsExported(tag.Name, langName) exported := IsExported(tag.Name, langName)
@@ -307,5 +306,9 @@ func tagKind(kind string) string {
if strings.HasPrefix(kind, prefix) { if strings.HasPrefix(kind, prefix) {
return kind[len(prefix):] return kind[len(prefix):]
} }
if kind == "reference.call" {
return "reference"
}
fmt.Println(kind)
return "" return ""
} }