@cesarandreslopez/occ 0.2.0 → 0.3.1
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 +60 -3
- package/dist/bin/occ.js +1 -1
- package/dist/bin/occ.js.map +1 -1
- package/dist/src/cli.js +5 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/code/build.d.ts +7 -0
- package/dist/src/code/build.js +315 -0
- package/dist/src/code/build.js.map +1 -0
- package/dist/src/code/command.d.ts +2 -0
- package/dist/src/code/command.js +178 -0
- package/dist/src/code/command.js.map +1 -0
- package/dist/src/code/discover.d.ts +5 -0
- package/dist/src/code/discover.js +53 -0
- package/dist/src/code/discover.js.map +1 -0
- package/dist/src/code/languages.d.ts +15 -0
- package/dist/src/code/languages.js +117 -0
- package/dist/src/code/languages.js.map +1 -0
- package/dist/src/code/output.d.ts +8 -0
- package/dist/src/code/output.js +245 -0
- package/dist/src/code/output.js.map +1 -0
- package/dist/src/code/parsers.d.ts +6 -0
- package/dist/src/code/parsers.js +450 -0
- package/dist/src/code/parsers.js.map +1 -0
- package/dist/src/code/query.d.ts +11 -0
- package/dist/src/code/query.js +232 -0
- package/dist/src/code/query.js.map +1 -0
- package/dist/src/code/types.d.ts +146 -0
- package/dist/src/code/types.js +2 -0
- package/dist/src/code/types.js.map +1 -0
- package/dist/src/parsers/xlsx.js +3 -1
- package/dist/src/parsers/xlsx.js.map +1 -1
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.js +10 -0
- package/dist/src/utils.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -5,15 +5,21 @@
|
|
|
5
5
|
<a href="https://www.npmjs.com/package/@cesarandreslopez/occ"><img src="https://img.shields.io/npm/dt/@cesarandreslopez/occ?label=npm%20Downloads" alt="npm Downloads"></a>
|
|
6
6
|
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
|
|
7
7
|
<a href="https://github.com/cesarandreslopez/occ/actions/workflows/ci.yml"><img src="https://github.com/cesarandreslopez/occ/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
8
|
+
<a href="https://deepwiki.com/cesarandreslopez/occ"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
|
|
8
9
|
</p>
|
|
9
10
|
|
|
10
11
|
<p align="center">
|
|
11
|
-
<strong>Office Cloc and Count</strong> —
|
|
12
|
+
<strong>Office Cloc and Count</strong> — document metrics, structure extraction, and code exploration for real repositories.
|
|
12
13
|
</p>
|
|
13
14
|
|
|
14
15
|
## What is this?
|
|
15
16
|
|
|
16
|
-
OCC
|
|
17
|
+
OCC started as a way to make office documents visible in the same workflows that already work well for code metrics tools like `scc` and `cloc`. In `0.3.0`, it also adds an on-demand code exploration surface under `occ code`, so the same CLI can now:
|
|
18
|
+
|
|
19
|
+
- scan office documents for word/page/sheet/slide metrics
|
|
20
|
+
- extract document heading structure for navigation and RAG-style use cases
|
|
21
|
+
- summarize code metrics through `scc`
|
|
22
|
+
- explore JavaScript, TypeScript, and Python repositories with symbol search, call analysis, dependency inspection, and inheritance queries
|
|
17
23
|
|
|
18
24
|
## Features
|
|
19
25
|
|
|
@@ -21,6 +27,7 @@ OCC scans directories for office documents (DOCX, XLSX, PPTX, PDF, ODT, ODS, ODP
|
|
|
21
27
|
- **Seven formats supported** — DOCX, XLSX, PPTX, PDF, ODT, ODS, ODP
|
|
22
28
|
- **Document structure extraction** — `--structure` parses heading hierarchy into a navigable tree with dotted section codes (1, 1.1, 1.2, ...)
|
|
23
29
|
- **Code metrics via scc** — auto-detects code files and integrates scc output
|
|
30
|
+
- **Code exploration via `occ code`** — JS/TS and Python-first symbol lookup, content search, callers/callees, dependency categories, inheritance, and ambiguity-aware chains
|
|
24
31
|
- **Multiple output modes** — grouped by type, per-file breakdown, or JSON
|
|
25
32
|
- **CI-friendly** — ASCII-only, no-color mode for pipelines
|
|
26
33
|
- **Flexible filtering** — include/exclude extensions, exclude directories, .gitignore-aware
|
|
@@ -48,6 +55,7 @@ npx @cesarandreslopez/occ docs/ reports/
|
|
|
48
55
|
git clone https://github.com/cesarandreslopez/occ.git && cd occ
|
|
49
56
|
npm install
|
|
50
57
|
npm run build
|
|
58
|
+
npm test
|
|
51
59
|
npm start
|
|
52
60
|
```
|
|
53
61
|
|
|
@@ -72,6 +80,12 @@ occ --structure docs/
|
|
|
72
80
|
# Structure as JSON
|
|
73
81
|
occ --structure --format json docs/
|
|
74
82
|
|
|
83
|
+
# Explore JS/TS and Python code
|
|
84
|
+
occ code find name UserService --path .
|
|
85
|
+
occ code analyze callers createUser --path .
|
|
86
|
+
occ code analyze deps src/deps --path .
|
|
87
|
+
occ code analyze chain ambiguousCaller duplicate --path .
|
|
88
|
+
|
|
75
89
|
# Only specific formats
|
|
76
90
|
occ --include-ext pdf,docx docs/
|
|
77
91
|
|
|
@@ -154,6 +168,45 @@ Scanned 23 documents (56,750 words, 201 pages) in 120ms
|
|
|
154
168
|
| `--large-file-limit <mb>` | Skip files over this size | `50` |
|
|
155
169
|
| `--no-code` | Skip scc code analysis | off |
|
|
156
170
|
|
|
171
|
+
## Code Exploration
|
|
172
|
+
|
|
173
|
+
`occ code` adds on-demand code exploration without changing the existing document-scan workflow. It builds an in-memory repository graph for each command and does not require a database, daemon, or background indexer.
|
|
174
|
+
|
|
175
|
+
The first-class support path in `0.3.0` is **JavaScript, TypeScript, and Python**. Other languages may be discovered and partially parsed, but the current resolver, fixtures, and output contracts are intentionally optimized around JS/TS and Python behavior.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Exact symbol lookup
|
|
179
|
+
occ code find name Greeter --path test/fixtures/code-explore
|
|
180
|
+
|
|
181
|
+
# Substring search
|
|
182
|
+
occ code find pattern service --path .
|
|
183
|
+
|
|
184
|
+
# Full-text content search
|
|
185
|
+
occ code find content normalize_name --path .
|
|
186
|
+
|
|
187
|
+
# Outgoing and incoming call analysis
|
|
188
|
+
occ code analyze calls bootstrap --path test/fixtures/code-explore
|
|
189
|
+
occ code analyze callers createUser --path test/fixtures/code-explore
|
|
190
|
+
|
|
191
|
+
# Dependency and inheritance inspection
|
|
192
|
+
occ code analyze deps src/service --path test/fixtures/code-explore
|
|
193
|
+
occ code analyze tree UserService --path test/fixtures/code-explore
|
|
194
|
+
|
|
195
|
+
# Ambiguity-aware chain analysis
|
|
196
|
+
occ code analyze chain ambiguousCaller duplicate --path test/fixtures/code-explore
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Highlights of the current code exploration behavior:
|
|
200
|
+
|
|
201
|
+
- **Exact, pattern, type, and content search** over the repository graph
|
|
202
|
+
- **Call analysis** with explicit `resolved`, `ambiguous`, and `unresolved` states
|
|
203
|
+
- **Receiver-aware method resolution** for `this`, `super`, `self`, and `cls`
|
|
204
|
+
- **Dependency analysis** grouped into local, external, and unresolved imports
|
|
205
|
+
- **Chain analysis** that reports when a path is blocked by ambiguity instead of silently returning nothing
|
|
206
|
+
- **Shared CLI ergonomics** with `--path`, `--format`, `--output`, `--exclude-dir`, and `.gitignore` support
|
|
207
|
+
|
|
208
|
+
All `occ code` commands support `--format tabular|json`. Most symbol-targeted commands also support `--file` for disambiguation, and JSON output includes repository metadata, query metadata, results, repository stats, and per-language capability flags.
|
|
209
|
+
|
|
157
210
|
## Documentation
|
|
158
211
|
|
|
159
212
|
Full documentation is available at [cesarandreslopez.github.io/occ](https://cesarandreslopez.github.io/occ/), including:
|
|
@@ -161,7 +214,9 @@ Full documentation is available at [cesarandreslopez.github.io/occ](https://cesa
|
|
|
161
214
|
- [Installation](https://cesarandreslopez.github.io/occ/getting-started/installation/)
|
|
162
215
|
- [Quick Start](https://cesarandreslopez.github.io/occ/getting-started/quick-start/)
|
|
163
216
|
- [CLI Reference](https://cesarandreslopez.github.io/occ/usage/cli-reference/)
|
|
217
|
+
- [Output Formats](https://cesarandreslopez.github.io/occ/usage/output-formats/)
|
|
164
218
|
- [Architecture](https://cesarandreslopez.github.io/occ/architecture/overview/)
|
|
219
|
+
- [Changelog](https://cesarandreslopez.github.io/occ/changelog/)
|
|
165
220
|
|
|
166
221
|
## Why OCC?
|
|
167
222
|
|
|
@@ -179,7 +234,7 @@ Tools like `scc`, `cloc`, and `tokei` give you instant visibility into codebases
|
|
|
179
234
|
- **Context budgeting** — LLMs have finite context windows. OCC's word and page counts let agents estimate how much of a document set they can ingest before hitting token limits
|
|
180
235
|
- **Prioritization** — an agent deciding which documents to read can use OCC's JSON output to rank files by size, word count, or type, focusing on the most relevant content first
|
|
181
236
|
- **RAG chunk mapping** — `--structure --format json` outputs heading trees with character offsets, enabling chunk-to-section mapping, scoped retrieval, and citation paths in RAG pipelines
|
|
182
|
-
- **Repository mapping** — agents exploring an unfamiliar codebase can
|
|
237
|
+
- **Repository mapping** — agents exploring an unfamiliar codebase can combine `occ --format json` for document inventory with `occ code ... --format json` for symbol and relationship data
|
|
183
238
|
- **Pipeline integration** — JSON output pipes directly into agent toolchains for automated document analysis, summarization, or compliance checking
|
|
184
239
|
|
|
185
240
|
## How It Works
|
|
@@ -188,6 +243,8 @@ OCC is written in TypeScript and uses [fast-glob](https://github.com/mrmlnc/fast
|
|
|
188
243
|
|
|
189
244
|
For structure extraction (`--structure`), documents are first converted to markdown (mammoth + [turndown](https://github.com/mixmark-io/turndown) for DOCX, pdf-parse with page markers for PDF), then headers are extracted and assembled into a tree with dotted section codes.
|
|
190
245
|
|
|
246
|
+
For `occ code`, OCC builds an in-memory code graph on demand. JavaScript and TypeScript are parsed with the TypeScript compiler API, Python uses a language-specific parser, and the query engine resolves symbols, imports, calls, inheritance, ambiguities, and dependency categories without a persistent database.
|
|
247
|
+
|
|
191
248
|
## Contributing
|
|
192
249
|
|
|
193
250
|
Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions and guidelines.
|
package/dist/bin/occ.js
CHANGED
package/dist/bin/occ.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"occ.js","sourceRoot":"","sources":["../../bin/occ.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"occ.js","sourceRoot":"","sources":["../../bin/occ.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/src/cli.js
CHANGED
|
@@ -12,7 +12,8 @@ import { createProgress } from './progress.js';
|
|
|
12
12
|
import { documentToMarkdown } from './markdown/convert.js';
|
|
13
13
|
import { extractFromMarkdown } from './structure/index.js';
|
|
14
14
|
import { formatStructureTree } from './output/tree.js';
|
|
15
|
-
import {
|
|
15
|
+
import { registerCodeCommands } from './code/command.js';
|
|
16
|
+
import { getExtension, writeStream } from './utils.js';
|
|
16
17
|
// Find package.json — works from both src/ (dev) and dist/src/ (built)
|
|
17
18
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
18
19
|
async function loadPkg() {
|
|
@@ -50,10 +51,11 @@ export async function run(argv) {
|
|
|
50
51
|
}
|
|
51
52
|
catch (err) {
|
|
52
53
|
const error = err;
|
|
53
|
-
process.stderr
|
|
54
|
+
await writeStream(process.stderr, `Error: ${error.message}\n`);
|
|
54
55
|
process.exit(1);
|
|
55
56
|
}
|
|
56
57
|
});
|
|
58
|
+
registerCodeCommands(program);
|
|
57
59
|
await program.parseAsync(argv);
|
|
58
60
|
}
|
|
59
61
|
function validateLargeFileLimit(value) {
|
|
@@ -178,7 +180,7 @@ async function execute(directories, opts) {
|
|
|
178
180
|
await writeFile(opts.output, output);
|
|
179
181
|
}
|
|
180
182
|
else {
|
|
181
|
-
process.stdout
|
|
183
|
+
await writeStream(process.stdout, output);
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
186
|
//# sourceMappingURL=cli.js.map
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAuB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { discoverCodeFiles } from './discover.js';
|
|
3
|
+
import { getLanguageSpec, getModuleName, normalizePath } from './languages.js';
|
|
4
|
+
import { parseCodeFile } from './parsers.js';
|
|
5
|
+
function makeId(prefix, ...parts) {
|
|
6
|
+
return [prefix, ...parts.filter((part) => part != null)].join(':');
|
|
7
|
+
}
|
|
8
|
+
function mergeCapabilities(files) {
|
|
9
|
+
const capabilities = {};
|
|
10
|
+
for (const file of files) {
|
|
11
|
+
const spec = getLanguageSpec(file.path);
|
|
12
|
+
if (!spec)
|
|
13
|
+
continue;
|
|
14
|
+
capabilities[spec.name] = spec.capabilities;
|
|
15
|
+
}
|
|
16
|
+
return capabilities;
|
|
17
|
+
}
|
|
18
|
+
function toCandidates(nodes) {
|
|
19
|
+
if (!nodes || nodes.length === 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
return nodes.map(node => ({
|
|
22
|
+
name: node.name,
|
|
23
|
+
relativePath: node.relativePath,
|
|
24
|
+
line: node.line,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
export async function buildCodebaseIndex(options) {
|
|
28
|
+
const repoRoot = path.resolve(options.repoRoot);
|
|
29
|
+
const discovered = await discoverCodeFiles(repoRoot, {
|
|
30
|
+
excludeDir: options.excludeDir,
|
|
31
|
+
noGitignore: options.noGitignore,
|
|
32
|
+
});
|
|
33
|
+
const parsedFiles = [];
|
|
34
|
+
for (const filePath of discovered) {
|
|
35
|
+
const parsed = await parseCodeFile(filePath, { repoRoot });
|
|
36
|
+
if (parsed)
|
|
37
|
+
parsedFiles.push(parsed);
|
|
38
|
+
}
|
|
39
|
+
const nodes = [];
|
|
40
|
+
const edges = [];
|
|
41
|
+
const functionsByName = new Map();
|
|
42
|
+
const classesByName = new Map();
|
|
43
|
+
const filesByPath = new Map();
|
|
44
|
+
const modulesByName = new Map();
|
|
45
|
+
const topLevelSymbolsByFile = new Map();
|
|
46
|
+
const allPaths = new Set(parsedFiles.map(file => file.path));
|
|
47
|
+
const moduleNodeByPath = new Map();
|
|
48
|
+
const symbolByIdentity = new Map();
|
|
49
|
+
const classByFileAndName = new Map();
|
|
50
|
+
const methodNodesByClassId = new Map();
|
|
51
|
+
const parentNamesByClassId = new Map();
|
|
52
|
+
const classKey = (filePath, className) => `${filePath}::${className}`;
|
|
53
|
+
for (const file of parsedFiles) {
|
|
54
|
+
const fileNode = {
|
|
55
|
+
id: makeId('file', file.path),
|
|
56
|
+
type: 'file',
|
|
57
|
+
name: path.basename(file.path),
|
|
58
|
+
path: file.path,
|
|
59
|
+
relativePath: file.relativePath,
|
|
60
|
+
line: 1,
|
|
61
|
+
language: file.language,
|
|
62
|
+
moduleName: file.moduleName,
|
|
63
|
+
};
|
|
64
|
+
const moduleNode = {
|
|
65
|
+
id: makeId('module', file.path),
|
|
66
|
+
type: 'module',
|
|
67
|
+
name: file.moduleName,
|
|
68
|
+
path: file.path,
|
|
69
|
+
relativePath: file.relativePath,
|
|
70
|
+
line: 1,
|
|
71
|
+
language: file.language,
|
|
72
|
+
moduleName: file.moduleName,
|
|
73
|
+
};
|
|
74
|
+
nodes.push(fileNode, moduleNode);
|
|
75
|
+
filesByPath.set(file.path, fileNode);
|
|
76
|
+
moduleNodeByPath.set(file.path, moduleNode);
|
|
77
|
+
modulesByName.set(file.moduleName, [...(modulesByName.get(file.moduleName) ?? []), moduleNode]);
|
|
78
|
+
modulesByName.set(path.basename(file.moduleName), [...(modulesByName.get(path.basename(file.moduleName)) ?? []), moduleNode]);
|
|
79
|
+
edges.push({
|
|
80
|
+
id: makeId('contains', fileNode.id, moduleNode.id),
|
|
81
|
+
type: 'contains',
|
|
82
|
+
from: fileNode.id,
|
|
83
|
+
to: moduleNode.id,
|
|
84
|
+
fromPath: file.path,
|
|
85
|
+
toPath: file.path,
|
|
86
|
+
status: 'resolved',
|
|
87
|
+
targetName: moduleNode.name,
|
|
88
|
+
});
|
|
89
|
+
const symbolIndex = new Map();
|
|
90
|
+
for (const symbol of file.symbols) {
|
|
91
|
+
const containerId = symbol.containerName
|
|
92
|
+
? makeId('class', file.path, symbol.containerName, file.symbols.find(candidate => candidate.type === 'class' && candidate.name === symbol.containerName)?.line)
|
|
93
|
+
: moduleNode.id;
|
|
94
|
+
const node = {
|
|
95
|
+
id: makeId(symbol.type, file.path, symbol.name, symbol.line, symbol.containerName),
|
|
96
|
+
type: symbol.type,
|
|
97
|
+
name: symbol.name,
|
|
98
|
+
path: file.path,
|
|
99
|
+
relativePath: file.relativePath,
|
|
100
|
+
line: symbol.line,
|
|
101
|
+
language: file.language,
|
|
102
|
+
moduleName: file.moduleName,
|
|
103
|
+
containerId,
|
|
104
|
+
containerName: symbol.containerName,
|
|
105
|
+
signature: symbol.signature,
|
|
106
|
+
};
|
|
107
|
+
nodes.push(node);
|
|
108
|
+
symbolByIdentity.set(makeId(symbol.type, file.path, symbol.name, symbol.line, symbol.containerName), node);
|
|
109
|
+
symbolIndex.set(symbol.name, [...(symbolIndex.get(symbol.name) ?? []), node]);
|
|
110
|
+
edges.push({
|
|
111
|
+
id: makeId('contains', containerId, node.id),
|
|
112
|
+
type: 'contains',
|
|
113
|
+
from: containerId,
|
|
114
|
+
to: node.id,
|
|
115
|
+
fromPath: file.path,
|
|
116
|
+
toPath: file.path,
|
|
117
|
+
line: symbol.line,
|
|
118
|
+
status: 'resolved',
|
|
119
|
+
targetName: node.name,
|
|
120
|
+
});
|
|
121
|
+
if (node.type === 'function') {
|
|
122
|
+
functionsByName.set(node.name, [...(functionsByName.get(node.name) ?? []), node]);
|
|
123
|
+
if (node.containerName) {
|
|
124
|
+
const parentClassNode = classByFileAndName.get(classKey(file.path, node.containerName));
|
|
125
|
+
if (parentClassNode) {
|
|
126
|
+
methodNodesByClassId.set(parentClassNode.id, [...(methodNodesByClassId.get(parentClassNode.id) ?? []), node]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (node.type === 'class') {
|
|
131
|
+
classesByName.set(node.name, [...(classesByName.get(node.name) ?? []), node]);
|
|
132
|
+
classByFileAndName.set(classKey(file.path, node.name), node);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
topLevelSymbolsByFile.set(file.path, symbolIndex);
|
|
136
|
+
}
|
|
137
|
+
for (const file of parsedFiles) {
|
|
138
|
+
const fileNode = filesByPath.get(file.path);
|
|
139
|
+
if (!fileNode)
|
|
140
|
+
continue;
|
|
141
|
+
const bindings = new Map();
|
|
142
|
+
for (const fileImport of file.imports) {
|
|
143
|
+
const resolvedPath = fileImport.resolvedPath && allPaths.has(fileImport.resolvedPath) ? fileImport.resolvedPath : undefined;
|
|
144
|
+
const importKind = resolvedPath
|
|
145
|
+
? 'local'
|
|
146
|
+
: fileImport.kind === 'external'
|
|
147
|
+
? 'external'
|
|
148
|
+
: 'unresolved';
|
|
149
|
+
let targetNode = resolvedPath ? moduleNodeByPath.get(resolvedPath) : undefined;
|
|
150
|
+
if (!targetNode && importKind === 'external') {
|
|
151
|
+
targetNode = {
|
|
152
|
+
id: makeId('module-external', fileImport.specifier),
|
|
153
|
+
type: 'module',
|
|
154
|
+
name: fileImport.specifier,
|
|
155
|
+
path: fileImport.specifier,
|
|
156
|
+
relativePath: fileImport.specifier,
|
|
157
|
+
line: fileImport.line,
|
|
158
|
+
language: 'external',
|
|
159
|
+
moduleName: fileImport.specifier,
|
|
160
|
+
external: true,
|
|
161
|
+
};
|
|
162
|
+
if (!nodes.some(node => node.id === targetNode?.id)) {
|
|
163
|
+
nodes.push(targetNode);
|
|
164
|
+
modulesByName.set(targetNode.name, [...(modulesByName.get(targetNode.name) ?? []), targetNode]);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
targetNode = nodes.find(node => node.id === targetNode?.id);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
edges.push({
|
|
171
|
+
id: makeId('imports', fileNode.id, targetNode?.id, fileImport.line, fileImport.specifier),
|
|
172
|
+
type: 'imports',
|
|
173
|
+
from: fileNode.id,
|
|
174
|
+
to: targetNode?.id,
|
|
175
|
+
fromPath: file.path,
|
|
176
|
+
toPath: resolvedPath ?? targetNode?.path,
|
|
177
|
+
line: fileImport.line,
|
|
178
|
+
status: importKind === 'unresolved' ? 'unresolved' : 'resolved',
|
|
179
|
+
targetName: targetNode?.name ?? fileImport.specifier,
|
|
180
|
+
specifier: fileImport.specifier,
|
|
181
|
+
importKind,
|
|
182
|
+
});
|
|
183
|
+
for (const binding of fileImport.bindings) {
|
|
184
|
+
bindings.set(binding.localName, {
|
|
185
|
+
importedName: binding.importedName,
|
|
186
|
+
modulePath: resolvedPath,
|
|
187
|
+
namespace: binding.isNamespace,
|
|
188
|
+
specifier: fileImport.specifier,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
for (const inheritance of file.inheritances) {
|
|
193
|
+
const classNodeId = makeId('class', file.path, inheritance.className, inheritance.classLine);
|
|
194
|
+
const classNode = symbolByIdentity.get(classNodeId);
|
|
195
|
+
if (!classNode)
|
|
196
|
+
continue;
|
|
197
|
+
parentNamesByClassId.set(classNode.id, [...(parentNamesByClassId.get(classNode.id) ?? []), inheritance.baseName]);
|
|
198
|
+
const localCandidates = classesByName.get(inheritance.baseName) ?? [];
|
|
199
|
+
const exactLocal = localCandidates.filter(candidate => candidate.path === file.path);
|
|
200
|
+
const candidates = exactLocal.length > 0 ? exactLocal : localCandidates;
|
|
201
|
+
const resolved = candidates.length === 1 ? candidates[0] : undefined;
|
|
202
|
+
edges.push({
|
|
203
|
+
id: makeId('inherits', classNode.id, inheritance.baseName, inheritance.line),
|
|
204
|
+
type: 'inherits',
|
|
205
|
+
from: classNode.id,
|
|
206
|
+
to: resolved?.id,
|
|
207
|
+
fromPath: file.path,
|
|
208
|
+
toPath: resolved?.path,
|
|
209
|
+
line: inheritance.line,
|
|
210
|
+
status: resolved ? 'resolved' : candidates.length > 1 ? 'ambiguous' : 'unresolved',
|
|
211
|
+
targetName: inheritance.baseName,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
const visitedClassMethods = new Map();
|
|
215
|
+
const resolveClassMethods = (classNode, methodName, includeParents) => {
|
|
216
|
+
if (!classNode)
|
|
217
|
+
return [];
|
|
218
|
+
const visitKey = `${classNode.id}:${methodName}:${includeParents}`;
|
|
219
|
+
const cached = visitedClassMethods.get(visitKey);
|
|
220
|
+
if (cached)
|
|
221
|
+
return cached;
|
|
222
|
+
const ownMethods = (methodNodesByClassId.get(classNode.id) ?? []).filter(node => node.name === methodName);
|
|
223
|
+
if (!includeParents || ownMethods.length > 0) {
|
|
224
|
+
visitedClassMethods.set(visitKey, ownMethods);
|
|
225
|
+
return ownMethods;
|
|
226
|
+
}
|
|
227
|
+
const parents = parentNamesByClassId.get(classNode.id) ?? [];
|
|
228
|
+
const inherited = [];
|
|
229
|
+
for (const parentName of parents) {
|
|
230
|
+
const directParent = classByFileAndName.get(classKey(classNode.path, parentName));
|
|
231
|
+
const parentCandidates = directParent ? [directParent] : (classesByName.get(parentName) ?? []);
|
|
232
|
+
for (const parentNode of parentCandidates) {
|
|
233
|
+
inherited.push(...resolveClassMethods(parentNode, methodName, true));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const unique = inherited.filter((node, index, array) => array.findIndex(candidate => candidate.id === node.id) === index);
|
|
237
|
+
visitedClassMethods.set(visitKey, unique);
|
|
238
|
+
return unique;
|
|
239
|
+
};
|
|
240
|
+
for (const call of file.calls) {
|
|
241
|
+
const callerId = makeId('function', file.path, call.callerName, call.callerLine, call.callerContainerName);
|
|
242
|
+
const callerNode = symbolByIdentity.get(callerId);
|
|
243
|
+
if (!callerNode)
|
|
244
|
+
continue;
|
|
245
|
+
const localSymbols = topLevelSymbolsByFile.get(file.path)?.get(call.calleeName) ?? [];
|
|
246
|
+
const namespaceBinding = call.qualifier ? bindings.get(call.qualifier) : undefined;
|
|
247
|
+
const directBinding = bindings.get(call.calleeName);
|
|
248
|
+
const callerClassNode = call.callerContainerName ? classByFileAndName.get(classKey(file.path, call.callerContainerName)) : undefined;
|
|
249
|
+
let candidates = localSymbols;
|
|
250
|
+
if (call.qualifier === 'this' || call.qualifier === 'self' || call.qualifier === 'cls') {
|
|
251
|
+
const classCandidates = resolveClassMethods(callerClassNode, call.calleeName, true);
|
|
252
|
+
if (classCandidates.length > 0)
|
|
253
|
+
candidates = classCandidates;
|
|
254
|
+
}
|
|
255
|
+
else if (call.qualifier === 'super') {
|
|
256
|
+
const parents = callerClassNode ? (parentNamesByClassId.get(callerClassNode.id) ?? []) : [];
|
|
257
|
+
const parentCandidates = [];
|
|
258
|
+
for (const parentName of parents) {
|
|
259
|
+
const directParent = callerClassNode ? classByFileAndName.get(classKey(callerClassNode.path, parentName)) : undefined;
|
|
260
|
+
const baseCandidates = directParent ? [directParent] : (classesByName.get(parentName) ?? []);
|
|
261
|
+
for (const parentNode of baseCandidates) {
|
|
262
|
+
parentCandidates.push(...resolveClassMethods(parentNode, call.calleeName, true));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (parentCandidates.length > 0)
|
|
266
|
+
candidates = parentCandidates;
|
|
267
|
+
}
|
|
268
|
+
else if (namespaceBinding?.modulePath) {
|
|
269
|
+
const importedFileSymbols = topLevelSymbolsByFile.get(namespaceBinding.modulePath)?.get(call.calleeName) ?? [];
|
|
270
|
+
if (importedFileSymbols.length > 0)
|
|
271
|
+
candidates = importedFileSymbols;
|
|
272
|
+
}
|
|
273
|
+
else if (directBinding?.modulePath) {
|
|
274
|
+
const importedFileSymbols = topLevelSymbolsByFile.get(directBinding.modulePath)?.get(directBinding.importedName ?? call.calleeName) ?? [];
|
|
275
|
+
if (importedFileSymbols.length > 0)
|
|
276
|
+
candidates = importedFileSymbols;
|
|
277
|
+
}
|
|
278
|
+
else if (candidates.length === 0) {
|
|
279
|
+
candidates = functionsByName.get(call.calleeName) ?? [];
|
|
280
|
+
}
|
|
281
|
+
const exactCandidates = directBinding?.modulePath
|
|
282
|
+
? candidates.filter(candidate => candidate.path === directBinding.modulePath)
|
|
283
|
+
: namespaceBinding?.modulePath
|
|
284
|
+
? candidates.filter(candidate => candidate.path === namespaceBinding.modulePath)
|
|
285
|
+
: candidates;
|
|
286
|
+
const resolvedCandidates = exactCandidates.length > 0 ? exactCandidates : candidates;
|
|
287
|
+
const resolved = resolvedCandidates.length === 1 ? resolvedCandidates[0] : undefined;
|
|
288
|
+
edges.push({
|
|
289
|
+
id: makeId('calls', callerNode.id, call.calleeName, call.line),
|
|
290
|
+
type: 'calls',
|
|
291
|
+
from: callerNode.id,
|
|
292
|
+
to: resolved?.id,
|
|
293
|
+
fromPath: file.path,
|
|
294
|
+
toPath: resolved?.path,
|
|
295
|
+
line: call.line,
|
|
296
|
+
status: resolved ? 'resolved' : resolvedCandidates.length > 1 ? 'ambiguous' : 'unresolved',
|
|
297
|
+
targetName: call.calleeName,
|
|
298
|
+
detail: call.qualifier,
|
|
299
|
+
candidates: resolved ? undefined : resolvedCandidates.length > 1 ? toCandidates(resolvedCandidates) : undefined,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
repoRoot,
|
|
305
|
+
files: parsedFiles.map(file => ({
|
|
306
|
+
...file,
|
|
307
|
+
relativePath: normalizePath(path.relative(repoRoot, file.path)),
|
|
308
|
+
moduleName: getModuleName(repoRoot, file.path),
|
|
309
|
+
})),
|
|
310
|
+
nodes,
|
|
311
|
+
edges,
|
|
312
|
+
capabilities: mergeCapabilities(parsedFiles),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/code/build.ts"],"names":[],"mappings":"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"}
|