@opensip-cli/lang-go 0.1.7 → 0.1.9

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 CHANGED
@@ -23,8 +23,8 @@ This package is published for the CLI and advanced plugin authors; most users sh
23
23
  ## Documentation
24
24
 
25
25
  - 📚 Project docs: https://opensip.ai/docs/opensip-cli/
26
- - 🧭 Package catalog (what every package does): https://github.com/opensip-ai/opensip-cli/blob/v0.1.7/docs/public/70-reference/02-package-catalog.md
27
- - 📦 Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.7/packages/languages/lang-go
26
+ - 🧭 Package catalog (what every package does): https://github.com/opensip-ai/opensip-cli/blob/v0.1.9/docs/public/70-reference/02-package-catalog.md
27
+ - 📦 Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.9/packages/languages/lang-go
28
28
 
29
29
  ## License
30
30
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/query.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { goAdapter } from '../adapter.js';
3
+ function parse(src) {
4
+ const tree = goAdapter.parse(src, 's.go');
5
+ if (!tree)
6
+ throw new Error('no tree');
7
+ return tree;
8
+ }
9
+ const q = goAdapter.query;
10
+ describe('goQuery (LanguageQueryAPI)', () => {
11
+ it('is wired onto the adapter', () => {
12
+ expect(goAdapter.query).toBeDefined();
13
+ });
14
+ it('findFunctions returns funcs, methods, and anonymous func literals', () => {
15
+ const tree = parse([
16
+ 'package app',
17
+ 'type S struct{}',
18
+ 'func (s S) M() {}',
19
+ 'func free() { f := func() {}; _ = f }',
20
+ '',
21
+ ].join('\n'));
22
+ const names = q.findFunctions(tree).map((f) => f.name);
23
+ expect(names).toContain('M');
24
+ expect(names).toContain('free');
25
+ expect(names).toContain(null); // func literal
26
+ });
27
+ it('findImports handles single and grouped imports (names always empty)', () => {
28
+ const tree = parse(['package app', 'import "fmt"', 'import (', '\t"os"', '\talias "strings"', ')', ''].join('\n'));
29
+ const imports = q.findImports(tree);
30
+ const specs = imports.map((i) => i.specifier).sort();
31
+ expect(specs).toEqual(['fmt', 'os', 'strings']);
32
+ expect(imports.every((i) => i.names.length === 0)).toBe(true);
33
+ });
34
+ it('findCallsTo matches identifier and selector call targets', () => {
35
+ const tree = parse(['package app', 'func f() {', '\tfoo()', '\tpkg.Bar()', '}', ''].join('\n'));
36
+ expect(q.findCallsTo(tree, 'foo').length).toBe(1);
37
+ expect(q.findCallsTo(tree, 'Bar').length).toBe(1);
38
+ expect(q.findCallsTo(tree, 'absent').length).toBe(0);
39
+ });
40
+ it('findCallsTo ignores computed callees (index-expression calls)', () => {
41
+ const tree = parse(['package app', 'func f(fns []func()) {', '\tfns[0]()', '}', ''].join('\n'));
42
+ expect(q.findCallsTo(tree, 'fns').length).toBe(0);
43
+ });
44
+ it('findStringLiterals returns values; getText/getLocation read nodes', () => {
45
+ const tree = parse(['package app', 'func f() {', '\ts := "hello"', '\t_ = s', '}', ''].join('\n'));
46
+ expect(q.findStringLiterals(tree).map((s) => s.value)).toContain('hello');
47
+ const fn = q.findFunctions(tree)[0];
48
+ expect(q.getText(tree, fn.node)).toContain('func f');
49
+ expect(q.getLocation(tree, fn.node).line).toBeGreaterThanOrEqual(1);
50
+ });
51
+ });
52
+ //# sourceMappingURL=query.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.test.js","sourceRoot":"","sources":["../../src/__tests__/query.test.ts"],"names":[],"mappings":"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"}
package/dist/adapter.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type GoTree } from './parse.js';
2
2
  import type { LanguageAdapter } from '@opensip-cli/core';
3
- export declare const goAdapter: LanguageAdapter<GoTree>;
3
+ import type { Node } from '@opensip-cli/tree-sitter';
4
+ export declare const goAdapter: LanguageAdapter<GoTree, Node>;
4
5
  /** Plugin contract — exported as the lang plugin's `adapters` array. */
5
- export declare const adapters: readonly [LanguageAdapter<import("@opensip-cli/tree-sitter").ParsedFile, unknown>];
6
+ export declare const adapters: readonly [LanguageAdapter<import("@opensip-cli/tree-sitter").ParsedFile, Node>];
6
7
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,MAAM,CAO7C,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,QAAQ,oFAAuB,CAAC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAIlD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,IAAI,CAQnD,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,QAAQ,iFAAuB,CAAC"}
package/dist/adapter.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { parseGo } from './parse.js';
2
+ import { goQuery } from './query.js';
2
3
  import { stripComments, stripStrings } from './strip.js';
3
4
  export const goAdapter = {
4
5
  id: 'go',
@@ -7,6 +8,7 @@ export const goAdapter = {
7
8
  parse: parseGo,
8
9
  stripStrings,
9
10
  stripComments,
11
+ query: goQuery,
10
12
  };
11
13
  /** Plugin contract — exported as the lang plugin's `adapters` array. */
12
14
  export const adapters = [goAdapter];
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIzD,MAAM,CAAC,MAAM,SAAS,GAA4B;IAChD,EAAE,EAAE,IAAI;IACR,cAAc,EAAE,CAAC,KAAK,CAAC;IACvB,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO;IACd,YAAY;IACZ,aAAa;CACd,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAU,CAAC"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzD,MAAM,CAAC,MAAM,SAAS,GAAkC;IACtD,EAAE,EAAE,IAAI;IACR,cAAc,EAAE,CAAC,KAAK,CAAC;IACvB,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO;IACd,YAAY;IACZ,aAAa;IACb,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAU,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ export { goAdapter, adapters } from './adapter.js';
2
2
  export { parseGo, type GoTree } from './parse.js';
3
3
  export { getSharedTree } from './shared-tree.js';
4
4
  export { stripStrings, stripComments } from './strip.js';
5
+ export { goQuery } from './query.js';
5
6
  export { isFunction, isMethod, isStruct, isComment, isString, isConditional, isLoop, } from './predicates.js';
6
7
  export { findEnclosingFunction, getEnclosingFunctionName } from './enclosing.js';
8
+ export { childrenOf, findEnclosing, getColumn, getLineNumber, nameOf, namedChildrenOf, nodeText, walkNodes, type Node, } from '@opensip-cli/tree-sitter';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAa,EACb,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAa,EACb,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAOjF,OAAO,EACL,UAAU,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACb,MAAM,EACN,eAAe,EACf,QAAQ,EACR,SAAS,EACT,KAAK,IAAI,GACV,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,13 @@ export { goAdapter, adapters } from './adapter.js';
2
2
  export { parseGo } from './parse.js';
3
3
  export { getSharedTree } from './shared-tree.js';
4
4
  export { stripStrings, stripComments } from './strip.js';
5
+ export { goQuery } from './query.js';
5
6
  export { isFunction, isMethod, isStruct, isComment, isString, isConditional, isLoop, } from './predicates.js';
6
7
  export { findEnclosingFunction, getEnclosingFunctionName } from './enclosing.js';
8
+ // Generic tree-sitter traversal/position vocabulary, re-exported so check
9
+ // packs reach the parser substrate THROUGH the language adapter (ADR-0039):
10
+ // the adapter owns the parser boundary; check packs depend on lang-go +
11
+ // fitness only, never on @opensip-cli/tree-sitter directly (enforced by
12
+ // dependency-cruiser).
13
+ export { childrenOf, findEnclosing, getColumn, getLineNumber, nameOf, namedChildrenOf, nodeText, walkNodes, } from '@opensip-cli/tree-sitter';
7
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAa,EACb,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAa,EACb,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEjF,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AACxE,uBAAuB;AACvB,OAAO,EACL,UAAU,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACb,MAAM,EACN,eAAe,EACf,QAAQ,EACR,SAAS,GAEV,MAAM,0BAA0B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAOnG,8EAA8E;AAC9E,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAEhC,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzE"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAqBnG,8EAA8E;AAC9E,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAEhC,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKzE"}
package/dist/parse.js CHANGED
@@ -10,11 +10,29 @@
10
10
  * (non-null) rather than throwing.
11
11
  */
12
12
  import { fileURLToPath } from 'node:url';
13
+ import { logger } from '@opensip-cli/core';
13
14
  import { loadGrammar, createParser, parseToTree } from '@opensip-cli/tree-sitter';
14
- const grammar = await loadGrammar(fileURLToPath(new URL('../wasm/tree-sitter-go.wasm', import.meta.url)));
15
- const parser = createParser(grammar);
15
+ // Load the grammar once at module top level (keeps parse() synchronous). A
16
+ // missing/corrupt/ABI-mismatched .wasm must NOT crash the whole CLI — contain
17
+ // the failure so Go analysis degrades to "unavailable" (parse returns null).
18
+ let parser;
19
+ /* v8 ignore start -- grammar-load failure is environment-dependent (bad/missing .wasm); not reproducible under the test runner */
20
+ try {
21
+ const grammar = await loadGrammar(fileURLToPath(new URL('../wasm/tree-sitter-go.wasm', import.meta.url)));
22
+ parser = createParser(grammar);
23
+ }
24
+ catch (error) {
25
+ logger.warn({
26
+ evt: 'lang.grammar.load_failed',
27
+ module: 'lang:go',
28
+ msg: `Go grammar failed to load — Go analysis is unavailable this run: ${error instanceof Error ? error.message : String(error)}`,
29
+ });
30
+ }
16
31
  /** Parses Go source into a {@link GoTree}, or null when no tree is produced. */
17
32
  export function parseGo(content, _filePath) {
33
+ /* v8 ignore next -- defensive: parser is undefined only when the grammar failed to load */
34
+ if (!parser)
35
+ return null;
18
36
  const tree = parseToTree(parser, content);
19
37
  return tree ? { tree, source: content } : null;
20
38
  }
package/dist/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAmB,MAAM,0BAA0B,CAAC;AAEnG,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,aAAa,CAAC,IAAI,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACvE,CAAC;AACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAKrC,gFAAgF;AAChF,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,SAAiB;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAmB,MAAM,0BAA0B,CAAC;AAEnG,2EAA2E;AAC3E,8EAA8E;AAC9E,6EAA6E;AAC7E,IAAI,MAAmD,CAAC;AACxD,kIAAkI;AAClI,IAAI,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,aAAa,CAAC,IAAI,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACvE,CAAC;IACF,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,IAAI,CAAC;QACV,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE,oEAAoE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KAClI,CAAC,CAAC;AACL,CAAC;AAMD,gFAAgF;AAChF,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,SAAiB;IACxD,2FAA2F;IAC3F,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Go {@link LanguageQueryAPI} (ADR-0010, M10) — the grammar config for the
3
+ * shared `createTreeSitterQuery` factory. Node types are from tree-sitter-go;
4
+ * the callee/import extractors mirror `graph-go`'s resolver + import walker so
5
+ * the query agrees with the call graph.
6
+ *
7
+ * Go has no named-import concept (a package is imported whole by path), so
8
+ * `findImports` returns `names: []` — the faithful equivalent, not a gap.
9
+ */
10
+ import { type LanguageQueryAPI, type Node, type ParsedFile } from '@opensip-cli/tree-sitter';
11
+ export declare const goQuery: LanguageQueryAPI<ParsedFile, Node>;
12
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,IAAI,EACT,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AA4ElC,eAAO,MAAM,OAAO,EAAE,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAKrD,CAAC"}
package/dist/query.js ADDED
@@ -0,0 +1,94 @@
1
+ // @fitness-ignore-file duplicate-utility-functions -- ADR-0010/M10: the per-language tree-sitter query config intentionally shares helper names (callee/import/string extractors) across lang-* with grammar-specific implementations; consolidating would defeat the substrate design.
2
+ /**
3
+ * Go {@link LanguageQueryAPI} (ADR-0010, M10) — the grammar config for the
4
+ * shared `createTreeSitterQuery` factory. Node types are from tree-sitter-go;
5
+ * the callee/import extractors mirror `graph-go`'s resolver + import walker so
6
+ * the query agrees with the call graph.
7
+ *
8
+ * Go has no named-import concept (a package is imported whole by path), so
9
+ * `findImports` returns `names: []` — the faithful equivalent, not a gap.
10
+ */
11
+ import { createTreeSitterQuery, namedChildrenOf, } from '@opensip-cli/tree-sitter';
12
+ /** Leaf callee name of a `call_expression` (`foo()` → `foo`, `p.F()` → `F`). */
13
+ function calleeName(node) {
14
+ const fn = node.childForFieldName('function');
15
+ /* v8 ignore next -- a call_expression always exposes its `function` field */
16
+ if (!fn)
17
+ return null;
18
+ if (fn.type === 'identifier')
19
+ return fn.text;
20
+ if (fn.type === 'selector_expression') {
21
+ const field = fn.childForFieldName('field');
22
+ /* v8 ignore next -- a selector_expression always exposes its `field` */
23
+ return field ? field.text : null;
24
+ }
25
+ // Other callee shapes (index/type-assertion calls) — unresolved by name.
26
+ return null;
27
+ }
28
+ /** Unwrap a Go interpreted-string literal (`"fmt"` → `fmt`), or null. */
29
+ function unquote(text) {
30
+ if (text.length >= 2 && text.startsWith('"') && text.endsWith('"'))
31
+ return text.slice(1, -1);
32
+ /* v8 ignore next -- Go import paths are always quoted interpreted strings */
33
+ return null;
34
+ }
35
+ /**
36
+ * Expand an `import_declaration` into import targets — one per `import_spec`,
37
+ * single (`import "fmt"`) or grouped (`import ( … )`). Names are always empty
38
+ * (Go imports a package whole). Aliased/blank/dot imports keep the path.
39
+ */
40
+ function extractImport(node) {
41
+ const out = [];
42
+ for (const child of namedChildrenOf(node)) {
43
+ if (child.type === 'import_spec') {
44
+ pushSpec(child, out);
45
+ }
46
+ else if (child.type === 'import_spec_list') {
47
+ for (const spec of namedChildrenOf(child)) {
48
+ if (spec.type === 'import_spec')
49
+ pushSpec(spec, out);
50
+ }
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ function pushSpec(spec, out) {
56
+ const pathNode = spec.childForFieldName('path') ?? findInterpretedString(spec);
57
+ /* v8 ignore next -- an import_spec always has a path */
58
+ if (!pathNode)
59
+ return;
60
+ const specifier = unquote(pathNode.text);
61
+ /* v8 ignore next -- unquote never returns null for a Go import path */
62
+ if (specifier === null)
63
+ return;
64
+ out.push({ specifier, names: [] });
65
+ }
66
+ /* v8 ignore start -- defensive fallback: import_spec always exposes the `path`
67
+ field, so this scan only runs on a malformed/partial tree */
68
+ function findInterpretedString(node) {
69
+ for (const child of namedChildrenOf(node)) {
70
+ if (child.type === 'interpreted_string_literal')
71
+ return child;
72
+ }
73
+ return null;
74
+ }
75
+ /* v8 ignore stop */
76
+ const FUNCTION_NODE_TYPES = new Set(['function_declaration', 'method_declaration', 'func_literal']);
77
+ const CALL_NODE_TYPES = new Set(['call_expression']);
78
+ const IMPORT_NODE_TYPES = new Set(['import_declaration']);
79
+ const STRING_NODE_TYPES = new Set(['interpreted_string_literal', 'raw_string_literal']);
80
+ /** A `func_literal` has no name field — keep `findFunctions` faithful (null). */
81
+ function goFunctionName(node) {
82
+ if (node.type === 'func_literal')
83
+ return null;
84
+ const name = node.childForFieldName('name');
85
+ /* v8 ignore next -- function/method declarations always expose a name field */
86
+ return name ? name.text : null;
87
+ }
88
+ export const goQuery = createTreeSitterQuery({
89
+ functions: { nodeTypes: FUNCTION_NODE_TYPES, nameOf: goFunctionName },
90
+ calls: { nodeTypes: CALL_NODE_TYPES, calleeName },
91
+ imports: { nodeTypes: IMPORT_NODE_TYPES, extract: extractImport },
92
+ strings: { nodeTypes: STRING_NODE_TYPES },
93
+ });
94
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensip-cli/lang-go",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Go language adapter for opensip-cli",
6
6
  "keywords": [
@@ -35,8 +35,8 @@
35
35
  "NOTICE"
36
36
  ],
37
37
  "dependencies": {
38
- "@opensip-cli/core": "0.1.7",
39
- "@opensip-cli/tree-sitter": "0.1.7"
38
+ "@opensip-cli/core": "0.1.9",
39
+ "@opensip-cli/tree-sitter": "0.1.9"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^24.13.2",