kopytko-linter 0.1.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 +190 -0
- package/dist/bin/kopytko-lint.d.ts +3 -0
- package/dist/bin/kopytko-lint.d.ts.map +1 -0
- package/dist/bin/kopytko-lint.js +118 -0
- package/dist/bin/kopytko-lint.js.map +1 -0
- package/dist/src/analysis/fsWrapper.d.ts +19 -0
- package/dist/src/analysis/fsWrapper.d.ts.map +1 -0
- package/dist/src/analysis/fsWrapper.js +62 -0
- package/dist/src/analysis/fsWrapper.js.map +1 -0
- package/dist/src/analysis/functionIndex.d.ts +19 -0
- package/dist/src/analysis/functionIndex.d.ts.map +1 -0
- package/dist/src/analysis/functionIndex.js +69 -0
- package/dist/src/analysis/functionIndex.js.map +1 -0
- package/dist/src/analysis/globMatcher.d.ts +8 -0
- package/dist/src/analysis/globMatcher.d.ts.map +1 -0
- package/dist/src/analysis/globMatcher.js +27 -0
- package/dist/src/analysis/globMatcher.js.map +1 -0
- package/dist/src/analysis/importParser.d.ts +22 -0
- package/dist/src/analysis/importParser.d.ts.map +1 -0
- package/dist/src/analysis/importParser.js +131 -0
- package/dist/src/analysis/importParser.js.map +1 -0
- package/dist/src/analysis/patternSiblings.d.ts +13 -0
- package/dist/src/analysis/patternSiblings.d.ts.map +1 -0
- package/dist/src/analysis/patternSiblings.js +91 -0
- package/dist/src/analysis/patternSiblings.js.map +1 -0
- package/dist/src/analysis/scopeAnalysis.d.ts +17 -0
- package/dist/src/analysis/scopeAnalysis.d.ts.map +1 -0
- package/dist/src/analysis/scopeAnalysis.js +180 -0
- package/dist/src/analysis/scopeAnalysis.js.map +1 -0
- package/dist/src/analysis/testUtils.d.ts +17 -0
- package/dist/src/analysis/testUtils.d.ts.map +1 -0
- package/dist/src/analysis/testUtils.js +124 -0
- package/dist/src/analysis/testUtils.js.map +1 -0
- package/dist/src/analysis/textUtils.d.ts +9 -0
- package/dist/src/analysis/textUtils.d.ts.map +1 -0
- package/dist/src/analysis/textUtils.js +45 -0
- package/dist/src/analysis/textUtils.js.map +1 -0
- package/dist/src/catalog/builtins.d.ts +26 -0
- package/dist/src/catalog/builtins.d.ts.map +1 -0
- package/dist/src/catalog/builtins.js +123 -0
- package/dist/src/catalog/builtins.js.map +1 -0
- package/dist/src/catalog/components.d.ts +8 -0
- package/dist/src/catalog/components.d.ts.map +1 -0
- package/dist/src/catalog/components.js +35 -0
- package/dist/src/catalog/components.js.map +1 -0
- package/dist/src/config.d.ts +23 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +167 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context.d.ts +22 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +3 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/index.d.ts +28 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +54 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jsonc.d.ts +6 -0
- package/dist/src/jsonc.d.ts.map +1 -0
- package/dist/src/jsonc.js +46 -0
- package/dist/src/jsonc.js.map +1 -0
- package/dist/src/linter.d.ts +19 -0
- package/dist/src/linter.d.ts.map +1 -0
- package/dist/src/linter.js +274 -0
- package/dist/src/linter.js.map +1 -0
- package/dist/src/output/jsonFormatter.d.ts +3 -0
- package/dist/src/output/jsonFormatter.d.ts.map +1 -0
- package/dist/src/output/jsonFormatter.js +26 -0
- package/dist/src/output/jsonFormatter.js.map +1 -0
- package/dist/src/output/sarifFormatter.d.ts +3 -0
- package/dist/src/output/sarifFormatter.d.ts.map +1 -0
- package/dist/src/output/sarifFormatter.js +110 -0
- package/dist/src/output/sarifFormatter.js.map +1 -0
- package/dist/src/output/textFormatter.d.ts +3 -0
- package/dist/src/output/textFormatter.d.ts.map +1 -0
- package/dist/src/output/textFormatter.js +61 -0
- package/dist/src/output/textFormatter.js.map +1 -0
- package/dist/src/rules/identifierRules.d.ts +6 -0
- package/dist/src/rules/identifierRules.d.ts.map +1 -0
- package/dist/src/rules/identifierRules.js +322 -0
- package/dist/src/rules/identifierRules.js.map +1 -0
- package/dist/src/rules/importRules.d.ts +6 -0
- package/dist/src/rules/importRules.d.ts.map +1 -0
- package/dist/src/rules/importRules.js +164 -0
- package/dist/src/rules/importRules.js.map +1 -0
- package/dist/src/rules/index.d.ts +4 -0
- package/dist/src/rules/index.d.ts.map +1 -0
- package/dist/src/rules/index.js +21 -0
- package/dist/src/rules/index.js.map +1 -0
- package/dist/src/rules/syntaxRules.d.ts +6 -0
- package/dist/src/rules/syntaxRules.d.ts.map +1 -0
- package/dist/src/rules/syntaxRules.js +221 -0
- package/dist/src/rules/syntaxRules.js.map +1 -0
- package/dist/src/rules/testRules.d.ts +3 -0
- package/dist/src/rules/testRules.d.ts.map +1 -0
- package/dist/src/rules/testRules.js +79 -0
- package/dist/src/rules/testRules.js.map +1 -0
- package/dist/src/types.d.ts +54 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ImportResolver = void 0;
|
|
40
|
+
exports.parseImports = parseImports;
|
|
41
|
+
const nodePath = __importStar(require("path"));
|
|
42
|
+
const fsWrapper_1 = __importDefault(require("./fsWrapper"));
|
|
43
|
+
const IMPORT_PATTERN = /^\s*'\s*@(import|mock)\s+(\S+)(?:\s+from\s+(\S+))?\s*$/;
|
|
44
|
+
function parseImports(text) {
|
|
45
|
+
const lines = text.split(/\r?\n/);
|
|
46
|
+
const imports = [];
|
|
47
|
+
for (let i = 0; i < lines.length; i++) {
|
|
48
|
+
const match = IMPORT_PATTERN.exec(lines[i]);
|
|
49
|
+
if (!match)
|
|
50
|
+
continue;
|
|
51
|
+
imports.push({
|
|
52
|
+
raw: lines[i],
|
|
53
|
+
importPath: match[2],
|
|
54
|
+
fromModule: match[3] || undefined,
|
|
55
|
+
line: i + 1,
|
|
56
|
+
isMock: match[1] === 'mock',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return imports;
|
|
60
|
+
}
|
|
61
|
+
class ImportResolver {
|
|
62
|
+
options;
|
|
63
|
+
packageCache = null;
|
|
64
|
+
constructor(options) {
|
|
65
|
+
this.options = options;
|
|
66
|
+
}
|
|
67
|
+
getWorkspaceFolders() {
|
|
68
|
+
return this.options.workspaceFolders;
|
|
69
|
+
}
|
|
70
|
+
getSourceDir() {
|
|
71
|
+
return this.options.sourceDir;
|
|
72
|
+
}
|
|
73
|
+
parseImports(text) {
|
|
74
|
+
return parseImports(text);
|
|
75
|
+
}
|
|
76
|
+
resolveImportPath(imp, documentPath) {
|
|
77
|
+
if (imp.fromModule) {
|
|
78
|
+
return this.resolveExternalImport(imp.importPath, imp.fromModule);
|
|
79
|
+
}
|
|
80
|
+
return this.resolveInternalImport(imp.importPath, documentPath);
|
|
81
|
+
}
|
|
82
|
+
importExists(imp, documentPath) {
|
|
83
|
+
return this.resolveImportPath(imp, documentPath) !== undefined;
|
|
84
|
+
}
|
|
85
|
+
invalidatePackageCache() {
|
|
86
|
+
this.packageCache = null;
|
|
87
|
+
}
|
|
88
|
+
resolveInternalImport(importPath, documentPath) {
|
|
89
|
+
const { workspaceFolders, sourceDir } = this.options;
|
|
90
|
+
// Try workspace folders
|
|
91
|
+
for (const folder of workspaceFolders) {
|
|
92
|
+
const withSource = nodePath.join(folder, sourceDir, importPath);
|
|
93
|
+
if (fsWrapper_1.default.existsSync(withSource))
|
|
94
|
+
return withSource;
|
|
95
|
+
const direct = nodePath.join(folder, importPath);
|
|
96
|
+
if (fsWrapper_1.default.existsSync(direct))
|
|
97
|
+
return direct;
|
|
98
|
+
}
|
|
99
|
+
// Try relative to document
|
|
100
|
+
const relative = nodePath.resolve(nodePath.dirname(documentPath), importPath);
|
|
101
|
+
if (fsWrapper_1.default.existsSync(relative))
|
|
102
|
+
return relative;
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
resolveExternalImport(importPath, moduleName) {
|
|
106
|
+
if (!this.options.resolveModules)
|
|
107
|
+
return undefined;
|
|
108
|
+
const packageRoot = this.resolvePackageBaseDir(moduleName);
|
|
109
|
+
if (!packageRoot)
|
|
110
|
+
return undefined;
|
|
111
|
+
const fullPath = nodePath.join(packageRoot, importPath);
|
|
112
|
+
if (fsWrapper_1.default.existsSync(fullPath))
|
|
113
|
+
return fullPath;
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
resolvePackageBaseDir(packageName) {
|
|
117
|
+
if (!this.packageCache) {
|
|
118
|
+
this.packageCache = new Map();
|
|
119
|
+
for (const folder of this.options.workspaceFolders) {
|
|
120
|
+
const nodeModulesPath = nodePath.join(folder, 'node_modules', packageName);
|
|
121
|
+
if (fsWrapper_1.default.existsSync(nodeModulesPath)) {
|
|
122
|
+
this.packageCache.set(packageName, nodeModulesPath);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return this.packageCache.get(packageName);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.ImportResolver = ImportResolver;
|
|
131
|
+
//# sourceMappingURL=importParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importParser.js","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches a filename against a single-wildcard pattern (e.g. "*.component.brs").
|
|
3
|
+
* Returns the string captured by the wildcard, or null if there is no match.
|
|
4
|
+
*/
|
|
5
|
+
export declare function matchWildcard(str: string, pattern: string): string | null;
|
|
6
|
+
/** Replaces the single `*` in a pattern with the given wildcard value. */
|
|
7
|
+
export declare function applyWildcard(pattern: string, wildcard: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Given a document path and sibling pattern groups, returns the absolute paths
|
|
10
|
+
* of any sibling files that exist alongside the current document.
|
|
11
|
+
*/
|
|
12
|
+
export declare function findSiblingFiles(documentPath: string, siblingPatterns: string[][]): string[];
|
|
13
|
+
//# sourceMappingURL=patternSiblings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patternSiblings.d.ts","sourceRoot":"","sources":["../../../src/analysis/patternSiblings.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUzE;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAoB5F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.matchWildcard = matchWildcard;
|
|
40
|
+
exports.applyWildcard = applyWildcard;
|
|
41
|
+
exports.findSiblingFiles = findSiblingFiles;
|
|
42
|
+
const nodePath = __importStar(require("path"));
|
|
43
|
+
const fsWrapper_1 = __importDefault(require("./fsWrapper"));
|
|
44
|
+
/**
|
|
45
|
+
* Matches a filename against a single-wildcard pattern (e.g. "*.component.brs").
|
|
46
|
+
* Returns the string captured by the wildcard, or null if there is no match.
|
|
47
|
+
*/
|
|
48
|
+
function matchWildcard(str, pattern) {
|
|
49
|
+
const starIdx = pattern.indexOf('*');
|
|
50
|
+
if (starIdx < 0)
|
|
51
|
+
return str === pattern ? '' : null;
|
|
52
|
+
const prefix = pattern.slice(0, starIdx);
|
|
53
|
+
const suffix = pattern.slice(starIdx + 1);
|
|
54
|
+
if (str.startsWith(prefix) && str.endsWith(suffix) && str.length >= prefix.length + suffix.length) {
|
|
55
|
+
const end = suffix.length > 0 ? str.length - suffix.length : str.length;
|
|
56
|
+
return str.slice(prefix.length, end);
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/** Replaces the single `*` in a pattern with the given wildcard value. */
|
|
61
|
+
function applyWildcard(pattern, wildcard) {
|
|
62
|
+
return pattern.replace('*', wildcard);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Given a document path and sibling pattern groups, returns the absolute paths
|
|
66
|
+
* of any sibling files that exist alongside the current document.
|
|
67
|
+
*/
|
|
68
|
+
function findSiblingFiles(documentPath, siblingPatterns) {
|
|
69
|
+
if (siblingPatterns.length === 0)
|
|
70
|
+
return [];
|
|
71
|
+
const dir = nodePath.dirname(documentPath);
|
|
72
|
+
const filename = nodePath.basename(documentPath);
|
|
73
|
+
for (const group of siblingPatterns) {
|
|
74
|
+
for (const pattern of group) {
|
|
75
|
+
const wildcard = matchWildcard(filename, pattern);
|
|
76
|
+
if (wildcard === null)
|
|
77
|
+
continue;
|
|
78
|
+
const siblings = [];
|
|
79
|
+
for (const siblingPattern of group) {
|
|
80
|
+
if (siblingPattern === pattern)
|
|
81
|
+
continue;
|
|
82
|
+
const siblingPath = nodePath.join(dir, applyWildcard(siblingPattern, wildcard));
|
|
83
|
+
if (fsWrapper_1.default.existsSync(siblingPath))
|
|
84
|
+
siblings.push(siblingPath);
|
|
85
|
+
}
|
|
86
|
+
return siblings; // use first matching group only
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=patternSiblings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patternSiblings.js","sourceRoot":"","sources":["../../../src/analysis/patternSiblings.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,sCAUC;AAGD,sCAEC;AAMD,4CAoBC;AAhDD,+CAAiC;AACjC,4DAAoC;AAEpC;;;GAGG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,OAAe;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAClG,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACxE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,SAAgB,aAAa,CAAC,OAAe,EAAE,QAAgB;IAC7D,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,YAAoB,EAAE,eAA2B;IAChF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,IAAI;gBAAE,SAAS;YAEhC,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,cAAc,IAAI,KAAK,EAAE,CAAC;gBACnC,IAAI,cAAc,KAAK,OAAO;oBAAE,SAAS;gBACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAChF,IAAI,mBAAS,CAAC,UAAU,CAAC,WAAW,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,gCAAgC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface FunctionScope {
|
|
2
|
+
startLine: number;
|
|
3
|
+
endLine: number;
|
|
4
|
+
startColumn: number;
|
|
5
|
+
name: string;
|
|
6
|
+
params: Set<string>;
|
|
7
|
+
vars: Set<string>;
|
|
8
|
+
}
|
|
9
|
+
declare const PARAM_LIST_RE: RegExp;
|
|
10
|
+
declare const ENTRY_POINT_NAMES: Set<string>;
|
|
11
|
+
export { PARAM_LIST_RE, ENTRY_POINT_NAMES };
|
|
12
|
+
export declare function buildFunctionScopes(lines: string[]): FunctionScope[];
|
|
13
|
+
export declare function findScopeAtLine(scopes: FunctionScope[], lineIdx: number): FunctionScope | null;
|
|
14
|
+
export declare function findParentScopeAtLine(scopes: FunctionScope[], lineIdx: number, innermost: FunctionScope): FunctionScope | null;
|
|
15
|
+
export declare function computeMainBodyLines(lines: string[]): boolean[];
|
|
16
|
+
export declare function countCallArgs(stripped: string, openParenPos: number): number | null;
|
|
17
|
+
//# sourceMappingURL=scopeAnalysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/analysis/scopeAnalysis.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnB;AAID,QAAA,MAAM,aAAa,QAA4D,CAAC;AAChF,QAAA,MAAM,iBAAiB,aAA0D,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AAE5C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAsEpE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAU9F;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EAAE,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,GACvB,aAAa,GAAG,IAAI,CAWtB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CA+B/D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+BnF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ENTRY_POINT_NAMES = exports.PARAM_LIST_RE = void 0;
|
|
4
|
+
exports.buildFunctionScopes = buildFunctionScopes;
|
|
5
|
+
exports.findScopeAtLine = findScopeAtLine;
|
|
6
|
+
exports.findParentScopeAtLine = findParentScopeAtLine;
|
|
7
|
+
exports.computeMainBodyLines = computeMainBodyLines;
|
|
8
|
+
exports.countCallArgs = countCallArgs;
|
|
9
|
+
const textUtils_1 = require("./textUtils");
|
|
10
|
+
const builtins_1 = require("../catalog/builtins");
|
|
11
|
+
const ANON_FUNC_SCOPE_RE = /\b(?:function|sub)\s*\(/i;
|
|
12
|
+
const FUNC_END_SCOPE_RE = /^\s*(?:end\s*(?:function|sub)|endfunction|endsub)\b/i;
|
|
13
|
+
const PARAM_LIST_RE = /\b(?:function|sub)\b\s*(?:[a-zA-Z_]\w*\s*)?\(([^)]*)\)/i;
|
|
14
|
+
exports.PARAM_LIST_RE = PARAM_LIST_RE;
|
|
15
|
+
const ENTRY_POINT_NAMES = new Set(['main', 'runuserinterface', 'runscreensaver']);
|
|
16
|
+
exports.ENTRY_POINT_NAMES = ENTRY_POINT_NAMES;
|
|
17
|
+
function buildFunctionScopes(lines) {
|
|
18
|
+
const allScopes = [];
|
|
19
|
+
const stack = [];
|
|
20
|
+
const ASSIGN_RE_SCOPE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
|
|
21
|
+
const FOR_RE_SCOPE = /^\s*for\s+(?:each\s+)?([a-zA-Z_]\w*)\b/i;
|
|
22
|
+
const DIM_RE_SCOPE = /^\s*dim\s+([a-zA-Z_]\w*)\s*\(/i;
|
|
23
|
+
const CATCH_RE_SCOPE = /^\s*catch\s+\(?([a-zA-Z_]\w*)\)?/i;
|
|
24
|
+
for (let i = 0; i < lines.length; i++) {
|
|
25
|
+
const line = lines[i];
|
|
26
|
+
if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
|
|
27
|
+
continue;
|
|
28
|
+
if (FUNC_END_SCOPE_RE.test(line)) {
|
|
29
|
+
if (stack.length > 0) {
|
|
30
|
+
stack[stack.length - 1].endLine = i;
|
|
31
|
+
stack.pop();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const current = stack.length > 0 ? stack[stack.length - 1] : null;
|
|
35
|
+
if (current) {
|
|
36
|
+
const assignMatch = ASSIGN_RE_SCOPE.exec(line);
|
|
37
|
+
if (assignMatch) {
|
|
38
|
+
const n = assignMatch[1].toLowerCase();
|
|
39
|
+
if (!builtins_1.keywordNames.has(n))
|
|
40
|
+
current.vars.add(n);
|
|
41
|
+
}
|
|
42
|
+
const forMatch = FOR_RE_SCOPE.exec(line);
|
|
43
|
+
if (forMatch)
|
|
44
|
+
current.vars.add(forMatch[1].toLowerCase());
|
|
45
|
+
const dimMatch = DIM_RE_SCOPE.exec(line);
|
|
46
|
+
if (dimMatch)
|
|
47
|
+
current.vars.add(dimMatch[1].toLowerCase());
|
|
48
|
+
const catchMatch = CATCH_RE_SCOPE.exec(line);
|
|
49
|
+
if (catchMatch)
|
|
50
|
+
current.vars.add(catchMatch[1].toLowerCase());
|
|
51
|
+
}
|
|
52
|
+
const strippedForScope = (0, textUtils_1.stripStringLiterals)(line, true);
|
|
53
|
+
const namedDeclMatch = /^\s*(?:function|sub)\s+([a-zA-Z_]\w*)\s*\(/i.exec(strippedForScope);
|
|
54
|
+
const isNamed = namedDeclMatch !== null;
|
|
55
|
+
const isAnon = !isNamed && ANON_FUNC_SCOPE_RE.test(strippedForScope);
|
|
56
|
+
if (isNamed || isAnon) {
|
|
57
|
+
const params = new Set();
|
|
58
|
+
const pm = PARAM_LIST_RE.exec(strippedForScope);
|
|
59
|
+
if (pm && pm[1].trim()) {
|
|
60
|
+
for (const part of pm[1].split(',')) {
|
|
61
|
+
const nm = /^\s*([a-zA-Z_]\w*)/.exec(part.trim());
|
|
62
|
+
if (nm) {
|
|
63
|
+
const p = nm[1].toLowerCase();
|
|
64
|
+
if (!builtins_1.keywordNames.has(p))
|
|
65
|
+
params.add(p);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const kwMatch = /\b(?:function|sub)\s*(?:\(|[a-zA-Z_])/i.exec(strippedForScope);
|
|
70
|
+
const newScope = {
|
|
71
|
+
startLine: i,
|
|
72
|
+
endLine: lines.length - 1,
|
|
73
|
+
startColumn: kwMatch ? kwMatch.index : 0,
|
|
74
|
+
name: namedDeclMatch ? namedDeclMatch[1].toLowerCase() : '',
|
|
75
|
+
params,
|
|
76
|
+
vars: new Set(),
|
|
77
|
+
};
|
|
78
|
+
allScopes.push(newScope);
|
|
79
|
+
stack.push(newScope);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return allScopes;
|
|
83
|
+
}
|
|
84
|
+
function findScopeAtLine(scopes, lineIdx) {
|
|
85
|
+
let innermost = null;
|
|
86
|
+
for (const s of scopes) {
|
|
87
|
+
if (s.startLine <= lineIdx && lineIdx <= s.endLine) {
|
|
88
|
+
if (!innermost || s.startLine > innermost.startLine) {
|
|
89
|
+
innermost = s;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return innermost;
|
|
94
|
+
}
|
|
95
|
+
function findParentScopeAtLine(scopes, lineIdx, innermost) {
|
|
96
|
+
let parent = null;
|
|
97
|
+
for (const s of scopes) {
|
|
98
|
+
if (s === innermost)
|
|
99
|
+
continue;
|
|
100
|
+
if (s.startLine <= lineIdx && lineIdx <= s.endLine) {
|
|
101
|
+
if (!parent || s.startLine > parent.startLine) {
|
|
102
|
+
parent = s;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return parent;
|
|
107
|
+
}
|
|
108
|
+
function computeMainBodyLines(lines) {
|
|
109
|
+
const result = new Array(lines.length).fill(false);
|
|
110
|
+
let inEntryPoint = false;
|
|
111
|
+
let depth = 0;
|
|
112
|
+
for (let i = 0; i < lines.length; i++) {
|
|
113
|
+
const raw = lines[i];
|
|
114
|
+
if (!raw || /^\s*'/.test(raw) || /^\s*rem\b/i.test(raw))
|
|
115
|
+
continue;
|
|
116
|
+
const s = (0, textUtils_1.stripStringLiterals)(raw, true);
|
|
117
|
+
if (!inEntryPoint) {
|
|
118
|
+
const m = /^\s*(?:function|sub)\s+([a-zA-Z_]\w*)\s*\(/i.exec(s);
|
|
119
|
+
if (m && ENTRY_POINT_NAMES.has(m[1].toLowerCase())) {
|
|
120
|
+
inEntryPoint = true;
|
|
121
|
+
depth = 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
result[i] = true;
|
|
126
|
+
if (/^\s*(?:end\s*(?:function|sub)|endfunction|endsub)\b/i.test(s)) {
|
|
127
|
+
depth--;
|
|
128
|
+
if (depth === 0)
|
|
129
|
+
inEntryPoint = false;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
if (/^\s*(?:function|sub)\b/i.test(s) || /\b(?:function|sub)\s*\(/i.test(s)) {
|
|
133
|
+
depth++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
function countCallArgs(stripped, openParenPos) {
|
|
141
|
+
if (openParenPos >= stripped.length || stripped[openParenPos] !== '(')
|
|
142
|
+
return null;
|
|
143
|
+
let parenDepth = 0;
|
|
144
|
+
let squareDepth = 0;
|
|
145
|
+
let braceDepth = 0;
|
|
146
|
+
let topLevelCommas = 0;
|
|
147
|
+
let nonEmpty = false;
|
|
148
|
+
for (let i = openParenPos; i < stripped.length; i++) {
|
|
149
|
+
const ch = stripped[i];
|
|
150
|
+
if (ch === '(') {
|
|
151
|
+
parenDepth++;
|
|
152
|
+
}
|
|
153
|
+
else if (ch === ')') {
|
|
154
|
+
parenDepth--;
|
|
155
|
+
if (parenDepth === 0)
|
|
156
|
+
return nonEmpty ? topLevelCommas + 1 : 0;
|
|
157
|
+
}
|
|
158
|
+
else if (ch === '[') {
|
|
159
|
+
squareDepth++;
|
|
160
|
+
}
|
|
161
|
+
else if (ch === ']') {
|
|
162
|
+
squareDepth--;
|
|
163
|
+
}
|
|
164
|
+
else if (ch === '{') {
|
|
165
|
+
braceDepth++;
|
|
166
|
+
}
|
|
167
|
+
else if (ch === '}') {
|
|
168
|
+
braceDepth--;
|
|
169
|
+
}
|
|
170
|
+
else if (ch === ',' && parenDepth === 1 && squareDepth === 0 && braceDepth === 0) {
|
|
171
|
+
topLevelCommas++;
|
|
172
|
+
nonEmpty = true;
|
|
173
|
+
}
|
|
174
|
+
else if (parenDepth === 1 && squareDepth === 0 && braceDepth === 0 && ch !== ' ') {
|
|
175
|
+
nonEmpty = true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=scopeAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeAnalysis.js","sourceRoot":"","sources":["../../../src/analysis/scopeAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Check if a file URI or path looks like a test file. */
|
|
2
|
+
export declare function isTestFile(uriOrPath: string): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the base test name from a test file path.
|
|
5
|
+
* `Foo.test.brs` → `Foo`, `Foo_Bar.test.brs` → `Foo`
|
|
6
|
+
*/
|
|
7
|
+
export declare function getTestBaseName(testFilePath: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Finds sibling test files that share the same base name.
|
|
10
|
+
* `Foo.test.brs` ↔ `Foo_Bar.test.brs` ↔ `Foo_Baz.test.brs` all share scope.
|
|
11
|
+
*/
|
|
12
|
+
export declare function findTestSiblings(testFilePath: string): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Resolves which source files a test file is testing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveTestedFiles(testFilePath: string): string[];
|
|
17
|
+
//# sourceMappingURL=testUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/analysis/testUtils.ts"],"names":[],"mappings":"AAGA,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB/D;AAiBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BjE"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.isTestFile = isTestFile;
|
|
40
|
+
exports.getTestBaseName = getTestBaseName;
|
|
41
|
+
exports.findTestSiblings = findTestSiblings;
|
|
42
|
+
exports.resolveTestedFiles = resolveTestedFiles;
|
|
43
|
+
const nodePath = __importStar(require("path"));
|
|
44
|
+
const fsWrapper_1 = __importDefault(require("./fsWrapper"));
|
|
45
|
+
/** Check if a file URI or path looks like a test file. */
|
|
46
|
+
function isTestFile(uriOrPath) {
|
|
47
|
+
return /[/\\]_tests[/\\].*\.test\.brs$/i.test(uriOrPath) || /\.test\.brs$/i.test(uriOrPath);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extracts the base test name from a test file path.
|
|
51
|
+
* `Foo.test.brs` → `Foo`, `Foo_Bar.test.brs` → `Foo`
|
|
52
|
+
*/
|
|
53
|
+
function getTestBaseName(testFilePath) {
|
|
54
|
+
const basename = testFilePath.replace(/\\/g, '/').split('/').pop()?.replace(/\.test\.brs$/i, '') ?? '';
|
|
55
|
+
const underscoreIdx = basename.indexOf('_');
|
|
56
|
+
return underscoreIdx > 0 ? basename.substring(0, underscoreIdx) : basename;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Finds sibling test files that share the same base name.
|
|
60
|
+
* `Foo.test.brs` ↔ `Foo_Bar.test.brs` ↔ `Foo_Baz.test.brs` all share scope.
|
|
61
|
+
*/
|
|
62
|
+
function findTestSiblings(testFilePath) {
|
|
63
|
+
const dir = nodePath.dirname(testFilePath);
|
|
64
|
+
const baseName = getTestBaseName(testFilePath);
|
|
65
|
+
if (!baseName)
|
|
66
|
+
return [];
|
|
67
|
+
const normalizedSelf = nodePath.normalize(testFilePath);
|
|
68
|
+
const siblings = [];
|
|
69
|
+
try {
|
|
70
|
+
for (const entry of fsWrapper_1.default.readdirSync(dir)) {
|
|
71
|
+
if (!entry.toLowerCase().endsWith('.test.brs'))
|
|
72
|
+
continue;
|
|
73
|
+
const entryBase = getTestBaseName(entry);
|
|
74
|
+
if (entryBase.toLowerCase() !== baseName.toLowerCase())
|
|
75
|
+
continue;
|
|
76
|
+
const fullPath = nodePath.join(dir, entry);
|
|
77
|
+
if (nodePath.normalize(fullPath) !== normalizedSelf) {
|
|
78
|
+
siblings.push(fullPath);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch { /* skip */ }
|
|
83
|
+
return siblings;
|
|
84
|
+
}
|
|
85
|
+
const COMPONENT_SUFFIXES = ['', '.component', '.view', '.template', '.facade', '.service'];
|
|
86
|
+
function splitAtUpperCaseBoundaries(name) {
|
|
87
|
+
const results = [];
|
|
88
|
+
for (let i = 1; i < name.length; i++) {
|
|
89
|
+
if (name[i] >= 'A' && name[i] <= 'Z') {
|
|
90
|
+
results.push({
|
|
91
|
+
base: name.slice(0, i),
|
|
92
|
+
dotSuffix: '.' + name.slice(i).toLowerCase(),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolves which source files a test file is testing.
|
|
100
|
+
*/
|
|
101
|
+
function resolveTestedFiles(testFilePath) {
|
|
102
|
+
const normalized = testFilePath.replace(/\\/g, '/');
|
|
103
|
+
const testsIdx = normalized.lastIndexOf('/_tests/');
|
|
104
|
+
const parentDir = testsIdx >= 0
|
|
105
|
+
? normalized.substring(0, testsIdx)
|
|
106
|
+
: nodePath.dirname(nodePath.dirname(testFilePath));
|
|
107
|
+
const basename = nodePath.basename(testFilePath, '.test.brs');
|
|
108
|
+
const candidates = [];
|
|
109
|
+
const addCandidates = (name) => {
|
|
110
|
+
for (const suffix of COMPONENT_SUFFIXES) {
|
|
111
|
+
candidates.push(nodePath.join(parentDir, `${name}${suffix}.brs`));
|
|
112
|
+
}
|
|
113
|
+
for (const { base, dotSuffix } of splitAtUpperCaseBoundaries(name)) {
|
|
114
|
+
candidates.push(nodePath.join(parentDir, `${base}${dotSuffix}.brs`));
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
addCandidates(basename);
|
|
118
|
+
const underscoreIdx = basename.indexOf('_');
|
|
119
|
+
if (underscoreIdx > 0) {
|
|
120
|
+
addCandidates(basename.substring(0, underscoreIdx));
|
|
121
|
+
}
|
|
122
|
+
return candidates.filter(p => fsWrapper_1.default.existsSync(p));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=testUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../../src/analysis/testUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Escapes special regex characters in a string for use in `new RegExp(...)`. */
|
|
2
|
+
export declare function escapeRegex(str: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Replaces string literal contents with spaces, preserving character offsets.
|
|
5
|
+
* When `stripComments` is true, truncates at the first `'` comment marker
|
|
6
|
+
* outside a string.
|
|
7
|
+
*/
|
|
8
|
+
export declare function stripStringLiterals(s: string, stripComments?: boolean): string;
|
|
9
|
+
//# sourceMappingURL=textUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textUtils.d.ts","sourceRoot":"","sources":["../../../src/analysis/textUtils.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,MAAM,CAyB5E"}
|