@opensip-cli/lang-java 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 +2 -2
- package/dist/__tests__/query.test.d.ts +2 -0
- package/dist/__tests__/query.test.d.ts.map +1 -0
- package/dist/__tests__/query.test.js +64 -0
- package/dist/__tests__/query.test.js.map +1 -0
- package/dist/adapter.d.ts +3 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +2 -0
- package/dist/adapter.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +20 -2
- package/dist/parse.js.map +1 -1
- package/dist/query.d.ts +13 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +97 -0
- package/dist/query.js.map +1 -0
- package/package.json +3 -3
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.
|
|
27
|
-
- 📦 Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.
|
|
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-java
|
|
28
28
|
|
|
29
29
|
## License
|
|
30
30
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/query.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { javaAdapter } from '../adapter.js';
|
|
3
|
+
function parse(src) {
|
|
4
|
+
const tree = javaAdapter.parse(src, 'S.java');
|
|
5
|
+
if (!tree)
|
|
6
|
+
throw new Error('no tree');
|
|
7
|
+
return tree;
|
|
8
|
+
}
|
|
9
|
+
const q = javaAdapter.query;
|
|
10
|
+
describe('javaQuery (LanguageQueryAPI)', () => {
|
|
11
|
+
it('is wired onto the adapter', () => {
|
|
12
|
+
expect(javaAdapter.query).toBeDefined();
|
|
13
|
+
});
|
|
14
|
+
it('findFunctions returns methods, constructors, and anonymous lambdas', () => {
|
|
15
|
+
const tree = parse(['class S {', ' S() {}', ' void m() { Runnable r = () -> {}; }', '}', ''].join('\n'));
|
|
16
|
+
const names = q.findFunctions(tree).map((f) => f.name);
|
|
17
|
+
expect(names).toContain('S'); // constructor
|
|
18
|
+
expect(names).toContain('m'); // method
|
|
19
|
+
expect(names).toContain(null); // lambda
|
|
20
|
+
});
|
|
21
|
+
it('findImports handles single-type and wildcard imports', () => {
|
|
22
|
+
const tree = parse(['import java.util.List;', 'import java.util.*;', 'class S {}', ''].join('\n'));
|
|
23
|
+
const imports = q.findImports(tree);
|
|
24
|
+
const list = imports.find((i) => i.specifier === 'java.util.List');
|
|
25
|
+
expect(list?.names).toEqual(['List']);
|
|
26
|
+
const star = imports.find((i) => i.specifier === 'java.util.*');
|
|
27
|
+
expect(star?.names).toEqual([]); // wildcard imports a package, no single name
|
|
28
|
+
});
|
|
29
|
+
it('findCallsTo matches method invocations and object creations', () => {
|
|
30
|
+
const tree = parse([
|
|
31
|
+
'class S {',
|
|
32
|
+
' void m() {',
|
|
33
|
+
' foo();',
|
|
34
|
+
' obj.bar();',
|
|
35
|
+
' new Widget();',
|
|
36
|
+
' }',
|
|
37
|
+
'}',
|
|
38
|
+
'',
|
|
39
|
+
].join('\n'));
|
|
40
|
+
expect(q.findCallsTo(tree, 'foo').length).toBe(1);
|
|
41
|
+
expect(q.findCallsTo(tree, 'bar').length).toBe(1);
|
|
42
|
+
expect(q.findCallsTo(tree, 'Widget').length).toBe(1); // new Widget()
|
|
43
|
+
expect(q.findCallsTo(tree, 'absent').length).toBe(0);
|
|
44
|
+
});
|
|
45
|
+
it('findCallsTo resolves a generic object creation to its raw type name', () => {
|
|
46
|
+
const tree = parse([
|
|
47
|
+
'class S {',
|
|
48
|
+
' void m() {',
|
|
49
|
+
' var xs = new ArrayList<String>();',
|
|
50
|
+
' }',
|
|
51
|
+
'}',
|
|
52
|
+
'',
|
|
53
|
+
].join('\n'));
|
|
54
|
+
expect(q.findCallsTo(tree, 'ArrayList').length).toBe(1);
|
|
55
|
+
});
|
|
56
|
+
it('findStringLiterals returns values; getText/getLocation read nodes', () => {
|
|
57
|
+
const tree = parse(['class S {', ' void m() { String s = "hello"; }', '}', ''].join('\n'));
|
|
58
|
+
expect(q.findStringLiterals(tree).map((s) => s.value)).toContain('hello');
|
|
59
|
+
const fns = q.findFunctions(tree);
|
|
60
|
+
expect(q.getText(tree, fns[0].node)).toContain('void m');
|
|
61
|
+
expect(q.getLocation(tree, fns[0].node).line).toBeGreaterThanOrEqual(1);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# 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 JavaTree } from './parse.js';
|
|
2
2
|
import type { LanguageAdapter } from '@opensip-cli/core';
|
|
3
|
-
|
|
3
|
+
import type { Node } from '@opensip-cli/tree-sitter';
|
|
4
|
+
export declare const javaAdapter: LanguageAdapter<JavaTree, 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,
|
|
6
|
+
export declare const adapters: readonly [LanguageAdapter<import("@opensip-cli/tree-sitter").ParsedFile, Node>];
|
|
6
7
|
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,eAAO,MAAM,WAAW,EAAE,eAAe,CAAC,QAAQ,EAAE,IAAI,CAOvD,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,QAAQ,iFAAyB,CAAC"}
|
package/dist/adapter.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parseJava } from './parse.js';
|
|
2
|
+
import { javaQuery } from './query.js';
|
|
2
3
|
import { stripComments, stripStrings } from './strip.js';
|
|
3
4
|
export const javaAdapter = {
|
|
4
5
|
id: 'java',
|
|
@@ -6,6 +7,7 @@ export const javaAdapter = {
|
|
|
6
7
|
parse: parseJava,
|
|
7
8
|
stripStrings,
|
|
8
9
|
stripComments,
|
|
10
|
+
query: javaQuery,
|
|
9
11
|
};
|
|
10
12
|
/** Plugin contract — exported as the lang plugin's `adapters` array. */
|
|
11
13
|
export const adapters = [javaAdapter];
|
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzD,MAAM,CAAC,MAAM,WAAW,GAAoC;IAC1D,EAAE,EAAE,MAAM;IACV,cAAc,EAAE,CAAC,OAAO,CAAC;IACzB,KAAK,EAAE,SAAS;IAChB,YAAY;IACZ,aAAa;IACb,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAU,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export { javaAdapter, adapters } from './adapter.js';
|
|
|
2
2
|
export { parseJava, type JavaTree } from './parse.js';
|
|
3
3
|
export { getSharedTree } from './shared-tree.js';
|
|
4
4
|
export { stripStrings, stripComments } from './strip.js';
|
|
5
|
+
export { javaQuery } from './query.js';
|
|
5
6
|
export { isFunction, isMethod, isConstructor, isClass, isComment, isString, isCatch, 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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,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,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,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 { javaAdapter, adapters } from './adapter.js';
|
|
|
2
2
|
export { parseJava } from './parse.js';
|
|
3
3
|
export { getSharedTree } from './shared-tree.js';
|
|
4
4
|
export { stripStrings, stripComments } from './strip.js';
|
|
5
|
+
export { javaQuery } from './query.js';
|
|
5
6
|
export { isFunction, isMethod, isConstructor, isClass, isComment, isString, isCatch, 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-java +
|
|
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,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,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,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,aAAa,EACb,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,aAAa,EACb,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEjF,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAC1E,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"}
|
package/dist/parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
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,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC;AAElC,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAK7E"}
|
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
|
-
|
|
15
|
-
|
|
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 Java 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-java.wasm', import.meta.url)));
|
|
22
|
+
parser = createParser(grammar);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
logger.warn({
|
|
26
|
+
evt: 'lang.grammar.load_failed',
|
|
27
|
+
module: 'lang:java',
|
|
28
|
+
msg: `Java grammar failed to load — Java analysis is unavailable this run: ${error instanceof Error ? error.message : String(error)}`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
16
31
|
/** Parses Java source into a {@link JavaTree}, or null when no tree is produced. */
|
|
17
32
|
export function parseJava(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,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACzE,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,+EAA+E;AAC/E,IAAI,MAAmD,CAAC;AACxD,kIAAkI;AAClI,IAAI,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,aAAa,CAAC,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACzE,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,WAAW;QACnB,GAAG,EAAE,wEAAwE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KACtI,CAAC,CAAC;AACL,CAAC;AAMD,oFAAoF;AACpF,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,SAAiB;IAC1D,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"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java {@link LanguageQueryAPI} (ADR-0010, M10) — the grammar config for the
|
|
3
|
+
* shared `createTreeSitterQuery` factory. Node types are from tree-sitter-java;
|
|
4
|
+
* the callee extractor mirrors `graph-java`'s resolver.
|
|
5
|
+
*
|
|
6
|
+
* A Java `import a.b.C;` imports the single type `C` by its fully-qualified
|
|
7
|
+
* path, so `findImports` reports specifier `a.b.C` with name `[C]`. A
|
|
8
|
+
* wildcard `import a.b.*;` imports a whole package (no single named type), so
|
|
9
|
+
* names is empty — the faithful equivalent.
|
|
10
|
+
*/
|
|
11
|
+
import { type LanguageQueryAPI, type Node, type ParsedFile } from '@opensip-cli/tree-sitter';
|
|
12
|
+
export declare const javaQuery: LanguageQueryAPI<ParsedFile, Node>;
|
|
13
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,IAAI,EACT,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAkFlC,eAAO,MAAM,SAAS,EAAE,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAKvD,CAAC"}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
* Java {@link LanguageQueryAPI} (ADR-0010, M10) — the grammar config for the
|
|
4
|
+
* shared `createTreeSitterQuery` factory. Node types are from tree-sitter-java;
|
|
5
|
+
* the callee extractor mirrors `graph-java`'s resolver.
|
|
6
|
+
*
|
|
7
|
+
* A Java `import a.b.C;` imports the single type `C` by its fully-qualified
|
|
8
|
+
* path, so `findImports` reports specifier `a.b.C` with name `[C]`. A
|
|
9
|
+
* wildcard `import a.b.*;` imports a whole package (no single named type), so
|
|
10
|
+
* names is empty — the faithful equivalent.
|
|
11
|
+
*/
|
|
12
|
+
import { createTreeSitterQuery, } from '@opensip-cli/tree-sitter';
|
|
13
|
+
/** Leaf callee name of a `method_invocation` / `object_creation_expression`. */
|
|
14
|
+
function calleeName(node) {
|
|
15
|
+
if (node.type === 'method_invocation') {
|
|
16
|
+
const name = node.childForFieldName('name');
|
|
17
|
+
/* v8 ignore next -- a method_invocation always exposes its `name` field */
|
|
18
|
+
return name ? name.text : null;
|
|
19
|
+
}
|
|
20
|
+
// object_creation_expression (the only other configured call node type).
|
|
21
|
+
const ty = node.childForFieldName('type');
|
|
22
|
+
/* v8 ignore next -- `new T(...)` always exposes its `type` field */
|
|
23
|
+
return ty ? leafTypeName(ty) : null;
|
|
24
|
+
}
|
|
25
|
+
/** Terminal name of a (possibly generic / qualified) type node. */
|
|
26
|
+
function leafTypeName(node) {
|
|
27
|
+
if (node.type === 'type_identifier')
|
|
28
|
+
return node.text;
|
|
29
|
+
if (node.type === 'generic_type') {
|
|
30
|
+
// `ArrayList<String>` → first named child is the raw `type_identifier`.
|
|
31
|
+
const inner = node.namedChild(0);
|
|
32
|
+
/* v8 ignore next -- a generic_type always wraps a raw type node */
|
|
33
|
+
return inner ? leafTypeName(inner) : null;
|
|
34
|
+
}
|
|
35
|
+
if (node.type === 'scoped_type_identifier') {
|
|
36
|
+
// `a.b.C` → last named child is the terminal type name.
|
|
37
|
+
const inner = node.namedChild(node.namedChildCount - 1);
|
|
38
|
+
/* v8 ignore next -- a scoped_type_identifier always has a terminal name */
|
|
39
|
+
return inner ? leafTypeName(inner) : null;
|
|
40
|
+
}
|
|
41
|
+
return node.text;
|
|
42
|
+
}
|
|
43
|
+
/** Terminal segment of a dotted import path (`a.b.C` → `C`). */
|
|
44
|
+
function dottedLeaf(text) {
|
|
45
|
+
/* v8 ignore next -- split('.') on a non-empty path always yields a segment */
|
|
46
|
+
return text.split('.').pop() ?? text;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Expand an `import_declaration` into a single import target.
|
|
50
|
+
* - `import a.b.C;` → specifier `a.b.C`, names `[C]`
|
|
51
|
+
* - `import a.b.*;` → specifier `a.b.*`, names `[]`
|
|
52
|
+
* - `import static a.b.C.m;` → specifier `a.b.C.m`, names `[m]`
|
|
53
|
+
*/
|
|
54
|
+
function extractImport(node) {
|
|
55
|
+
const path = node.childForFieldName('name') ?? firstScopedIdentifier(node);
|
|
56
|
+
/* v8 ignore next -- an import_declaration always has a path */
|
|
57
|
+
if (!path)
|
|
58
|
+
return [];
|
|
59
|
+
const hasAsterisk = node.children.some((c) => c !== null && c.type === 'asterisk');
|
|
60
|
+
const base = path.text;
|
|
61
|
+
if (hasAsterisk)
|
|
62
|
+
return [{ specifier: `${base}.*`, names: [] }];
|
|
63
|
+
return [{ specifier: base, names: [dottedLeaf(base)] }];
|
|
64
|
+
}
|
|
65
|
+
/* v8 ignore start -- defensive fallback: import_declaration always exposes the
|
|
66
|
+
`name` field, so this scan only runs on a malformed/partial tree */
|
|
67
|
+
function firstScopedIdentifier(node) {
|
|
68
|
+
for (const c of node.namedChildren) {
|
|
69
|
+
if (c && (c.type === 'scoped_identifier' || c.type === 'identifier'))
|
|
70
|
+
return c;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/* v8 ignore stop */
|
|
75
|
+
const FUNCTION_NODE_TYPES = new Set([
|
|
76
|
+
'method_declaration',
|
|
77
|
+
'constructor_declaration',
|
|
78
|
+
'lambda_expression',
|
|
79
|
+
]);
|
|
80
|
+
const CALL_NODE_TYPES = new Set(['method_invocation', 'object_creation_expression']);
|
|
81
|
+
const IMPORT_NODE_TYPES = new Set(['import_declaration']);
|
|
82
|
+
const STRING_NODE_TYPES = new Set(['string_literal']);
|
|
83
|
+
/** A `lambda_expression` has no name field — keep `findFunctions` faithful. */
|
|
84
|
+
function javaFunctionName(node) {
|
|
85
|
+
if (node.type === 'lambda_expression')
|
|
86
|
+
return null;
|
|
87
|
+
const name = node.childForFieldName('name');
|
|
88
|
+
/* v8 ignore next -- method/constructor declarations always expose a name field */
|
|
89
|
+
return name ? name.text : null;
|
|
90
|
+
}
|
|
91
|
+
export const javaQuery = createTreeSitterQuery({
|
|
92
|
+
functions: { nodeTypes: FUNCTION_NODE_TYPES, nameOf: javaFunctionName },
|
|
93
|
+
calls: { nodeTypes: CALL_NODE_TYPES, calleeName },
|
|
94
|
+
imports: { nodeTypes: IMPORT_NODE_TYPES, extract: extractImport },
|
|
95
|
+
strings: { nodeTypes: STRING_NODE_TYPES },
|
|
96
|
+
});
|
|
97
|
+
//# 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-java",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Java language adapter for opensip-cli",
|
|
6
6
|
"keywords": [
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"NOTICE"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@opensip-cli/core": "0.1.
|
|
38
|
-
"@opensip-cli/tree-sitter": "0.1.
|
|
37
|
+
"@opensip-cli/core": "0.1.9",
|
|
38
|
+
"@opensip-cli/tree-sitter": "0.1.9"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^24.13.2",
|