clast-ai 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +14 -0
- package/.claude-plugin/plugin.json +11 -9
- package/README.md +447 -401
- package/bench/ab/onair-concept.json +22 -0
- package/bench/ab/onair-deadcode.json +7 -0
- package/bench/ab/onair-hard.json +32 -0
- package/bench/ab/onair-impact.json +17 -0
- package/bench/ab/onair-refactors.json +18 -0
- package/bench/ab/onair-survey.json +17 -0
- package/bench/ab/onair-tasks.json +20 -0
- package/bench/ab/onair.json +52 -0
- package/bench/ab/vscode-concept.json +22 -0
- package/bench/ab/vscode-hard.json +32 -0
- package/bench/ab/vscode-impact.json +17 -0
- package/bench/ab/vscode-refactors.json +18 -0
- package/bench/ab/vscode-tasks.json +20 -0
- package/bench/ab/vscode.json +52 -0
- package/bench/ab.mjs +213 -0
- package/bench/bench.mjs +98 -0
- package/bench/resolution.mjs +75 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +257 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -2
- package/dist/config/defaults.js +38 -31
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +26 -14
- package/dist/config/index.js.map +1 -1
- package/dist/db/index.d.ts +73 -13
- package/dist/db/index.js +481 -39
- package/dist/db/index.js.map +1 -1
- package/dist/engine.d.ts +15 -0
- package/dist/engine.js +28 -0
- package/dist/engine.js.map +1 -0
- package/dist/indexer/imports.d.ts +6 -0
- package/dist/indexer/imports.js +254 -0
- package/dist/indexer/imports.js.map +1 -0
- package/dist/indexer/index.d.ts +63 -0
- package/dist/indexer/index.js +360 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/process.d.ts +22 -0
- package/dist/indexer/process.js +42 -0
- package/dist/indexer/process.js.map +1 -0
- package/dist/indexer/scan.d.ts +43 -0
- package/dist/indexer/scan.js +223 -0
- package/dist/indexer/scan.js.map +1 -0
- package/dist/indexer/worker.d.ts +1 -0
- package/dist/indexer/worker.js +23 -0
- package/dist/indexer/worker.js.map +1 -0
- package/dist/llm/comment-generator.d.ts +17 -19
- package/dist/llm/comment-generator.js +46 -80
- package/dist/llm/comment-generator.js.map +1 -1
- package/dist/llm/index.d.ts +0 -1
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/prompts.d.ts +0 -1
- package/dist/llm/prompts.js +16 -16
- package/dist/parser/extractor.d.ts +21 -16
- package/dist/parser/extractor.js +700 -228
- package/dist/parser/extractor.js.map +1 -1
- package/dist/parser/index.d.ts +17 -21
- package/dist/parser/index.js +115 -171
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/langs/c.d.ts +3 -0
- package/dist/parser/langs/c.js +879 -0
- package/dist/parser/langs/c.js.map +1 -0
- package/dist/parser/langs/csharp.d.ts +2 -0
- package/dist/parser/langs/csharp.js +548 -0
- package/dist/parser/langs/csharp.js.map +1 -0
- package/dist/parser/langs/dart.d.ts +2 -0
- package/dist/parser/langs/dart.js +893 -0
- package/dist/parser/langs/dart.js.map +1 -0
- package/dist/parser/langs/go.d.ts +2 -0
- package/dist/parser/langs/go.js +455 -0
- package/dist/parser/langs/go.js.map +1 -0
- package/dist/parser/langs/java.d.ts +2 -0
- package/dist/parser/langs/java.js +390 -0
- package/dist/parser/langs/java.js.map +1 -0
- package/dist/parser/langs/php.d.ts +2 -0
- package/dist/parser/langs/php.js +486 -0
- package/dist/parser/langs/php.js.map +1 -0
- package/dist/parser/langs/python.d.ts +2 -0
- package/dist/parser/langs/python.js +216 -0
- package/dist/parser/langs/python.js.map +1 -0
- package/dist/parser/langs/ruby.d.ts +2 -0
- package/dist/parser/langs/ruby.js +602 -0
- package/dist/parser/langs/ruby.js.map +1 -0
- package/dist/parser/langs/rust.d.ts +2 -0
- package/dist/parser/langs/rust.js +931 -0
- package/dist/parser/langs/rust.js.map +1 -0
- package/dist/parser/langs/swift.d.ts +2 -0
- package/dist/parser/langs/swift.js +616 -0
- package/dist/parser/langs/swift.js.map +1 -0
- package/dist/parser/langs/typescript.d.ts +4 -0
- package/dist/parser/langs/typescript.js +535 -0
- package/dist/parser/langs/typescript.js.map +1 -0
- package/dist/parser/registry.d.ts +16 -0
- package/dist/parser/registry.js +87 -0
- package/dist/parser/registry.js.map +1 -0
- package/dist/parser/returns.d.ts +9 -0
- package/dist/parser/returns.js +152 -0
- package/dist/parser/returns.js.map +1 -0
- package/dist/parser/spec.d.ts +165 -0
- package/dist/parser/spec.js +188 -0
- package/dist/parser/spec.js.map +1 -0
- package/dist/query/arity.d.ts +27 -0
- package/dist/query/arity.js +187 -0
- package/dist/query/arity.js.map +1 -0
- package/dist/query/callgraph.d.ts +113 -0
- package/dist/query/callgraph.js +332 -0
- package/dist/query/callgraph.js.map +1 -0
- package/dist/query/format.d.ts +36 -0
- package/dist/query/format.js +136 -0
- package/dist/query/format.js.map +1 -0
- package/dist/query/hierarchy.d.ts +44 -0
- package/dist/query/hierarchy.js +441 -0
- package/dist/query/hierarchy.js.map +1 -0
- package/dist/query/resolve.d.ts +265 -0
- package/dist/query/resolve.js +1957 -0
- package/dist/query/resolve.js.map +1 -0
- package/dist/query/search.d.ts +35 -0
- package/dist/query/search.js +379 -0
- package/dist/query/search.js.map +1 -0
- package/dist/query/words.d.ts +30 -0
- package/dist/query/words.js +201 -0
- package/dist/query/words.js.map +1 -0
- package/dist/server/index.d.ts +1 -3
- package/dist/server/index.js +313 -73
- package/dist/server/index.js.map +1 -1
- package/dist/tools/context.d.ts +35 -0
- package/dist/tools/context.js +79 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/explore.d.ts +51 -0
- package/dist/tools/explore.js +779 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/impact.d.ts +21 -0
- package/dist/tools/impact.js +743 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.js +843 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/stats.d.ts +26 -0
- package/dist/tools/stats.js +604 -0
- package/dist/tools/stats.js.map +1 -0
- package/dist/types.d.ts +95 -40
- package/dist/types.js +9 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher/index.d.ts +18 -16
- package/dist/watcher/index.js +94 -77
- package/dist/watcher/index.js.map +1 -1
- package/package.json +21 -24
- package/plugin/server.mjs +50 -0
- package/skills/audit/SKILL.md +37 -0
- package/skills/deadcode/SKILL.md +33 -0
- package/skills/explore/SKILL.md +54 -0
- package/skills/impact/SKILL.md +24 -0
- package/skills/status/SKILL.md +11 -0
- package/src/cli.ts +256 -0
- package/src/config/defaults.ts +50 -32
- package/src/config/index.ts +23 -14
- package/src/db/index.ts +540 -43
- package/src/engine.ts +30 -0
- package/src/indexer/imports.ts +241 -0
- package/src/indexer/index.ts +369 -0
- package/src/indexer/process.ts +63 -0
- package/src/indexer/scan.ts +226 -0
- package/src/indexer/worker.ts +24 -0
- package/src/llm/comment-generator.ts +52 -103
- package/src/llm/index.ts +80 -80
- package/src/llm/prompts.ts +95 -95
- package/src/parser/extractor.ts +643 -256
- package/src/parser/index.ts +105 -205
- package/src/parser/langs/c.ts +860 -0
- package/src/parser/langs/csharp.ts +519 -0
- package/src/parser/langs/dart.ts +820 -0
- package/src/parser/langs/go.ts +437 -0
- package/src/parser/langs/java.ts +361 -0
- package/src/parser/langs/php.ts +450 -0
- package/src/parser/langs/python.ts +206 -0
- package/src/parser/langs/ruby.ts +554 -0
- package/src/parser/langs/rust.ts +904 -0
- package/src/parser/langs/swift.ts +590 -0
- package/src/parser/langs/typescript.ts +499 -0
- package/src/parser/registry.ts +88 -0
- package/src/parser/returns.ts +137 -0
- package/src/parser/spec.ts +309 -0
- package/src/query/arity.ts +173 -0
- package/src/query/callgraph.ts +473 -0
- package/src/query/format.ts +136 -0
- package/src/query/hierarchy.ts +447 -0
- package/src/query/resolve.ts +1972 -0
- package/src/query/search.ts +430 -0
- package/src/query/words.ts +183 -0
- package/src/server/index.ts +390 -79
- package/src/tools/context.ts +82 -0
- package/src/tools/explore.ts +860 -0
- package/src/tools/impact.ts +748 -0
- package/src/tools/search.ts +886 -0
- package/src/tools/stats.ts +633 -0
- package/src/types.ts +113 -45
- package/src/version.ts +2 -0
- package/src/watcher/index.ts +82 -88
- package/tsconfig.json +7 -4
- package/.mcp.json +0 -8
- package/commands/clast-status.md +0 -9
- package/dist/config/defaults.d.ts.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/queries.d.ts +0 -44
- package/dist/db/queries.d.ts.map +0 -1
- package/dist/db/queries.js +0 -251
- package/dist/db/queries.js.map +0 -1
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -94
- package/dist/db/schema.js.map +0 -1
- package/dist/db/types.d.ts +0 -44
- package/dist/db/types.d.ts.map +0 -1
- package/dist/db/types.js +0 -2
- package/dist/db/types.js.map +0 -1
- package/dist/llm/comment-generator.d.ts.map +0 -1
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/prompts.d.ts.map +0 -1
- package/dist/parser/call-resolver.d.ts +0 -15
- package/dist/parser/call-resolver.d.ts.map +0 -1
- package/dist/parser/call-resolver.js +0 -16
- package/dist/parser/call-resolver.js.map +0 -1
- package/dist/parser/extractor.d.ts.map +0 -1
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/languages.d.ts +0 -11
- package/dist/parser/languages.d.ts.map +0 -1
- package/dist/parser/languages.js +0 -74
- package/dist/parser/languages.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/register-tools.d.ts +0 -7
- package/dist/server/register-tools.d.ts.map +0 -1
- package/dist/server/register-tools.js +0 -17
- package/dist/server/register-tools.js.map +0 -1
- package/dist/server/tools/clast-call-graph.d.ts +0 -4
- package/dist/server/tools/clast-call-graph.d.ts.map +0 -1
- package/dist/server/tools/clast-call-graph.js +0 -70
- package/dist/server/tools/clast-call-graph.js.map +0 -1
- package/dist/server/tools/clast-comment.d.ts +0 -5
- package/dist/server/tools/clast-comment.d.ts.map +0 -1
- package/dist/server/tools/clast-comment.js +0 -64
- package/dist/server/tools/clast-comment.js.map +0 -1
- package/dist/server/tools/clast-file-summary.d.ts +0 -4
- package/dist/server/tools/clast-file-summary.d.ts.map +0 -1
- package/dist/server/tools/clast-file-summary.js +0 -42
- package/dist/server/tools/clast-file-summary.js.map +0 -1
- package/dist/server/tools/clast-get-context.d.ts +0 -4
- package/dist/server/tools/clast-get-context.d.ts.map +0 -1
- package/dist/server/tools/clast-get-context.js +0 -80
- package/dist/server/tools/clast-get-context.js.map +0 -1
- package/dist/server/tools/clast-reindex.d.ts +0 -5
- package/dist/server/tools/clast-reindex.d.ts.map +0 -1
- package/dist/server/tools/clast-reindex.js +0 -36
- package/dist/server/tools/clast-reindex.js.map +0 -1
- package/dist/server/tools/clast-search.d.ts +0 -4
- package/dist/server/tools/clast-search.d.ts.map +0 -1
- package/dist/server/tools/clast-search.js +0 -29
- package/dist/server/tools/clast-search.js.map +0 -1
- package/dist/server/tools/clast-status.d.ts +0 -5
- package/dist/server/tools/clast-status.d.ts.map +0 -1
- package/dist/server/tools/clast-status.js +0 -23
- package/dist/server/tools/clast-status.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/watcher/gitignore.d.ts +0 -9
- package/dist/watcher/gitignore.d.ts.map +0 -1
- package/dist/watcher/gitignore.js +0 -38
- package/dist/watcher/gitignore.js.map +0 -1
- package/dist/watcher/index.d.ts.map +0 -1
- package/skills/clast-explore/SKILL.md +0 -41
- package/src/db/queries.ts +0 -332
- package/src/db/schema.ts +0 -106
- package/src/db/types.ts +0 -47
- package/src/parser/call-resolver.ts +0 -17
- package/src/parser/languages.ts +0 -86
- package/src/server/register-tools.ts +0 -30
- package/src/server/tools/clast-call-graph.ts +0 -82
- package/src/server/tools/clast-comment.ts +0 -76
- package/src/server/tools/clast-file-summary.ts +0 -59
- package/src/server/tools/clast-get-context.ts +0 -97
- package/src/server/tools/clast-reindex.ts +0 -52
- package/src/server/tools/clast-search.ts +0 -38
- package/src/server/tools/clast-status.ts +0 -37
- package/src/watcher/gitignore.ts +0 -42
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { SYMBOL_COLUMNS, SYMBOL_FROM } from '../db/index.js';
|
|
2
|
+
import { CONTAINER_KINDS } from '../types.js';
|
|
3
|
+
import { isTestPath } from './format.js';
|
|
4
|
+
import { genericArity } from '../parser/spec.js';
|
|
5
|
+
import { langFamily } from './resolve.js';
|
|
6
|
+
/** Type parameters a type is declared with: `class ActionResult<TValue>` -> 1. */
|
|
7
|
+
function declaredArity(sym) {
|
|
8
|
+
const at = sym.signature.search(new RegExp('\\b' + sym.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\s*<'));
|
|
9
|
+
return at === -1 ? 0 : genericArity(sym.signature.slice(at));
|
|
10
|
+
}
|
|
11
|
+
const isPartial = (s) => /\bpartial\b/.test(s.signature);
|
|
12
|
+
/** C# static classes cannot be inherited from. */
|
|
13
|
+
const isStaticClass = (s) => s.lang === 'csharp' && /\bstatic\s+(partial\s+)?class\b/.test(s.signature);
|
|
14
|
+
const RUST_RELATIVE = new Set(['crate', 'self', 'super', 'Self']);
|
|
15
|
+
/**
|
|
16
|
+
* Can `qualifier.Name` / `qualifier::Name` written in Go or Rust mean the type `cand`?
|
|
17
|
+
* The qualifier is a package or module, which shows in the path of the defining file
|
|
18
|
+
* (directory or file name). Other languages: always true. `strict` rejects relative paths too.
|
|
19
|
+
*/
|
|
20
|
+
function qualifierFits(qualifier, cand, lang, strict = false) {
|
|
21
|
+
if (lang !== 'go' && lang !== 'rust')
|
|
22
|
+
return true;
|
|
23
|
+
const q = qualifier.split(/::|\./).filter(Boolean);
|
|
24
|
+
const last = q[q.length - 1];
|
|
25
|
+
if (!last)
|
|
26
|
+
return true;
|
|
27
|
+
if (lang === 'rust' && RUST_RELATIVE.has(last))
|
|
28
|
+
return !strict;
|
|
29
|
+
const segs = cand.path.toLowerCase().split('/');
|
|
30
|
+
const want = last.toLowerCase().replace(/_/g, '-');
|
|
31
|
+
for (let i = 0; i < segs.length; i++) {
|
|
32
|
+
const seg = (i === segs.length - 1 ? segs[i].replace(/\.[a-z]+$/, '') : segs[i]).replace(/_/g, '-');
|
|
33
|
+
if (seg === want)
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
// An enclosing module / type of the same name inside the file.
|
|
37
|
+
return cand.qname.split('.').slice(0, -1).some(p => p.toLowerCase() === last.toLowerCase());
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Lexical scope lookup of a type name written inside `from`: `Enum` inside
|
|
41
|
+
* `ActiveRecord.Base` is `ActiveRecord.Base.Enum`, else `ActiveRecord.Enum`,
|
|
42
|
+
* else top-level `Enum`. Returns null when no enclosing scope defines it.
|
|
43
|
+
*/
|
|
44
|
+
function lexicalType(db, from, qualifier, name) {
|
|
45
|
+
const cands = db
|
|
46
|
+
.symbolsByName(name)
|
|
47
|
+
.filter(s => (CONTAINER_KINDS.has(s.kind) || s.kind === 'type') && s.id !== from.id && s.lang === from.lang && !isStaticClass(s));
|
|
48
|
+
if (cands.length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
const parts = from.qname.split('.');
|
|
51
|
+
const tail = (qualifier ? qualifier.replace(/::|\\/g, '.') + '.' : '') + name;
|
|
52
|
+
for (let n = parts.length; n >= 0; n--) {
|
|
53
|
+
const want = (n ? parts.slice(0, n).join('.') + '.' : '') + tail;
|
|
54
|
+
const hits = cands.filter(s => s.qname === want);
|
|
55
|
+
if (hits.length)
|
|
56
|
+
return hits.find(s => !isTestPath(s.path)) ?? hits[0];
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Types that directly extend / implement `sym`. Heritage is recorded by
|
|
62
|
+
* name, so each candidate is checked by resolving that name from the
|
|
63
|
+
* subtype's file (imports, same file, proximity) back to `sym`.
|
|
64
|
+
*/
|
|
65
|
+
export function directSubtypes(db, resolver, sym) {
|
|
66
|
+
if (isStaticClass(sym))
|
|
67
|
+
return [];
|
|
68
|
+
const symArity = sym.lang === 'csharp' ? declaredArity(sym) : -1;
|
|
69
|
+
const select = `SELECT ${SYMBOL_COLUMNS}, h.kind AS hkind, h.qualifier AS hqual, h.arity AS harity, h.file_id AS hfile FROM heritage h
|
|
70
|
+
JOIN symbols s ON s.id = h.symbol_id JOIN files f ON f.id = s.file_id`;
|
|
71
|
+
const rows = db.all(`${select} WHERE h.name = ? LIMIT 5000`, sym.name);
|
|
72
|
+
const sameName = db.symbolsByName(sym.name).filter(s => CONTAINER_KINDS.has(s.kind) || s.kind === 'type');
|
|
73
|
+
const out = [];
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
// Subtypes that name the supertype through an import alias (`import { X as Base }`).
|
|
76
|
+
for (const use of resolver.aliasesOf(sym)) {
|
|
77
|
+
for (const row of db.all(`${select} WHERE h.name = ? AND h.file_id = ?`, use.alias, use.fileId)) {
|
|
78
|
+
if (row.id === sym.id || seen.has(row.id))
|
|
79
|
+
continue;
|
|
80
|
+
seen.add(row.id);
|
|
81
|
+
out.push({ sym: row, kind: row.hkind, certain: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const qparts = sym.qname.split('.');
|
|
85
|
+
const symContainer = qparts.length >= 2 ? qparts[qparts.length - 2] : null;
|
|
86
|
+
for (const row of rows) {
|
|
87
|
+
if (row.id === sym.id || seen.has(row.id))
|
|
88
|
+
continue;
|
|
89
|
+
// A C++ class does not implement a C# interface of the same name.
|
|
90
|
+
if (langFamily(row.lang) !== langFamily(sym.lang))
|
|
91
|
+
continue;
|
|
92
|
+
// `io.Closer` / a `Wake` imported from std is not the project's type of that name.
|
|
93
|
+
if (resolver.externalSupertype(sym.name, row.hqual, row.hfile, row.lang))
|
|
94
|
+
continue;
|
|
95
|
+
// C#: `Foo` and `Foo<T>` are different types.
|
|
96
|
+
if (symArity !== -1 && row.harity !== symArity)
|
|
97
|
+
continue;
|
|
98
|
+
let certain = true;
|
|
99
|
+
const lex = row.lang === 'ruby' ? lexicalType(db, row, row.hqual, sym.name) : null;
|
|
100
|
+
if (lex) {
|
|
101
|
+
// Ruby constant lookup is lexical: the name means the nearest enclosing definition.
|
|
102
|
+
if (lex.id !== sym.id && lex.qname !== sym.qname)
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
else if (row.lang === 'ruby' && !row.hqual && sym.qname.includes('.')) {
|
|
106
|
+
continue; // the unqualified name does not reach this nested constant from there
|
|
107
|
+
}
|
|
108
|
+
else if (row.hqual && !qualifierFits(row.hqual, sym, row.lang)) {
|
|
109
|
+
continue; // Go / Rust: qualified by another package or module
|
|
110
|
+
}
|
|
111
|
+
else if (row.hqual && symContainer) {
|
|
112
|
+
// Written as Outer::Name / Outer.Name: the qualifier must be our enclosing type or namespace.
|
|
113
|
+
if (row.hqual !== symContainer)
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
else if (sameName.length > 1 || row.hqual) {
|
|
117
|
+
const res = resolver.resolve(sym.name, { fileId: row.file_id, path: row.path, lang: row.lang, receiver: row.hqual, caller: row }, 0, true);
|
|
118
|
+
// A type does not extend itself (`class Foo<T> : Foo`), and in C# the arity must match.
|
|
119
|
+
const cands = res.candidates.filter(c => c.sym.id !== row.id && (symArity === -1 || declaredArity(c.sym) === row.harity) && !isStaticClass(c.sym));
|
|
120
|
+
const top = cands[0];
|
|
121
|
+
if (!top) {
|
|
122
|
+
certain = false;
|
|
123
|
+
}
|
|
124
|
+
else if (top.sym.id !== sym.id) {
|
|
125
|
+
const mine = cands.find(c => c.sym.id === sym.id);
|
|
126
|
+
// The heritage name clearly refers to another definition of the same name.
|
|
127
|
+
if (!mine || top.score - mine.score > 10)
|
|
128
|
+
continue;
|
|
129
|
+
certain = false;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// C#: the arity already singled out one of the same-named types.
|
|
133
|
+
certain = res.confident || (symArity !== -1 && cands.length === 1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
seen.add(row.id);
|
|
137
|
+
out.push({ sym: row, kind: row.hkind, certain });
|
|
138
|
+
}
|
|
139
|
+
out.sort((a, b) => Number(b.certain) - Number(a.certain) ||
|
|
140
|
+
Number(isTestPath(a.sym.path)) - Number(isTestPath(b.sym.path)) ||
|
|
141
|
+
Number(b.sym.file_id === sym.file_id) - Number(a.sym.file_id === sym.file_id) ||
|
|
142
|
+
a.sym.path.localeCompare(b.sym.path) ||
|
|
143
|
+
a.sym.start_line - b.sym.start_line);
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
/** Declared supertypes of `sym`, resolved to project symbols where possible. */
|
|
147
|
+
export function directSupertypes(db, resolver, sym) {
|
|
148
|
+
// C# partial classes: the base list may be on any of the parts.
|
|
149
|
+
let ids = [sym.id];
|
|
150
|
+
if (sym.lang === 'csharp' && isPartial(sym)) {
|
|
151
|
+
const dir = sym.path.slice(0, sym.path.lastIndexOf('/') + 1);
|
|
152
|
+
ids = db
|
|
153
|
+
.symbolsByName(sym.name)
|
|
154
|
+
.filter(s => s.qname === sym.qname && s.kind === sym.kind && s.lang === sym.lang && isPartial(s) && s.path.startsWith(dir))
|
|
155
|
+
.map(s => s.id);
|
|
156
|
+
if (!ids.includes(sym.id))
|
|
157
|
+
ids.push(sym.id);
|
|
158
|
+
}
|
|
159
|
+
const rows = db.all(`SELECT name, kind, qualifier, arity, file_id FROM heritage WHERE symbol_id IN (${ids.map(() => '?').join(',')})`, ...ids);
|
|
160
|
+
const out = [];
|
|
161
|
+
const seen = new Set();
|
|
162
|
+
for (const row of rows) {
|
|
163
|
+
// (`include Thor::Actions` and `include Rails::Generators::Actions` are two supertypes.)
|
|
164
|
+
const key = `${row.qualifier ?? ''}::${row.name}`;
|
|
165
|
+
if (seen.has(key))
|
|
166
|
+
continue;
|
|
167
|
+
seen.add(key);
|
|
168
|
+
const isType = (s) => (CONTAINER_KINDS.has(s.kind) || s.kind === 'type') && s.id !== sym.id && !isStaticClass(s) &&
|
|
169
|
+
// Rust associated types (`type Future = ...` inside an impl) are not the trait `Future`.
|
|
170
|
+
!(s.lang === 'rust' && s.kind === 'type' && s.qname !== s.name);
|
|
171
|
+
if (resolver.externalSupertype(row.name, row.qualifier, row.file_id, sym.lang)) {
|
|
172
|
+
out.push({ name: row.name, kind: row.kind, sym: null });
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
let res = resolver.resolve(row.name, { fileId: sym.file_id, path: sym.path, lang: sym.lang, receiver: row.qualifier, caller: sym }, 0, true);
|
|
176
|
+
let target = res.candidates.find(c => isType(c.sym));
|
|
177
|
+
if (sym.lang === 'ruby' || !res.confident) {
|
|
178
|
+
const lex = lexicalType(db, sym, row.qualifier, row.name);
|
|
179
|
+
if (lex)
|
|
180
|
+
target = { sym: lex, score: 95 };
|
|
181
|
+
// Ruby: an unqualified constant that no enclosing scope defines is not some class of that name
|
|
182
|
+
// nested elsewhere (`class SlowRedis < Redis` at top level means the gem's Redis).
|
|
183
|
+
// The same holds for a qualified one: `Thor::Group` is not some other class called Group.
|
|
184
|
+
else if (sym.lang === 'ruby')
|
|
185
|
+
target = undefined;
|
|
186
|
+
}
|
|
187
|
+
if (!target && row.qualifier && sym.lang !== 'ruby') {
|
|
188
|
+
// Qualified by an enclosing type / namespace that is part of the qualified name.
|
|
189
|
+
const want = row.qualifier + '.' + row.name;
|
|
190
|
+
const direct = db.symbolsByName(row.name).find(s => isType(s) && (s.qname === want || s.qname.endsWith('.' + want)));
|
|
191
|
+
if (direct)
|
|
192
|
+
target = { sym: direct, score: 90 };
|
|
193
|
+
else {
|
|
194
|
+
res = resolver.resolve(row.name, { fileId: sym.file_id, path: sym.path, lang: sym.lang, receiver: null, caller: sym }, 0, true);
|
|
195
|
+
target = res.candidates.find(c => isType(c.sym) && qualifierFits(row.qualifier, c.sym, sym.lang));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Go / Rust: `page.Provider`, `futures_io::AsyncRead` name a package / module. A same-named type
|
|
199
|
+
// that lives somewhere else is a different type.
|
|
200
|
+
if (target && row.qualifier && !qualifierFits(row.qualifier, target.sym, sym.lang)) {
|
|
201
|
+
const better = db.symbolsByName(row.name).find(s => isType(s) && s.lang === sym.lang && qualifierFits(row.qualifier, s, sym.lang, true));
|
|
202
|
+
target = better ? { sym: better, score: 90 } : undefined;
|
|
203
|
+
}
|
|
204
|
+
if (target && sym.lang === 'csharp' && declaredArity(target.sym) !== row.arity) {
|
|
205
|
+
// `: ActionResult` is not `ActionResult<TValue>`.
|
|
206
|
+
const fit = db.symbolsByName(row.name).filter(s => isType(s) && s.lang === 'csharp' && declaredArity(s) === row.arity);
|
|
207
|
+
const best = fit.find(s => !isTestPath(s.path)) ?? fit[0];
|
|
208
|
+
target = best ? { sym: best, score: 90 } : undefined;
|
|
209
|
+
}
|
|
210
|
+
// PHP traits are recorded as 'implements'; say what they are.
|
|
211
|
+
const kind = target && target.sym.kind === 'trait' && sym.lang === 'php' ? 'uses' : row.kind;
|
|
212
|
+
out.push({ name: row.name, kind, sym: target ? target.sym : null });
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
function dirOf(path) {
|
|
217
|
+
const i = path.lastIndexOf('/');
|
|
218
|
+
return i === -1 ? '' : path.slice(0, i);
|
|
219
|
+
}
|
|
220
|
+
/** Top-level comma-separated items in a parameter / result list. */
|
|
221
|
+
function countItems(list) {
|
|
222
|
+
if (!list.trim())
|
|
223
|
+
return 0;
|
|
224
|
+
let depth = 0;
|
|
225
|
+
let n = 1;
|
|
226
|
+
for (const ch of list) {
|
|
227
|
+
if (ch === '(' || ch === '[' || ch === '{')
|
|
228
|
+
depth++;
|
|
229
|
+
else if (ch === ')' || ch === ']' || ch === '}')
|
|
230
|
+
depth--;
|
|
231
|
+
else if (ch === ',' && depth === 0)
|
|
232
|
+
n++;
|
|
233
|
+
}
|
|
234
|
+
return n;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Shape of a Go method signature: number of parameters and of results
|
|
238
|
+
* (`Close() error` -> "0/1", `Close(n Node, r Reader)` -> "2/0"). Go matches
|
|
239
|
+
* interfaces on full signatures; counting is enough to reject look-alikes
|
|
240
|
+
* without parsing types. Null when the signature cannot be read.
|
|
241
|
+
*/
|
|
242
|
+
export function goShape(signature, name) {
|
|
243
|
+
let sig = signature;
|
|
244
|
+
// func (r *T) Name(...) ...: skip the receiver.
|
|
245
|
+
const recv = /^func\s*\(/.exec(sig);
|
|
246
|
+
if (recv) {
|
|
247
|
+
let depth = 0;
|
|
248
|
+
let i = recv[0].length - 1;
|
|
249
|
+
for (; i < sig.length; i++) {
|
|
250
|
+
if (sig[i] === '(')
|
|
251
|
+
depth++;
|
|
252
|
+
else if (sig[i] === ')' && --depth === 0)
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
sig = sig.slice(i + 1);
|
|
256
|
+
}
|
|
257
|
+
const at = sig.indexOf(name);
|
|
258
|
+
if (at === -1)
|
|
259
|
+
return null;
|
|
260
|
+
let i = at + name.length;
|
|
261
|
+
while (i < sig.length && sig[i] === ' ')
|
|
262
|
+
i++;
|
|
263
|
+
if (sig[i] === '[') {
|
|
264
|
+
// type parameters
|
|
265
|
+
let depth = 0;
|
|
266
|
+
for (; i < sig.length; i++) {
|
|
267
|
+
if (sig[i] === '[')
|
|
268
|
+
depth++;
|
|
269
|
+
else if (sig[i] === ']' && --depth === 0) {
|
|
270
|
+
i++;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (sig[i] !== '(')
|
|
276
|
+
return null;
|
|
277
|
+
let depth = 0;
|
|
278
|
+
const open = i;
|
|
279
|
+
for (; i < sig.length; i++) {
|
|
280
|
+
if (sig[i] === '(')
|
|
281
|
+
depth++;
|
|
282
|
+
else if (sig[i] === ')' && --depth === 0)
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
if (i >= sig.length)
|
|
286
|
+
return null; // cut off
|
|
287
|
+
const params = countItems(sig.slice(open + 1, i));
|
|
288
|
+
const rest = sig.slice(i + 1).replace(/\{\s*$/, '').trim();
|
|
289
|
+
let results = 0;
|
|
290
|
+
if (rest.startsWith('(')) {
|
|
291
|
+
const close = rest.lastIndexOf(')');
|
|
292
|
+
if (close === -1)
|
|
293
|
+
return null;
|
|
294
|
+
results = countItems(rest.slice(1, close));
|
|
295
|
+
}
|
|
296
|
+
else if (rest) {
|
|
297
|
+
results = 1;
|
|
298
|
+
}
|
|
299
|
+
return params + '/' + results;
|
|
300
|
+
}
|
|
301
|
+
function membersOf(db, containerId) {
|
|
302
|
+
const seen = new Set();
|
|
303
|
+
const out = [];
|
|
304
|
+
for (const r of db.all(`SELECT id, name, signature FROM symbols WHERE parent_id = ? AND kind = 'method'`, containerId)) {
|
|
305
|
+
if (seen.has(r.name))
|
|
306
|
+
continue;
|
|
307
|
+
seen.add(r.name);
|
|
308
|
+
out.push({ id: r.id, name: r.name, shape: goShape(r.signature, r.name) });
|
|
309
|
+
}
|
|
310
|
+
return out;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Methods of the type called `typeName` that are defined outside its body
|
|
314
|
+
* (Go receivers), with their shapes. `dir` limits this to one package.
|
|
315
|
+
*/
|
|
316
|
+
function methodsOfType(db, typeName, lang, dir) {
|
|
317
|
+
const rows = db.all(`SELECT s.name, s.qname, s.signature, f.path FROM symbols s JOIN files f ON f.id = s.file_id
|
|
318
|
+
WHERE s.kind = 'method' AND f.lang = ? AND s.qname LIKE ? ESCAPE '\\'`, lang, '%' + typeName.replace(/[\\%_]/g, c => '\\' + c) + '.%');
|
|
319
|
+
const out = new Map();
|
|
320
|
+
for (const r of rows) {
|
|
321
|
+
const parts = r.qname.split('.');
|
|
322
|
+
if (parts.length < 2 || parts[parts.length - 2] !== typeName)
|
|
323
|
+
continue;
|
|
324
|
+
if (dir !== undefined && dirOf(r.path) !== dir)
|
|
325
|
+
continue;
|
|
326
|
+
let set = out.get(r.name);
|
|
327
|
+
if (!set)
|
|
328
|
+
out.set(r.name, (set = new Set()));
|
|
329
|
+
set.add(goShape(r.signature, r.name));
|
|
330
|
+
}
|
|
331
|
+
return out;
|
|
332
|
+
}
|
|
333
|
+
/** Does a method set cover every required interface method (by name and, where readable, shape)? */
|
|
334
|
+
function covers(methods, required) {
|
|
335
|
+
for (const m of required) {
|
|
336
|
+
const shapes = methods.get(m.name);
|
|
337
|
+
if (!shapes)
|
|
338
|
+
return false;
|
|
339
|
+
if (m.shape !== null && !shapes.has(m.shape) && !shapes.has(null))
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Go has no `implements`: a type satisfies an interface when its method set
|
|
346
|
+
* contains the interface's methods. Returns the types whose methods (name,
|
|
347
|
+
* parameter and result counts) cover every method of the interface.
|
|
348
|
+
*/
|
|
349
|
+
export function structuralImplementers(db, iface, limit = 200) {
|
|
350
|
+
if (iface.lang !== 'go' || iface.kind !== 'interface')
|
|
351
|
+
return [];
|
|
352
|
+
const required = membersOf(db, iface.id);
|
|
353
|
+
if (required.length === 0)
|
|
354
|
+
return [];
|
|
355
|
+
// Start from the rarest method name to keep the candidate set small.
|
|
356
|
+
let rarest = required[0].name;
|
|
357
|
+
let rarestCount = Infinity;
|
|
358
|
+
for (const m of required) {
|
|
359
|
+
const n = db.get(`SELECT COUNT(*) AS n FROM symbols WHERE name = ? AND kind = 'method'`, m.name)?.n ?? 0;
|
|
360
|
+
if (n < rarestCount) {
|
|
361
|
+
rarestCount = n;
|
|
362
|
+
rarest = m.name;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
const holders = db.all(`SELECT s.qname, f.path FROM symbols s JOIN files f ON f.id = s.file_id
|
|
366
|
+
WHERE s.name = ? AND s.kind = 'method' AND f.lang = 'go' LIMIT 5000`, rarest);
|
|
367
|
+
// A type is identified by its package directory and name.
|
|
368
|
+
const types = new Map();
|
|
369
|
+
for (const h of holders) {
|
|
370
|
+
const parts = h.qname.split('.');
|
|
371
|
+
if (parts.length < 2)
|
|
372
|
+
continue;
|
|
373
|
+
const name = parts[parts.length - 2];
|
|
374
|
+
const dir = dirOf(h.path);
|
|
375
|
+
if (name === iface.name && dir === dirOf(iface.path))
|
|
376
|
+
continue;
|
|
377
|
+
types.set(dir + '\0' + name, { dir, name });
|
|
378
|
+
}
|
|
379
|
+
const out = [];
|
|
380
|
+
for (const t of types.values()) {
|
|
381
|
+
if (!covers(methodsOfType(db, t.name, 'go', t.dir), required))
|
|
382
|
+
continue;
|
|
383
|
+
const defs = db
|
|
384
|
+
.all(`SELECT ${SYMBOL_COLUMNS} FROM ${SYMBOL_FROM} WHERE s.name = ? AND f.lang = 'go'`, t.name)
|
|
385
|
+
.filter(s => (s.kind === 'struct' || s.kind === 'type') && dirOf(s.path) === t.dir);
|
|
386
|
+
for (const d of defs)
|
|
387
|
+
out.push(d);
|
|
388
|
+
if (out.length >= limit)
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
out.sort((a, b) => Number(isTestPath(a.path)) - Number(isTestPath(b.path)) || a.path.localeCompare(b.path));
|
|
392
|
+
return out;
|
|
393
|
+
}
|
|
394
|
+
/** Go: interfaces whose method set is covered by the methods of `type`. */
|
|
395
|
+
export function structuralInterfaces(db, type, limit = 40) {
|
|
396
|
+
if (type.lang !== 'go' || (type.kind !== 'struct' && type.kind !== 'type'))
|
|
397
|
+
return [];
|
|
398
|
+
const methods = methodsOfType(db, type.name, 'go', dirOf(type.path));
|
|
399
|
+
if (methods.size === 0)
|
|
400
|
+
return [];
|
|
401
|
+
const ifaces = db.all(`SELECT ${SYMBOL_COLUMNS} FROM ${SYMBOL_FROM} WHERE s.kind = 'interface' AND f.lang = 'go' LIMIT 20000`);
|
|
402
|
+
const out = [];
|
|
403
|
+
for (const iface of ifaces) {
|
|
404
|
+
const required = membersOf(db, iface.id);
|
|
405
|
+
if (required.length === 0 || required.length > methods.size)
|
|
406
|
+
continue;
|
|
407
|
+
if (covers(methods, required))
|
|
408
|
+
out.push(iface);
|
|
409
|
+
if (out.length >= limit)
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
out.sort((a, b) => Number(isTestPath(a.path)) - Number(isTestPath(b.path)) || a.path.localeCompare(b.path));
|
|
413
|
+
return out;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Go: ids of the interface methods that `method` implements (its type covers
|
|
417
|
+
* the whole interface). A call through such an interface may reach `method`.
|
|
418
|
+
*/
|
|
419
|
+
export function goInterfaceMethods(db, method) {
|
|
420
|
+
if (method.lang !== 'go' || method.kind !== 'method')
|
|
421
|
+
return [];
|
|
422
|
+
const parts = method.qname.split('.');
|
|
423
|
+
if (parts.length < 2)
|
|
424
|
+
return [];
|
|
425
|
+
const typeName = parts[parts.length - 2];
|
|
426
|
+
const decls = db.all(`SELECT s.id, s.parent_id FROM symbols s JOIN symbols p ON p.id = s.parent_id JOIN files f ON f.id = s.file_id
|
|
427
|
+
WHERE s.name = ? AND s.kind = 'method' AND p.kind = 'interface' AND f.lang = 'go' LIMIT 400`, method.name);
|
|
428
|
+
if (decls.length === 0)
|
|
429
|
+
return [];
|
|
430
|
+
const methods = methodsOfType(db, typeName, 'go', dirOf(method.path));
|
|
431
|
+
const out = [];
|
|
432
|
+
for (const d of decls) {
|
|
433
|
+
if (d.id === method.id)
|
|
434
|
+
continue;
|
|
435
|
+
const required = membersOf(db, d.parent_id);
|
|
436
|
+
if (required.length && covers(methods, required))
|
|
437
|
+
out.push(d.id);
|
|
438
|
+
}
|
|
439
|
+
return out;
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=hierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/query/hierarchy.ts"],"names":[],"mappings":"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"}
|