@tmhs/godot-correctness-mcp 0.1.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/LICENSE +34 -0
- package/README.md +118 -0
- package/data/godot-4.4.symbols.json.gz +0 -0
- package/data/godot-4.5.symbols.json.gz +0 -0
- package/data/tree-sitter-gdscript.wasm +0 -0
- package/dist/capabilities.d.ts +21 -0
- package/dist/capabilities.js +24 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.js +105 -0
- package/dist/cli.js.map +1 -0
- package/dist/gdscript/ast.d.ts +25 -0
- package/dist/gdscript/ast.js +82 -0
- package/dist/gdscript/ast.js.map +1 -0
- package/dist/gdscript/parser.d.ts +7 -0
- package/dist/gdscript/parser.js +44 -0
- package/dist/gdscript/parser.js.map +1 -0
- package/dist/godot/text-format.d.ts +35 -0
- package/dist/godot/text-format.js +105 -0
- package/dist/godot/text-format.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/config.d.ts +83 -0
- package/dist/lint/config.js +55 -0
- package/dist/lint/config.js.map +1 -0
- package/dist/lint/engine.d.ts +7 -0
- package/dist/lint/engine.js +33 -0
- package/dist/lint/engine.js.map +1 -0
- package/dist/lint/project.d.ts +12 -0
- package/dist/lint/project.js +49 -0
- package/dist/lint/project.js.map +1 -0
- package/dist/lint/rules/await-misuse.d.ts +3 -0
- package/dist/lint/rules/await-misuse.js +34 -0
- package/dist/lint/rules/await-misuse.js.map +1 -0
- package/dist/lint/rules/connect-without-disconnect.d.ts +7 -0
- package/dist/lint/rules/connect-without-disconnect.js +38 -0
- package/dist/lint/rules/connect-without-disconnect.js.map +1 -0
- package/dist/lint/rules/delta-misuse.d.ts +7 -0
- package/dist/lint/rules/delta-misuse.js +78 -0
- package/dist/lint/rules/delta-misuse.js.map +1 -0
- package/dist/lint/rules/float-grid-equality.d.ts +6 -0
- package/dist/lint/rules/float-grid-equality.js +39 -0
- package/dist/lint/rules/float-grid-equality.js.map +1 -0
- package/dist/lint/rules/get-node-in-process.d.ts +3 -0
- package/dist/lint/rules/get-node-in-process.js +31 -0
- package/dist/lint/rules/get-node-in-process.js.map +1 -0
- package/dist/lint/rules/index.d.ts +4 -0
- package/dist/lint/rules/index.js +21 -0
- package/dist/lint/rules/index.js.map +1 -0
- package/dist/lint/rules/missing-onready.d.ts +3 -0
- package/dist/lint/rules/missing-onready.js +52 -0
- package/dist/lint/rules/missing-onready.js.map +1 -0
- package/dist/lint/rules/stringly-nodepath.d.ts +3 -0
- package/dist/lint/rules/stringly-nodepath.js +35 -0
- package/dist/lint/rules/stringly-nodepath.js.map +1 -0
- package/dist/lint/rules/untyped-declaration.d.ts +7 -0
- package/dist/lint/rules/untyped-declaration.js +25 -0
- package/dist/lint/rules/untyped-declaration.js.map +1 -0
- package/dist/lint/types.d.ts +36 -0
- package/dist/lint/types.js +2 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/resources/skills.d.ts +12 -0
- package/dist/resources/skills.js +45 -0
- package/dist/resources/skills.js.map +1 -0
- package/dist/scenes/paths.d.ts +14 -0
- package/dist/scenes/paths.js +38 -0
- package/dist/scenes/paths.js.map +1 -0
- package/dist/scenes/report.d.ts +17 -0
- package/dist/scenes/report.js +25 -0
- package/dist/scenes/report.js.map +1 -0
- package/dist/scenes/validate.d.ts +16 -0
- package/dist/scenes/validate.js +185 -0
- package/dist/scenes/validate.js.map +1 -0
- package/dist/server-info.d.ts +13 -0
- package/dist/server-info.js +21 -0
- package/dist/server-info.js.map +1 -0
- package/dist/symbols/db.d.ts +11 -0
- package/dist/symbols/db.js +42 -0
- package/dist/symbols/db.js.map +1 -0
- package/dist/symbols/lookup.d.ts +89 -0
- package/dist/symbols/lookup.js +271 -0
- package/dist/symbols/lookup.js.map +1 -0
- package/dist/symbols/schema.d.ts +1419 -0
- package/dist/symbols/schema.js +109 -0
- package/dist/symbols/schema.js.map +1 -0
- package/dist/tools/api.d.ts +3 -0
- package/dist/tools/api.js +91 -0
- package/dist/tools/api.js.map +1 -0
- package/dist/tools/lint.d.ts +3 -0
- package/dist/tools/lint.js +45 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/scenes.d.ts +3 -0
- package/dist/tools/scenes.js +43 -0
- package/dist/tools/scenes.js.map +1 -0
- package/package.json +57 -0
- package/skills/data-driven-resources.md +78 -0
- package/skills/resource-preload.md +43 -0
- package/skills/signal-hygiene.md +46 -0
- package/skills/typed-gdscript.md +47 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { PINNED_GODOT_VERSIONS, pillarAvailability, } from "./capabilities.js";
|
|
5
|
+
export const SERVER_NAME = "godot-correctness-mcp";
|
|
6
|
+
/** Read the package version from the shipped package.json. */
|
|
7
|
+
export function readVersion() {
|
|
8
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
|
|
9
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
10
|
+
return pkg.version ?? "0.0.0";
|
|
11
|
+
}
|
|
12
|
+
/** Health payload: version, pinned Godot versions, and pillar availability. */
|
|
13
|
+
export function getServerInfo() {
|
|
14
|
+
return {
|
|
15
|
+
name: SERVER_NAME,
|
|
16
|
+
version: readVersion(),
|
|
17
|
+
godotVersions: [...PINNED_GODOT_VERSIONS],
|
|
18
|
+
pillars: pillarAvailability(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=server-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-info.js","sourceRoot":"","sources":["../src/server-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAEnD,8DAA8D;AAC9D,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAyB,CAAC;IAC/E,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AAChC,CAAC;AAUD,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,WAAW,EAAE;QACtB,aAAa,EAAE,CAAC,GAAG,qBAAqB,CAAC;QACzC,OAAO,EAAE,kBAAkB,EAAE;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SymbolDb } from "./schema.js";
|
|
2
|
+
/** Path to the committed gzipped symbol DB for a version label ("4.4"/"4.5"). */
|
|
3
|
+
export declare function dbPath(label: string): string;
|
|
4
|
+
/** Whether a symbol DB artifact is present for the given version label. */
|
|
5
|
+
export declare function isVersionAvailable(label: string): boolean;
|
|
6
|
+
/** Pinned versions that actually have a committed artifact. */
|
|
7
|
+
export declare function availableVersions(): string[];
|
|
8
|
+
/** Decompress, parse, and validate a DB from an explicit file path. */
|
|
9
|
+
export declare function loadSymbolDbFromFile(path: string): SymbolDb;
|
|
10
|
+
/** Load (and cache) the committed symbol DB for a version label. */
|
|
11
|
+
export declare function loadSymbolDb(label: string): SymbolDb;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { gunzipSync } from "node:zlib";
|
|
5
|
+
import { PINNED_GODOT_VERSIONS } from "../capabilities.js";
|
|
6
|
+
import { parseSymbolDb } from "./schema.js";
|
|
7
|
+
// dist/symbols/db.js and src/symbols/db.ts both sit two levels below the
|
|
8
|
+
// package root, so data/ resolves the same compiled or via tsx/vitest.
|
|
9
|
+
const dataDir = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "data");
|
|
10
|
+
const cache = new Map();
|
|
11
|
+
/** Path to the committed gzipped symbol DB for a version label ("4.4"/"4.5"). */
|
|
12
|
+
export function dbPath(label) {
|
|
13
|
+
return join(dataDir, `godot-${label}.symbols.json.gz`);
|
|
14
|
+
}
|
|
15
|
+
/** Whether a symbol DB artifact is present for the given version label. */
|
|
16
|
+
export function isVersionAvailable(label) {
|
|
17
|
+
return existsSync(dbPath(label));
|
|
18
|
+
}
|
|
19
|
+
/** Pinned versions that actually have a committed artifact. */
|
|
20
|
+
export function availableVersions() {
|
|
21
|
+
return PINNED_GODOT_VERSIONS.filter(isVersionAvailable);
|
|
22
|
+
}
|
|
23
|
+
/** Decompress, parse, and validate a DB from an explicit file path. */
|
|
24
|
+
export function loadSymbolDbFromFile(path) {
|
|
25
|
+
const raw = JSON.parse(gunzipSync(readFileSync(path)).toString("utf-8"));
|
|
26
|
+
return parseSymbolDb(raw);
|
|
27
|
+
}
|
|
28
|
+
/** Load (and cache) the committed symbol DB for a version label. */
|
|
29
|
+
export function loadSymbolDb(label) {
|
|
30
|
+
const cached = cache.get(label);
|
|
31
|
+
if (cached)
|
|
32
|
+
return cached;
|
|
33
|
+
const path = dbPath(label);
|
|
34
|
+
if (!existsSync(path)) {
|
|
35
|
+
throw new Error(`No symbol database for Godot ${label}. Expected ${path}. ` +
|
|
36
|
+
`Available: ${availableVersions().join(", ") || "none"}.`);
|
|
37
|
+
}
|
|
38
|
+
const db = loadSymbolDbFromFile(path);
|
|
39
|
+
cache.set(label, db);
|
|
40
|
+
return db;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/symbols/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAE3D,yEAAyE;AACzE,uEAAuE;AACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAElF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE1C,iFAAiF;AACjF,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,KAAK,kBAAkB,CAAC,CAAC;AACzD,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC1D,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAY,CAAC;IACpF,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,gCAAgC,KAAK,cAAc,IAAI,IAAI;YACzD,cAAc,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAC5D,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Method, Property, Signal, SymbolDb, UtilityFunction } from "./schema.js";
|
|
2
|
+
export declare function formatMethod(m: Method, owner?: string): string;
|
|
3
|
+
export declare function formatSignal(s: Signal, owner?: string): string;
|
|
4
|
+
export declare function formatProperty(p: Property, owner?: string): string;
|
|
5
|
+
export declare function formatUtility(u: UtilityFunction): string;
|
|
6
|
+
export type SymbolKind = "class" | "method" | "property" | "signal" | "enum" | "constant" | "builtin_class" | "builtin_method" | "utility_function" | "singleton" | "global_enum";
|
|
7
|
+
export interface SymbolMatch {
|
|
8
|
+
kind: SymbolKind;
|
|
9
|
+
name: string;
|
|
10
|
+
/** Owning class/builtin, or null for top-level symbols. */
|
|
11
|
+
owner: string | null;
|
|
12
|
+
signature: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LookupResult {
|
|
15
|
+
query: string;
|
|
16
|
+
matches: SymbolMatch[];
|
|
17
|
+
suggestions?: {
|
|
18
|
+
name: string;
|
|
19
|
+
kind: SymbolKind;
|
|
20
|
+
owner: string | null;
|
|
21
|
+
distance: number;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Look up a symbol by name. Supports "Owner.member" qualified queries. Falls
|
|
26
|
+
* back to closest-match suggestions when nothing matches exactly.
|
|
27
|
+
*/
|
|
28
|
+
export declare function lookupSymbol(db: SymbolDb, query: string, opts?: {
|
|
29
|
+
kind?: SymbolKind;
|
|
30
|
+
}): LookupResult;
|
|
31
|
+
export interface ClassSummary {
|
|
32
|
+
name: string;
|
|
33
|
+
inherits: string | null;
|
|
34
|
+
apiType: string;
|
|
35
|
+
isRefcounted: boolean;
|
|
36
|
+
isInstantiable: boolean;
|
|
37
|
+
inheritanceChain: string[];
|
|
38
|
+
methods: string[];
|
|
39
|
+
properties: string[];
|
|
40
|
+
signals: string[];
|
|
41
|
+
enums: string[];
|
|
42
|
+
constants: string[];
|
|
43
|
+
}
|
|
44
|
+
export declare function classSummary(db: SymbolDb, className: string): ClassSummary | undefined;
|
|
45
|
+
export interface MemberDiff {
|
|
46
|
+
added: string[];
|
|
47
|
+
removed: string[];
|
|
48
|
+
changed: {
|
|
49
|
+
name: string;
|
|
50
|
+
old: string;
|
|
51
|
+
new: string;
|
|
52
|
+
}[];
|
|
53
|
+
}
|
|
54
|
+
export interface ClassDiff {
|
|
55
|
+
class: string;
|
|
56
|
+
presence: {
|
|
57
|
+
fromLabel: string;
|
|
58
|
+
toLabel: string;
|
|
59
|
+
inFrom: boolean;
|
|
60
|
+
inTo: boolean;
|
|
61
|
+
};
|
|
62
|
+
methods: MemberDiff;
|
|
63
|
+
properties: MemberDiff;
|
|
64
|
+
signals: MemberDiff;
|
|
65
|
+
enums: MemberDiff;
|
|
66
|
+
constants: MemberDiff;
|
|
67
|
+
identical: boolean;
|
|
68
|
+
}
|
|
69
|
+
export declare function diffClass(from: SymbolDb, to: SymbolDb, className: string): ClassDiff;
|
|
70
|
+
export interface SymbolDiffEntry {
|
|
71
|
+
owner: string | null;
|
|
72
|
+
kind: SymbolKind;
|
|
73
|
+
name: string;
|
|
74
|
+
fromSignature: string | null;
|
|
75
|
+
toSignature: string | null;
|
|
76
|
+
status: "added" | "removed" | "changed" | "unchanged";
|
|
77
|
+
}
|
|
78
|
+
export interface SymbolDiff {
|
|
79
|
+
query: string;
|
|
80
|
+
fromLabel: string;
|
|
81
|
+
toLabel: string;
|
|
82
|
+
entries: SymbolDiffEntry[];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Diff a bare or qualified symbol name across versions. For a class name, use
|
|
86
|
+
* diffClass instead; this handles members (methods/properties/signals) found in
|
|
87
|
+
* either version, matched by owner+name.
|
|
88
|
+
*/
|
|
89
|
+
export declare function diffSymbol(from: SymbolDb, to: SymbolDb, query: string): SymbolDiff;
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Signature formatting
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
function fmtArgs(args) {
|
|
5
|
+
return args
|
|
6
|
+
.map((a) => `${a.type} ${a.name}${a.default !== undefined ? ` = ${a.default}` : ""}`)
|
|
7
|
+
.join(", ");
|
|
8
|
+
}
|
|
9
|
+
export function formatMethod(m, owner) {
|
|
10
|
+
const flags = [m.isStatic && "static", m.isConst && "const", m.isVirtual && "virtual"]
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.join(" ");
|
|
13
|
+
const prefix = flags ? `${flags} ` : "";
|
|
14
|
+
const vararg = m.isVararg ? (m.args.length ? ", ..." : "...") : "";
|
|
15
|
+
const q = owner ? `${owner}.` : "";
|
|
16
|
+
return `${prefix}${q}${m.name}(${fmtArgs(m.args)}${vararg}) -> ${m.ret ?? "void"}`;
|
|
17
|
+
}
|
|
18
|
+
export function formatSignal(s, owner) {
|
|
19
|
+
return `signal ${owner ? `${owner}.` : ""}${s.name}(${fmtArgs(s.args)})`;
|
|
20
|
+
}
|
|
21
|
+
export function formatProperty(p, owner) {
|
|
22
|
+
const acc = [p.getter && `get=${p.getter}`, p.setter && `set=${p.setter}`]
|
|
23
|
+
.filter(Boolean)
|
|
24
|
+
.join(" ");
|
|
25
|
+
return `${p.type} ${owner ? `${owner}.` : ""}${p.name}${acc ? ` [${acc}]` : ""}`;
|
|
26
|
+
}
|
|
27
|
+
export function formatUtility(u) {
|
|
28
|
+
const vararg = u.isVararg ? (u.args.length ? ", ..." : "...") : "";
|
|
29
|
+
return `${u.name}(${fmtArgs(u.args)}${vararg}) -> ${u.ret ?? "void"} # ${u.category}`;
|
|
30
|
+
}
|
|
31
|
+
function formatEnum(e, owner) {
|
|
32
|
+
const kind = e.isBitfield ? "bitfield" : "enum";
|
|
33
|
+
const vals = e.values.map((v) => `${v.name} = ${v.value}`).join(", ");
|
|
34
|
+
return `${kind} ${owner ? `${owner}.` : ""}${e.name} { ${vals} }`;
|
|
35
|
+
}
|
|
36
|
+
const indexCache = new WeakMap();
|
|
37
|
+
function buildIndex(db) {
|
|
38
|
+
const cached = indexCache.get(db);
|
|
39
|
+
if (cached)
|
|
40
|
+
return cached;
|
|
41
|
+
const entries = [];
|
|
42
|
+
for (const [name, c] of Object.entries(db.classes)) {
|
|
43
|
+
entries.push({
|
|
44
|
+
kind: "class",
|
|
45
|
+
name,
|
|
46
|
+
owner: null,
|
|
47
|
+
signature: `class ${name}${c.inherits ? ` extends ${c.inherits}` : ""}`,
|
|
48
|
+
detail: { inherits: c.inherits, apiType: c.apiType },
|
|
49
|
+
});
|
|
50
|
+
for (const m of c.methods)
|
|
51
|
+
entries.push({ kind: "method", name: m.name, owner: name, signature: formatMethod(m, name), detail: m });
|
|
52
|
+
for (const p of c.properties)
|
|
53
|
+
entries.push({ kind: "property", name: p.name, owner: name, signature: formatProperty(p, name), detail: p });
|
|
54
|
+
for (const s of c.signals)
|
|
55
|
+
entries.push({ kind: "signal", name: s.name, owner: name, signature: formatSignal(s, name), detail: s });
|
|
56
|
+
for (const e of c.enums)
|
|
57
|
+
entries.push({ kind: "enum", name: e.name, owner: name, signature: formatEnum(e, name), detail: e });
|
|
58
|
+
for (const k of c.constants)
|
|
59
|
+
entries.push({ kind: "constant", name: k.name, owner: name, signature: `const ${name}.${k.name} = ${k.value}`, detail: k });
|
|
60
|
+
}
|
|
61
|
+
for (const [name, b] of Object.entries(db.builtinClasses)) {
|
|
62
|
+
entries.push({ kind: "builtin_class", name, owner: null, signature: `builtin ${name}`, detail: { members: b.members } });
|
|
63
|
+
for (const m of b.methods)
|
|
64
|
+
entries.push({ kind: "builtin_method", name: m.name, owner: name, signature: formatMethod(m, name), detail: m });
|
|
65
|
+
}
|
|
66
|
+
for (const u of db.utilityFunctions)
|
|
67
|
+
entries.push({ kind: "utility_function", name: u.name, owner: null, signature: formatUtility(u), detail: u });
|
|
68
|
+
for (const s of db.singletons)
|
|
69
|
+
entries.push({ kind: "singleton", name: s.name, owner: null, signature: `singleton ${s.name}: ${s.type}`, detail: s });
|
|
70
|
+
for (const e of db.globalEnums)
|
|
71
|
+
entries.push({ kind: "global_enum", name: e.name, owner: null, signature: formatEnum(e), detail: e });
|
|
72
|
+
indexCache.set(db, entries);
|
|
73
|
+
return entries;
|
|
74
|
+
}
|
|
75
|
+
function levenshtein(a, b) {
|
|
76
|
+
const m = a.length;
|
|
77
|
+
const n = b.length;
|
|
78
|
+
if (m === 0)
|
|
79
|
+
return n;
|
|
80
|
+
if (n === 0)
|
|
81
|
+
return m;
|
|
82
|
+
let prev = Array.from({ length: n + 1 }, (_, i) => i);
|
|
83
|
+
let curr = new Array(n + 1);
|
|
84
|
+
for (let i = 1; i <= m; i++) {
|
|
85
|
+
curr[0] = i;
|
|
86
|
+
for (let j = 1; j <= n; j++) {
|
|
87
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
88
|
+
curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);
|
|
89
|
+
}
|
|
90
|
+
[prev, curr] = [curr, prev];
|
|
91
|
+
}
|
|
92
|
+
return prev[n];
|
|
93
|
+
}
|
|
94
|
+
function toMatch(e) {
|
|
95
|
+
return { kind: e.kind, name: e.name, owner: e.owner, signature: e.signature, detail: e.detail };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Look up a symbol by name. Supports "Owner.member" qualified queries. Falls
|
|
99
|
+
* back to closest-match suggestions when nothing matches exactly.
|
|
100
|
+
*/
|
|
101
|
+
export function lookupSymbol(db, query, opts = {}) {
|
|
102
|
+
const index = buildIndex(db);
|
|
103
|
+
const dot = query.indexOf(".");
|
|
104
|
+
let candidates;
|
|
105
|
+
if (dot > 0) {
|
|
106
|
+
const owner = query.slice(0, dot);
|
|
107
|
+
const member = query.slice(dot + 1);
|
|
108
|
+
candidates = index.filter((e) => e.owner !== null && e.owner === owner && e.name === member);
|
|
109
|
+
if (candidates.length === 0) {
|
|
110
|
+
const ownerLc = owner.toLowerCase();
|
|
111
|
+
const memberLc = member.toLowerCase();
|
|
112
|
+
candidates = index.filter((e) => e.owner?.toLowerCase() === ownerLc && e.name.toLowerCase() === memberLc);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
candidates = index.filter((e) => e.name === query);
|
|
117
|
+
if (candidates.length === 0) {
|
|
118
|
+
const lc = query.toLowerCase();
|
|
119
|
+
candidates = index.filter((e) => e.name.toLowerCase() === lc);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (opts.kind)
|
|
123
|
+
candidates = candidates.filter((e) => e.kind === opts.kind);
|
|
124
|
+
if (candidates.length > 0) {
|
|
125
|
+
return { query, matches: candidates.map(toMatch) };
|
|
126
|
+
}
|
|
127
|
+
// Fuzzy fallback on the last path segment.
|
|
128
|
+
const needle = (dot > 0 ? query.slice(dot + 1) : query).toLowerCase();
|
|
129
|
+
const scored = index
|
|
130
|
+
.map((e) => ({ e, d: levenshtein(needle, e.name.toLowerCase()) }))
|
|
131
|
+
.filter(({ d, e }) => d <= Math.max(2, Math.floor(e.name.length / 3)))
|
|
132
|
+
.sort((x, y) => x.d - y.d);
|
|
133
|
+
const seen = new Set();
|
|
134
|
+
const suggestions = [];
|
|
135
|
+
for (const { e, d } of scored) {
|
|
136
|
+
const key = `${e.owner ?? ""}.${e.name}.${e.kind}`;
|
|
137
|
+
if (seen.has(key))
|
|
138
|
+
continue;
|
|
139
|
+
seen.add(key);
|
|
140
|
+
suggestions.push({ name: e.name, kind: e.kind, owner: e.owner, distance: d });
|
|
141
|
+
if (suggestions.length >= 8)
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
return { query, matches: [], suggestions };
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Class summary
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
function findClass(db, name) {
|
|
150
|
+
if (db.classes[name])
|
|
151
|
+
return { name, def: db.classes[name] };
|
|
152
|
+
const lc = name.toLowerCase();
|
|
153
|
+
const key = Object.keys(db.classes).find((k) => k.toLowerCase() === lc);
|
|
154
|
+
return key ? { name: key, def: db.classes[key] } : undefined;
|
|
155
|
+
}
|
|
156
|
+
export function classSummary(db, className) {
|
|
157
|
+
const found = findClass(db, className);
|
|
158
|
+
if (!found)
|
|
159
|
+
return undefined;
|
|
160
|
+
const { name, def } = found;
|
|
161
|
+
const chain = [];
|
|
162
|
+
let parent = def.inherits;
|
|
163
|
+
const guard = new Set();
|
|
164
|
+
while (parent && !guard.has(parent)) {
|
|
165
|
+
guard.add(parent);
|
|
166
|
+
chain.push(parent);
|
|
167
|
+
parent = db.classes[parent]?.inherits ?? null;
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
name,
|
|
171
|
+
inherits: def.inherits,
|
|
172
|
+
apiType: def.apiType,
|
|
173
|
+
isRefcounted: def.isRefcounted ?? false,
|
|
174
|
+
isInstantiable: def.isInstantiable ?? false,
|
|
175
|
+
inheritanceChain: chain,
|
|
176
|
+
methods: def.methods.map((m) => formatMethod(m)),
|
|
177
|
+
properties: def.properties.map((p) => formatProperty(p)),
|
|
178
|
+
signals: def.signals.map((s) => formatSignal(s)),
|
|
179
|
+
enums: def.enums.map((e) => formatEnum(e)),
|
|
180
|
+
constants: def.constants.map((k) => `${k.name} = ${k.value}`),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function diffMembers(aList, bList, keyOf, sigOf) {
|
|
184
|
+
const a = new Map(aList.map((t) => [keyOf(t), t]));
|
|
185
|
+
const b = new Map(bList.map((t) => [keyOf(t), t]));
|
|
186
|
+
const added = [];
|
|
187
|
+
const removed = [];
|
|
188
|
+
const changed = [];
|
|
189
|
+
for (const [k, tb] of b)
|
|
190
|
+
if (!a.has(k))
|
|
191
|
+
added.push(sigOf(tb));
|
|
192
|
+
for (const [k, ta] of a) {
|
|
193
|
+
const tb = b.get(k);
|
|
194
|
+
if (!tb) {
|
|
195
|
+
removed.push(sigOf(ta));
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const oldSig = sigOf(ta);
|
|
199
|
+
const newSig = sigOf(tb);
|
|
200
|
+
if (oldSig !== newSig)
|
|
201
|
+
changed.push({ name: k, old: oldSig, new: newSig });
|
|
202
|
+
}
|
|
203
|
+
return { added, removed, changed };
|
|
204
|
+
}
|
|
205
|
+
function isEmptyDiff(d) {
|
|
206
|
+
return d.added.length === 0 && d.removed.length === 0 && d.changed.length === 0;
|
|
207
|
+
}
|
|
208
|
+
export function diffClass(from, to, className) {
|
|
209
|
+
const a = findClass(from, className);
|
|
210
|
+
const b = findClass(to, className);
|
|
211
|
+
const name = a?.name ?? b?.name ?? className;
|
|
212
|
+
const ad = a?.def;
|
|
213
|
+
const bd = b?.def;
|
|
214
|
+
const methods = diffMembers(ad?.methods ?? [], bd?.methods ?? [], (m) => m.name, (m) => formatMethod(m));
|
|
215
|
+
const properties = diffMembers(ad?.properties ?? [], bd?.properties ?? [], (p) => p.name, (p) => formatProperty(p));
|
|
216
|
+
const signals = diffMembers(ad?.signals ?? [], bd?.signals ?? [], (s) => s.name, (s) => formatSignal(s));
|
|
217
|
+
const enums = diffMembers(ad?.enums ?? [], bd?.enums ?? [], (e) => e.name, (e) => formatEnum(e));
|
|
218
|
+
const constants = diffMembers(ad?.constants ?? [], bd?.constants ?? [], (k) => k.name, (k) => `${k.name} = ${k.value}`);
|
|
219
|
+
return {
|
|
220
|
+
class: name,
|
|
221
|
+
presence: {
|
|
222
|
+
fromLabel: from.meta.versionLabel,
|
|
223
|
+
toLabel: to.meta.versionLabel,
|
|
224
|
+
inFrom: Boolean(ad),
|
|
225
|
+
inTo: Boolean(bd),
|
|
226
|
+
},
|
|
227
|
+
methods,
|
|
228
|
+
properties,
|
|
229
|
+
signals,
|
|
230
|
+
enums,
|
|
231
|
+
constants,
|
|
232
|
+
identical: Boolean(ad) &&
|
|
233
|
+
Boolean(bd) &&
|
|
234
|
+
[methods, properties, signals, enums, constants].every(isEmptyDiff),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function status(from, to) {
|
|
238
|
+
if (from === null)
|
|
239
|
+
return "added";
|
|
240
|
+
if (to === null)
|
|
241
|
+
return "removed";
|
|
242
|
+
return from === to ? "unchanged" : "changed";
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Diff a bare or qualified symbol name across versions. For a class name, use
|
|
246
|
+
* diffClass instead; this handles members (methods/properties/signals) found in
|
|
247
|
+
* either version, matched by owner+name.
|
|
248
|
+
*/
|
|
249
|
+
export function diffSymbol(from, to, query) {
|
|
250
|
+
const fromMatches = lookupSymbol(from, query).matches;
|
|
251
|
+
const toMatches = lookupSymbol(to, query).matches;
|
|
252
|
+
const byKey = new Map();
|
|
253
|
+
const key = (m) => `${m.owner ?? ""}::${m.kind}::${m.name}`;
|
|
254
|
+
for (const m of fromMatches)
|
|
255
|
+
byKey.set(key(m), { owner: m.owner, kind: m.kind, name: m.name, from: m.signature });
|
|
256
|
+
for (const m of toMatches) {
|
|
257
|
+
const e = byKey.get(key(m)) ?? { owner: m.owner, kind: m.kind, name: m.name };
|
|
258
|
+
e.to = m.signature;
|
|
259
|
+
byKey.set(key(m), e);
|
|
260
|
+
}
|
|
261
|
+
const entries = [...byKey.values()].map((e) => ({
|
|
262
|
+
owner: e.owner,
|
|
263
|
+
kind: e.kind,
|
|
264
|
+
name: e.name,
|
|
265
|
+
fromSignature: e.from ?? null,
|
|
266
|
+
toSignature: e.to ?? null,
|
|
267
|
+
status: status(e.from ?? null, e.to ?? null),
|
|
268
|
+
}));
|
|
269
|
+
return { query, fromLabel: from.meta.versionLabel, toLabel: to.meta.versionLabel, entries };
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/symbols/lookup.ts"],"names":[],"mappings":"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"}
|