kopytko-linter 0.1.2 → 0.1.4
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/dist/src/analysis/importParser.d.ts +3 -3
- package/dist/src/analysis/importParser.d.ts.map +1 -1
- package/dist/src/analysis/importParser.js +82 -32
- package/dist/src/analysis/importParser.js.map +1 -1
- package/dist/src/catalog/testGlobals.d.ts +8 -0
- package/dist/src/catalog/testGlobals.d.ts.map +1 -0
- package/dist/src/catalog/testGlobals.js +21 -0
- package/dist/src/catalog/testGlobals.js.map +1 -0
- package/dist/src/linter.d.ts.map +1 -1
- package/dist/src/linter.js +116 -109
- package/dist/src/linter.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,16 +7,16 @@ export interface ImportResolverOptions {
|
|
|
7
7
|
}
|
|
8
8
|
export declare class ImportResolver {
|
|
9
9
|
private readonly options;
|
|
10
|
-
private
|
|
10
|
+
private readonly existsCache;
|
|
11
|
+
private readonly resolveCache;
|
|
11
12
|
constructor(options: ImportResolverOptions);
|
|
13
|
+
private cachedExists;
|
|
12
14
|
getWorkspaceFolders(): string[];
|
|
13
15
|
getSourceDir(): string;
|
|
14
16
|
parseImports(text: string): KopytkoImport[];
|
|
15
17
|
resolveImportPath(imp: KopytkoImport, documentPath: string): string | undefined;
|
|
16
18
|
importExists(imp: KopytkoImport, documentPath: string): boolean;
|
|
17
|
-
invalidatePackageCache(): void;
|
|
18
19
|
private resolveInternalImport;
|
|
19
20
|
private resolveExternalImport;
|
|
20
|
-
resolvePackageBaseDir(packageName: string): string | undefined;
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=importParser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importParser.d.ts","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB1D;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"importParser.d.ts","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB1D;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;gBAE1D,OAAO,EAAE,qBAAqB;IAI1C,OAAO,CAAC,YAAY;IAUpB,mBAAmB,IAAI,MAAM,EAAE;IAI/B,YAAY,IAAI,MAAM;IAItB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAI3C,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe/E,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAI/D,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,qBAAqB;CAwB9B"}
|
|
@@ -60,10 +60,20 @@ function parseImports(text) {
|
|
|
60
60
|
}
|
|
61
61
|
class ImportResolver {
|
|
62
62
|
options;
|
|
63
|
-
|
|
63
|
+
existsCache = new Map();
|
|
64
|
+
resolveCache = new Map();
|
|
64
65
|
constructor(options) {
|
|
65
66
|
this.options = options;
|
|
66
67
|
}
|
|
68
|
+
cachedExists(filePath) {
|
|
69
|
+
const normalized = nodePath.normalize(filePath);
|
|
70
|
+
let result = this.existsCache.get(normalized);
|
|
71
|
+
if (result === undefined) {
|
|
72
|
+
result = fsWrapper_1.default.existsSync(filePath);
|
|
73
|
+
this.existsCache.set(normalized, result);
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
67
77
|
getWorkspaceFolders() {
|
|
68
78
|
return this.options.workspaceFolders;
|
|
69
79
|
}
|
|
@@ -74,58 +84,98 @@ class ImportResolver {
|
|
|
74
84
|
return parseImports(text);
|
|
75
85
|
}
|
|
76
86
|
resolveImportPath(imp, documentPath) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
87
|
+
// Cache key: importPath + fromModule + documentDir (resolution depends on where the file is)
|
|
88
|
+
const docDir = nodePath.dirname(nodePath.normalize(documentPath));
|
|
89
|
+
const cacheKey = `${imp.importPath}|${imp.fromModule ?? ''}|${docDir}`;
|
|
90
|
+
const cached = this.resolveCache.get(cacheKey);
|
|
91
|
+
if (cached !== undefined)
|
|
92
|
+
return cached || undefined;
|
|
93
|
+
const result = imp.fromModule
|
|
94
|
+
? this.resolveExternalImport(imp.importPath, imp.fromModule, documentPath)
|
|
95
|
+
: this.resolveInternalImport(imp.importPath, documentPath);
|
|
96
|
+
this.resolveCache.set(cacheKey, result ?? '');
|
|
97
|
+
return result;
|
|
81
98
|
}
|
|
82
99
|
importExists(imp, documentPath) {
|
|
83
100
|
return this.resolveImportPath(imp, documentPath) !== undefined;
|
|
84
101
|
}
|
|
85
|
-
invalidatePackageCache() {
|
|
86
|
-
this.packageCache = null;
|
|
87
|
-
}
|
|
88
102
|
resolveInternalImport(importPath, documentPath) {
|
|
89
103
|
const { workspaceFolders, sourceDir } = this.options;
|
|
90
|
-
// Try workspace folders
|
|
91
104
|
for (const folder of workspaceFolders) {
|
|
92
105
|
const withSource = nodePath.join(folder, sourceDir, importPath);
|
|
93
|
-
if (
|
|
106
|
+
if (this.cachedExists(withSource))
|
|
94
107
|
return withSource;
|
|
95
108
|
const direct = nodePath.join(folder, importPath);
|
|
96
|
-
if (
|
|
109
|
+
if (this.cachedExists(direct))
|
|
97
110
|
return direct;
|
|
98
111
|
}
|
|
99
|
-
|
|
112
|
+
const pkgRoot = getNodeModulesPackageRoot(documentPath);
|
|
113
|
+
if (pkgRoot) {
|
|
114
|
+
const kopytkoDir = readKopytkoModuleDir(pkgRoot);
|
|
115
|
+
const candidate = nodePath.join(pkgRoot, kopytkoDir, importPath);
|
|
116
|
+
if (this.cachedExists(candidate))
|
|
117
|
+
return candidate;
|
|
118
|
+
}
|
|
100
119
|
const relative = nodePath.resolve(nodePath.dirname(documentPath), importPath);
|
|
101
|
-
if (
|
|
120
|
+
if (this.cachedExists(relative))
|
|
102
121
|
return relative;
|
|
103
122
|
return undefined;
|
|
104
123
|
}
|
|
105
|
-
resolveExternalImport(importPath, moduleName) {
|
|
124
|
+
resolveExternalImport(importPath, moduleName, documentPath) {
|
|
106
125
|
if (!this.options.resolveModules)
|
|
107
126
|
return undefined;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (fsWrapper_1.default.existsSync(nodeModulesPath)) {
|
|
122
|
-
this.packageCache.set(packageName, nodeModulesPath);
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
127
|
+
let dir = nodePath.dirname(documentPath);
|
|
128
|
+
const maxDepth = 10;
|
|
129
|
+
for (let i = 0; i < maxDepth; i++) {
|
|
130
|
+
const modulePath = nodePath.join(dir, 'node_modules', moduleName);
|
|
131
|
+
if (this.cachedExists(modulePath)) {
|
|
132
|
+
const kopytkoDir = readKopytkoModuleDir(modulePath);
|
|
133
|
+
const candidate = nodePath.join(modulePath, kopytkoDir, importPath);
|
|
134
|
+
if (this.cachedExists(candidate))
|
|
135
|
+
return candidate;
|
|
136
|
+
const candidateRoot = nodePath.join(modulePath, importPath);
|
|
137
|
+
if (this.cachedExists(candidateRoot))
|
|
138
|
+
return candidateRoot;
|
|
139
|
+
return undefined;
|
|
125
140
|
}
|
|
141
|
+
const parent = nodePath.dirname(dir);
|
|
142
|
+
if (parent === dir)
|
|
143
|
+
break;
|
|
144
|
+
dir = parent;
|
|
126
145
|
}
|
|
127
|
-
return
|
|
146
|
+
return undefined;
|
|
128
147
|
}
|
|
129
148
|
}
|
|
130
149
|
exports.ImportResolver = ImportResolver;
|
|
150
|
+
/** Read `kopytkoModuleDir` from a package's package.json if it exists. */
|
|
151
|
+
function readKopytkoModuleDir(modulePath) {
|
|
152
|
+
try {
|
|
153
|
+
const pkgJson = nodePath.join(modulePath, 'package.json');
|
|
154
|
+
const content = fsWrapper_1.default.readFileSync(pkgJson, 'utf-8');
|
|
155
|
+
const pkg = JSON.parse(content);
|
|
156
|
+
return pkg.kopytkoModuleDir ?? '';
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return '';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Given any path inside a node_modules package, returns the package root
|
|
164
|
+
* (handles both regular and scoped packages).
|
|
165
|
+
*/
|
|
166
|
+
function getNodeModulesPackageRoot(filePath) {
|
|
167
|
+
const marker = `${nodePath.sep}node_modules${nodePath.sep}`;
|
|
168
|
+
const idx = filePath.lastIndexOf(marker);
|
|
169
|
+
if (idx === -1)
|
|
170
|
+
return undefined;
|
|
171
|
+
const base = filePath.slice(0, idx + marker.length);
|
|
172
|
+
const after = filePath.slice(base.length);
|
|
173
|
+
const parts = after.split(nodePath.sep).filter(Boolean);
|
|
174
|
+
if (parts.length === 0)
|
|
175
|
+
return undefined;
|
|
176
|
+
const pkgName = parts[0].startsWith('@') && parts.length >= 2
|
|
177
|
+
? parts[0] + nodePath.sep + parts[1]
|
|
178
|
+
: parts[0];
|
|
179
|
+
return base + pkgName;
|
|
180
|
+
}
|
|
131
181
|
//# sourceMappingURL=importParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importParser.js","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oCAkBC;AAxBD,+CAAiC;AAEjC,4DAAoC;AAEpC,MAAM,cAAc,GAAG,wDAAwD,CAAC;AAEhF,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YACpB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;YACjC,IAAI,EAAE,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD,MAAa,cAAc;IACR,OAAO,CAAwB;
|
|
1
|
+
{"version":3,"file":"importParser.js","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kopytko test framework global functions.
|
|
3
|
+
* Available in all .test.brs files without explicit @import.
|
|
4
|
+
*
|
|
5
|
+
* Kept in sync with the extension's src/server/kopytko/testFramework.ts.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TEST_FRAMEWORK_GLOBALS: string[];
|
|
8
|
+
//# sourceMappingURL=testGlobals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testGlobals.d.ts","sourceRoot":"","sources":["../../../src/catalog/testGlobals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAU1C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Kopytko test framework global functions.
|
|
4
|
+
* Available in all .test.brs files without explicit @import.
|
|
5
|
+
*
|
|
6
|
+
* Kept in sync with the extension's src/server/kopytko/testFramework.ts.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TEST_FRAMEWORK_GLOBALS = void 0;
|
|
10
|
+
exports.TEST_FRAMEWORK_GLOBALS = [
|
|
11
|
+
// Test suite helpers
|
|
12
|
+
'it', 'test', 'iteach', 'testeach',
|
|
13
|
+
'beforeeach', 'aftereach', 'beforeall', 'afterall',
|
|
14
|
+
// Assertions & mocking
|
|
15
|
+
'expect', 'mockfunction',
|
|
16
|
+
// Test utilities
|
|
17
|
+
'fakeclock', 'initkopytko', 'forceupdate', 'destroykopytko',
|
|
18
|
+
// Test suite object
|
|
19
|
+
'ts',
|
|
20
|
+
];
|
|
21
|
+
//# sourceMappingURL=testGlobals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testGlobals.js","sourceRoot":"","sources":["../../../src/catalog/testGlobals.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,sBAAsB,GAAa;IAC9C,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAClC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU;IAClD,uBAAuB;IACvB,QAAQ,EAAE,cAAc;IACxB,iBAAiB;IACjB,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB;IAC3D,oBAAoB;IACpB,IAAI;CACL,CAAC"}
|
package/dist/src/linter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAA8B,MAAM,SAAS,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAA8B,MAAM,SAAS,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAU7C;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,GACnB,cAAc,EAAE,CAuBlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GACrC,UAAU,CA2BZ;AAmLD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQzF"}
|
package/dist/src/linter.js
CHANGED
|
@@ -46,6 +46,7 @@ const importParser_1 = require("./analysis/importParser");
|
|
|
46
46
|
const functionIndex_1 = require("./analysis/functionIndex");
|
|
47
47
|
const patternSiblings_1 = require("./analysis/patternSiblings");
|
|
48
48
|
const testUtils_1 = require("./analysis/testUtils");
|
|
49
|
+
const testGlobals_1 = require("./catalog/testGlobals");
|
|
49
50
|
const fsWrapper_1 = __importDefault(require("./analysis/fsWrapper"));
|
|
50
51
|
/**
|
|
51
52
|
* Lints a single file with a pre-built context.
|
|
@@ -81,19 +82,15 @@ function lintProject(projectRoot, configOverride) {
|
|
|
81
82
|
...(0, config_1.resolveConfig)(projectRoot),
|
|
82
83
|
...configOverride,
|
|
83
84
|
};
|
|
84
|
-
const context = buildProjectContext(projectRoot, config);
|
|
85
|
-
const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
|
|
85
|
+
const { context, brsFiles, fileContentsCache } = buildProjectContext(projectRoot, config);
|
|
86
86
|
const allDiagnostics = [];
|
|
87
87
|
for (const file of brsFiles) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
catch {
|
|
95
|
-
// skip unreadable files
|
|
96
|
-
}
|
|
88
|
+
const content = fileContentsCache.get(nodePath.normalize(file));
|
|
89
|
+
if (!content)
|
|
90
|
+
continue;
|
|
91
|
+
const fileContext = createFileContext(context, file);
|
|
92
|
+
const diagnostics = lintFile(file, content, fileContext, config);
|
|
93
|
+
allDiagnostics.push(...diagnostics);
|
|
97
94
|
}
|
|
98
95
|
return {
|
|
99
96
|
diagnostics: allDiagnostics,
|
|
@@ -110,107 +107,127 @@ function buildProjectContext(projectRoot, config) {
|
|
|
110
107
|
sourceDir: config.sourceDir,
|
|
111
108
|
resolveModules: config.resolveModules,
|
|
112
109
|
});
|
|
113
|
-
// Build a project-wide function index
|
|
110
|
+
// Build a project-wide function index — single pass over all files
|
|
114
111
|
const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
|
|
115
112
|
const allFunctions = new Map();
|
|
116
113
|
const fileFunctions = new Map();
|
|
114
|
+
const fileImports = new Map();
|
|
115
|
+
const fileContentsCache = new Map();
|
|
117
116
|
for (const file of brsFiles) {
|
|
118
117
|
try {
|
|
119
118
|
const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
|
|
120
|
-
const
|
|
121
|
-
|
|
119
|
+
const normalized = nodePath.normalize(file);
|
|
120
|
+
fileContentsCache.set(normalized, text);
|
|
121
|
+
fileFunctions.set(normalized, (0, functionIndex_1.parseFunctionDefs)(text, file).map(f => f.nameLower));
|
|
122
|
+
fileImports.set(normalized, (0, importParser_1.parseImports)(text));
|
|
122
123
|
}
|
|
123
124
|
catch { /* skip */ }
|
|
124
125
|
}
|
|
126
|
+
// Helper: read a file, using cache when available
|
|
127
|
+
const readFileCached = (filePath) => {
|
|
128
|
+
const normalized = nodePath.normalize(filePath);
|
|
129
|
+
const cached = fileContentsCache.get(normalized);
|
|
130
|
+
if (cached !== undefined)
|
|
131
|
+
return cached;
|
|
132
|
+
try {
|
|
133
|
+
const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
134
|
+
fileContentsCache.set(normalized, text);
|
|
135
|
+
return text;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// Helper: get parsed functions for a file, using cache
|
|
142
|
+
const getFunctions = (filePath) => {
|
|
143
|
+
const normalized = nodePath.normalize(filePath);
|
|
144
|
+
const cached = fileFunctions.get(normalized);
|
|
145
|
+
if (cached)
|
|
146
|
+
return cached;
|
|
147
|
+
const text = readFileCached(filePath);
|
|
148
|
+
if (!text)
|
|
149
|
+
return [];
|
|
150
|
+
const fns = (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
|
|
151
|
+
fileFunctions.set(normalized, fns);
|
|
152
|
+
return fns;
|
|
153
|
+
};
|
|
154
|
+
// Helper: get parsed imports for a file, using cache
|
|
155
|
+
const getImports = (filePath) => {
|
|
156
|
+
const normalized = nodePath.normalize(filePath);
|
|
157
|
+
const cached = fileImports.get(normalized);
|
|
158
|
+
if (cached)
|
|
159
|
+
return cached;
|
|
160
|
+
const text = readFileCached(filePath);
|
|
161
|
+
if (!text)
|
|
162
|
+
return [];
|
|
163
|
+
const imports = (0, importParser_1.parseImports)(text);
|
|
164
|
+
fileImports.set(normalized, imports);
|
|
165
|
+
return imports;
|
|
166
|
+
};
|
|
125
167
|
// For each file, compute its known function names from imports + siblings + self
|
|
126
168
|
for (const file of brsFiles) {
|
|
169
|
+
const normalizedFile = nodePath.normalize(file);
|
|
127
170
|
const known = new Set();
|
|
128
|
-
const
|
|
129
|
-
for (const fn of selfFns)
|
|
171
|
+
for (const fn of (fileFunctions.get(normalizedFile) ?? []))
|
|
130
172
|
known.add(fn);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
173
|
+
// Add test framework globals for test files
|
|
174
|
+
if ((0, testUtils_1.isTestFile)(file)) {
|
|
175
|
+
for (const fn of testGlobals_1.TEST_FRAMEWORK_GLOBALS)
|
|
176
|
+
known.add(fn);
|
|
177
|
+
}
|
|
178
|
+
// Collect functions from imports (transitively)
|
|
179
|
+
const visited = new Set();
|
|
180
|
+
const collectFromImports = (sourceFile, imps) => {
|
|
181
|
+
for (const imp of imps) {
|
|
182
|
+
if (imp.isMock)
|
|
183
|
+
continue;
|
|
184
|
+
const resolved = importResolver.resolveImportPath(imp, sourceFile);
|
|
185
|
+
if (!resolved)
|
|
186
|
+
continue;
|
|
187
|
+
const normalizedResolved = nodePath.normalize(resolved);
|
|
188
|
+
if (visited.has(normalizedResolved))
|
|
189
|
+
continue;
|
|
190
|
+
visited.add(normalizedResolved);
|
|
191
|
+
for (const fn of getFunctions(resolved))
|
|
192
|
+
known.add(fn);
|
|
193
|
+
collectFromImports(resolved, getImports(resolved));
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
collectFromImports(file, getImports(file));
|
|
197
|
+
// Add sibling functions (and their imports)
|
|
198
|
+
for (const siblingPath of (0, patternSiblings_1.findSiblingFiles)(file, config.siblingPatterns)) {
|
|
199
|
+
const normalizedSibling = nodePath.normalize(siblingPath);
|
|
200
|
+
if (!visited.has(normalizedSibling)) {
|
|
201
|
+
visited.add(normalizedSibling);
|
|
202
|
+
for (const fn of getFunctions(siblingPath))
|
|
203
|
+
known.add(fn);
|
|
204
|
+
collectFromImports(siblingPath, getImports(siblingPath));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// For test files, add tested file functions and test siblings
|
|
208
|
+
if ((0, testUtils_1.isTestFile)(file)) {
|
|
209
|
+
for (const testedPath of (0, testUtils_1.resolveTestedFiles)(file)) {
|
|
210
|
+
const normalizedTested = nodePath.normalize(testedPath);
|
|
211
|
+
if (!visited.has(normalizedTested)) {
|
|
212
|
+
visited.add(normalizedTested);
|
|
213
|
+
for (const fn of getFunctions(testedPath))
|
|
169
214
|
known.add(fn);
|
|
215
|
+
collectFromImports(testedPath, getImports(testedPath));
|
|
170
216
|
}
|
|
171
|
-
// Also follow sibling's imports
|
|
172
|
-
try {
|
|
173
|
-
const sibText = fsWrapper_1.default.readFileSync(normalizedSibling, 'utf-8');
|
|
174
|
-
collectFromImports(normalizedSibling, (0, importParser_1.parseImports)(sibText));
|
|
175
|
-
}
|
|
176
|
-
catch { /* skip */ }
|
|
177
217
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
known.add(fn);
|
|
186
|
-
}
|
|
187
|
-
// Also follow tested file's imports
|
|
188
|
-
try {
|
|
189
|
-
const testedText = fsWrapper_1.default.readFileSync(normalizedTested, 'utf-8');
|
|
190
|
-
collectFromImports(normalizedTested, (0, importParser_1.parseImports)(testedText));
|
|
191
|
-
}
|
|
192
|
-
catch { /* skip */ }
|
|
193
|
-
}
|
|
194
|
-
for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
|
|
195
|
-
const normalizedSibTest = nodePath.normalize(siblingTest);
|
|
196
|
-
const siblingFns = fileFunctions.get(normalizedSibTest);
|
|
197
|
-
if (siblingFns) {
|
|
198
|
-
for (const fn of siblingFns)
|
|
199
|
-
known.add(fn);
|
|
200
|
-
}
|
|
201
|
-
// Also follow sibling test's imports
|
|
202
|
-
try {
|
|
203
|
-
const sibTestText = fsWrapper_1.default.readFileSync(normalizedSibTest, 'utf-8');
|
|
204
|
-
collectFromImports(normalizedSibTest, (0, importParser_1.parseImports)(sibTestText));
|
|
205
|
-
}
|
|
206
|
-
catch { /* skip */ }
|
|
218
|
+
for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
|
|
219
|
+
const normalizedSibTest = nodePath.normalize(siblingTest);
|
|
220
|
+
if (!visited.has(normalizedSibTest)) {
|
|
221
|
+
visited.add(normalizedSibTest);
|
|
222
|
+
for (const fn of getFunctions(siblingTest))
|
|
223
|
+
known.add(fn);
|
|
224
|
+
collectFromImports(siblingTest, getImports(siblingTest));
|
|
207
225
|
}
|
|
208
226
|
}
|
|
209
227
|
}
|
|
210
|
-
|
|
211
|
-
allFunctions.set(nodePath.normalize(file), known);
|
|
228
|
+
allFunctions.set(normalizedFile, known);
|
|
212
229
|
}
|
|
213
|
-
|
|
230
|
+
const context = {
|
|
214
231
|
get knownFuncNames() { return new Set(); },
|
|
215
232
|
parseImports(text) {
|
|
216
233
|
return (0, importParser_1.parseImports)(text);
|
|
@@ -223,24 +240,10 @@ function buildProjectContext(projectRoot, config) {
|
|
|
223
240
|
return this.resolveImportPath(importPath, documentPath, fromModule) !== null;
|
|
224
241
|
},
|
|
225
242
|
readFile(filePath) {
|
|
226
|
-
|
|
227
|
-
return fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
228
|
-
}
|
|
229
|
-
catch {
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
243
|
+
return readFileCached(filePath);
|
|
232
244
|
},
|
|
233
245
|
parseFunctionsFromFile(filePath) {
|
|
234
|
-
|
|
235
|
-
if (fns)
|
|
236
|
-
return fns;
|
|
237
|
-
try {
|
|
238
|
-
const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
239
|
-
return (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
return [];
|
|
243
|
-
}
|
|
246
|
+
return getFunctions(filePath);
|
|
244
247
|
},
|
|
245
248
|
getSiblingFiles(filePath) {
|
|
246
249
|
return (0, patternSiblings_1.findSiblingFiles)(filePath, config.siblingPatterns);
|
|
@@ -254,7 +257,11 @@ function buildProjectContext(projectRoot, config) {
|
|
|
254
257
|
generatedPaths: config.generatedPaths,
|
|
255
258
|
generatedModules: config.generatedModules,
|
|
256
259
|
siblingPatterns: config.siblingPatterns,
|
|
257
|
-
|
|
260
|
+
};
|
|
261
|
+
return {
|
|
262
|
+
context: Object.assign(context, { _allFunctions: allFunctions }),
|
|
263
|
+
brsFiles,
|
|
264
|
+
fileContentsCache,
|
|
258
265
|
};
|
|
259
266
|
}
|
|
260
267
|
/**
|
package/dist/src/linter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
|