openlore 2.0.2 → 2.0.3
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/README.md +28 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +18 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/export/index.d.ts +10 -0
- package/dist/cli/export/index.d.ts.map +1 -0
- package/dist/cli/export/index.js +27 -0
- package/dist/cli/export/index.js.map +1 -0
- package/dist/cli/export/scip.d.ts +22 -0
- package/dist/cli/export/scip.d.ts.map +1 -0
- package/dist/cli/export/scip.js +95 -0
- package/dist/cli/export/scip.js.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manifest/detect/events.d.ts +31 -0
- package/dist/cli/manifest/detect/events.d.ts.map +1 -0
- package/dist/cli/manifest/detect/events.js +22 -0
- package/dist/cli/manifest/detect/events.js.map +1 -0
- package/dist/cli/manifest/detect/http-routes.d.ts +22 -0
- package/dist/cli/manifest/detect/http-routes.d.ts.map +1 -0
- package/dist/cli/manifest/detect/http-routes.js +18 -0
- package/dist/cli/manifest/detect/http-routes.js.map +1 -0
- package/dist/cli/manifest/detect/public-symbols.d.ts +46 -0
- package/dist/cli/manifest/detect/public-symbols.d.ts.map +1 -0
- package/dist/cli/manifest/detect/public-symbols.js +144 -0
- package/dist/cli/manifest/detect/public-symbols.js.map +1 -0
- package/dist/cli/manifest/emit.d.ts +103 -0
- package/dist/cli/manifest/emit.d.ts.map +1 -0
- package/dist/cli/manifest/emit.js +272 -0
- package/dist/cli/manifest/emit.js.map +1 -0
- package/dist/cli/manifest/index.d.ts +11 -0
- package/dist/cli/manifest/index.d.ts.map +1 -0
- package/dist/cli/manifest/index.js +31 -0
- package/dist/cli/manifest/index.js.map +1 -0
- package/dist/cli/manifest/schema-validator.d.ts +18 -0
- package/dist/cli/manifest/schema-validator.d.ts.map +1 -0
- package/dist/cli/manifest/schema-validator.js +77 -0
- package/dist/cli/manifest/schema-validator.js.map +1 -0
- package/dist/cli/manifest/validate.d.ts +15 -0
- package/dist/cli/manifest/validate.d.ts.map +1 -0
- package/dist/cli/manifest/validate.js +51 -0
- package/dist/cli/manifest/validate.js.map +1 -0
- package/dist/core/scip/index.d.ts +51 -0
- package/dist/core/scip/index.d.ts.map +1 -0
- package/dist/core/scip/index.js +210 -0
- package/dist/core/scip/index.js.map +1 -0
- package/dist/core/scip/moniker.d.ts +48 -0
- package/dist/core/scip/moniker.d.ts.map +1 -0
- package/dist/core/scip/moniker.js +109 -0
- package/dist/core/scip/moniker.js.map +1 -0
- package/dist/core/scip/schema.d.ts +34 -0
- package/dist/core/scip/schema.d.ts.map +1 -0
- package/dist/core/scip/schema.js +48 -0
- package/dist/core/scip/schema.js.map +1 -0
- package/dist/core/scip/vendor/scip.proto +910 -0
- package/package.json +3 -1
- package/schemas/openlore-manifest-v1.json +191 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/manifest/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAA4B,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACvC,WAAW,CAAC,0FAA0F,CAAC;KACvG,MAAM,CAAC,cAAc,EAAE,iEAAiE,CAAC;KACzF,MAAM,CAAC,uBAAuB,EAAE,uDAAuD,CAAC;KACxF,MAAM,CAAC,mBAAmB,EAAE,yDAAyD,EAAE,KAAK,CAAC;KAC7F,MAAM,CAAC,qBAAqB,EAAE,+DAA+D,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KACtH,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEL,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAC/C,WAAW,CAAC,sEAAsE,CAAC;KACnF,QAAQ,CAAC,QAAQ,EAAE,uCAAuC,CAAC;KAC3D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;IACvB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,qEAAqE,CAAC;KAClF,UAAU,CAAC,cAAc,CAAC;KAC1B,UAAU,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A deliberately tiny JSON Schema validator — just the subset used by
|
|
3
|
+
* schemas/openlore-manifest-v1.json. Avoids pulling in Ajv (a large dep) for a
|
|
4
|
+
* single internal schema, per spec-05's acceptance criteria.
|
|
5
|
+
*
|
|
6
|
+
* Supported keywords: type (string or array incl. "null"), const, enum,
|
|
7
|
+
* required, properties, additionalProperties (false only), items. The
|
|
8
|
+
* `integer` type is distinguished from `number`.
|
|
9
|
+
*/
|
|
10
|
+
export interface ValidationError {
|
|
11
|
+
path: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
type JsonSchema = Record<string, unknown>;
|
|
15
|
+
/** Validate a parsed JSON value against a parsed JSON Schema. */
|
|
16
|
+
export declare function validateAgainstSchema(value: unknown, schema: JsonSchema): ValidationError[];
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../src/cli/manifest/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAoE1C,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,eAAe,EAAE,CAI3F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A deliberately tiny JSON Schema validator — just the subset used by
|
|
3
|
+
* schemas/openlore-manifest-v1.json. Avoids pulling in Ajv (a large dep) for a
|
|
4
|
+
* single internal schema, per spec-05's acceptance criteria.
|
|
5
|
+
*
|
|
6
|
+
* Supported keywords: type (string or array incl. "null"), const, enum,
|
|
7
|
+
* required, properties, additionalProperties (false only), items. The
|
|
8
|
+
* `integer` type is distinguished from `number`.
|
|
9
|
+
*/
|
|
10
|
+
function typeOf(value) {
|
|
11
|
+
if (value === null)
|
|
12
|
+
return 'null';
|
|
13
|
+
if (Array.isArray(value))
|
|
14
|
+
return 'array';
|
|
15
|
+
if (Number.isInteger(value))
|
|
16
|
+
return 'integer';
|
|
17
|
+
return typeof value; // 'number' | 'string' | 'boolean' | 'object'
|
|
18
|
+
}
|
|
19
|
+
/** Returns true if `value` satisfies a single JSON Schema `type` token. */
|
|
20
|
+
function matchesType(value, type) {
|
|
21
|
+
const actual = typeOf(value);
|
|
22
|
+
if (type === 'number')
|
|
23
|
+
return actual === 'number' || actual === 'integer';
|
|
24
|
+
return actual === type;
|
|
25
|
+
}
|
|
26
|
+
function validateNode(value, schema, path, errors) {
|
|
27
|
+
// const
|
|
28
|
+
if ('const' in schema && value !== schema.const) {
|
|
29
|
+
errors.push({ path, message: `expected const ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}` });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// type
|
|
33
|
+
if ('type' in schema) {
|
|
34
|
+
const types = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
35
|
+
if (!types.some(t => matchesType(value, t))) {
|
|
36
|
+
errors.push({ path, message: `expected type ${types.join('|')}, got ${typeOf(value)}` });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// null short-circuits remaining checks
|
|
41
|
+
if (value === null)
|
|
42
|
+
return;
|
|
43
|
+
// enum
|
|
44
|
+
if (Array.isArray(schema.enum) && !schema.enum.includes(value)) {
|
|
45
|
+
errors.push({ path, message: `value ${JSON.stringify(value)} not in enum ${JSON.stringify(schema.enum)}` });
|
|
46
|
+
}
|
|
47
|
+
// object
|
|
48
|
+
if (typeOf(value) === 'object') {
|
|
49
|
+
const obj = value;
|
|
50
|
+
const props = schema.properties ?? {};
|
|
51
|
+
for (const req of schema.required ?? []) {
|
|
52
|
+
if (!(req in obj))
|
|
53
|
+
errors.push({ path: `${path}/${req}`, message: 'missing required property' });
|
|
54
|
+
}
|
|
55
|
+
if (schema.additionalProperties === false) {
|
|
56
|
+
for (const key of Object.keys(obj)) {
|
|
57
|
+
if (!(key in props))
|
|
58
|
+
errors.push({ path: `${path}/${key}`, message: 'additional property not allowed' });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const [key, subSchema] of Object.entries(props)) {
|
|
62
|
+
if (key in obj)
|
|
63
|
+
validateNode(obj[key], subSchema, `${path}/${key}`, errors);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// array
|
|
67
|
+
if (typeOf(value) === 'array' && schema.items) {
|
|
68
|
+
value.forEach((item, i) => validateNode(item, schema.items, `${path}/${i}`, errors));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Validate a parsed JSON value against a parsed JSON Schema. */
|
|
72
|
+
export function validateAgainstSchema(value, schema) {
|
|
73
|
+
const errors = [];
|
|
74
|
+
validateNode(value, schema, '', errors);
|
|
75
|
+
return errors;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../src/cli/manifest/schema-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `openlore manifest validate <path>` — schema-check an existing manifest.
|
|
3
|
+
*
|
|
4
|
+
* Validates against the canonical JSON Schema shipped with OpenLore
|
|
5
|
+
* (schemas/openlore-manifest-v1.json), using the small in-repo validator
|
|
6
|
+
* rather than a heavyweight dependency.
|
|
7
|
+
*/
|
|
8
|
+
import { type ValidationError } from './schema-validator.js';
|
|
9
|
+
/** Absolute path to the vendored manifest JSON Schema (ships in the package). */
|
|
10
|
+
export declare function manifestSchemaPath(): string;
|
|
11
|
+
export declare function loadManifestSchema(): Record<string, unknown>;
|
|
12
|
+
/** Validate a parsed manifest object; returns the (possibly empty) error list. */
|
|
13
|
+
export declare function validateManifest(manifest: unknown): ValidationError[];
|
|
14
|
+
export declare function runManifestValidate(path: string): number;
|
|
15
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/manifest/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpF,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE5D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,EAAE,CAErE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BxD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `openlore manifest validate <path>` — schema-check an existing manifest.
|
|
3
|
+
*
|
|
4
|
+
* Validates against the canonical JSON Schema shipped with OpenLore
|
|
5
|
+
* (schemas/openlore-manifest-v1.json), using the small in-repo validator
|
|
6
|
+
* rather than a heavyweight dependency.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import { logger } from '../../utils/logger.js';
|
|
11
|
+
import { validateAgainstSchema } from './schema-validator.js';
|
|
12
|
+
/** Absolute path to the vendored manifest JSON Schema (ships in the package). */
|
|
13
|
+
export function manifestSchemaPath() {
|
|
14
|
+
// src/cli/manifest/validate.ts → repo root → schemas/ (same depth in dist/).
|
|
15
|
+
return fileURLToPath(new URL('../../../schemas/openlore-manifest-v1.json', import.meta.url));
|
|
16
|
+
}
|
|
17
|
+
export function loadManifestSchema() {
|
|
18
|
+
return JSON.parse(readFileSync(manifestSchemaPath(), 'utf-8'));
|
|
19
|
+
}
|
|
20
|
+
/** Validate a parsed manifest object; returns the (possibly empty) error list. */
|
|
21
|
+
export function validateManifest(manifest) {
|
|
22
|
+
return validateAgainstSchema(manifest, loadManifestSchema());
|
|
23
|
+
}
|
|
24
|
+
export function runManifestValidate(path) {
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = readFileSync(path, 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
logger.error(`Cannot read manifest: ${path}`);
|
|
31
|
+
return 2;
|
|
32
|
+
}
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
logger.error(`Invalid JSON in ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
const errors = validateManifest(parsed);
|
|
42
|
+
if (errors.length === 0) {
|
|
43
|
+
logger.success(`${path} is a valid OpenLore manifest (v1).`);
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
logger.error(`${path} failed schema validation (${errors.length} error(s)):`);
|
|
47
|
+
for (const e of errors)
|
|
48
|
+
logger.error(` ${e.path || '/'}: ${e.message}`);
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/manifest/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AAEpF,iFAAiF;AACjF,MAAM,UAAU,kBAAkB;IAChC,6EAA6E;IAC7E,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,4CAA4C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAA4B,CAAC;AAC5F,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,8BAA8B,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCIP export — derives a valid `index.scip` payload from an OpenLore call
|
|
3
|
+
* graph.
|
|
4
|
+
*
|
|
5
|
+
* SCIP (Source Code Intelligence Protocol) is Sourcegraph's open successor to
|
|
6
|
+
* LSIF. This is a one-way interop export: the SQLite/JSON graph remains
|
|
7
|
+
* canonical, and we lossily project the subset of it that SCIP can model
|
|
8
|
+
* (functions → symbols, call edges → reference/definition occurrences).
|
|
9
|
+
*
|
|
10
|
+
* Guarantees:
|
|
11
|
+
* - Deterministic: documents sorted by relative path, occurrences by
|
|
12
|
+
* `(line, col)`, symbols deduplicated and sorted. Re-running on an unchanged
|
|
13
|
+
* graph produces byte-identical output.
|
|
14
|
+
* - Faithful or loud: if a node we export lacks a defining line (a range a
|
|
15
|
+
* SCIP consumer expects), the export throws rather than emitting a malformed
|
|
16
|
+
* index. Column-level precision is unavailable in the analyzer today, so we
|
|
17
|
+
* emit zero-width ranges at column 0 and warn once.
|
|
18
|
+
* TODO(spec-04-followup): column ranges in analyzer.
|
|
19
|
+
* - TODO(spec-04-followup): scip import (consume external SCIP into the graph).
|
|
20
|
+
*/
|
|
21
|
+
import type { SerializedCallGraph } from '../analyzer/call-graph.js';
|
|
22
|
+
import { type PackageInfo } from './moniker.js';
|
|
23
|
+
export interface ExportScipOptions {
|
|
24
|
+
/** Absolute path to the project root. Emitted (URI-encoded) as project_root. */
|
|
25
|
+
projectRoot: string;
|
|
26
|
+
/** Package coordinates filling the SCIP `<package>` symbol slot. */
|
|
27
|
+
package: PackageInfo;
|
|
28
|
+
/** openlore's own version, emitted as tool_info.version. */
|
|
29
|
+
toolVersion: string;
|
|
30
|
+
/** Gitignore-style globs over repo-relative paths; if set, only matches participate. */
|
|
31
|
+
include?: string[];
|
|
32
|
+
/** Gitignore-style globs over repo-relative paths; matches are dropped. */
|
|
33
|
+
exclude?: string[];
|
|
34
|
+
/** Out-param: populated with summary statistics and warnings for the CLI. */
|
|
35
|
+
report?: ExportReport;
|
|
36
|
+
}
|
|
37
|
+
export interface ExportReport {
|
|
38
|
+
documentCount: number;
|
|
39
|
+
occurrenceCount: number;
|
|
40
|
+
symbolCount: number;
|
|
41
|
+
definitionCount: number;
|
|
42
|
+
/** Repo-relative paths whose language has no SCIP enum value. */
|
|
43
|
+
unspecifiedLanguageFiles: string[];
|
|
44
|
+
warnings: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build a deterministic SCIP `index.scip` payload from a serialized call graph.
|
|
48
|
+
* Returns the encoded protobuf bytes.
|
|
49
|
+
*/
|
|
50
|
+
export declare function exportScip(graph: SerializedCallGraph, options: ExportScipOptions): Buffer;
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/scip/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAgB,MAAM,2BAA2B,CAAC;AAOnF,OAAO,EAAmC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjF,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,OAAO,EAAE,WAAW,CAAC;IACrB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAqED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAqIzF"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCIP export — derives a valid `index.scip` payload from an OpenLore call
|
|
3
|
+
* graph.
|
|
4
|
+
*
|
|
5
|
+
* SCIP (Source Code Intelligence Protocol) is Sourcegraph's open successor to
|
|
6
|
+
* LSIF. This is a one-way interop export: the SQLite/JSON graph remains
|
|
7
|
+
* canonical, and we lossily project the subset of it that SCIP can model
|
|
8
|
+
* (functions → symbols, call edges → reference/definition occurrences).
|
|
9
|
+
*
|
|
10
|
+
* Guarantees:
|
|
11
|
+
* - Deterministic: documents sorted by relative path, occurrences by
|
|
12
|
+
* `(line, col)`, symbols deduplicated and sorted. Re-running on an unchanged
|
|
13
|
+
* graph produces byte-identical output.
|
|
14
|
+
* - Faithful or loud: if a node we export lacks a defining line (a range a
|
|
15
|
+
* SCIP consumer expects), the export throws rather than emitting a malformed
|
|
16
|
+
* index. Column-level precision is unavailable in the analyzer today, so we
|
|
17
|
+
* emit zero-width ranges at column 0 and warn once.
|
|
18
|
+
* TODO(spec-04-followup): column ranges in analyzer.
|
|
19
|
+
* - TODO(spec-04-followup): scip import (consume external SCIP into the graph).
|
|
20
|
+
*/
|
|
21
|
+
import { scipIndexType, SymbolRole, TextEncoding_UTF8, SymbolKind_Function, } from './schema.js';
|
|
22
|
+
import { symbolMoniker, scipLanguageName } from './moniker.js';
|
|
23
|
+
/**
|
|
24
|
+
* Compile a glob to a path-matching RegExp. Supports `*` (within a segment),
|
|
25
|
+
* `?`, `**` (across segments), and a globstar-plus-slash (zero or more leading
|
|
26
|
+
* path segments).
|
|
27
|
+
* Sufficient for the documented `--include`/`--exclude` patterns; not a full
|
|
28
|
+
* gitignore implementation.
|
|
29
|
+
*/
|
|
30
|
+
function globToRegExp(glob) {
|
|
31
|
+
let re = '';
|
|
32
|
+
for (let i = 0; i < glob.length; i++) {
|
|
33
|
+
const c = glob[i];
|
|
34
|
+
if (c === '*') {
|
|
35
|
+
if (glob[i + 1] === '*') {
|
|
36
|
+
if (glob[i + 2] === '/') {
|
|
37
|
+
re += '(?:.*/)?';
|
|
38
|
+
i += 2;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
re += '.*';
|
|
42
|
+
i += 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
re += '[^/]*';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (c === '?') {
|
|
50
|
+
re += '[^/]';
|
|
51
|
+
}
|
|
52
|
+
else if ('.+^${}()|[]\\'.includes(c)) {
|
|
53
|
+
re += '\\' + c;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
re += c;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return new RegExp('^' + re + '$');
|
|
60
|
+
}
|
|
61
|
+
/** True iff `relPath` matches any of the compiled glob patterns. */
|
|
62
|
+
function matchesAny(relPath, patterns) {
|
|
63
|
+
return patterns.some(p => p.test(relPath));
|
|
64
|
+
}
|
|
65
|
+
/** Normalize a node's file path to a POSIX repo-relative path. */
|
|
66
|
+
function toRelPath(filePath, projectRoot) {
|
|
67
|
+
let p = filePath.replace(/\\/g, '/');
|
|
68
|
+
const root = projectRoot.replace(/\\/g, '/').replace(/\/$/, '');
|
|
69
|
+
if (p.startsWith(root + '/'))
|
|
70
|
+
p = p.slice(root.length + 1);
|
|
71
|
+
return p.replace(/^\.\//, '').replace(/^\/+/, '');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Build a deterministic SCIP `index.scip` payload from a serialized call graph.
|
|
75
|
+
* Returns the encoded protobuf bytes.
|
|
76
|
+
*/
|
|
77
|
+
export function exportScip(graph, options) {
|
|
78
|
+
const report = options.report ?? {
|
|
79
|
+
documentCount: 0,
|
|
80
|
+
occurrenceCount: 0,
|
|
81
|
+
symbolCount: 0,
|
|
82
|
+
definitionCount: 0,
|
|
83
|
+
unspecifiedLanguageFiles: [],
|
|
84
|
+
warnings: [],
|
|
85
|
+
};
|
|
86
|
+
if (options.report) {
|
|
87
|
+
// Reset the caller-provided report so repeated calls are clean.
|
|
88
|
+
report.documentCount = 0;
|
|
89
|
+
report.occurrenceCount = 0;
|
|
90
|
+
report.symbolCount = 0;
|
|
91
|
+
report.definitionCount = 0;
|
|
92
|
+
report.unspecifiedLanguageFiles = [];
|
|
93
|
+
report.warnings = [];
|
|
94
|
+
}
|
|
95
|
+
const includePatterns = (options.include ?? []).map(globToRegExp);
|
|
96
|
+
const excludePatterns = (options.exclude ?? []).map(globToRegExp);
|
|
97
|
+
// Real (non-synthetic) nodes that survive the include/exclude filter.
|
|
98
|
+
const exportable = new Map();
|
|
99
|
+
for (const node of graph.nodes) {
|
|
100
|
+
if (node.isExternal)
|
|
101
|
+
continue;
|
|
102
|
+
const relPath = toRelPath(node.filePath, options.projectRoot);
|
|
103
|
+
if (!relPath)
|
|
104
|
+
continue;
|
|
105
|
+
if (includePatterns.length > 0 && !matchesAny(relPath, includePatterns))
|
|
106
|
+
continue;
|
|
107
|
+
if (excludePatterns.length > 0 && matchesAny(relPath, excludePatterns))
|
|
108
|
+
continue;
|
|
109
|
+
exportable.set(node.id, { node, relPath });
|
|
110
|
+
}
|
|
111
|
+
// Stable moniker per node id, computed once.
|
|
112
|
+
const monikers = new Map();
|
|
113
|
+
for (const [id, { node, relPath }] of exportable) {
|
|
114
|
+
monikers.set(id, symbolMoniker(node, relPath, options.package));
|
|
115
|
+
}
|
|
116
|
+
let warnedMissingColumns = false;
|
|
117
|
+
const warnMissingColumns = () => {
|
|
118
|
+
if (warnedMissingColumns)
|
|
119
|
+
return;
|
|
120
|
+
warnedMissingColumns = true;
|
|
121
|
+
report.warnings.push('Column-level ranges are unavailable in the analyzer; emitted zero-width ranges at column 0. ' +
|
|
122
|
+
'TODO(spec-04-followup): column ranges in analyzer.');
|
|
123
|
+
};
|
|
124
|
+
// documents keyed by relative path.
|
|
125
|
+
const docs = new Map();
|
|
126
|
+
const seenLanguages = new Map(); // relPath -> openlore language
|
|
127
|
+
const docFor = (relPath, openloreLang) => {
|
|
128
|
+
let doc = docs.get(relPath);
|
|
129
|
+
if (!doc) {
|
|
130
|
+
const language = scipLanguageName(openloreLang);
|
|
131
|
+
if (!language)
|
|
132
|
+
report.unspecifiedLanguageFiles.push(relPath);
|
|
133
|
+
doc = { language, relative_path: relPath, occurrences: [], symbols: [] };
|
|
134
|
+
docs.set(relPath, doc);
|
|
135
|
+
seenLanguages.set(relPath, openloreLang);
|
|
136
|
+
}
|
|
137
|
+
return doc;
|
|
138
|
+
};
|
|
139
|
+
// 1. Definition occurrence + SymbolInformation for every exported node.
|
|
140
|
+
for (const [, { node, relPath }] of exportable) {
|
|
141
|
+
if (node.startLine === undefined) {
|
|
142
|
+
throw new Error(`SCIP export aborted: node "${node.id}" has no defining line. ` +
|
|
143
|
+
'The graph is missing a range that an SCIP consumer requires. ' +
|
|
144
|
+
'Re-run `openlore analyze` to rebuild the graph; if the problem persists the analyzer ' +
|
|
145
|
+
'did not record positions for this language.');
|
|
146
|
+
}
|
|
147
|
+
const doc = docFor(relPath, node.language);
|
|
148
|
+
const symbol = monikers.get(node.id);
|
|
149
|
+
const line = node.startLine - 1; // SCIP ranges are 0-based.
|
|
150
|
+
warnMissingColumns();
|
|
151
|
+
doc.occurrences.push({ range: [line, 0, 0], symbol, symbol_roles: SymbolRole.Definition });
|
|
152
|
+
doc.symbols.push({
|
|
153
|
+
symbol,
|
|
154
|
+
kind: SymbolKind_Function,
|
|
155
|
+
...(node.docstring ? { documentation: [node.docstring] } : {}),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// 2. Reference occurrence at each call site whose callee we export.
|
|
159
|
+
for (const edge of graph.edges) {
|
|
160
|
+
const caller = exportable.get(edge.callerId);
|
|
161
|
+
const calleeSymbol = monikers.get(edge.calleeId);
|
|
162
|
+
if (!caller || !calleeSymbol)
|
|
163
|
+
continue; // skip edges to external/filtered nodes.
|
|
164
|
+
const doc = docFor(caller.relPath, caller.node.language);
|
|
165
|
+
if (edge.line === undefined)
|
|
166
|
+
warnMissingColumns();
|
|
167
|
+
const line = (edge.line ?? caller.node.startLine ?? 1) - 1;
|
|
168
|
+
doc.occurrences.push({ range: [line, 0, 0], symbol: calleeSymbol, symbol_roles: SymbolRole.ReadAccess });
|
|
169
|
+
}
|
|
170
|
+
// 3. Deterministic ordering: documents by path; occurrences by (line, col,
|
|
171
|
+
// roles, symbol); symbols deduplicated and sorted by symbol string.
|
|
172
|
+
const sortedDocs = [...docs.values()].sort((a, b) => a.relative_path.localeCompare(b.relative_path));
|
|
173
|
+
for (const doc of sortedDocs) {
|
|
174
|
+
doc.occurrences.sort((a, b) => a.range[0] - b.range[0] ||
|
|
175
|
+
a.range[1] - b.range[1] ||
|
|
176
|
+
a.symbol_roles - b.symbol_roles ||
|
|
177
|
+
a.symbol.localeCompare(b.symbol));
|
|
178
|
+
const bySymbol = new Map();
|
|
179
|
+
for (const s of doc.symbols)
|
|
180
|
+
if (!bySymbol.has(s.symbol))
|
|
181
|
+
bySymbol.set(s.symbol, s);
|
|
182
|
+
doc.symbols = [...bySymbol.values()].sort((a, b) => a.symbol.localeCompare(b.symbol));
|
|
183
|
+
report.occurrenceCount += doc.occurrences.length;
|
|
184
|
+
report.symbolCount += doc.symbols.length;
|
|
185
|
+
report.definitionCount += doc.occurrences.filter(o => o.symbol_roles === SymbolRole.Definition).length;
|
|
186
|
+
}
|
|
187
|
+
report.documentCount = sortedDocs.length;
|
|
188
|
+
const payload = {
|
|
189
|
+
metadata: {
|
|
190
|
+
version: 0, // UnspecifiedProtocolVersion — the only defined value.
|
|
191
|
+
tool_info: { name: 'openlore', version: options.toolVersion },
|
|
192
|
+
project_root: pathToFileUri(options.projectRoot),
|
|
193
|
+
text_document_encoding: TextEncoding_UTF8,
|
|
194
|
+
},
|
|
195
|
+
documents: sortedDocs,
|
|
196
|
+
};
|
|
197
|
+
const Index = scipIndexType();
|
|
198
|
+
const err = Index.verify(payload);
|
|
199
|
+
if (err)
|
|
200
|
+
throw new Error(`SCIP export produced an invalid index: ${err}`);
|
|
201
|
+
const message = Index.create(payload);
|
|
202
|
+
return Buffer.from(Index.encode(message).finish());
|
|
203
|
+
}
|
|
204
|
+
/** Encode an absolute filesystem path as a `file://` URI for project_root. */
|
|
205
|
+
function pathToFileUri(absPath) {
|
|
206
|
+
const normalized = absPath.replace(/\\/g, '/');
|
|
207
|
+
const withSlash = normalized.startsWith('/') ? normalized : '/' + normalized;
|
|
208
|
+
return 'file://' + withSlash.split('/').map(encodeURIComponent).join('/');
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/scip/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derivation of SCIP symbol monikers and language tags from OpenLore graph
|
|
3
|
+
* nodes.
|
|
4
|
+
*
|
|
5
|
+
* SCIP symbols are formatted strings, not structured objects, per the grammar
|
|
6
|
+
* documented at https://github.com/sourcegraph/scip/blob/main/docs/scip.md.
|
|
7
|
+
* We emit global symbols of the form:
|
|
8
|
+
*
|
|
9
|
+
* <scheme> ' ' <manager> ' ' <package-name> ' ' <version> <descriptors>
|
|
10
|
+
*
|
|
11
|
+
* where descriptors are `<repo-rel-path>/` (namespace) followed by
|
|
12
|
+
* `<qualified-name>(<arity>).` (method). Example:
|
|
13
|
+
*
|
|
14
|
+
* openlore npm openlore 2.0.2 `src/core/scip/index.ts`/exportScip(1).
|
|
15
|
+
*
|
|
16
|
+
* Identifiers containing characters outside the SCIP "simple identifier" set
|
|
17
|
+
* are backtick-escaped (with embedded backticks doubled).
|
|
18
|
+
*/
|
|
19
|
+
import type { FunctionNode } from '../analyzer/call-graph.js';
|
|
20
|
+
/** Package coordinates that fill the SCIP `<package>` slot of every symbol. */
|
|
21
|
+
export interface PackageInfo {
|
|
22
|
+
manager: string;
|
|
23
|
+
name: string;
|
|
24
|
+
version: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Map an OpenLore language tag (see signature-extractor.ts) to the SCIP
|
|
28
|
+
* `Language` enum name used as `Document.language`. Returns `''` for languages
|
|
29
|
+
* SCIP has no value for (the caller records these for the export summary).
|
|
30
|
+
*/
|
|
31
|
+
export declare function scipLanguageName(openloreLanguage: string): string;
|
|
32
|
+
/** Fully-qualified name within a file: `Class.method` or bare `function`. */
|
|
33
|
+
export declare function qualifiedName(node: FunctionNode): string;
|
|
34
|
+
/**
|
|
35
|
+
* Best-effort parameter count from a node's declaration `signature`. Counts
|
|
36
|
+
* top-level comma-separated parameters inside the first parenthesized group.
|
|
37
|
+
* Returns `undefined` when no signature is available (the analyzer does not
|
|
38
|
+
* persist arity directly — TODO(spec-04-followup): arity in analyzer).
|
|
39
|
+
*/
|
|
40
|
+
export declare function arityOf(node: FunctionNode): number | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Build the SCIP symbol moniker string for a function node.
|
|
43
|
+
*
|
|
44
|
+
* `repoRelPath` must be the document's relative path (POSIX separators), the
|
|
45
|
+
* same value used for the node's `Document.relative_path`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function symbolMoniker(node: FunctionNode, repoRelPath: string, pkg: PackageInfo): string;
|
|
48
|
+
//# sourceMappingURL=moniker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moniker.d.ts","sourceRoot":"","sources":["../../../src/core/scip/moniker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAsBjE;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAoB9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAM/F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derivation of SCIP symbol monikers and language tags from OpenLore graph
|
|
3
|
+
* nodes.
|
|
4
|
+
*
|
|
5
|
+
* SCIP symbols are formatted strings, not structured objects, per the grammar
|
|
6
|
+
* documented at https://github.com/sourcegraph/scip/blob/main/docs/scip.md.
|
|
7
|
+
* We emit global symbols of the form:
|
|
8
|
+
*
|
|
9
|
+
* <scheme> ' ' <manager> ' ' <package-name> ' ' <version> <descriptors>
|
|
10
|
+
*
|
|
11
|
+
* where descriptors are `<repo-rel-path>/` (namespace) followed by
|
|
12
|
+
* `<qualified-name>(<arity>).` (method). Example:
|
|
13
|
+
*
|
|
14
|
+
* openlore npm openlore 2.0.2 `src/core/scip/index.ts`/exportScip(1).
|
|
15
|
+
*
|
|
16
|
+
* Identifiers containing characters outside the SCIP "simple identifier" set
|
|
17
|
+
* are backtick-escaped (with embedded backticks doubled).
|
|
18
|
+
*/
|
|
19
|
+
const SCHEME = 'openlore';
|
|
20
|
+
/** A simple identifier needs no escaping iff it matches this set entirely. */
|
|
21
|
+
const SIMPLE_IDENTIFIER = /^[A-Za-z0-9\-+$_]+$/;
|
|
22
|
+
/** Escape a name for use as a SCIP descriptor identifier. */
|
|
23
|
+
function escapeName(name) {
|
|
24
|
+
if (SIMPLE_IDENTIFIER.test(name))
|
|
25
|
+
return name;
|
|
26
|
+
// Escaped identifier: wrap in backticks, double any embedded backticks.
|
|
27
|
+
return '`' + name.replace(/`/g, '``') + '`';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Map an OpenLore language tag (see signature-extractor.ts) to the SCIP
|
|
31
|
+
* `Language` enum name used as `Document.language`. Returns `''` for languages
|
|
32
|
+
* SCIP has no value for (the caller records these for the export summary).
|
|
33
|
+
*/
|
|
34
|
+
export function scipLanguageName(openloreLanguage) {
|
|
35
|
+
switch (openloreLanguage) {
|
|
36
|
+
case 'Python':
|
|
37
|
+
case 'TypeScript':
|
|
38
|
+
case 'JavaScript':
|
|
39
|
+
case 'Go':
|
|
40
|
+
case 'Rust':
|
|
41
|
+
case 'Ruby':
|
|
42
|
+
case 'Java':
|
|
43
|
+
case 'Kotlin':
|
|
44
|
+
case 'PHP':
|
|
45
|
+
case 'Swift':
|
|
46
|
+
case 'C':
|
|
47
|
+
return openloreLanguage;
|
|
48
|
+
case 'C++':
|
|
49
|
+
return 'CPP';
|
|
50
|
+
case 'C#':
|
|
51
|
+
return 'CSharp';
|
|
52
|
+
default:
|
|
53
|
+
// 'unknown' and anything SCIP lacks an enum value for.
|
|
54
|
+
return '';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Fully-qualified name within a file: `Class.method` or bare `function`. */
|
|
58
|
+
export function qualifiedName(node) {
|
|
59
|
+
return node.className ? `${node.className}.${node.name}` : node.name;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Best-effort parameter count from a node's declaration `signature`. Counts
|
|
63
|
+
* top-level comma-separated parameters inside the first parenthesized group.
|
|
64
|
+
* Returns `undefined` when no signature is available (the analyzer does not
|
|
65
|
+
* persist arity directly — TODO(spec-04-followup): arity in analyzer).
|
|
66
|
+
*/
|
|
67
|
+
export function arityOf(node) {
|
|
68
|
+
const sig = node.signature;
|
|
69
|
+
if (!sig)
|
|
70
|
+
return undefined;
|
|
71
|
+
const open = sig.indexOf('(');
|
|
72
|
+
if (open === -1)
|
|
73
|
+
return undefined;
|
|
74
|
+
// Walk to the matching close paren, counting top-level commas.
|
|
75
|
+
let depth = 0;
|
|
76
|
+
let commas = 0;
|
|
77
|
+
let sawContent = false;
|
|
78
|
+
for (let i = open; i < sig.length; i++) {
|
|
79
|
+
const ch = sig[i];
|
|
80
|
+
if (ch === '(' || ch === '[' || ch === '{' || ch === '<')
|
|
81
|
+
depth++;
|
|
82
|
+
else if (ch === ')' || ch === ']' || ch === '}' || ch === '>') {
|
|
83
|
+
depth--;
|
|
84
|
+
if (depth === 0)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
else if (ch === ',' && depth === 1)
|
|
88
|
+
commas++;
|
|
89
|
+
else if (depth === 1 && !/\s/.test(ch))
|
|
90
|
+
sawContent = true;
|
|
91
|
+
}
|
|
92
|
+
if (!sawContent)
|
|
93
|
+
return 0;
|
|
94
|
+
return commas + 1;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Build the SCIP symbol moniker string for a function node.
|
|
98
|
+
*
|
|
99
|
+
* `repoRelPath` must be the document's relative path (POSIX separators), the
|
|
100
|
+
* same value used for the node's `Document.relative_path`.
|
|
101
|
+
*/
|
|
102
|
+
export function symbolMoniker(node, repoRelPath, pkg) {
|
|
103
|
+
const namespace = `${escapeName(repoRelPath)}/`;
|
|
104
|
+
const arity = arityOf(node);
|
|
105
|
+
const disambiguator = arity === undefined ? '' : String(arity);
|
|
106
|
+
const method = `${escapeName(qualifiedName(node))}(${disambiguator}).`;
|
|
107
|
+
return `${SCHEME} ${pkg.manager} ${pkg.name} ${pkg.version} ${namespace}${method}`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=moniker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moniker.js","sourceRoot":"","sources":["../../../src/core/scip/moniker.ts"],"names":[],"mappings":"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"}
|