kopytko-linter 0.1.3 → 0.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/dist/src/analysis/importParser.d.ts +3 -2
- package/dist/src/analysis/importParser.d.ts.map +1 -1
- package/dist/src/analysis/importParser.js +30 -22
- package/dist/src/analysis/importParser.js.map +1 -1
- package/dist/src/analysis/xmlParser.d.ts +42 -0
- package/dist/src/analysis/xmlParser.d.ts.map +1 -0
- package/dist/src/analysis/xmlParser.js +220 -0
- package/dist/src/analysis/xmlParser.js.map +1 -0
- 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 +1 -1
- package/dist/src/linter.d.ts.map +1 -1
- package/dist/src/linter.js +297 -138
- package/dist/src/linter.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,14 +7,15 @@ 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
|
+
cachedExists(filePath: string): boolean;
|
|
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
21
|
}
|
|
@@ -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,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUvC,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,61 +84,59 @@ 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 each workspace folder: <root>/<sourceDir><importPath> then <root><importPath>
|
|
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
|
-
// If the document lives inside a node_modules package, resolve relative
|
|
100
|
-
// to that package's kopytkoModuleDir root
|
|
101
112
|
const pkgRoot = getNodeModulesPackageRoot(documentPath);
|
|
102
113
|
if (pkgRoot) {
|
|
103
114
|
const kopytkoDir = readKopytkoModuleDir(pkgRoot);
|
|
104
115
|
const candidate = nodePath.join(pkgRoot, kopytkoDir, importPath);
|
|
105
|
-
if (
|
|
116
|
+
if (this.cachedExists(candidate))
|
|
106
117
|
return candidate;
|
|
107
118
|
}
|
|
108
|
-
// Last resort: resolve relative to the document's directory
|
|
109
119
|
const relative = nodePath.resolve(nodePath.dirname(documentPath), importPath);
|
|
110
|
-
if (
|
|
120
|
+
if (this.cachedExists(relative))
|
|
111
121
|
return relative;
|
|
112
122
|
return undefined;
|
|
113
123
|
}
|
|
114
124
|
resolveExternalImport(importPath, moduleName, documentPath) {
|
|
115
125
|
if (!this.options.resolveModules)
|
|
116
126
|
return undefined;
|
|
117
|
-
// Walk up from documentPath to find node_modules (like npm resolution)
|
|
118
127
|
let dir = nodePath.dirname(documentPath);
|
|
119
128
|
const maxDepth = 10;
|
|
120
129
|
for (let i = 0; i < maxDepth; i++) {
|
|
121
130
|
const modulePath = nodePath.join(dir, 'node_modules', moduleName);
|
|
122
|
-
if (
|
|
131
|
+
if (this.cachedExists(modulePath)) {
|
|
123
132
|
const kopytkoDir = readKopytkoModuleDir(modulePath);
|
|
124
133
|
const candidate = nodePath.join(modulePath, kopytkoDir, importPath);
|
|
125
|
-
if (
|
|
134
|
+
if (this.cachedExists(candidate))
|
|
126
135
|
return candidate;
|
|
127
|
-
// Also try without the subdir
|
|
128
136
|
const candidateRoot = nodePath.join(modulePath, importPath);
|
|
129
|
-
if (
|
|
137
|
+
if (this.cachedExists(candidateRoot))
|
|
130
138
|
return candidateRoot;
|
|
131
|
-
return undefined;
|
|
139
|
+
return undefined;
|
|
132
140
|
}
|
|
133
141
|
const parent = nodePath.dirname(dir);
|
|
134
142
|
if (parent === dir)
|
|
@@ -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,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns raw URI strings from all <script> tags in an XML text.
|
|
3
|
+
*/
|
|
4
|
+
export declare function parseXmlScriptUris(xmlText: string): string[];
|
|
5
|
+
/**
|
|
6
|
+
* Resolves a script URI from an XML file to an absolute filesystem path.
|
|
7
|
+
* Supports `pkg:/path/file.brs` and relative paths.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveScriptUri(uri: string, xmlDir: string, workspaceFolders: string[], sourceDir: string, cachedExists?: (path: string) => boolean): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Returns absolute paths for all BrightScript files listed in an XML's <script> tags.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getScriptPathsFromXml(xmlPath: string, xmlText: string, workspaceFolders: string[], sourceDir: string, cachedExists?: (path: string) => boolean): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Returns the `extends` attribute value from a <component> tag, or null.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseXmlExtends(xmlText: string): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the `name` attribute value from a <component> tag, or null.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseXmlComponentName(xmlText: string): string | null;
|
|
22
|
+
export interface XmlInterfaceField {
|
|
23
|
+
name: string;
|
|
24
|
+
type: string;
|
|
25
|
+
}
|
|
26
|
+
export interface XmlInterfaceFunction {
|
|
27
|
+
name: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ParsedXmlInterface {
|
|
30
|
+
fields: XmlInterfaceField[];
|
|
31
|
+
functions: XmlInterfaceFunction[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parses the <interface> section of a SceneGraph XML file.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseXmlInterface(xmlText: string): ParsedXmlInterface;
|
|
37
|
+
/**
|
|
38
|
+
* Finds a component's XML file by name across multiple search roots.
|
|
39
|
+
* Tries exact filename match first, then searches by <component name="..."> attribute.
|
|
40
|
+
*/
|
|
41
|
+
export declare function findComponentXml(componentName: string, searchRoots: string[], maxDepth?: number): string | undefined;
|
|
42
|
+
//# sourceMappingURL=xmlParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xmlParser.d.ts","sourceRoot":"","sources":["../../../src/analysis/xmlParser.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACvC,MAAM,GAAG,SAAS,CAepB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACvC,MAAM,EAAE,CAKV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CA2BrE;AA2DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,SAAI,GACX,MAAM,GAAG,SAAS,CAYpB"}
|
|
@@ -0,0 +1,220 @@
|
|
|
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.parseXmlScriptUris = parseXmlScriptUris;
|
|
40
|
+
exports.resolveScriptUri = resolveScriptUri;
|
|
41
|
+
exports.getScriptPathsFromXml = getScriptPathsFromXml;
|
|
42
|
+
exports.parseXmlExtends = parseXmlExtends;
|
|
43
|
+
exports.parseXmlComponentName = parseXmlComponentName;
|
|
44
|
+
exports.parseXmlInterface = parseXmlInterface;
|
|
45
|
+
exports.findComponentXml = findComponentXml;
|
|
46
|
+
const nodePath = __importStar(require("path"));
|
|
47
|
+
const fsWrapper_1 = __importDefault(require("./fsWrapper"));
|
|
48
|
+
/**
|
|
49
|
+
* Returns raw URI strings from all <script> tags in an XML text.
|
|
50
|
+
*/
|
|
51
|
+
function parseXmlScriptUris(xmlText) {
|
|
52
|
+
const uris = [];
|
|
53
|
+
const pattern = /<script\b[^>]*\buri\s*=\s*"([^"]+)"[^>]*>/gi;
|
|
54
|
+
let match;
|
|
55
|
+
while ((match = pattern.exec(xmlText)) !== null) {
|
|
56
|
+
uris.push(match[1]);
|
|
57
|
+
}
|
|
58
|
+
return uris;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolves a script URI from an XML file to an absolute filesystem path.
|
|
62
|
+
* Supports `pkg:/path/file.brs` and relative paths.
|
|
63
|
+
*/
|
|
64
|
+
function resolveScriptUri(uri, xmlDir, workspaceFolders, sourceDir, cachedExists) {
|
|
65
|
+
const exists = cachedExists ?? fsWrapper_1.default.existsSync;
|
|
66
|
+
if (uri.startsWith('pkg:/')) {
|
|
67
|
+
const rel = uri.slice(5);
|
|
68
|
+
for (const ws of workspaceFolders) {
|
|
69
|
+
const candidate = nodePath.join(ws, sourceDir, rel);
|
|
70
|
+
if (exists(candidate))
|
|
71
|
+
return candidate;
|
|
72
|
+
const candidateRoot = nodePath.join(ws, rel);
|
|
73
|
+
if (exists(candidateRoot))
|
|
74
|
+
return candidateRoot;
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const candidate = nodePath.join(xmlDir, uri);
|
|
79
|
+
return exists(candidate) ? candidate : undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Returns absolute paths for all BrightScript files listed in an XML's <script> tags.
|
|
83
|
+
*/
|
|
84
|
+
function getScriptPathsFromXml(xmlPath, xmlText, workspaceFolders, sourceDir, cachedExists) {
|
|
85
|
+
const xmlDir = nodePath.dirname(xmlPath);
|
|
86
|
+
return parseXmlScriptUris(xmlText)
|
|
87
|
+
.map((uri) => resolveScriptUri(uri, xmlDir, workspaceFolders, sourceDir, cachedExists))
|
|
88
|
+
.filter((p) => p !== undefined);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Returns the `extends` attribute value from a <component> tag, or null.
|
|
92
|
+
*/
|
|
93
|
+
function parseXmlExtends(xmlText) {
|
|
94
|
+
const match = /<component\b[^>]*\bextends\s*=\s*["']([^"']+)["']/i.exec(xmlText);
|
|
95
|
+
return match ? match[1] : null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Returns the `name` attribute value from a <component> tag, or null.
|
|
99
|
+
*/
|
|
100
|
+
function parseXmlComponentName(xmlText) {
|
|
101
|
+
const match = /<component\b[^>]*\bname\s*=\s*["']([^"']+)["']/i.exec(xmlText);
|
|
102
|
+
return match ? match[1] : null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parses the <interface> section of a SceneGraph XML file.
|
|
106
|
+
*/
|
|
107
|
+
function parseXmlInterface(xmlText) {
|
|
108
|
+
const fields = [];
|
|
109
|
+
const functions = [];
|
|
110
|
+
const ifaceMatch = /<interface\b[^>]*>([\s\S]*?)<\/interface>/i.exec(xmlText);
|
|
111
|
+
if (!ifaceMatch)
|
|
112
|
+
return { fields, functions };
|
|
113
|
+
const ifaceText = ifaceMatch[1];
|
|
114
|
+
const fieldRe = /<field\b([^>]*)>/gi;
|
|
115
|
+
let m;
|
|
116
|
+
while ((m = fieldRe.exec(ifaceText)) !== null) {
|
|
117
|
+
const attrs = m[1];
|
|
118
|
+
const idMatch = /\bid\s*=\s*["']([^"']+)["']/i.exec(attrs);
|
|
119
|
+
const typeMatch = /\btype\s*=\s*["']([^"']+)["']/i.exec(attrs);
|
|
120
|
+
if (idMatch) {
|
|
121
|
+
fields.push({ name: idMatch[1], type: typeMatch ? typeMatch[1] : 'dynamic' });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const funcRe = /<function\b([^>]*)>/gi;
|
|
125
|
+
while ((m = funcRe.exec(ifaceText)) !== null) {
|
|
126
|
+
const attrs = m[1];
|
|
127
|
+
const nameMatch = /\bname\s*=\s*["']([^"']+)["']/i.exec(attrs);
|
|
128
|
+
if (nameMatch)
|
|
129
|
+
functions.push({ name: nameMatch[1] });
|
|
130
|
+
}
|
|
131
|
+
return { fields, functions };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Searches directories recursively for a file by name.
|
|
135
|
+
*/
|
|
136
|
+
function findFileInTree(dir, filename, depth) {
|
|
137
|
+
if (depth < 0)
|
|
138
|
+
return undefined;
|
|
139
|
+
let entries;
|
|
140
|
+
try {
|
|
141
|
+
entries = fsWrapper_1.default.readdirTyped(dir);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
for (const entry of entries) {
|
|
147
|
+
if (!entry.isDirectory && entry.name === filename) {
|
|
148
|
+
return nodePath.join(dir, entry.name);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const entry of entries) {
|
|
152
|
+
if (!entry.isDirectory)
|
|
153
|
+
continue;
|
|
154
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
155
|
+
continue;
|
|
156
|
+
const found = findFileInTree(nodePath.join(dir, entry.name), filename, depth - 1);
|
|
157
|
+
if (found)
|
|
158
|
+
return found;
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Searches directories for an XML file whose <component name="..."> matches.
|
|
164
|
+
*/
|
|
165
|
+
function findXmlByComponentName(dir, nameLower, depth) {
|
|
166
|
+
if (depth < 0)
|
|
167
|
+
return undefined;
|
|
168
|
+
let entries;
|
|
169
|
+
try {
|
|
170
|
+
entries = fsWrapper_1.default.readdirTyped(dir);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
for (const entry of entries) {
|
|
176
|
+
if (entry.isDirectory)
|
|
177
|
+
continue;
|
|
178
|
+
if (!entry.name.endsWith('.xml'))
|
|
179
|
+
continue;
|
|
180
|
+
const xmlPath = nodePath.join(dir, entry.name);
|
|
181
|
+
try {
|
|
182
|
+
const text = fsWrapper_1.default.readFileSync(xmlPath, 'utf-8');
|
|
183
|
+
const nameMatch = /<component\b[^>]*\bname\s*=\s*"([^"]+)"/i.exec(text);
|
|
184
|
+
if (nameMatch && nameMatch[1].toLowerCase() === nameLower) {
|
|
185
|
+
return xmlPath;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch { /* skip */ }
|
|
189
|
+
}
|
|
190
|
+
for (const entry of entries) {
|
|
191
|
+
if (!entry.isDirectory)
|
|
192
|
+
continue;
|
|
193
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
194
|
+
continue;
|
|
195
|
+
const found = findXmlByComponentName(nodePath.join(dir, entry.name), nameLower, depth - 1);
|
|
196
|
+
if (found)
|
|
197
|
+
return found;
|
|
198
|
+
}
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Finds a component's XML file by name across multiple search roots.
|
|
203
|
+
* Tries exact filename match first, then searches by <component name="..."> attribute.
|
|
204
|
+
*/
|
|
205
|
+
function findComponentXml(componentName, searchRoots, maxDepth = 8) {
|
|
206
|
+
const filename = `${componentName}.xml`;
|
|
207
|
+
for (const root of searchRoots) {
|
|
208
|
+
const found = findFileInTree(root, filename, maxDepth);
|
|
209
|
+
if (found)
|
|
210
|
+
return found;
|
|
211
|
+
}
|
|
212
|
+
const nameLower = componentName.toLowerCase();
|
|
213
|
+
for (const root of searchRoots) {
|
|
214
|
+
const found = findXmlByComponentName(root, nameLower, maxDepth);
|
|
215
|
+
if (found)
|
|
216
|
+
return found;
|
|
217
|
+
}
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=xmlParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xmlParser.js","sourceRoot":"","sources":["../../../src/analysis/xmlParser.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
CHANGED
|
@@ -5,7 +5,7 @@ import type { LinterConfig } from './config';
|
|
|
5
5
|
* Lints a single file with a pre-built context.
|
|
6
6
|
* Used by the extension (library mode) and internally by lintProject.
|
|
7
7
|
*/
|
|
8
|
-
export declare function lintFile(filePath: string, content: string, context: LintContext, config: LinterConfig): LintDiagnostic[];
|
|
8
|
+
export declare function lintFile(filePath: string, content: string, context: LintContext, config: LinterConfig, preLines?: string[]): LintDiagnostic[];
|
|
9
9
|
/**
|
|
10
10
|
* Lints all .brs files in a project directory.
|
|
11
11
|
* Used by the CLI (standalone mode).
|
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;AAW7C;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,cAAc,EAAE,CAuBlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GACrC,UAAU,CA2BZ;AAyVD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQzF"}
|
package/dist/src/linter.js
CHANGED
|
@@ -46,13 +46,15 @@ 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 xmlParser_1 = require("./analysis/xmlParser");
|
|
50
|
+
const testGlobals_1 = require("./catalog/testGlobals");
|
|
49
51
|
const fsWrapper_1 = __importDefault(require("./analysis/fsWrapper"));
|
|
50
52
|
/**
|
|
51
53
|
* Lints a single file with a pre-built context.
|
|
52
54
|
* Used by the extension (library mode) and internally by lintProject.
|
|
53
55
|
*/
|
|
54
|
-
function lintFile(filePath, content, context, config) {
|
|
55
|
-
const lines = content.split(/\r?\n/);
|
|
56
|
+
function lintFile(filePath, content, context, config, preLines) {
|
|
57
|
+
const lines = preLines ?? content.split(/\r?\n/);
|
|
56
58
|
const imports = context.parseImports(content);
|
|
57
59
|
const ruleContext = {
|
|
58
60
|
filePath,
|
|
@@ -81,19 +83,15 @@ function lintProject(projectRoot, configOverride) {
|
|
|
81
83
|
...(0, config_1.resolveConfig)(projectRoot),
|
|
82
84
|
...configOverride,
|
|
83
85
|
};
|
|
84
|
-
const context = buildProjectContext(projectRoot, config);
|
|
85
|
-
const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
|
|
86
|
+
const { context, brsFiles, fileContentsCache } = buildProjectContext(projectRoot, config);
|
|
86
87
|
const allDiagnostics = [];
|
|
87
88
|
for (const file of brsFiles) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
catch {
|
|
95
|
-
// skip unreadable files
|
|
96
|
-
}
|
|
89
|
+
const content = fileContentsCache.get(nodePath.normalize(file));
|
|
90
|
+
if (!content)
|
|
91
|
+
continue;
|
|
92
|
+
const fileContext = createFileContext(context, file);
|
|
93
|
+
const diagnostics = lintFile(file, content, fileContext, config);
|
|
94
|
+
allDiagnostics.push(...diagnostics);
|
|
97
95
|
}
|
|
98
96
|
return {
|
|
99
97
|
diagnostics: allDiagnostics,
|
|
@@ -110,107 +108,298 @@ function buildProjectContext(projectRoot, config) {
|
|
|
110
108
|
sourceDir: config.sourceDir,
|
|
111
109
|
resolveModules: config.resolveModules,
|
|
112
110
|
});
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
|
|
111
|
+
const workspaceFolders = [projectRoot];
|
|
112
|
+
const sourceDir = config.sourceDir;
|
|
113
|
+
// ── Phase 1: Scan all BRS and XML files (project + packages, single pass) ──
|
|
114
|
+
const brsFiles = [];
|
|
115
|
+
const fileContentsCache = new Map();
|
|
116
116
|
const fileFunctions = new Map();
|
|
117
|
+
const fileImports = new Map();
|
|
118
|
+
const componentNameToXml = new Map(); // lowercase component name → xml path
|
|
119
|
+
const xmlTextCache = new Map(); // normalized xml path → content
|
|
120
|
+
const brsToXmlParents = new Map(); // normalized brs path → xml paths
|
|
121
|
+
// Walk a directory collecting BRS files and indexing XML component names
|
|
122
|
+
function walkAndIndex(dir, collectBrs) {
|
|
123
|
+
let entries;
|
|
124
|
+
try {
|
|
125
|
+
entries = fsWrapper_1.default.readdirTyped(dir);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const fullPath = nodePath.join(dir, entry.name);
|
|
132
|
+
if (entry.isDirectory) {
|
|
133
|
+
if (entry.name === 'node_modules' || entry.name === '.git')
|
|
134
|
+
continue;
|
|
135
|
+
walkAndIndex(fullPath, collectBrs);
|
|
136
|
+
}
|
|
137
|
+
else if (entry.name.endsWith('.brs') && collectBrs) {
|
|
138
|
+
brsFiles.push(fullPath);
|
|
139
|
+
}
|
|
140
|
+
else if (entry.name.endsWith('.xml')) {
|
|
141
|
+
try {
|
|
142
|
+
const text = fsWrapper_1.default.readFileSync(fullPath, 'utf-8');
|
|
143
|
+
const normalized = nodePath.normalize(fullPath);
|
|
144
|
+
xmlTextCache.set(normalized, text);
|
|
145
|
+
fileContentsCache.set(normalized, text);
|
|
146
|
+
const name = (0, xmlParser_1.parseXmlComponentName)(text);
|
|
147
|
+
if (name)
|
|
148
|
+
componentNameToXml.set(name.toLowerCase(), normalized);
|
|
149
|
+
}
|
|
150
|
+
catch { /* skip */ }
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Scan project source (collect BRS + XML)
|
|
155
|
+
const sourceRoot = nodePath.join(projectRoot, sourceDir);
|
|
156
|
+
const walkRoot = fsWrapper_1.default.existsSync(sourceRoot) ? sourceRoot : projectRoot;
|
|
157
|
+
walkAndIndex(walkRoot, true);
|
|
158
|
+
// Scan Kopytko packages (XML only — for extends chain resolution)
|
|
159
|
+
const nmDir = nodePath.join(projectRoot, 'node_modules');
|
|
160
|
+
try {
|
|
161
|
+
for (const entry of fsWrapper_1.default.readdirTyped(nmDir)) {
|
|
162
|
+
if (!entry.isDirectory)
|
|
163
|
+
continue;
|
|
164
|
+
if (entry.name.startsWith('@')) {
|
|
165
|
+
try {
|
|
166
|
+
for (const scoped of fsWrapper_1.default.readdirTyped(nodePath.join(nmDir, entry.name))) {
|
|
167
|
+
if (!scoped.isDirectory)
|
|
168
|
+
continue;
|
|
169
|
+
const pkgDir = nodePath.join(nmDir, entry.name, scoped.name);
|
|
170
|
+
const moduleDir = readKopytkoModuleDir(pkgDir);
|
|
171
|
+
if (moduleDir)
|
|
172
|
+
walkAndIndex(nodePath.join(pkgDir, moduleDir), false);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch { /* skip */ }
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const pkgDir = nodePath.join(nmDir, entry.name);
|
|
179
|
+
const moduleDir = readKopytkoModuleDir(pkgDir);
|
|
180
|
+
if (moduleDir)
|
|
181
|
+
walkAndIndex(nodePath.join(pkgDir, moduleDir), false);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch { /* no node_modules */ }
|
|
186
|
+
// ── Phase 2: Parse all BRS files ──
|
|
117
187
|
for (const file of brsFiles) {
|
|
118
188
|
try {
|
|
119
189
|
const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
|
|
120
|
-
const
|
|
121
|
-
|
|
190
|
+
const normalized = nodePath.normalize(file);
|
|
191
|
+
fileContentsCache.set(normalized, text);
|
|
192
|
+
fileFunctions.set(normalized, (0, functionIndex_1.parseFunctionDefs)(text, file).map(f => f.nameLower));
|
|
193
|
+
fileImports.set(normalized, (0, importParser_1.parseImports)(text));
|
|
122
194
|
}
|
|
123
195
|
catch { /* skip */ }
|
|
124
196
|
}
|
|
125
|
-
//
|
|
197
|
+
// Build BRS→XML parent mapping from indexed XML files
|
|
198
|
+
for (const [xmlPath, xmlText] of xmlTextCache) {
|
|
199
|
+
const scriptPaths = (0, xmlParser_1.getScriptPathsFromXml)(xmlPath, xmlText, workspaceFolders, sourceDir, (p) => importResolver.cachedExists(p));
|
|
200
|
+
for (const scriptPath of scriptPaths) {
|
|
201
|
+
const normalizedScript = nodePath.normalize(scriptPath);
|
|
202
|
+
const parents = brsToXmlParents.get(normalizedScript) ?? [];
|
|
203
|
+
parents.push(xmlPath);
|
|
204
|
+
brsToXmlParents.set(normalizedScript, parents);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// ── Phase 3: Cached helpers ──
|
|
208
|
+
const allFunctions = new Map();
|
|
209
|
+
const readFileCached = (filePath) => {
|
|
210
|
+
const normalized = nodePath.normalize(filePath);
|
|
211
|
+
const cached = fileContentsCache.get(normalized);
|
|
212
|
+
if (cached !== undefined)
|
|
213
|
+
return cached;
|
|
214
|
+
try {
|
|
215
|
+
const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
216
|
+
fileContentsCache.set(normalized, text);
|
|
217
|
+
return text;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
const getFunctions = (filePath) => {
|
|
224
|
+
const normalized = nodePath.normalize(filePath);
|
|
225
|
+
const cached = fileFunctions.get(normalized);
|
|
226
|
+
if (cached)
|
|
227
|
+
return cached;
|
|
228
|
+
const text = readFileCached(filePath);
|
|
229
|
+
if (!text)
|
|
230
|
+
return [];
|
|
231
|
+
const fns = (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
|
|
232
|
+
fileFunctions.set(normalized, fns);
|
|
233
|
+
return fns;
|
|
234
|
+
};
|
|
235
|
+
const getImports = (filePath) => {
|
|
236
|
+
const normalized = nodePath.normalize(filePath);
|
|
237
|
+
const cached = fileImports.get(normalized);
|
|
238
|
+
if (cached)
|
|
239
|
+
return cached;
|
|
240
|
+
const text = readFileCached(filePath);
|
|
241
|
+
if (!text)
|
|
242
|
+
return [];
|
|
243
|
+
const imports = (0, importParser_1.parseImports)(text);
|
|
244
|
+
fileImports.set(normalized, imports);
|
|
245
|
+
return imports;
|
|
246
|
+
};
|
|
247
|
+
// Collect functions from an XML component's extends chain (map-based, no filesystem traversal)
|
|
248
|
+
const extendsCache = new Map();
|
|
249
|
+
const collectFromExtendsChain = (componentNameLower) => {
|
|
250
|
+
const cached = extendsCache.get(componentNameLower);
|
|
251
|
+
if (cached)
|
|
252
|
+
return cached;
|
|
253
|
+
const fns = [];
|
|
254
|
+
const visitedComponents = new Set();
|
|
255
|
+
const walk = (nameLower) => {
|
|
256
|
+
if (visitedComponents.has(nameLower))
|
|
257
|
+
return;
|
|
258
|
+
visitedComponents.add(nameLower);
|
|
259
|
+
const xmlPath = componentNameToXml.get(nameLower);
|
|
260
|
+
if (!xmlPath)
|
|
261
|
+
return;
|
|
262
|
+
const xmlText = xmlTextCache.get(xmlPath) ?? readFileCached(xmlPath);
|
|
263
|
+
if (!xmlText)
|
|
264
|
+
return;
|
|
265
|
+
// Add functions from all BRS scripts listed in this XML
|
|
266
|
+
const scriptPaths = (0, xmlParser_1.getScriptPathsFromXml)(xmlPath, xmlText, workspaceFolders, sourceDir, (p) => importResolver.cachedExists(p));
|
|
267
|
+
for (const scriptPath of scriptPaths) {
|
|
268
|
+
for (const fn of getFunctions(scriptPath))
|
|
269
|
+
fns.push(fn);
|
|
270
|
+
// Follow the script's @import chain
|
|
271
|
+
const visited = new Set();
|
|
272
|
+
const followImports = (file) => {
|
|
273
|
+
for (const imp of getImports(file)) {
|
|
274
|
+
if (imp.isMock)
|
|
275
|
+
continue;
|
|
276
|
+
const resolved = importResolver.resolveImportPath(imp, file);
|
|
277
|
+
if (!resolved)
|
|
278
|
+
continue;
|
|
279
|
+
const norm = nodePath.normalize(resolved);
|
|
280
|
+
if (visited.has(norm))
|
|
281
|
+
continue;
|
|
282
|
+
visited.add(norm);
|
|
283
|
+
for (const fn of getFunctions(resolved))
|
|
284
|
+
fns.push(fn);
|
|
285
|
+
followImports(resolved);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
followImports(scriptPath);
|
|
289
|
+
}
|
|
290
|
+
// Walk up the extends chain
|
|
291
|
+
const parentName = (0, xmlParser_1.parseXmlExtends)(xmlText);
|
|
292
|
+
if (parentName)
|
|
293
|
+
walk(parentName.toLowerCase());
|
|
294
|
+
};
|
|
295
|
+
walk(componentNameLower);
|
|
296
|
+
extendsCache.set(componentNameLower, fns);
|
|
297
|
+
return fns;
|
|
298
|
+
};
|
|
299
|
+
// ── Phase 4: Build per-file known function names ──
|
|
126
300
|
for (const file of brsFiles) {
|
|
301
|
+
const normalizedFile = nodePath.normalize(file);
|
|
127
302
|
const known = new Set();
|
|
128
|
-
const
|
|
129
|
-
for (const fn of selfFns)
|
|
303
|
+
for (const fn of (fileFunctions.get(normalizedFile) ?? []))
|
|
130
304
|
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
|
-
if (
|
|
168
|
-
|
|
305
|
+
// Add test framework globals for test files
|
|
306
|
+
if ((0, testUtils_1.isTestFile)(file)) {
|
|
307
|
+
for (const fn of testGlobals_1.TEST_FRAMEWORK_GLOBALS)
|
|
308
|
+
known.add(fn);
|
|
309
|
+
}
|
|
310
|
+
// Collect functions from @import chain (transitively)
|
|
311
|
+
const visited = new Set();
|
|
312
|
+
const collectFromImports = (sourceFile, imps) => {
|
|
313
|
+
for (const imp of imps) {
|
|
314
|
+
if (imp.isMock)
|
|
315
|
+
continue;
|
|
316
|
+
const resolved = importResolver.resolveImportPath(imp, sourceFile);
|
|
317
|
+
if (!resolved)
|
|
318
|
+
continue;
|
|
319
|
+
const normalizedResolved = nodePath.normalize(resolved);
|
|
320
|
+
if (visited.has(normalizedResolved))
|
|
321
|
+
continue;
|
|
322
|
+
visited.add(normalizedResolved);
|
|
323
|
+
for (const fn of getFunctions(resolved))
|
|
324
|
+
known.add(fn);
|
|
325
|
+
collectFromImports(resolved, getImports(resolved));
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
collectFromImports(file, getImports(file));
|
|
329
|
+
// Add XML sibling functions — other BRS files in the same XML component
|
|
330
|
+
const parentXmls = brsToXmlParents.get(normalizedFile) ?? [];
|
|
331
|
+
for (const xmlPath of parentXmls) {
|
|
332
|
+
const xmlText = readFileCached(xmlPath);
|
|
333
|
+
if (!xmlText)
|
|
334
|
+
continue;
|
|
335
|
+
// Add all sibling BRS scripts from this XML
|
|
336
|
+
const scriptPaths = (0, xmlParser_1.getScriptPathsFromXml)(xmlPath, xmlText, workspaceFolders, sourceDir, (p) => importResolver.cachedExists(p));
|
|
337
|
+
for (const scriptPath of scriptPaths) {
|
|
338
|
+
const normalizedScript = nodePath.normalize(scriptPath);
|
|
339
|
+
if (normalizedScript === normalizedFile)
|
|
340
|
+
continue;
|
|
341
|
+
if (!visited.has(normalizedScript)) {
|
|
342
|
+
visited.add(normalizedScript);
|
|
343
|
+
for (const fn of getFunctions(scriptPath))
|
|
169
344
|
known.add(fn);
|
|
345
|
+
collectFromImports(scriptPath, getImports(scriptPath));
|
|
170
346
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
347
|
+
}
|
|
348
|
+
// Walk the extends chain and add inherited functions
|
|
349
|
+
const parentComponentName = (0, xmlParser_1.parseXmlExtends)(xmlText);
|
|
350
|
+
if (parentComponentName) {
|
|
351
|
+
for (const fn of collectFromExtendsChain(parentComponentName.toLowerCase())) {
|
|
352
|
+
known.add(fn);
|
|
175
353
|
}
|
|
176
|
-
catch { /* skip */ }
|
|
177
354
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
355
|
+
}
|
|
356
|
+
// Add pattern sibling functions
|
|
357
|
+
for (const siblingPath of (0, patternSiblings_1.findSiblingFiles)(file, config.siblingPatterns)) {
|
|
358
|
+
const normalizedSibling = nodePath.normalize(siblingPath);
|
|
359
|
+
if (!visited.has(normalizedSibling)) {
|
|
360
|
+
visited.add(normalizedSibling);
|
|
361
|
+
for (const fn of getFunctions(siblingPath))
|
|
362
|
+
known.add(fn);
|
|
363
|
+
collectFromImports(siblingPath, getImports(siblingPath));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// For test files, add tested file scope
|
|
367
|
+
if ((0, testUtils_1.isTestFile)(file)) {
|
|
368
|
+
for (const testedPath of (0, testUtils_1.resolveTestedFiles)(file)) {
|
|
369
|
+
const normalizedTested = nodePath.normalize(testedPath);
|
|
370
|
+
if (!visited.has(normalizedTested)) {
|
|
371
|
+
visited.add(normalizedTested);
|
|
372
|
+
for (const fn of getFunctions(testedPath))
|
|
373
|
+
known.add(fn);
|
|
374
|
+
collectFromImports(testedPath, getImports(testedPath));
|
|
193
375
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
376
|
+
// Also add the tested file's XML extends chain
|
|
377
|
+
const testedXmls = brsToXmlParents.get(normalizedTested) ?? [];
|
|
378
|
+
for (const txmlPath of testedXmls) {
|
|
379
|
+
const txmlText = readFileCached(txmlPath);
|
|
380
|
+
if (!txmlText)
|
|
381
|
+
continue;
|
|
382
|
+
const parentName = (0, xmlParser_1.parseXmlExtends)(txmlText);
|
|
383
|
+
if (parentName) {
|
|
384
|
+
for (const fn of collectFromExtendsChain(parentName.toLowerCase())) {
|
|
199
385
|
known.add(fn);
|
|
386
|
+
}
|
|
200
387
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
|
|
391
|
+
const normalizedSibTest = nodePath.normalize(siblingTest);
|
|
392
|
+
if (!visited.has(normalizedSibTest)) {
|
|
393
|
+
visited.add(normalizedSibTest);
|
|
394
|
+
for (const fn of getFunctions(siblingTest))
|
|
395
|
+
known.add(fn);
|
|
396
|
+
collectFromImports(siblingTest, getImports(siblingTest));
|
|
207
397
|
}
|
|
208
398
|
}
|
|
209
399
|
}
|
|
210
|
-
|
|
211
|
-
allFunctions.set(nodePath.normalize(file), known);
|
|
400
|
+
allFunctions.set(normalizedFile, known);
|
|
212
401
|
}
|
|
213
|
-
|
|
402
|
+
const context = {
|
|
214
403
|
get knownFuncNames() { return new Set(); },
|
|
215
404
|
parseImports(text) {
|
|
216
405
|
return (0, importParser_1.parseImports)(text);
|
|
@@ -223,24 +412,10 @@ function buildProjectContext(projectRoot, config) {
|
|
|
223
412
|
return this.resolveImportPath(importPath, documentPath, fromModule) !== null;
|
|
224
413
|
},
|
|
225
414
|
readFile(filePath) {
|
|
226
|
-
|
|
227
|
-
return fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
228
|
-
}
|
|
229
|
-
catch {
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
415
|
+
return readFileCached(filePath);
|
|
232
416
|
},
|
|
233
417
|
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
|
-
}
|
|
418
|
+
return getFunctions(filePath);
|
|
244
419
|
},
|
|
245
420
|
getSiblingFiles(filePath) {
|
|
246
421
|
return (0, patternSiblings_1.findSiblingFiles)(filePath, config.siblingPatterns);
|
|
@@ -254,7 +429,11 @@ function buildProjectContext(projectRoot, config) {
|
|
|
254
429
|
generatedPaths: config.generatedPaths,
|
|
255
430
|
generatedModules: config.generatedModules,
|
|
256
431
|
siblingPatterns: config.siblingPatterns,
|
|
257
|
-
|
|
432
|
+
};
|
|
433
|
+
return {
|
|
434
|
+
context: Object.assign(context, { _allFunctions: allFunctions }),
|
|
435
|
+
brsFiles,
|
|
436
|
+
fileContentsCache,
|
|
258
437
|
};
|
|
259
438
|
}
|
|
260
439
|
/**
|
|
@@ -269,35 +448,15 @@ function createFileContext(baseContext, filePath) {
|
|
|
269
448
|
knownFuncNames: fileKnown,
|
|
270
449
|
};
|
|
271
450
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
entries = fsWrapper_1.default.readdirTyped(currentDir);
|
|
279
|
-
}
|
|
280
|
-
catch {
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
for (const entry of entries) {
|
|
284
|
-
const fullPath = nodePath.join(currentDir, entry.name);
|
|
285
|
-
if (entry.isDirectory) {
|
|
286
|
-
if (entry.name === 'node_modules' || entry.name === '.git')
|
|
287
|
-
continue;
|
|
288
|
-
walk(fullPath);
|
|
289
|
-
}
|
|
290
|
-
else if (entry.name.endsWith('.brs')) {
|
|
291
|
-
files.push(fullPath);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
if (fsWrapper_1.default.existsSync(sourceRoot)) {
|
|
296
|
-
walk(sourceRoot);
|
|
451
|
+
/** Read `kopytkoModuleDir` from a package's package.json. Returns null if not a Kopytko package. */
|
|
452
|
+
function readKopytkoModuleDir(pkgDir) {
|
|
453
|
+
try {
|
|
454
|
+
const content = fsWrapper_1.default.readFileSync(nodePath.join(pkgDir, 'package.json'), 'utf-8');
|
|
455
|
+
const pkg = JSON.parse(content);
|
|
456
|
+
return pkg.kopytkoModuleDir ?? null;
|
|
297
457
|
}
|
|
298
|
-
|
|
299
|
-
|
|
458
|
+
catch {
|
|
459
|
+
return null;
|
|
300
460
|
}
|
|
301
|
-
return files;
|
|
302
461
|
}
|
|
303
462
|
//# sourceMappingURL=linter.js.map
|
package/dist/src/linter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
|