projscan 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -5
- package/dist/cli/commands/coverage.js +4 -0
- package/dist/cli/commands/coverage.js.map +1 -1
- package/dist/cli/commands/prDiff.js +4 -0
- package/dist/cli/commands/prDiff.js.map +1 -1
- package/dist/core/ast.d.ts +14 -0
- package/dist/core/ast.js +30 -8
- package/dist/core/ast.js.map +1 -1
- package/dist/core/codeGraph.js +68 -3
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/languages/LanguageAdapter.d.ts +1 -1
- package/dist/core/languages/csharpAdapter.d.ts +2 -0
- package/dist/core/languages/csharpAdapter.js +148 -0
- package/dist/core/languages/csharpAdapter.js.map +1 -0
- package/dist/core/languages/csharpCallSites.d.ts +22 -0
- package/dist/core/languages/csharpCallSites.js +73 -0
- package/dist/core/languages/csharpCallSites.js.map +1 -0
- package/dist/core/languages/csharpCyclomatic.d.ts +23 -0
- package/dist/core/languages/csharpCyclomatic.js +61 -0
- package/dist/core/languages/csharpCyclomatic.js.map +1 -0
- package/dist/core/languages/csharpExports.d.ts +13 -0
- package/dist/core/languages/csharpExports.js +69 -0
- package/dist/core/languages/csharpExports.js.map +1 -0
- package/dist/core/languages/csharpFunctions.d.ts +24 -0
- package/dist/core/languages/csharpFunctions.js +170 -0
- package/dist/core/languages/csharpFunctions.js.map +1 -0
- package/dist/core/languages/csharpImports.d.ts +30 -0
- package/dist/core/languages/csharpImports.js +90 -0
- package/dist/core/languages/csharpImports.js.map +1 -0
- package/dist/core/languages/goFunctions.js +31 -7
- package/dist/core/languages/goFunctions.js.map +1 -1
- package/dist/core/languages/javaFunctions.js +12 -5
- package/dist/core/languages/javaFunctions.js.map +1 -1
- package/dist/core/languages/phpAdapter.d.ts +2 -0
- package/dist/core/languages/phpAdapter.js +149 -0
- package/dist/core/languages/phpAdapter.js.map +1 -0
- package/dist/core/languages/phpCallSites.d.ts +21 -0
- package/dist/core/languages/phpCallSites.js +56 -0
- package/dist/core/languages/phpCallSites.js.map +1 -0
- package/dist/core/languages/phpCyclomatic.d.ts +27 -0
- package/dist/core/languages/phpCyclomatic.js +69 -0
- package/dist/core/languages/phpCyclomatic.js.map +1 -0
- package/dist/core/languages/phpExports.d.ts +13 -0
- package/dist/core/languages/phpExports.js +58 -0
- package/dist/core/languages/phpExports.js.map +1 -0
- package/dist/core/languages/phpFunctions.d.ts +25 -0
- package/dist/core/languages/phpFunctions.js +144 -0
- package/dist/core/languages/phpFunctions.js.map +1 -0
- package/dist/core/languages/phpImports.d.ts +31 -0
- package/dist/core/languages/phpImports.js +142 -0
- package/dist/core/languages/phpImports.js.map +1 -0
- package/dist/core/languages/phpManifests.d.ts +31 -0
- package/dist/core/languages/phpManifests.js +89 -0
- package/dist/core/languages/phpManifests.js.map +1 -0
- package/dist/core/languages/pythonFunctions.js +34 -8
- package/dist/core/languages/pythonFunctions.js.map +1 -1
- package/dist/core/languages/registry.js +3 -1
- package/dist/core/languages/registry.js.map +1 -1
- package/dist/core/languages/rubyFunctions.js +37 -5
- package/dist/core/languages/rubyFunctions.js.map +1 -1
- package/dist/core/languages/rustFunctions.js +44 -8
- package/dist/core/languages/rustFunctions.js.map +1 -1
- package/dist/core/languages/treeSitterLoader.js +3 -1
- package/dist/core/languages/treeSitterLoader.js.map +1 -1
- package/dist/grammars/tree-sitter-c_sharp.wasm +0 -0
- package/dist/grammars/tree-sitter-php.wasm +0 -0
- package/dist/reporters/htmlReporter.d.ts +3 -1
- package/dist/reporters/htmlReporter.js +86 -0
- package/dist/reporters/htmlReporter.js.map +1 -1
- package/dist/tool-manifest.json +2 -2
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goFunctions.js","sourceRoot":"","sources":["../../../src/core/languages/goFunctions.ts"],"names":[],"mappings":"AAWA,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,WAAW;IACX,oBAAoB;CACrB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,GAAmB;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"goFunctions.js","sourceRoot":"","sources":["../../../src/core/languages/goFunctions.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,18 +39,19 @@ function walk(node, className, out) {
|
|
|
39
39
|
const fnName = className ? `${className}.${baseName}` : baseName;
|
|
40
40
|
const line = node.startPosition.row + 1;
|
|
41
41
|
const endLine = node.endPosition.row + 1;
|
|
42
|
-
const cc =
|
|
43
|
-
out.push({ name: fnName, line, endLine, cyclomaticComplexity: cc });
|
|
42
|
+
const { cc, callSites } = analyzeBody(node);
|
|
43
|
+
out.push({ name: fnName, line, endLine, cyclomaticComplexity: cc, callSites });
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
for (const child of node.namedChildren)
|
|
47
47
|
walk(child, className, out);
|
|
48
48
|
}
|
|
49
|
-
function
|
|
49
|
+
function analyzeBody(fnNode) {
|
|
50
50
|
let count = 0;
|
|
51
|
+
const calls = new Set();
|
|
51
52
|
const body = fnNode.childForFieldName ? fnNode.childForFieldName('body') : null;
|
|
52
53
|
if (!body)
|
|
53
|
-
return 1;
|
|
54
|
+
return { cc: 1, callSites: [] };
|
|
54
55
|
walkSkipNested(body, (n) => {
|
|
55
56
|
if (JAVA_DECISION_NODES.has(n.type)) {
|
|
56
57
|
count++;
|
|
@@ -62,9 +63,15 @@ function countDecisions(fnNode) {
|
|
|
62
63
|
}
|
|
63
64
|
if (n.type === 'binary_expression' && /(\s|^)(\|\||&&)(\s|$)/.test(n.text)) {
|
|
64
65
|
count++;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (n.type === 'method_invocation') {
|
|
69
|
+
const name = n.childForFieldName ? n.childForFieldName('name') : null;
|
|
70
|
+
if (name)
|
|
71
|
+
calls.add(name.text);
|
|
65
72
|
}
|
|
66
73
|
});
|
|
67
|
-
return count + 1;
|
|
74
|
+
return { cc: count + 1, callSites: [...calls] };
|
|
68
75
|
}
|
|
69
76
|
function walkSkipNested(node, visit) {
|
|
70
77
|
visit(node);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"javaFunctions.js","sourceRoot":"","sources":["../../../src/core/languages/javaFunctions.ts"],"names":[],"mappings":"AAWA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,wBAAwB;IACxB,iBAAiB;IACjB,cAAc;IACd,cAAc;CACf,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,SAAwB,EAAE,GAAmB;IACvE,IACE,IAAI,CAAC,IAAI,KAAK,mBAAmB;QACjC,IAAI,CAAC,IAAI,KAAK,uBAAuB;QACrC,IAAI,CAAC,IAAI,KAAK,kBAAkB;QAChC,IAAI,CAAC,IAAI,KAAK,oBAAoB;QAClC,IAAI,CAAC,IAAI,KAAK,6BAA6B,EAC3C,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACzG,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACzG,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,yBAAyB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,aAAa,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"javaFunctions.js","sourceRoot":"","sources":["../../../src/core/languages/javaFunctions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { createParserFor } from './treeSitterLoader.js';
|
|
3
|
+
import { extractPhpImports } from './phpImports.js';
|
|
4
|
+
import { extractPhpExports } from './phpExports.js';
|
|
5
|
+
import { extractPhpCyclomatic } from './phpCyclomatic.js';
|
|
6
|
+
import { extractPhpFunctions } from './phpFunctions.js';
|
|
7
|
+
import { extractPhpCallSites } from './phpCallSites.js';
|
|
8
|
+
import { detectPhpProject } from './phpManifests.js';
|
|
9
|
+
const PHP_EXTENSIONS = new Set(['.php']);
|
|
10
|
+
const MAX_PHP_FILE = 1024 * 1024;
|
|
11
|
+
let parserPromise = null;
|
|
12
|
+
async function getParser() {
|
|
13
|
+
if (!parserPromise)
|
|
14
|
+
parserPromise = createParserFor('tree-sitter-php.wasm');
|
|
15
|
+
return parserPromise;
|
|
16
|
+
}
|
|
17
|
+
export const phpAdapter = {
|
|
18
|
+
id: 'php',
|
|
19
|
+
extensions: PHP_EXTENSIONS,
|
|
20
|
+
sourceExtensions: PHP_EXTENSIONS,
|
|
21
|
+
// PHP has no barrel-file convention.
|
|
22
|
+
barrelBasenames: new Set(),
|
|
23
|
+
maxFileSize: MAX_PHP_FILE,
|
|
24
|
+
async parse(_filePath, content) {
|
|
25
|
+
try {
|
|
26
|
+
const parser = await getParser();
|
|
27
|
+
const tree = parser.parse(content);
|
|
28
|
+
if (!tree || !tree.rootNode) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
reason: 'tree-sitter returned null tree',
|
|
32
|
+
imports: [],
|
|
33
|
+
exports: [],
|
|
34
|
+
callSites: [],
|
|
35
|
+
lineCount: content ? content.split('\n').length : 0,
|
|
36
|
+
cyclomaticComplexity: 0,
|
|
37
|
+
functions: [],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const root = tree.rootNode;
|
|
41
|
+
const imports = extractPhpImports(root);
|
|
42
|
+
const exports = extractPhpExports(root);
|
|
43
|
+
const cyclomaticComplexity = extractPhpCyclomatic(root);
|
|
44
|
+
const callSites = extractPhpCallSites(root);
|
|
45
|
+
const functions = extractPhpFunctions(root);
|
|
46
|
+
return {
|
|
47
|
+
ok: true,
|
|
48
|
+
imports,
|
|
49
|
+
exports,
|
|
50
|
+
callSites,
|
|
51
|
+
lineCount: content ? content.split('\n').length : 0,
|
|
52
|
+
cyclomaticComplexity,
|
|
53
|
+
functions,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
reason: `php parse failure: ${msg.slice(0, 120)}`,
|
|
61
|
+
imports: [],
|
|
62
|
+
exports: [],
|
|
63
|
+
callSites: [],
|
|
64
|
+
lineCount: content ? content.split('\n').length : 0,
|
|
65
|
+
cyclomaticComplexity: 0,
|
|
66
|
+
functions: [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
resolveImport(importingFile, source, graphFiles, context) {
|
|
71
|
+
return resolvePhpImport(importingFile, source, graphFiles, context);
|
|
72
|
+
},
|
|
73
|
+
toPackageName(source) {
|
|
74
|
+
if (!source)
|
|
75
|
+
return null;
|
|
76
|
+
// Relative include paths (./, ../, /) are local; resolveImport handles them.
|
|
77
|
+
if (source.startsWith('./') || source.startsWith('../') || source.startsWith('/'))
|
|
78
|
+
return null;
|
|
79
|
+
if (source.includes('.php'))
|
|
80
|
+
return null; // bare include path with extension
|
|
81
|
+
// Namespace import: take the first segment as the "package". Composer
|
|
82
|
+
// package names are vendor/name; we approximate by taking the top namespace.
|
|
83
|
+
return source.split('\\')[0];
|
|
84
|
+
},
|
|
85
|
+
async preparePackageRoots(rootPath, files) {
|
|
86
|
+
const info = await detectPhpProject(rootPath, files);
|
|
87
|
+
if (!info)
|
|
88
|
+
return { packageRoots: [], meta: undefined };
|
|
89
|
+
const projectRel = path.relative(rootPath, info.projectRoot) || '.';
|
|
90
|
+
return {
|
|
91
|
+
packageRoots: [projectRel],
|
|
92
|
+
meta: { phpProject: info },
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Resolve a PHP import to a repo-local file or null.
|
|
98
|
+
*
|
|
99
|
+
* Two import shapes:
|
|
100
|
+
* 1. Namespace use: `use Foo\Bar\Baz;` — match the longest PSR-4 prefix
|
|
101
|
+
* from composer.json autoload, replace it with the prefix's source
|
|
102
|
+
* root, append the remaining segments as directories, append `.php`.
|
|
103
|
+
* Example with `psr-4: { "App\\": "src" }`:
|
|
104
|
+
* "App\\Models\\User" → src/Models/User.php
|
|
105
|
+
* 2. Include path: `require 'path/to/file.php';` — relative to the
|
|
106
|
+
* including file's directory; literal probe.
|
|
107
|
+
*/
|
|
108
|
+
function resolvePhpImport(importingFile, source, graphFiles, context) {
|
|
109
|
+
if (!source)
|
|
110
|
+
return null;
|
|
111
|
+
// Include-path form (literal `.php` filename).
|
|
112
|
+
if (source.endsWith('.php') || source.startsWith('./') || source.startsWith('../') || source.startsWith('/')) {
|
|
113
|
+
const importingDir = path.posix.dirname(importingFile);
|
|
114
|
+
const stripped = source.startsWith('/') ? source.slice(1) : source;
|
|
115
|
+
const joined = path.posix.normalize(path.posix.join(importingDir, stripped));
|
|
116
|
+
if (graphFiles.has(joined))
|
|
117
|
+
return joined;
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
// Namespace use form. Resolve via PSR-4 if we have a Composer project.
|
|
121
|
+
const project = context.meta?.phpProject;
|
|
122
|
+
if (!project || project.psr4.length === 0)
|
|
123
|
+
return null;
|
|
124
|
+
// Composer namespaces use `\` as the separator; in JSON the convention is
|
|
125
|
+
// `\\` (escaped). The grammar's qualified_name preserves single
|
|
126
|
+
// backslashes. We compare against composer.json prefixes that are also
|
|
127
|
+
// single-backslash because we already json-parsed them.
|
|
128
|
+
for (const { prefix, root } of project.psr4) {
|
|
129
|
+
if (source === prefix.replace(/\\$/, '')) {
|
|
130
|
+
// Exact namespace - usually doesn't resolve to a file, but try
|
|
131
|
+
// <root>/<index>.php as a courtesy.
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (source.startsWith(prefix)) {
|
|
135
|
+
const remainder = source.slice(prefix.length);
|
|
136
|
+
const segments = remainder.split('\\').filter(Boolean);
|
|
137
|
+
// Build the candidate. The composer root path is relative to the
|
|
138
|
+
// project root; the project root is the first packageRoot.
|
|
139
|
+
const projectRel = (context.packageRoots ?? ['.'])[0] ?? '.';
|
|
140
|
+
const projectSegs = projectRel === '.' || projectRel === '' ? [] : projectRel.split('/').filter(Boolean);
|
|
141
|
+
const rootSegs = root.split('/').filter(Boolean);
|
|
142
|
+
const candidate = [...projectSegs, ...rootSegs, ...segments].join('/') + '.php';
|
|
143
|
+
if (graphFiles.has(candidate))
|
|
144
|
+
return candidate;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=phpAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phpAdapter.js","sourceRoot":"","sources":["../../../src/core/languages/phpAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface TsNode {
|
|
2
|
+
type: string;
|
|
3
|
+
text: string;
|
|
4
|
+
namedChildren: TsNode[];
|
|
5
|
+
childForFieldName?: (name: string) => TsNode | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extract called-function names from PHP. Three call shapes, all surfaced
|
|
9
|
+
* as a deduplicated list of bare identifiers (mirrors the JS / Python /
|
|
10
|
+
* Go / Java / Ruby / Rust adapters):
|
|
11
|
+
*
|
|
12
|
+
* function_call_expression foo(args) → "foo"
|
|
13
|
+
* member_call_expression $obj->method(args) → "method"
|
|
14
|
+
* scoped_call_expression Foo::method(args) → "method"
|
|
15
|
+
* nullsafe_member_call_expression $obj?->method() → "method"
|
|
16
|
+
*
|
|
17
|
+
* `require` / `include` family are NOT call expressions in tree-sitter-php
|
|
18
|
+
* (they're their own expression kinds); we already handle those as imports.
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractPhpCallSites(root: TsNode): string[];
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract called-function names from PHP. Three call shapes, all surfaced
|
|
3
|
+
* as a deduplicated list of bare identifiers (mirrors the JS / Python /
|
|
4
|
+
* Go / Java / Ruby / Rust adapters):
|
|
5
|
+
*
|
|
6
|
+
* function_call_expression foo(args) → "foo"
|
|
7
|
+
* member_call_expression $obj->method(args) → "method"
|
|
8
|
+
* scoped_call_expression Foo::method(args) → "method"
|
|
9
|
+
* nullsafe_member_call_expression $obj?->method() → "method"
|
|
10
|
+
*
|
|
11
|
+
* `require` / `include` family are NOT call expressions in tree-sitter-php
|
|
12
|
+
* (they're their own expression kinds); we already handle those as imports.
|
|
13
|
+
*/
|
|
14
|
+
export function extractPhpCallSites(root) {
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
walk(root, (n) => {
|
|
17
|
+
let name = null;
|
|
18
|
+
if (n.type === 'function_call_expression') {
|
|
19
|
+
name = nameOf(n.childForFieldName ? n.childForFieldName('function') : null);
|
|
20
|
+
}
|
|
21
|
+
else if (n.type === 'member_call_expression' ||
|
|
22
|
+
n.type === 'nullsafe_member_call_expression' ||
|
|
23
|
+
n.type === 'scoped_call_expression') {
|
|
24
|
+
name = nameOf(n.childForFieldName ? n.childForFieldName('name') : null);
|
|
25
|
+
}
|
|
26
|
+
if (name)
|
|
27
|
+
seen.add(name);
|
|
28
|
+
});
|
|
29
|
+
return [...seen];
|
|
30
|
+
}
|
|
31
|
+
function nameOf(node) {
|
|
32
|
+
if (!node)
|
|
33
|
+
return null;
|
|
34
|
+
switch (node.type) {
|
|
35
|
+
case 'name':
|
|
36
|
+
case 'variable_name':
|
|
37
|
+
return node.text.replace(/^\$/, '');
|
|
38
|
+
case 'qualified_name': {
|
|
39
|
+
// Take the last segment.
|
|
40
|
+
let last = null;
|
|
41
|
+
for (const c of node.namedChildren) {
|
|
42
|
+
if (c.type === 'name')
|
|
43
|
+
last = c;
|
|
44
|
+
}
|
|
45
|
+
return last ? last.text : null;
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function walk(node, visit) {
|
|
52
|
+
visit(node);
|
|
53
|
+
for (const child of node.namedChildren)
|
|
54
|
+
walk(child, visit);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=phpCallSites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phpCallSites.js","sourceRoot":"","sources":["../../../src/core/languages/phpCallSites.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC1C,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;aAAM,IACL,CAAC,CAAC,IAAI,KAAK,wBAAwB;YACnC,CAAC,CAAC,IAAI,KAAK,iCAAiC;YAC5C,CAAC,CAAC,IAAI,KAAK,wBAAwB,EACnC,CAAC;YACD,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,MAAM,CAAC,IAAmB;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,eAAe;YAClB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,yBAAyB;YACzB,IAAI,IAAI,GAAkB,IAAI,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;oBAAE,IAAI,GAAG,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,KAA0B;IACpD,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa;QAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface TsNode {
|
|
2
|
+
type: string;
|
|
3
|
+
text: string;
|
|
4
|
+
namedChildren: TsNode[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* File-level McCabe cyclomatic complexity for tree-sitter-php.
|
|
8
|
+
*
|
|
9
|
+
* Decision points:
|
|
10
|
+
* if_statement +1
|
|
11
|
+
* else_if_clause / elseif_clause +1 each (the `else` does NOT count)
|
|
12
|
+
* for_statement / foreach_statement +1 each
|
|
13
|
+
* while_statement / do_statement +1 each
|
|
14
|
+
* case_statement / match_condition_list +1 per non-default arm (default does NOT count)
|
|
15
|
+
* catch_clause +1 each
|
|
16
|
+
* conditional_expression (ternary `?:`) +1
|
|
17
|
+
* binary_expression with `&&` / `||` +1 each
|
|
18
|
+
* binary_expression with `??` (null coalesce) +1
|
|
19
|
+
* `and` / `or` word operators +1 each (text-detected; binary_expression doesn't
|
|
20
|
+
* distinguish them from `&&` / `||` at the node-type
|
|
21
|
+
* level)
|
|
22
|
+
*
|
|
23
|
+
* Hat tip to existing analyzers (eslint, phpmetrics) that follow these
|
|
24
|
+
* conventions; we match them so our scores read like everyone else's.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractPhpCyclomatic(root: TsNode): number;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-level McCabe cyclomatic complexity for tree-sitter-php.
|
|
3
|
+
*
|
|
4
|
+
* Decision points:
|
|
5
|
+
* if_statement +1
|
|
6
|
+
* else_if_clause / elseif_clause +1 each (the `else` does NOT count)
|
|
7
|
+
* for_statement / foreach_statement +1 each
|
|
8
|
+
* while_statement / do_statement +1 each
|
|
9
|
+
* case_statement / match_condition_list +1 per non-default arm (default does NOT count)
|
|
10
|
+
* catch_clause +1 each
|
|
11
|
+
* conditional_expression (ternary `?:`) +1
|
|
12
|
+
* binary_expression with `&&` / `||` +1 each
|
|
13
|
+
* binary_expression with `??` (null coalesce) +1
|
|
14
|
+
* `and` / `or` word operators +1 each (text-detected; binary_expression doesn't
|
|
15
|
+
* distinguish them from `&&` / `||` at the node-type
|
|
16
|
+
* level)
|
|
17
|
+
*
|
|
18
|
+
* Hat tip to existing analyzers (eslint, phpmetrics) that follow these
|
|
19
|
+
* conventions; we match them so our scores read like everyone else's.
|
|
20
|
+
*/
|
|
21
|
+
export function extractPhpCyclomatic(root) {
|
|
22
|
+
let decisions = 0;
|
|
23
|
+
walk(root, (n) => {
|
|
24
|
+
if (isDecisionPoint(n))
|
|
25
|
+
decisions++;
|
|
26
|
+
});
|
|
27
|
+
return decisions + 1;
|
|
28
|
+
}
|
|
29
|
+
function isDecisionPoint(n) {
|
|
30
|
+
switch (n.type) {
|
|
31
|
+
case 'if_statement':
|
|
32
|
+
case 'else_if_clause':
|
|
33
|
+
case 'elseif_clause':
|
|
34
|
+
case 'for_statement':
|
|
35
|
+
case 'foreach_statement':
|
|
36
|
+
case 'while_statement':
|
|
37
|
+
case 'do_statement':
|
|
38
|
+
case 'catch_clause':
|
|
39
|
+
case 'conditional_expression':
|
|
40
|
+
return true;
|
|
41
|
+
case 'case_statement': {
|
|
42
|
+
// `default:` is the fallthrough, not a branch.
|
|
43
|
+
return !/^\s*default\b/.test(n.text);
|
|
44
|
+
}
|
|
45
|
+
case 'match_condition_list': {
|
|
46
|
+
// Each match condition list is one arm of a `match { ... }`. Arms
|
|
47
|
+
// matching anything but `default` count.
|
|
48
|
+
return !/^\s*default\b/.test(n.text);
|
|
49
|
+
}
|
|
50
|
+
case 'binary_expression': {
|
|
51
|
+
const t = n.text;
|
|
52
|
+
// PHP supports both symbolic (`&&`, `||`, `??`) and word (`and`, `or`)
|
|
53
|
+
// boolean operators. Match each occurrence at most once per node.
|
|
54
|
+
if (/(\s|^)(\|\||&&|\?\?)(\s|$)/.test(t))
|
|
55
|
+
return true;
|
|
56
|
+
if (/\b(and|or)\b/.test(t))
|
|
57
|
+
return true;
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function walk(node, visit) {
|
|
65
|
+
visit(node);
|
|
66
|
+
for (const child of node.namedChildren)
|
|
67
|
+
walk(child, visit);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=phpCyclomatic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phpCyclomatic.js","sourceRoot":"","sources":["../../../src/core/languages/phpCyclomatic.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,IAAI,eAAe,CAAC,CAAC,CAAC;YAAE,SAAS,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAChC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,cAAc,CAAC;QACpB,KAAK,gBAAgB,CAAC;QACtB,KAAK,eAAe,CAAC;QACrB,KAAK,eAAe,CAAC;QACrB,KAAK,mBAAmB,CAAC;QACzB,KAAK,iBAAiB,CAAC;QACvB,KAAK,cAAc,CAAC;QACpB,KAAK,cAAc,CAAC;QACpB,KAAK,wBAAwB;YAC3B,OAAO,IAAI,CAAC;QACd,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,+CAA+C;YAC/C,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC5B,kEAAkE;YAClE,yCAAyC;YACzC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,uEAAuE;YACvE,kEAAkE;YAClE,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtD,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,KAA0B;IACpD,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa;QAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AstExport } from '../ast.js';
|
|
2
|
+
interface TsNode {
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
startPosition: {
|
|
6
|
+
row: number;
|
|
7
|
+
column: number;
|
|
8
|
+
};
|
|
9
|
+
namedChildren: TsNode[];
|
|
10
|
+
childForFieldName?: (name: string) => TsNode | null;
|
|
11
|
+
}
|
|
12
|
+
export declare function extractPhpExports(root: TsNode): AstExport[];
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level PHP declarations are always public to anything that imports the
|
|
3
|
+
* file's namespace via `use` — there's no `private` modifier at the file /
|
|
4
|
+
* namespace scope (only inside classes). So all top-level
|
|
5
|
+
* function_definition / class_declaration / interface_declaration /
|
|
6
|
+
* trait_declaration / enum_declaration nodes count as exports.
|
|
7
|
+
*
|
|
8
|
+
* Method-level visibility is enforced inside `phpFunctions.ts` (where
|
|
9
|
+
* we surface per-method CC); it doesn't matter at the file-export level.
|
|
10
|
+
*/
|
|
11
|
+
const TOP_LEVEL_EXPORTS = {
|
|
12
|
+
function_definition: 'function',
|
|
13
|
+
class_declaration: 'class',
|
|
14
|
+
interface_declaration: 'interface',
|
|
15
|
+
trait_declaration: 'class',
|
|
16
|
+
enum_declaration: 'enum',
|
|
17
|
+
};
|
|
18
|
+
export function extractPhpExports(root) {
|
|
19
|
+
const exports = [];
|
|
20
|
+
// Only walk top-level (program -> direct children). Nested classes are
|
|
21
|
+
// method-level and addressed by phpFunctions, not file exports.
|
|
22
|
+
for (const child of root.namedChildren) {
|
|
23
|
+
visit(child, exports, /* depth */ 0);
|
|
24
|
+
}
|
|
25
|
+
return exports;
|
|
26
|
+
}
|
|
27
|
+
function visit(node, out, depth) {
|
|
28
|
+
const kind = TOP_LEVEL_EXPORTS[node.type];
|
|
29
|
+
if (kind && depth === 0) {
|
|
30
|
+
const name = nameOf(node);
|
|
31
|
+
if (name) {
|
|
32
|
+
out.push({ name, kind, typeOnly: false, line: node.startPosition.row + 1 });
|
|
33
|
+
}
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// namespace_definition wraps further declarations; descend with the same
|
|
37
|
+
// depth so we still classify its top-level children as exports.
|
|
38
|
+
if (node.type === 'namespace_definition') {
|
|
39
|
+
const body = node.namedChildren.find((c) => c.type === 'declaration_list' || c.type === 'compound_statement');
|
|
40
|
+
if (body) {
|
|
41
|
+
for (const c of body.namedChildren)
|
|
42
|
+
visit(c, out, depth);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function nameOf(node) {
|
|
47
|
+
if (node.childForFieldName) {
|
|
48
|
+
const id = node.childForFieldName('name');
|
|
49
|
+
if (id)
|
|
50
|
+
return id.text;
|
|
51
|
+
}
|
|
52
|
+
for (const c of node.namedChildren) {
|
|
53
|
+
if (c.type === 'name')
|
|
54
|
+
return c.text;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=phpExports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phpExports.js","sourceRoot":"","sources":["../../../src/core/languages/phpExports.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,MAAM,iBAAiB,GAA+B;IACpD,mBAAmB,EAAE,UAAU;IAC/B,iBAAiB,EAAE,OAAO;IAC1B,qBAAqB,EAAE,WAAW;IAClC,iBAAiB,EAAE,OAAO;IAC1B,gBAAgB,EAAE,MAAM;CACzB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,uEAAuE;IACvE,gEAAgE;IAChE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,GAAgB,EAAE,KAAa;IAC1D,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO;IACT,CAAC;IACD,yEAAyE;IACzE,gEAAgE;IAChE,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;QAC9G,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa;gBAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FunctionInfo } from '../ast.js';
|
|
2
|
+
interface TsNode {
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
startPosition: {
|
|
6
|
+
row: number;
|
|
7
|
+
column: number;
|
|
8
|
+
};
|
|
9
|
+
endPosition: {
|
|
10
|
+
row: number;
|
|
11
|
+
column: number;
|
|
12
|
+
};
|
|
13
|
+
namedChildren: TsNode[];
|
|
14
|
+
childForFieldName?: (name: string) => TsNode | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Per-function McCabe CC for PHP. Walks `function_definition` (free
|
|
18
|
+
* functions) and `method_declaration` nodes. Methods inside `class Foo`
|
|
19
|
+
* are named `Foo.method`; methods in interfaces/traits/enums use the
|
|
20
|
+
* declaring type's name. Anonymous functions and closures are not
|
|
21
|
+
* extracted as separate functions; their CC folds into the enclosing
|
|
22
|
+
* function.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractPhpFunctions(root: TsNode): FunctionInfo[];
|
|
25
|
+
export {};
|