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,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatText = formatText;
|
|
4
|
+
const SEVERITY_COLORS = {
|
|
5
|
+
error: '\x1b[31m', // red
|
|
6
|
+
warning: '\x1b[33m', // yellow
|
|
7
|
+
info: '\x1b[36m', // cyan
|
|
8
|
+
hint: '\x1b[90m', // gray
|
|
9
|
+
};
|
|
10
|
+
const RESET = '\x1b[0m';
|
|
11
|
+
const BOLD = '\x1b[1m';
|
|
12
|
+
const DIM = '\x1b[2m';
|
|
13
|
+
function groupByFile(diagnostics) {
|
|
14
|
+
const groups = new Map();
|
|
15
|
+
for (const d of diagnostics) {
|
|
16
|
+
const existing = groups.get(d.filePath) ?? [];
|
|
17
|
+
existing.push(d);
|
|
18
|
+
groups.set(d.filePath, existing);
|
|
19
|
+
}
|
|
20
|
+
return groups;
|
|
21
|
+
}
|
|
22
|
+
function formatText(result, useColors = true) {
|
|
23
|
+
const c = useColors ? SEVERITY_COLORS : { error: '', warning: '', info: '', hint: '' };
|
|
24
|
+
const reset = useColors ? RESET : '';
|
|
25
|
+
const bold = useColors ? BOLD : '';
|
|
26
|
+
const dim = useColors ? DIM : '';
|
|
27
|
+
const lines = [];
|
|
28
|
+
const grouped = groupByFile(result.diagnostics);
|
|
29
|
+
for (const [filePath, diagnostics] of grouped) {
|
|
30
|
+
lines.push('');
|
|
31
|
+
lines.push(`${bold}${filePath}${reset}`);
|
|
32
|
+
const sorted = diagnostics.sort((a, b) => a.line - b.line || a.column - b.column);
|
|
33
|
+
for (const d of sorted) {
|
|
34
|
+
const sevColor = c[d.severity] ?? '';
|
|
35
|
+
const loc = `${dim}${d.line + 1}:${d.column + 1}${reset}`;
|
|
36
|
+
const sev = `${sevColor}${d.severity.padEnd(7)}${reset}`;
|
|
37
|
+
const code = `${dim}${d.code}${reset}`;
|
|
38
|
+
lines.push(` ${loc} ${sev} ${d.message} ${code}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (result.diagnostics.length > 0) {
|
|
42
|
+
lines.push('');
|
|
43
|
+
const parts = [];
|
|
44
|
+
if (result.errorCount > 0)
|
|
45
|
+
parts.push(`${c['error']}${result.errorCount} error${result.errorCount !== 1 ? 's' : ''}${reset}`);
|
|
46
|
+
if (result.warningCount > 0)
|
|
47
|
+
parts.push(`${c['warning']}${result.warningCount} warning${result.warningCount !== 1 ? 's' : ''}${reset}`);
|
|
48
|
+
if (result.infoCount > 0)
|
|
49
|
+
parts.push(`${c['info']}${result.infoCount} info${reset}`);
|
|
50
|
+
if (result.hintCount > 0)
|
|
51
|
+
parts.push(`${c['hint']}${result.hintCount} hint${result.hintCount !== 1 ? 's' : ''}${reset}`);
|
|
52
|
+
lines.push(`✖ ${parts.join(', ')} in ${result.fileCount} file${result.fileCount !== 1 ? 's' : ''}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
lines.push('');
|
|
56
|
+
lines.push(`✓ No issues found in ${result.fileCount} file${result.fileCount !== 1 ? 's' : ''}`);
|
|
57
|
+
}
|
|
58
|
+
lines.push('');
|
|
59
|
+
return lines.join('\n');
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=textFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textFormatter.js","sourceRoot":"","sources":["../../../src/output/textFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LintDiagnostic, RuleContext } from '../types';
|
|
2
|
+
export declare function checkUndefinedCalls(ctx: RuleContext): LintDiagnostic[];
|
|
3
|
+
export declare function checkUndefinedVariables(ctx: RuleContext): LintDiagnostic[];
|
|
4
|
+
export declare function checkShadowedBuiltins(ctx: RuleContext): LintDiagnostic[];
|
|
5
|
+
export declare function checkUnusedParameters(ctx: RuleContext): LintDiagnostic[];
|
|
6
|
+
//# sourceMappingURL=identifierRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifierRules.d.ts","sourceRoot":"","sources":["../../../src/rules/identifierRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAqD5D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA6EtE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA0E1E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA+DxE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CAsDxE"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkUndefinedCalls = checkUndefinedCalls;
|
|
4
|
+
exports.checkUndefinedVariables = checkUndefinedVariables;
|
|
5
|
+
exports.checkShadowedBuiltins = checkShadowedBuiltins;
|
|
6
|
+
exports.checkUnusedParameters = checkUnusedParameters;
|
|
7
|
+
const builtins_1 = require("../catalog/builtins");
|
|
8
|
+
const textUtils_1 = require("../analysis/textUtils");
|
|
9
|
+
const textUtils_2 = require("../analysis/textUtils");
|
|
10
|
+
const scopeAnalysis_1 = require("../analysis/scopeAnalysis");
|
|
11
|
+
const CALL_RE = /(?<![.\w])([a-zA-Z_]\w*)\s*\(/g;
|
|
12
|
+
const DECL_RE = /^\s*(?:function|sub)\s+\w+\s*\(/i;
|
|
13
|
+
const EXPR_IDENT_RE = /(?<![.\w])([a-zA-Z_]\w*)/g;
|
|
14
|
+
const _alwaysValidVarIdents = new Set(['m']);
|
|
15
|
+
function collectLocalNames(lines) {
|
|
16
|
+
const names = new Set();
|
|
17
|
+
const ASSIGN_RE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
|
|
18
|
+
const FOR_RE = /^\s*for\s+(?:each\s+)?([a-zA-Z_]\w*)\b/i;
|
|
19
|
+
const CATCH_VAR_RE = /^\s*catch\s+\(?([a-zA-Z_]\w*)\)?/i;
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
const assignMatch = ASSIGN_RE.exec(line);
|
|
22
|
+
if (assignMatch) {
|
|
23
|
+
const n = assignMatch[1].toLowerCase();
|
|
24
|
+
if (!builtins_1.keywordNames.has(n))
|
|
25
|
+
names.add(n);
|
|
26
|
+
}
|
|
27
|
+
const forMatch = FOR_RE.exec(line);
|
|
28
|
+
if (forMatch)
|
|
29
|
+
names.add(forMatch[1].toLowerCase());
|
|
30
|
+
const strippedForParams = (0, textUtils_1.stripStringLiterals)(line, true);
|
|
31
|
+
const paramListMatch = scopeAnalysis_1.PARAM_LIST_RE.exec(strippedForParams);
|
|
32
|
+
if (paramListMatch && paramListMatch[1].trim()) {
|
|
33
|
+
for (const part of paramListMatch[1].split(',')) {
|
|
34
|
+
const nm = /^\s*([a-zA-Z_]\w*)/.exec(part.trim());
|
|
35
|
+
if (nm) {
|
|
36
|
+
const p = nm[1].toLowerCase();
|
|
37
|
+
if (!builtins_1.keywordNames.has(p))
|
|
38
|
+
names.add(p);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const catchMatch = CATCH_VAR_RE.exec(line);
|
|
43
|
+
if (catchMatch)
|
|
44
|
+
names.add(catchMatch[1].toLowerCase());
|
|
45
|
+
}
|
|
46
|
+
return names;
|
|
47
|
+
}
|
|
48
|
+
function checkUndefinedCalls(ctx) {
|
|
49
|
+
const { lines, filePath, config, lintContext } = ctx;
|
|
50
|
+
if (config['identifier/undefined-function'] === 'off' && config['identifier/wrong-arg-count'] === 'off')
|
|
51
|
+
return [];
|
|
52
|
+
const isMainFile = /[/\\]main\.brs$/i.test(filePath);
|
|
53
|
+
if (isMainFile)
|
|
54
|
+
return [];
|
|
55
|
+
const localNames = collectLocalNames(lines);
|
|
56
|
+
const inMainBody = (0, scopeAnalysis_1.computeMainBodyLines)(lines);
|
|
57
|
+
const knownFuncNames = lintContext.knownFuncNames;
|
|
58
|
+
const diagnostics = [];
|
|
59
|
+
for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
|
|
60
|
+
const raw = lines[lineIdx];
|
|
61
|
+
if (/^\s*'/.test(raw) || /^\s*rem\b/i.test(raw))
|
|
62
|
+
continue;
|
|
63
|
+
if (/^\s*#/i.test(raw))
|
|
64
|
+
continue;
|
|
65
|
+
if (DECL_RE.test(raw))
|
|
66
|
+
continue;
|
|
67
|
+
if (/^\s*dim\b/i.test(raw))
|
|
68
|
+
continue;
|
|
69
|
+
if (/^\s*throw\b/i.test(raw))
|
|
70
|
+
continue;
|
|
71
|
+
if (inMainBody[lineIdx])
|
|
72
|
+
continue;
|
|
73
|
+
const stripped = (0, textUtils_1.stripStringLiterals)(raw, true);
|
|
74
|
+
CALL_RE.lastIndex = 0;
|
|
75
|
+
let match;
|
|
76
|
+
while ((match = CALL_RE.exec(stripped)) !== null) {
|
|
77
|
+
const name = match[1];
|
|
78
|
+
const nameLower = name.toLowerCase();
|
|
79
|
+
if (builtins_1.keywordNames.has(nameLower))
|
|
80
|
+
continue;
|
|
81
|
+
if (builtins_1.builtinNames.has(nameLower)) {
|
|
82
|
+
if (config['identifier/wrong-arg-count'] !== 'off') {
|
|
83
|
+
const arity = builtins_1.builtinArity.get(nameLower);
|
|
84
|
+
if (arity) {
|
|
85
|
+
const openParenPos = match.index + match[0].length - 1;
|
|
86
|
+
const argCount = (0, scopeAnalysis_1.countCallArgs)(stripped, openParenPos);
|
|
87
|
+
if (argCount !== null && (argCount < arity.min || argCount > arity.max)) {
|
|
88
|
+
const expected = arity.min === arity.max
|
|
89
|
+
? `${arity.min} argument${arity.min !== 1 ? 's' : ''}`
|
|
90
|
+
: `${arity.min}–${arity.max} arguments`;
|
|
91
|
+
const got = `${argCount} ${argCount !== 1 ? 'were' : 'was'}`;
|
|
92
|
+
diagnostics.push({
|
|
93
|
+
severity: config['identifier/wrong-arg-count'] ?? 'error',
|
|
94
|
+
code: 'identifier/wrong-arg-count',
|
|
95
|
+
message: `'${name}' expects ${expected} but ${got} provided.`,
|
|
96
|
+
line: lineIdx,
|
|
97
|
+
column: match.index,
|
|
98
|
+
endLine: lineIdx,
|
|
99
|
+
endColumn: match.index + name.length,
|
|
100
|
+
filePath,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (knownFuncNames.has(nameLower))
|
|
108
|
+
continue;
|
|
109
|
+
if (localNames.has(nameLower))
|
|
110
|
+
continue;
|
|
111
|
+
if (config['identifier/undefined-function'] !== 'off') {
|
|
112
|
+
diagnostics.push({
|
|
113
|
+
severity: config['identifier/undefined-function'] ?? 'error',
|
|
114
|
+
code: 'identifier/undefined-function',
|
|
115
|
+
message: `Unknown function '${name}'. It is not defined in this file or any reachable @import.`,
|
|
116
|
+
line: lineIdx,
|
|
117
|
+
column: match.index,
|
|
118
|
+
endLine: lineIdx,
|
|
119
|
+
endColumn: match.index + name.length,
|
|
120
|
+
filePath,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return diagnostics;
|
|
126
|
+
}
|
|
127
|
+
function checkUndefinedVariables(ctx) {
|
|
128
|
+
const { lines, filePath, config, lintContext } = ctx;
|
|
129
|
+
if (config['identifier/undefined-variable'] === 'off')
|
|
130
|
+
return [];
|
|
131
|
+
const scopes = (0, scopeAnalysis_1.buildFunctionScopes)(lines);
|
|
132
|
+
const knownFuncNames = lintContext.knownFuncNames;
|
|
133
|
+
const diagnostics = [];
|
|
134
|
+
for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
|
|
135
|
+
const raw = lines[lineIdx];
|
|
136
|
+
if (!raw)
|
|
137
|
+
continue;
|
|
138
|
+
if (/^\s*'/.test(raw) || /^\s*rem\b/i.test(raw))
|
|
139
|
+
continue;
|
|
140
|
+
if (/^\s*#/i.test(raw))
|
|
141
|
+
continue;
|
|
142
|
+
if (DECL_RE.test(raw))
|
|
143
|
+
continue;
|
|
144
|
+
if (/^\s*dim\b/i.test(raw))
|
|
145
|
+
continue;
|
|
146
|
+
const scope = (0, scopeAnalysis_1.findScopeAtLine)(scopes, lineIdx);
|
|
147
|
+
if (!scope)
|
|
148
|
+
continue;
|
|
149
|
+
const scopeVars = new Set([...scope.params, ...scope.vars]);
|
|
150
|
+
const stripped = (0, textUtils_1.stripStringLiterals)(raw, true);
|
|
151
|
+
const LVALUE_RE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
|
|
152
|
+
const lvalueMatch = LVALUE_RE.exec(stripped);
|
|
153
|
+
const lvalue = lvalueMatch ? lvalueMatch[1].toLowerCase() : null;
|
|
154
|
+
EXPR_IDENT_RE.lastIndex = 0;
|
|
155
|
+
let match;
|
|
156
|
+
while ((match = EXPR_IDENT_RE.exec(stripped)) !== null) {
|
|
157
|
+
const name = match[1];
|
|
158
|
+
const nameLower = name.toLowerCase();
|
|
159
|
+
const after = stripped.slice(match.index + name.length).trimStart();
|
|
160
|
+
if (after.startsWith('(') || after.startsWith(':') || after.startsWith('.'))
|
|
161
|
+
continue;
|
|
162
|
+
if (builtins_1.keywordNames.has(nameLower))
|
|
163
|
+
continue;
|
|
164
|
+
if (builtins_1.builtinNames.has(nameLower))
|
|
165
|
+
continue;
|
|
166
|
+
if (_alwaysValidVarIdents.has(nameLower))
|
|
167
|
+
continue;
|
|
168
|
+
if (knownFuncNames.has(nameLower))
|
|
169
|
+
continue;
|
|
170
|
+
if (lvalue !== null && nameLower === lvalue)
|
|
171
|
+
continue;
|
|
172
|
+
if (scopeVars.has(nameLower))
|
|
173
|
+
continue;
|
|
174
|
+
if (lineIdx === scope.startLine && scope.name === '' && match.index < scope.startColumn) {
|
|
175
|
+
const parentScope = (0, scopeAnalysis_1.findParentScopeAtLine)(scopes, lineIdx, scope);
|
|
176
|
+
if (parentScope) {
|
|
177
|
+
const parentVars = new Set([...parentScope.params, ...parentScope.vars]);
|
|
178
|
+
if (parentVars.has(nameLower))
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (lineIdx === scope.endLine) {
|
|
183
|
+
const endKw = /\b(?:end\s*(?:function|sub)|endfunction|endsub)\b/i.exec(stripped);
|
|
184
|
+
if (endKw && match.index >= endKw.index + endKw[0].length) {
|
|
185
|
+
const parentScope = (0, scopeAnalysis_1.findParentScopeAtLine)(scopes, lineIdx, scope);
|
|
186
|
+
if (parentScope) {
|
|
187
|
+
const parentVars = new Set([...parentScope.params, ...parentScope.vars]);
|
|
188
|
+
if (parentVars.has(nameLower))
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
diagnostics.push({
|
|
194
|
+
severity: config['identifier/undefined-variable'] ?? 'error',
|
|
195
|
+
code: 'identifier/undefined-variable',
|
|
196
|
+
message: `'${name}' is used but never defined in this scope.`,
|
|
197
|
+
line: lineIdx,
|
|
198
|
+
column: match.index,
|
|
199
|
+
endLine: lineIdx,
|
|
200
|
+
endColumn: match.index + name.length,
|
|
201
|
+
filePath,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return diagnostics;
|
|
206
|
+
}
|
|
207
|
+
function checkShadowedBuiltins(ctx) {
|
|
208
|
+
const { lines, filePath, config } = ctx;
|
|
209
|
+
if (config['identifier/shadows-builtin'] === 'off')
|
|
210
|
+
return [];
|
|
211
|
+
const diagnostics = [];
|
|
212
|
+
const severity = config['identifier/shadows-builtin'] ?? 'error';
|
|
213
|
+
const ASSIGN_RE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
|
|
214
|
+
const FOR_RE = /^\s*for\s+(?:each\s+)?([a-zA-Z_]\w*)\b/i;
|
|
215
|
+
const DIM_RE = /^\s*dim\s+([a-zA-Z_]\w*)\s*\(/i;
|
|
216
|
+
const CATCH_RE = /^\s*catch\s+\(?([a-zA-Z_]\w*)\)?/i;
|
|
217
|
+
for (let i = 0; i < lines.length; i++) {
|
|
218
|
+
const line = lines[i];
|
|
219
|
+
if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
|
|
220
|
+
continue;
|
|
221
|
+
const stripped = (0, textUtils_1.stripStringLiterals)(line, true);
|
|
222
|
+
// Check function/sub parameters
|
|
223
|
+
const funcMatch = /\b(?:function|sub)\b\s*(?:[a-zA-Z_]\w*\s*)?\(([^)]*)\)/i.exec(stripped);
|
|
224
|
+
if (funcMatch && funcMatch[1].trim()) {
|
|
225
|
+
const paramsStr = funcMatch[1];
|
|
226
|
+
const paramsStart = stripped.indexOf(paramsStr, funcMatch.index);
|
|
227
|
+
for (const part of paramsStr.split(',')) {
|
|
228
|
+
const nm = /^\s*([a-zA-Z_]\w*)/.exec(part.trim());
|
|
229
|
+
if (nm) {
|
|
230
|
+
const paramName = nm[1];
|
|
231
|
+
if (builtins_1.builtinNames.has(paramName.toLowerCase())) {
|
|
232
|
+
const col = stripped.indexOf(paramName, paramsStart);
|
|
233
|
+
diagnostics.push({
|
|
234
|
+
severity,
|
|
235
|
+
code: 'identifier/shadows-builtin',
|
|
236
|
+
message: `'${paramName}' shadows the built-in global function '${paramName}'. Use a different name to avoid hiding the built-in.`,
|
|
237
|
+
line: i, column: col >= 0 ? col : 0, endLine: i, endColumn: (col >= 0 ? col : 0) + paramName.length, filePath,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const checks = [
|
|
244
|
+
{ re: ASSIGN_RE, match: ASSIGN_RE.exec(stripped) },
|
|
245
|
+
{ re: FOR_RE, match: FOR_RE.exec(stripped) },
|
|
246
|
+
{ re: DIM_RE, match: DIM_RE.exec(stripped) },
|
|
247
|
+
{ re: CATCH_RE, match: CATCH_RE.exec(stripped) },
|
|
248
|
+
];
|
|
249
|
+
for (const { match: m } of checks) {
|
|
250
|
+
if (!m)
|
|
251
|
+
continue;
|
|
252
|
+
const varName = m[1];
|
|
253
|
+
if (builtins_1.builtinNames.has(varName.toLowerCase())) {
|
|
254
|
+
const col = stripped.indexOf(varName, m.index);
|
|
255
|
+
diagnostics.push({
|
|
256
|
+
severity,
|
|
257
|
+
code: 'identifier/shadows-builtin',
|
|
258
|
+
message: `'${varName}' shadows the built-in global function '${varName}'. Use a different name to avoid hiding the built-in.`,
|
|
259
|
+
line: i, column: col >= 0 ? col : 0, endLine: i, endColumn: (col >= 0 ? col : 0) + varName.length, filePath,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return diagnostics;
|
|
265
|
+
}
|
|
266
|
+
function checkUnusedParameters(ctx) {
|
|
267
|
+
const { lines, filePath, config } = ctx;
|
|
268
|
+
if (config['identifier/unused-parameter'] === 'off')
|
|
269
|
+
return [];
|
|
270
|
+
const FUNC_DECL_RE = /^\s*(?:function|sub)\s+\w+\s*\(([^)]*)\)/i;
|
|
271
|
+
const ANON_FUNC_RE = /(?:function|sub)\s*\(([^)]*)\)/i;
|
|
272
|
+
const diagnostics = [];
|
|
273
|
+
for (let i = 0; i < lines.length; i++) {
|
|
274
|
+
const line = lines[i];
|
|
275
|
+
if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
|
|
276
|
+
continue;
|
|
277
|
+
const funcMatch = FUNC_DECL_RE.exec(line) || ANON_FUNC_RE.exec(line);
|
|
278
|
+
if (!funcMatch || !funcMatch[1].trim())
|
|
279
|
+
continue;
|
|
280
|
+
const params = [];
|
|
281
|
+
for (const param of funcMatch[1].split(',')) {
|
|
282
|
+
const nameMatch = /^\s*(\w+)/.exec(param.trim());
|
|
283
|
+
if (!nameMatch)
|
|
284
|
+
continue;
|
|
285
|
+
const name = nameMatch[1];
|
|
286
|
+
if (name.startsWith('_'))
|
|
287
|
+
continue;
|
|
288
|
+
const col = line.indexOf(name, funcMatch.index);
|
|
289
|
+
params.push({ name, col: col >= 0 ? col : 0 });
|
|
290
|
+
}
|
|
291
|
+
if (params.length === 0)
|
|
292
|
+
continue;
|
|
293
|
+
const bodyLines = [];
|
|
294
|
+
let depth = 1;
|
|
295
|
+
for (let j = i + 1; j < lines.length && depth > 0; j++) {
|
|
296
|
+
const bLine = lines[j];
|
|
297
|
+
if (/^\s*'/.test(bLine) || /^\s*rem\b/i.test(bLine))
|
|
298
|
+
continue;
|
|
299
|
+
const stripped = bLine.replace(/'.*$/, '');
|
|
300
|
+
if (/\b(?:function|sub)\s*\(/i.test(stripped))
|
|
301
|
+
depth++;
|
|
302
|
+
if (/^\s*end\s*(?:function|sub)\b/i.test(stripped))
|
|
303
|
+
depth--;
|
|
304
|
+
if (depth > 0)
|
|
305
|
+
bodyLines.push((0, textUtils_1.stripStringLiterals)(stripped, true));
|
|
306
|
+
}
|
|
307
|
+
const bodyText = bodyLines.join('\n');
|
|
308
|
+
for (const param of params) {
|
|
309
|
+
const used = new RegExp(`\\b${(0, textUtils_2.escapeRegex)(param.name)}\\b`, 'i').test(bodyText);
|
|
310
|
+
if (!used) {
|
|
311
|
+
diagnostics.push({
|
|
312
|
+
severity: config['identifier/unused-parameter'] ?? 'hint',
|
|
313
|
+
code: 'identifier/unused-parameter',
|
|
314
|
+
message: `Parameter "${param.name}" is never used. Prefix with \`_\` to indicate it is intentionally unused.`,
|
|
315
|
+
line: i, column: param.col, endLine: i, endColumn: param.col + param.name.length, filePath,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return diagnostics;
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=identifierRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifierRules.js","sourceRoot":"","sources":["../../../src/rules/identifierRules.ts"],"names":[],"mappings":";;AAqDA,kDA6EC;AAED,0DA0EC;AAED,sDA+DC;AAED,sDAsDC;AAtUD,kDAA+E;AAC/E,qDAA4D;AAC5D,qDAAoD;AACpD,6DAOmC;AAEnC,MAAM,OAAO,GAAG,gCAAgC,CAAC;AACjD,MAAM,OAAO,GAAG,kCAAkC,CAAC;AACnD,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAClD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7C,SAAS,iBAAiB,CAAC,KAAe;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,SAAS,GAAG,kFAAkF,CAAC;IACrG,MAAM,MAAM,GAAG,yCAAyC,CAAC;IACzD,MAAM,YAAY,GAAG,mCAAmC,CAAC;IAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,CAAC,uBAAY,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAEnD,MAAM,iBAAiB,GAAG,IAAA,+BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,6BAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7D,IAAI,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC9B,IAAI,CAAC,uBAAY,CAAC,GAAG,CAAC,CAAC,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU;YAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAgB;IAClD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IACrD,IAAI,MAAM,CAAC,+BAA+B,CAAC,KAAK,KAAK,IAAI,MAAM,CAAC,4BAA4B,CAAC,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEnH,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,UAAU;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAA,oCAAoB,EAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC;IAClD,MAAM,WAAW,GAAqB,EAAE,CAAC;IAEzC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAC1D,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAChC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACvC,IAAI,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QAElC,MAAM,QAAQ,GAAG,IAAA,+BAAmB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEhD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAErC,IAAI,uBAAY,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAE1C,IAAI,uBAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,IAAI,MAAM,CAAC,4BAA4B,CAAC,KAAK,KAAK,EAAE,CAAC;oBACnD,MAAM,KAAK,GAAG,uBAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC1C,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;wBACvD,MAAM,QAAQ,GAAG,IAAA,6BAAa,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;wBACvD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;4BACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;gCACtC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gCACtD,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,YAAY,CAAC;4BAC1C,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;4BAC7D,WAAW,CAAC,IAAI,CAAC;gCACf,QAAQ,EAAE,MAAM,CAAC,4BAA4B,CAAC,IAAI,OAAO;gCACzD,IAAI,EAAE,4BAA4B;gCAClC,OAAO,EAAE,IAAI,IAAI,aAAa,QAAQ,QAAQ,GAAG,YAAY;gCAC7D,IAAI,EAAE,OAAO;gCACb,MAAM,EAAE,KAAK,CAAC,KAAK;gCACnB,OAAO,EAAE,OAAO;gCAChB,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;gCACpC,QAAQ;6BACT,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC5C,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAExC,IAAI,MAAM,CAAC,+BAA+B,CAAC,KAAK,KAAK,EAAE,CAAC;gBACtD,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,+BAA+B,CAAC,IAAI,OAAO;oBAC5D,IAAI,EAAE,+BAA+B;oBACrC,OAAO,EAAE,qBAAqB,IAAI,6DAA6D;oBAC/F,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,KAAK,CAAC,KAAK;oBACnB,OAAO,EAAE,OAAO;oBAChB,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;oBACpC,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,uBAAuB,CAAC,GAAgB;IACtD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IACrD,IAAI,MAAM,CAAC,+BAA+B,CAAC,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEjE,MAAM,MAAM,GAAG,IAAA,mCAAmB,EAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC;IAClD,MAAM,WAAW,GAAqB,EAAE,CAAC;IAEzC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAC1D,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAChC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,KAAK,GAAG,IAAA,+BAAe,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAA,+BAAmB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,kFAAkF,CAAC;QACrG,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEjE,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;QAC5B,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YACpE,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAEtF,IAAI,uBAAY,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC1C,IAAI,uBAAY,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC1C,IAAI,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YACnD,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC5C,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM;gBAAE,SAAS;YACtD,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAEvC,IAAI,OAAO,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACxF,MAAM,WAAW,GAAG,IAAA,qCAAqB,EAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;gBAClE,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;oBACzE,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;wBAAE,SAAS;gBAC1C,CAAC;YACH,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,oDAAoD,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClF,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAC1D,MAAM,WAAW,GAAG,IAAA,qCAAqB,EAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;oBAClE,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;wBACzE,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;4BAAE,SAAS;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC,+BAA+B,CAAC,IAAI,OAAO;gBAC5D,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,IAAI,IAAI,4CAA4C;gBAC7D,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,KAAK,CAAC,KAAK;gBACnB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;gBACpC,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,qBAAqB,CAAC,GAAgB;IACpD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACxC,IAAI,MAAM,CAAC,4BAA4B,CAAC,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAE9D,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,IAAI,OAAO,CAAC;IAEjE,MAAM,SAAS,GAAG,kFAAkF,CAAC;IACrG,MAAM,MAAM,GAAG,yCAAyC,CAAC;IACzD,MAAM,MAAM,GAAG,gCAAgC,CAAC;IAChD,MAAM,QAAQ,GAAG,mCAAmC,CAAC;IAErD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAE5D,MAAM,QAAQ,GAAG,IAAA,+BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEjD,gCAAgC;QAChC,MAAM,SAAS,GAAG,yDAAyD,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3F,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YACjE,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,IAAI,uBAAY,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;wBAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;wBACrD,WAAW,CAAC,IAAI,CAAC;4BACf,QAAQ;4BACR,IAAI,EAAE,4BAA4B;4BAClC,OAAO,EAAE,IAAI,SAAS,2CAA2C,SAAS,uDAAuD;4BACjI,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ;yBAC9G,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAoD;YAC9D,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAClD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC5C,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC5C,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;SACjD,CAAC;QAEF,KAAK,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,uBAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC/C,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ;oBACR,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,IAAI,OAAO,2CAA2C,OAAO,uDAAuD;oBAC7H,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ;iBAC5G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,qBAAqB,CAAC,GAAgB;IACpD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACxC,IAAI,MAAM,CAAC,6BAA6B,CAAC,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAE/D,MAAM,YAAY,GAAG,2CAA2C,CAAC;IACjE,MAAM,YAAY,GAAG,iCAAiC,CAAC;IACvD,MAAM,WAAW,GAAqB,EAAE,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAE5D,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,SAAS;QAEjD,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAElC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,KAAK,EAAE,CAAC;YACvD,IAAI,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,KAAK,EAAE,CAAC;YAC5D,IAAI,KAAK,GAAG,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,IAAA,+BAAmB,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,IAAA,uBAAW,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,6BAA6B,CAAC,IAAI,MAAM;oBACzD,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,cAAc,KAAK,CAAC,IAAI,4EAA4E;oBAC7G,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ;iBAC3F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LintDiagnostic, RuleContext } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Checks for duplicate, malformed, wrong-style, build-generated, and unresolved imports.
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkImports(ctx: RuleContext): LintDiagnostic[];
|
|
6
|
+
//# sourceMappingURL=importRules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importRules.d.ts","sourceRoot":"","sources":["../../../src/rules/importRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAiB,MAAM,UAAU,CAAC;AAqB3E;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA2G/D"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkImports = checkImports;
|
|
4
|
+
const globMatcher_1 = require("../analysis/globMatcher");
|
|
5
|
+
const functionIndex_1 = require("../analysis/functionIndex");
|
|
6
|
+
const textUtils_1 = require("../analysis/textUtils");
|
|
7
|
+
const textUtils_2 = require("../analysis/textUtils");
|
|
8
|
+
function lineRange(lineIndex, filePath) {
|
|
9
|
+
return { line: lineIndex, column: 0, endLine: lineIndex, endColumn: Number.MAX_SAFE_INTEGER, filePath };
|
|
10
|
+
}
|
|
11
|
+
const IMPLICIT_MOCK_DEPS = [
|
|
12
|
+
{ pathPattern: /\/PromiseResolve\.brs$/i, usagePattern: /\.resolvedValue\s*\(/i },
|
|
13
|
+
{ pathPattern: /\/PromiseReject\.brs$/i, usagePattern: /\.rejectedValue\s*\(/i },
|
|
14
|
+
];
|
|
15
|
+
function isImplicitMockDependency(importPath, corpus) {
|
|
16
|
+
return IMPLICIT_MOCK_DEPS.some((dep) => dep.pathPattern.test(importPath) && dep.usagePattern.test(corpus));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Checks for duplicate, malformed, wrong-style, build-generated, and unresolved imports.
|
|
20
|
+
*/
|
|
21
|
+
function checkImports(ctx) {
|
|
22
|
+
const diagnostics = [];
|
|
23
|
+
const { filePath, lines, imports, config, lintContext } = ctx;
|
|
24
|
+
const seenImportKeys = new Set();
|
|
25
|
+
for (const imp of imports) {
|
|
26
|
+
const lineIndex = imp.line - 1;
|
|
27
|
+
const lineText = lines[lineIndex] ?? '';
|
|
28
|
+
const annotationType = imp.isMock ? '@mock' : '@import';
|
|
29
|
+
// import/duplicate
|
|
30
|
+
if (config['import/duplicate'] !== 'off') {
|
|
31
|
+
const importKey = `${imp.importPath}|${imp.fromModule ?? ''}`;
|
|
32
|
+
if (seenImportKeys.has(importKey)) {
|
|
33
|
+
diagnostics.push({
|
|
34
|
+
severity: config['import/duplicate'] ?? 'error',
|
|
35
|
+
code: 'import/duplicate',
|
|
36
|
+
message: `Kopytko ${annotationType}: duplicate import "${imp.importPath}"${imp.fromModule ? ` from "${imp.fromModule}"` : ''}.`,
|
|
37
|
+
...lineRange(lineIndex, filePath),
|
|
38
|
+
});
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
seenImportKeys.add(importKey);
|
|
42
|
+
}
|
|
43
|
+
// import/missing-path
|
|
44
|
+
if (config['import/missing-path'] !== 'off') {
|
|
45
|
+
if (!imp.importPath || imp.importPath.trim() === '') {
|
|
46
|
+
diagnostics.push({
|
|
47
|
+
severity: config['import/missing-path'] ?? 'error',
|
|
48
|
+
code: 'import/missing-path',
|
|
49
|
+
message: `Kopytko ${annotationType}: missing import path.`,
|
|
50
|
+
...lineRange(lineIndex, filePath),
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// import/path-not-absolute
|
|
56
|
+
if (config['import/path-not-absolute'] !== 'off') {
|
|
57
|
+
if (!imp.importPath.startsWith('/')) {
|
|
58
|
+
diagnostics.push({
|
|
59
|
+
severity: config['import/path-not-absolute'] ?? 'warning',
|
|
60
|
+
code: 'import/path-not-absolute',
|
|
61
|
+
message: `Kopytko ${annotationType}: path "${imp.importPath}" should start with "/".`,
|
|
62
|
+
...lineRange(lineIndex, filePath),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// import/wrong-comment-style
|
|
67
|
+
if (config['import/wrong-comment-style'] !== 'off') {
|
|
68
|
+
if (lineText.includes('"@import') || lineText.includes('"@mock')) {
|
|
69
|
+
diagnostics.push({
|
|
70
|
+
severity: config['import/wrong-comment-style'] ?? 'error',
|
|
71
|
+
code: 'import/wrong-comment-style',
|
|
72
|
+
message: `Kopytko ${annotationType} must be written as a line comment starting with an apostrophe ('), not a double quote.`,
|
|
73
|
+
...lineRange(lineIndex, filePath),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// File resolution checks
|
|
78
|
+
const resolved = lintContext.resolveImportPath(imp.importPath, imp.fromModule);
|
|
79
|
+
if (resolved !== null) {
|
|
80
|
+
// Skip unused-import check for @mock
|
|
81
|
+
if (!imp.isMock && config['import/unused'] !== 'off') {
|
|
82
|
+
const unusedDiag = checkUnusedImport(resolved, imp, lineIndex, lines, filePath, ctx);
|
|
83
|
+
if (unusedDiag)
|
|
84
|
+
diagnostics.push(unusedDiag);
|
|
85
|
+
}
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
// import/build-generated
|
|
89
|
+
if (config['import/build-generated'] !== 'off') {
|
|
90
|
+
const matchedPattern = (0, globMatcher_1.findMatchingGlob)(imp.importPath, lintContext.generatedPaths)
|
|
91
|
+
?? lintContext.generatedModules.find((gm) => (0, globMatcher_1.matchesGlob)(imp.importPath, gm.path))?.path;
|
|
92
|
+
if (matchedPattern) {
|
|
93
|
+
diagnostics.push({
|
|
94
|
+
severity: config['import/build-generated'] ?? 'info',
|
|
95
|
+
code: 'import/build-generated',
|
|
96
|
+
message: `Kopytko ${annotationType}: "${imp.importPath}" is not on disk — it is expected to be generated during the build process (matches configured pattern "${matchedPattern}").`,
|
|
97
|
+
...lineRange(lineIndex, filePath),
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// import/unresolved
|
|
103
|
+
if (config['import/unresolved'] !== 'off') {
|
|
104
|
+
const label = imp.fromModule
|
|
105
|
+
? `"${imp.importPath}" from "${imp.fromModule}"`
|
|
106
|
+
: `"${imp.importPath}"`;
|
|
107
|
+
const message = imp.fromModule
|
|
108
|
+
? `Kopytko ${annotationType}: cannot resolve ${label}. Is "${imp.fromModule}" installed as an NPM dependency?`
|
|
109
|
+
: `Kopytko ${annotationType}: cannot resolve ${label}. Check the file path and the sourceDir configuration.`;
|
|
110
|
+
diagnostics.push({
|
|
111
|
+
severity: config['import/unresolved'] ?? 'warning',
|
|
112
|
+
code: 'import/unresolved',
|
|
113
|
+
message,
|
|
114
|
+
...lineRange(lineIndex, filePath),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return diagnostics;
|
|
119
|
+
}
|
|
120
|
+
function checkUnusedImport(resolvedPath, imp, lineIndex, fileLines, documentPath, ctx) {
|
|
121
|
+
const importedText = ctx.lintContext.readFile(resolvedPath);
|
|
122
|
+
if (importedText === null)
|
|
123
|
+
return null;
|
|
124
|
+
const fns = (0, functionIndex_1.parseFunctionDefs)(importedText, resolvedPath);
|
|
125
|
+
if (fns.length === 0)
|
|
126
|
+
return null;
|
|
127
|
+
const linesToCorpus = (lines, skipIndex = -1) => lines
|
|
128
|
+
.filter((_, i) => i !== skipIndex)
|
|
129
|
+
.map((line) => {
|
|
130
|
+
if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
|
|
131
|
+
return '';
|
|
132
|
+
return (0, textUtils_1.stripStringLiterals)(line, true);
|
|
133
|
+
})
|
|
134
|
+
.join('\n');
|
|
135
|
+
const corpora = [linesToCorpus(fileLines, lineIndex)];
|
|
136
|
+
for (const siblingPath of ctx.lintContext.getSiblingFiles(documentPath)) {
|
|
137
|
+
const siblingText = ctx.lintContext.readFile(siblingPath);
|
|
138
|
+
if (siblingText !== null) {
|
|
139
|
+
corpora.push(linesToCorpus(siblingText.split(/\r?\n/)));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (ctx.lintContext.isTestFile(documentPath)) {
|
|
143
|
+
for (const siblingTest of ctx.lintContext.getTestSiblings(documentPath)) {
|
|
144
|
+
const sibText = ctx.lintContext.readFile(siblingTest);
|
|
145
|
+
if (sibText !== null) {
|
|
146
|
+
corpora.push(linesToCorpus(sibText.split(/\r?\n/)));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const corpus = corpora.join('\n');
|
|
151
|
+
const anyUsed = fns.some((fn) => new RegExp(`\\b${(0, textUtils_2.escapeRegex)(fn.name)}\\b`, 'i').test(corpus));
|
|
152
|
+
if (anyUsed)
|
|
153
|
+
return null;
|
|
154
|
+
if (ctx.lintContext.isTestFile(documentPath) && isImplicitMockDependency(imp.importPath, corpus)) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
severity: (ctx.config['import/unused'] === 'off' ? 'warning' : ctx.config['import/unused']) ?? 'warning',
|
|
159
|
+
code: 'import/unused',
|
|
160
|
+
message: `Kopytko @import: "${imp.importPath}" is imported but none of its exported functions are referenced in this file.`,
|
|
161
|
+
...lineRange(lineIndex, documentPath),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=importRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importRules.js","sourceRoot":"","sources":["../../../src/rules/importRules.ts"],"names":[],"mappings":";;AAwBA,oCA2GC;AAlID,yDAAwE;AACxE,6DAA8D;AAC9D,qDAA4D;AAC5D,qDAAoD;AAEpD,SAAS,SAAS,CAAC,SAAiB,EAAE,QAAgB;IACpD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AAC1G,CAAC;AAED,MAAM,kBAAkB,GAAoD;IAC1E,EAAE,WAAW,EAAE,yBAAyB,EAAE,YAAY,EAAE,uBAAuB,EAAE;IACjF,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,uBAAuB,EAAE;CACjF,CAAC;AAEF,SAAS,wBAAwB,CAAC,UAAkB,EAAE,MAAc;IAClE,OAAO,kBAAkB,CAAC,IAAI,CAC5B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,GAAgB;IAC3C,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAExD,mBAAmB;QACnB,IAAI,MAAM,CAAC,kBAAkB,CAAC,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YAC9D,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,kBAAkB,CAAC,IAAI,OAAO;oBAC/C,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,WAAW,cAAc,uBAAuB,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;oBAC/H,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAClC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,KAAK,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACpD,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,qBAAqB,CAAC,IAAI,OAAO;oBAClD,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,WAAW,cAAc,wBAAwB;oBAC1D,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAClC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,MAAM,CAAC,0BAA0B,CAAC,KAAK,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,0BAA0B,CAAC,IAAI,SAAS;oBACzD,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,WAAW,cAAc,WAAW,GAAG,CAAC,UAAU,0BAA0B;oBACrF,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,MAAM,CAAC,4BAA4B,CAAC,KAAK,KAAK,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjE,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,4BAA4B,CAAC,IAAI,OAAO;oBACzD,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,WAAW,cAAc,yFAAyF;oBAC3H,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/E,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,qCAAqC;YACrC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,KAAK,EAAE,CAAC;gBACrD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACrF,IAAI,UAAU;oBAAE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;YACD,SAAS;QACX,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,CAAC,wBAAwB,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/C,MAAM,cAAc,GAAG,IAAA,8BAAgB,EAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,cAAc,CAAC;mBAC9E,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,yBAAW,EAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;YAC3F,IAAI,cAAc,EAAE,CAAC;gBACnB,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,MAAM,CAAC,wBAAwB,CAAC,IAAI,MAAM;oBACpD,IAAI,EAAE,wBAAwB;oBAC9B,OAAO,EAAE,WAAW,cAAc,MAAM,GAAG,CAAC,UAAU,2GAA2G,cAAc,KAAK;oBACpL,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAClC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,KAAK,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU;gBAC1B,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,WAAW,GAAG,CAAC,UAAU,GAAG;gBAChD,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU;gBAC5B,CAAC,CAAC,WAAW,cAAc,oBAAoB,KAAK,SAAS,GAAG,CAAC,UAAU,mCAAmC;gBAC9G,CAAC,CAAC,WAAW,cAAc,oBAAoB,KAAK,wDAAwD,CAAC;YAE/G,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,SAAS;gBAClD,IAAI,EAAE,mBAAmB;gBACzB,OAAO;gBACP,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAoB,EACpB,GAAkB,EAClB,SAAiB,EACjB,SAAmB,EACnB,YAAoB,EACpB,GAAgB;IAEhB,MAAM,YAAY,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,GAAG,GAAG,IAAA,iCAAiB,EAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,aAAa,GAAG,CAAC,KAAe,EAAE,SAAS,GAAG,CAAC,CAAC,EAAU,EAAE,CAChE,KAAK;SACF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAC7D,OAAO,IAAA,+BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QACxE,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,KAAK,MAAM,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;YACxE,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CACtB,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,IAAA,uBAAW,EAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CACtE,CAAC;IACF,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,wBAAwB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;QACjG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,SAAS;QACxG,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,qBAAqB,GAAG,CAAC,UAAU,+EAA+E;QAC3H,GAAG,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC;KACtC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM/C,gFAAgF;AAChF,eAAO,MAAM,eAAe,EAAE,cAAc,EAW3C,CAAC"}
|