@m100/core 0.8.2 → 0.9.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/data/keywordCategories.json +69 -0
- package/dist/data/keywordDataset.json +1935 -0
- package/dist/diagnostics/diagnostics.d.ts +15 -0
- package/dist/diagnostics/diagnostics.js +368 -0
- package/dist/diagnostics/diagnostics.js.map +1 -0
- package/dist/diagnostics/formatMessage.d.ts +19 -0
- package/dist/diagnostics/formatMessage.js +96 -0
- package/dist/diagnostics/formatMessage.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/keywords.d.ts +28 -0
- package/dist/keywords.js +188 -0
- package/dist/keywords.js.map +1 -0
- package/dist/languageFeatures.d.ts +24 -0
- package/dist/languageFeatures.js +195 -0
- package/dist/languageFeatures.js.map +1 -0
- package/dist/utils/programAnalysis.d.ts +18 -6
- package/dist/utils/programAnalysis.js +102 -4
- package/dist/utils/programAnalysis.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type LineSource } from '../utils/programAnalysis.js';
|
|
2
|
+
import { type M100DiagCode } from './formatMessage.js';
|
|
3
|
+
export type DiagnosticSeverity = 'error' | 'warning';
|
|
4
|
+
export type M100Diagnostic = {
|
|
5
|
+
code: M100DiagCode;
|
|
6
|
+
severity: DiagnosticSeverity;
|
|
7
|
+
line: number;
|
|
8
|
+
column: number;
|
|
9
|
+
endColumn: number;
|
|
10
|
+
message: string;
|
|
11
|
+
fix: string;
|
|
12
|
+
hint?: string;
|
|
13
|
+
context?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function computeDiagnostics(input: string | string[] | LineSource): M100Diagnostic[];
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { stripComment, stripCommentsAndStrings, findCommentStart, } from '../commentUtils.js';
|
|
2
|
+
import { KEYWORDS_BY_NAME, splitStatementsWithOffsets, normalizeStatement, inferVariableType, inferExpressionType, typeMatches, formatType, formatExpectedType, extractArguments, } from '../languageFeatures.js';
|
|
3
|
+
import { collectProgramStructure, } from '../utils/programAnalysis.js';
|
|
4
|
+
import { diagBuilders, formatM100Diagnostic, } from './formatMessage.js';
|
|
5
|
+
export function computeDiagnostics(input) {
|
|
6
|
+
const source = toLineSource(input);
|
|
7
|
+
const diags = [];
|
|
8
|
+
for (let line = 0; line < source.lineCount; line++) {
|
|
9
|
+
const originalLine = readLine(source, line);
|
|
10
|
+
const codeLine = stripComment(originalLine);
|
|
11
|
+
if (!codeLine.trim()) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const statements = splitStatementsWithOffsets(codeLine);
|
|
15
|
+
let hasValidStatement = false;
|
|
16
|
+
for (const statement of statements) {
|
|
17
|
+
const normalized = normalizeStatement(statement.text);
|
|
18
|
+
if (!normalized.text) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
hasValidStatement = true;
|
|
22
|
+
analyzeAssignment(line, normalized.text, statement.start + normalized.leadingOffset, diags);
|
|
23
|
+
analyzeFunctionCalls(line, normalized.text, statement.start + normalized.leadingOffset, diags);
|
|
24
|
+
}
|
|
25
|
+
if (!hasValidStatement && findCommentStart(originalLine) === undefined) {
|
|
26
|
+
const template = diagBuilders.W_NO_TOKENS(originalLine);
|
|
27
|
+
pushDiagnostic(diags, 'W_NO_TOKENS', line, 0, originalLine.length, template);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
analyzeProgramStructure(source, diags);
|
|
31
|
+
analyzeVariableCollisions(source, diags);
|
|
32
|
+
return diags;
|
|
33
|
+
}
|
|
34
|
+
function analyzeVariableName(line, varName, column, diags) {
|
|
35
|
+
if (!/^[A-Za-z]/.test(varName)) {
|
|
36
|
+
const template = diagBuilders.E_VAR_INVALID_START(varName);
|
|
37
|
+
pushDiagnostic(diags, 'E_VAR_INVALID_START', line, column, column + varName.length, template, column);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const typeMatch = /^([A-Za-z][A-Za-z0-9_]*)([!#%$]?)$/i.exec(varName);
|
|
41
|
+
if (!typeMatch) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const baseName = typeMatch[1];
|
|
45
|
+
const typeSuffix = typeMatch[2];
|
|
46
|
+
if (baseName.length > 2) {
|
|
47
|
+
const effectiveName = baseName.substring(0, 2) + typeSuffix;
|
|
48
|
+
const template = diagBuilders.W_VAR_NAME_TOO_LONG(varName, effectiveName);
|
|
49
|
+
pushDiagnostic(diags, 'W_VAR_NAME_TOO_LONG', line, column, column + varName.length, template, column);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function analyzeAssignment(line, statement, startColumn, diags) {
|
|
53
|
+
const assignmentMatch = /^(?:LET\s+)?([A-Za-z][A-Za-z0-9_$#!%]*)\s*=\s*(.+)$/i.exec(statement);
|
|
54
|
+
if (!assignmentMatch) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const targetName = assignmentMatch[1];
|
|
58
|
+
const keyword = KEYWORDS_BY_NAME.get(targetName.toUpperCase());
|
|
59
|
+
if (keyword && (keyword.category === 'function' || keyword.returnType)) {
|
|
60
|
+
const column = startColumn + statement.indexOf(targetName, assignmentMatch.index);
|
|
61
|
+
const template = diagBuilders.E_ASSIGN_TO_FUNCTION(targetName);
|
|
62
|
+
pushDiagnostic(diags, 'E_ASSIGN_TO_FUNCTION', line, column, column + targetName.length, template, column);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const upperTargetName = targetName.toUpperCase();
|
|
66
|
+
for (const [keywordName] of KEYWORDS_BY_NAME) {
|
|
67
|
+
if (upperTargetName.startsWith(keywordName) &&
|
|
68
|
+
upperTargetName.length > keywordName.length) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
analyzeVariableName(line, targetName, startColumn + statement.indexOf(targetName, assignmentMatch.index), diags);
|
|
73
|
+
const targetType = inferVariableType(targetName);
|
|
74
|
+
if (!targetType) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const valueType = inferExpressionType(assignmentMatch[2]);
|
|
78
|
+
if (!valueType) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (typeMatches(targetType, valueType)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const column = startColumn + statement.indexOf(targetName, assignmentMatch.index);
|
|
85
|
+
const template = diagBuilders.W_ASSIGN_TYPE(formatType(valueType), formatType(targetType), targetName, assignmentMatch[2]);
|
|
86
|
+
pushDiagnostic(diags, 'W_ASSIGN_TYPE', line, column, column + targetName.length, template, column);
|
|
87
|
+
}
|
|
88
|
+
function analyzeFunctionCalls(line, statement, startColumn, diags) {
|
|
89
|
+
const callRegex = /([A-Za-z][A-Za-z0-9_$#!%]*)\s*\(/gi;
|
|
90
|
+
let match;
|
|
91
|
+
while ((match = callRegex.exec(statement)) !== null) {
|
|
92
|
+
const keyword = KEYWORDS_BY_NAME.get(match[1].toUpperCase());
|
|
93
|
+
if (!keyword || keyword.requiresParentheses !== true) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const parenIndex = match.index + match[0].lastIndexOf('(');
|
|
97
|
+
const argsInfo = extractArguments(statement, parenIndex);
|
|
98
|
+
if (!argsInfo) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const expectedParams = keyword.parameters;
|
|
102
|
+
if (!expectedParams || expectedParams.length === 0) {
|
|
103
|
+
callRegex.lastIndex = argsInfo.endIndex + 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const requiredCount = expectedParams.filter(p => !p.optional).length;
|
|
107
|
+
if (argsInfo.args.length < requiredCount ||
|
|
108
|
+
argsInfo.args.length > expectedParams.length) {
|
|
109
|
+
const nameColumn = startColumn + match.index;
|
|
110
|
+
const code = argsInfo.args.length < requiredCount ? 'W_ARG_MIN' : 'W_ARG_MAX';
|
|
111
|
+
const template = code === 'W_ARG_MIN'
|
|
112
|
+
? diagBuilders.W_ARG_MIN(keyword.name, requiredCount)
|
|
113
|
+
: diagBuilders.W_ARG_MAX(keyword.name, expectedParams.length, argsInfo.args.length);
|
|
114
|
+
pushDiagnostic(diags, code, line, nameColumn, nameColumn + keyword.name.length, template, nameColumn);
|
|
115
|
+
callRegex.lastIndex = argsInfo.endIndex + 1;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
argsInfo.args.forEach((arg, index) => {
|
|
119
|
+
const expected = expectedParams[index];
|
|
120
|
+
if (!expected) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const actualType = inferExpressionType(arg);
|
|
124
|
+
if (!actualType) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (typeMatches(expected.type, actualType)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const argRange = argsInfo.ranges[index];
|
|
131
|
+
const col0 = startColumn + argRange.start;
|
|
132
|
+
const template = diagBuilders.W_ARG_TYPE(keyword.name, index + 1, formatExpectedType(expected.type), formatType(actualType), arg);
|
|
133
|
+
pushDiagnostic(diags, 'W_ARG_TYPE', line, col0, startColumn + argRange.end, template, col0);
|
|
134
|
+
});
|
|
135
|
+
callRegex.lastIndex = argsInfo.endIndex + 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function analyzeProgramStructure(source, diags) {
|
|
139
|
+
const { numberedLines, references } = collectProgramStructure(source);
|
|
140
|
+
if (numberedLines.length === 0) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const lineInfo = [];
|
|
144
|
+
const seenLineNumbers = new Map();
|
|
145
|
+
for (const info of numberedLines) {
|
|
146
|
+
const lineNumber = info.number;
|
|
147
|
+
const lineIndex = info.line;
|
|
148
|
+
if (lineNumber < 0 || lineNumber > 65529) {
|
|
149
|
+
const template = diagBuilders.E_LINE_RANGE(lineNumber);
|
|
150
|
+
pushDiagnostic(diags, 'E_LINE_RANGE', lineIndex, info.numberStart, info.numberEnd, template, info.numberStart);
|
|
151
|
+
}
|
|
152
|
+
if (seenLineNumbers.has(lineNumber)) {
|
|
153
|
+
const otherLineIndex = seenLineNumbers.get(lineNumber);
|
|
154
|
+
const otherLines = (otherLineIndex + 1).toString();
|
|
155
|
+
const template = diagBuilders.E_DUP_LINE(lineNumber, otherLines);
|
|
156
|
+
pushDiagnostic(diags, 'E_DUP_LINE', lineIndex, info.numberStart, info.numberEnd, template, info.numberStart);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
seenLineNumbers.set(lineNumber, lineIndex);
|
|
160
|
+
lineInfo.push({
|
|
161
|
+
line: lineIndex,
|
|
162
|
+
number: lineNumber,
|
|
163
|
+
textBeforeComment: info.textBeforeComment,
|
|
164
|
+
bodyOffset: info.bodyOffset,
|
|
165
|
+
controlInfo: info.controlInfo,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
const codeText = info.textBeforeComment.slice(info.bodyOffset);
|
|
169
|
+
const lineNumberDigits = info.numberEnd - info.numberStart;
|
|
170
|
+
const tokenizedBytes = Buffer.byteLength(codeText, 'utf8') + lineNumberDigits + 5;
|
|
171
|
+
if (tokenizedBytes > 256) {
|
|
172
|
+
const template = diagBuilders.W_LINE_LEN(tokenizedBytes);
|
|
173
|
+
pushDiagnostic(diags, 'W_LINE_LEN', lineIndex, info.bodyOffset, info.textBeforeComment.length, template, info.bodyOffset);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
let prevLineNumber;
|
|
177
|
+
for (const info of numberedLines) {
|
|
178
|
+
if (prevLineNumber !== undefined && info.number < prevLineNumber) {
|
|
179
|
+
const template = diagBuilders.W_LINE_ORDER(info.number, prevLineNumber);
|
|
180
|
+
pushDiagnostic(diags, 'W_LINE_ORDER', info.line, info.numberStart, info.numberEnd, template, info.numberStart);
|
|
181
|
+
}
|
|
182
|
+
prevLineNumber = info.number;
|
|
183
|
+
}
|
|
184
|
+
const allLines = new Set(lineInfo.map(li => li.number));
|
|
185
|
+
const allLineNumbers = [...allLines].sort((a, b) => a - b);
|
|
186
|
+
const findNearest = (target, numbers) => {
|
|
187
|
+
let lower;
|
|
188
|
+
let upper;
|
|
189
|
+
for (const n of numbers) {
|
|
190
|
+
if (n < target) {
|
|
191
|
+
lower = n;
|
|
192
|
+
}
|
|
193
|
+
else if (n > target) {
|
|
194
|
+
upper = n;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return { lower, upper };
|
|
199
|
+
};
|
|
200
|
+
for (const ref of references) {
|
|
201
|
+
if (allLines.has(ref.target)) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const nearest = findNearest(ref.target, allLineNumbers);
|
|
205
|
+
const lineText = readLine(source, ref.lineIndex);
|
|
206
|
+
const template = diagBuilders.E_MISSING_TARGET(ref.keyword, ref.target, nearest.lower, nearest.upper, lineText);
|
|
207
|
+
pushDiagnostic(diags, 'E_MISSING_TARGET', ref.lineIndex, ref.start, ref.end, template, ref.start);
|
|
208
|
+
}
|
|
209
|
+
const sorted = [...lineInfo].sort((a, b) => a.number - b.number);
|
|
210
|
+
const adjacency = new Map();
|
|
211
|
+
const addEdge = (from, to) => {
|
|
212
|
+
if (!adjacency.has(from)) {
|
|
213
|
+
adjacency.set(from, new Set());
|
|
214
|
+
}
|
|
215
|
+
adjacency.get(from).add(to);
|
|
216
|
+
};
|
|
217
|
+
for (const ref of references) {
|
|
218
|
+
if (allLines.has(ref.target)) {
|
|
219
|
+
addEdge(ref.fromNumber, ref.target);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
223
|
+
const info = sorted[i];
|
|
224
|
+
const isUnconditional = !info.controlInfo.hasIfThen && info.controlInfo.endsWithTerminal;
|
|
225
|
+
if (isUnconditional) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (i < sorted.length - 1) {
|
|
229
|
+
addEdge(info.number, sorted[i + 1].number);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const reachable = new Set();
|
|
233
|
+
const entry = sorted[0].number;
|
|
234
|
+
const queue = [entry];
|
|
235
|
+
reachable.add(entry);
|
|
236
|
+
while (queue.length) {
|
|
237
|
+
const current = queue.shift();
|
|
238
|
+
const neighbors = adjacency.get(current);
|
|
239
|
+
if (!neighbors) {
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
for (const next of neighbors) {
|
|
243
|
+
if (!reachable.has(next) && allLines.has(next)) {
|
|
244
|
+
reachable.add(next);
|
|
245
|
+
queue.push(next);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const targets = new Set(references.map(r => r.target));
|
|
250
|
+
for (const info of numberedLines) {
|
|
251
|
+
const body = info.textBeforeComment.slice(info.bodyOffset).trim();
|
|
252
|
+
if (body === '' && targets.has(info.number)) {
|
|
253
|
+
const referringLines = references
|
|
254
|
+
.filter(ref => ref.target === info.number)
|
|
255
|
+
.map(ref => ref.fromNumber)
|
|
256
|
+
.filter((v, i, a) => a.indexOf(v) === i)
|
|
257
|
+
.sort((a, b) => a - b)
|
|
258
|
+
.join(', ');
|
|
259
|
+
const template = diagBuilders.W_COMMENT_TARGET(info.number, referringLines);
|
|
260
|
+
pushDiagnostic(diags, 'W_COMMENT_TARGET', info.line, info.numberStart, info.numberEnd, template, info.numberStart);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (const info of sorted) {
|
|
264
|
+
const body = info.textBeforeComment.slice(info.bodyOffset).trim();
|
|
265
|
+
if (reachable.has(info.number) || info.controlInfo.hasData || body === '') {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const match = /^\s*(\d+)\b/.exec(info.textBeforeComment);
|
|
269
|
+
const start = match ? match.index + match[0].indexOf(match[1]) : 0;
|
|
270
|
+
const len = match ? match[1].length : info.textBeforeComment.length;
|
|
271
|
+
const template = diagBuilders.W_UNREACHABLE();
|
|
272
|
+
pushDiagnostic(diags, 'W_UNREACHABLE', info.line, start, start + len, template, start);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function analyzeVariableCollisions(source, diags) {
|
|
276
|
+
const variablesByEffectiveName = new Map();
|
|
277
|
+
const varPattern = /\b([A-Za-z][A-Za-z0-9_]*[!#%$]?)/g;
|
|
278
|
+
for (let line = 0; line < source.lineCount; line++) {
|
|
279
|
+
const text = readLine(source, line);
|
|
280
|
+
const codeLine = stripCommentsAndStrings(text);
|
|
281
|
+
let match;
|
|
282
|
+
while ((match = varPattern.exec(codeLine)) !== null) {
|
|
283
|
+
const varName = match[1];
|
|
284
|
+
const column = match.index;
|
|
285
|
+
const keyword = KEYWORDS_BY_NAME.get(varName.toUpperCase());
|
|
286
|
+
if (keyword) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
let startsWithKeyword = false;
|
|
290
|
+
const upperVarName = varName.toUpperCase();
|
|
291
|
+
for (const [keywordName] of KEYWORDS_BY_NAME) {
|
|
292
|
+
if (upperVarName.startsWith(keywordName) &&
|
|
293
|
+
upperVarName.length > keywordName.length) {
|
|
294
|
+
startsWithKeyword = true;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (startsWithKeyword) {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
const typeMatch = /^([A-Za-z][A-Za-z0-9_]*)([!#%$]?)$/i.exec(varName);
|
|
302
|
+
if (!typeMatch) {
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const baseName = typeMatch[1];
|
|
306
|
+
const typeSuffix = typeMatch[2];
|
|
307
|
+
const effectiveName = baseName.substring(0, 2).toUpperCase() + typeSuffix;
|
|
308
|
+
if (!variablesByEffectiveName.has(effectiveName)) {
|
|
309
|
+
variablesByEffectiveName.set(effectiveName, []);
|
|
310
|
+
}
|
|
311
|
+
const existing = variablesByEffectiveName.get(effectiveName);
|
|
312
|
+
if (!existing.some(v => v.varName === varName)) {
|
|
313
|
+
existing.push({ varName, line, column });
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
for (const [effectiveName, vars] of variablesByEffectiveName.entries()) {
|
|
318
|
+
if (vars.length > 1) {
|
|
319
|
+
for (const varInfo of vars) {
|
|
320
|
+
const conflictingVars = vars
|
|
321
|
+
.filter(v => v.varName !== varInfo.varName)
|
|
322
|
+
.map(v => v.varName);
|
|
323
|
+
const template = diagBuilders.W_VAR_NAME_COLLISION(varInfo.varName, conflictingVars);
|
|
324
|
+
pushDiagnostic(diags, 'W_VAR_NAME_COLLISION', varInfo.line, varInfo.column, varInfo.column + varInfo.varName.length, template, varInfo.column);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function pushDiagnostic(diags, code, line, start, end, template, messageColumn) {
|
|
330
|
+
const message = formatM100Diagnostic({
|
|
331
|
+
code,
|
|
332
|
+
line0: line,
|
|
333
|
+
col0: messageColumn,
|
|
334
|
+
...template,
|
|
335
|
+
});
|
|
336
|
+
diags.push({
|
|
337
|
+
code,
|
|
338
|
+
severity: code.startsWith('E_') ? 'error' : 'warning',
|
|
339
|
+
line,
|
|
340
|
+
column: start,
|
|
341
|
+
endColumn: end,
|
|
342
|
+
message,
|
|
343
|
+
fix: template.fix,
|
|
344
|
+
hint: template.hint,
|
|
345
|
+
context: template.context,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
function toLineSource(input) {
|
|
349
|
+
if (typeof input === 'string') {
|
|
350
|
+
const lines = input.split(/\r?\n/);
|
|
351
|
+
return {
|
|
352
|
+
lineCount: lines.length,
|
|
353
|
+
lineAt: (index) => lines[index] ?? '',
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
if (Array.isArray(input)) {
|
|
357
|
+
return {
|
|
358
|
+
lineCount: input.length,
|
|
359
|
+
lineAt: (index) => input[index] ?? '',
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return input;
|
|
363
|
+
}
|
|
364
|
+
function readLine(source, index) {
|
|
365
|
+
const value = source.lineAt(index);
|
|
366
|
+
return typeof value === 'string' ? value : value.text ?? '';
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/diagnostics/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type M100DiagCode = 'E_LINE_RANGE' | 'E_DUP_LINE' | 'E_MISSING_TARGET' | 'E_ASSIGN_TO_FUNCTION' | 'E_VAR_INVALID_START' | 'W_ASSIGN_TYPE' | 'W_ARG_MIN' | 'W_ARG_MAX' | 'W_ARG_TYPE' | 'W_LINE_LEN' | 'W_LINE_ORDER' | 'W_NO_TOKENS' | 'W_COMMENT_TARGET' | 'W_UNREACHABLE' | 'W_VAR_NAME_TOO_LONG' | 'W_VAR_NAME_COLLISION';
|
|
2
|
+
export interface M100DiagFormatInput {
|
|
3
|
+
code: M100DiagCode;
|
|
4
|
+
line0: number;
|
|
5
|
+
col0?: number;
|
|
6
|
+
message: string;
|
|
7
|
+
fix: string;
|
|
8
|
+
hint?: string;
|
|
9
|
+
context?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function formatM100Diagnostic(i: M100DiagFormatInput): string;
|
|
12
|
+
interface DiagTemplate {
|
|
13
|
+
message: string;
|
|
14
|
+
fix: string;
|
|
15
|
+
hint?: string;
|
|
16
|
+
context?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const diagBuilders: Record<M100DiagCode, (...args: any[]) => DiagTemplate>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export function formatM100Diagnostic(i) {
|
|
2
|
+
const line1 = i.line0 + 1;
|
|
3
|
+
const colPart = i.col0 !== undefined ? `:C${i.col0 + 1}` : '';
|
|
4
|
+
let result = `[M100:${i.code}] L${line1}${colPart} ${i.message}. Fix: ${i.fix}.`;
|
|
5
|
+
if (i.hint) {
|
|
6
|
+
result += `\nHint: ${i.hint}`;
|
|
7
|
+
}
|
|
8
|
+
if (i.context) {
|
|
9
|
+
result += `\nContext: "${i.context}"`;
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
export const diagBuilders = {
|
|
14
|
+
E_LINE_RANGE: (number) => ({
|
|
15
|
+
message: `Invalid line number ${number}. Allowed: 0–65529`,
|
|
16
|
+
fix: 'change the line label to a value within range (common: multiples of 10)',
|
|
17
|
+
}),
|
|
18
|
+
E_DUP_LINE: (number, otherLines) => ({
|
|
19
|
+
message: `Duplicate line number ${number}`,
|
|
20
|
+
fix: 'renumber one of the duplicates or run "M100 BASIC: Renumber Program"',
|
|
21
|
+
hint: otherLines ? `other occurrences at L${otherLines}` : undefined,
|
|
22
|
+
}),
|
|
23
|
+
E_MISSING_TARGET: (keyword, target, lowerNeighbor, upperNeighbor, lineText) => ({
|
|
24
|
+
message: `${keyword} target ${target} does not exist`,
|
|
25
|
+
fix: `change the target to an existing line number or add line ${target}`,
|
|
26
|
+
hint: lowerNeighbor !== undefined && upperNeighbor !== undefined
|
|
27
|
+
? `nearest existing lines: ${lowerNeighbor}, ${upperNeighbor}`
|
|
28
|
+
: undefined,
|
|
29
|
+
context: lineText,
|
|
30
|
+
}),
|
|
31
|
+
W_ASSIGN_TYPE: (valueType, targetType, targetName, expression) => ({
|
|
32
|
+
message: `Cannot assign ${valueType} to ${targetType} variable "${targetName}"`,
|
|
33
|
+
fix: 'use a matching variable type (add/remove $ or %) or convert the value',
|
|
34
|
+
context: expression,
|
|
35
|
+
}),
|
|
36
|
+
W_ARG_MIN: (keyword, count) => ({
|
|
37
|
+
message: `${keyword} requires at least ${count} argument(s)`,
|
|
38
|
+
fix: 'add the missing argument(s)',
|
|
39
|
+
}),
|
|
40
|
+
W_ARG_MAX: (keyword, count, actualCount) => ({
|
|
41
|
+
message: `${keyword} allows at most ${count} argument(s)`,
|
|
42
|
+
fix: 'remove the extra argument(s)',
|
|
43
|
+
hint: actualCount ? `received ${actualCount}` : undefined,
|
|
44
|
+
}),
|
|
45
|
+
W_ARG_TYPE: (keyword, index, expectedType, actualType, argText) => ({
|
|
46
|
+
message: `${keyword} arg #${index} expects ${expectedType}, got ${actualType}`,
|
|
47
|
+
fix: `convert the argument or supply a ${expectedType} expression`,
|
|
48
|
+
context: argText,
|
|
49
|
+
}),
|
|
50
|
+
W_LINE_LEN: (bytes) => ({
|
|
51
|
+
message: `Line may exceed tokenized length: ~${bytes} bytes (max 256 incl header)`,
|
|
52
|
+
fix: 'split into multiple lines or reduce statements on this line',
|
|
53
|
+
hint: 'reduce ":" usage; shorten string literals; split long PRINT chains.',
|
|
54
|
+
}),
|
|
55
|
+
W_LINE_ORDER: (number, prevNumber) => ({
|
|
56
|
+
message: `Line number ${number} is out of order (previous line is ${prevNumber})`,
|
|
57
|
+
fix: 'reorder/sort lines by line number or run "M100 BASIC: Renumber Program"',
|
|
58
|
+
hint: 'BASIC executes lines in line number order, not file order',
|
|
59
|
+
}),
|
|
60
|
+
W_NO_TOKENS: (lineText) => ({
|
|
61
|
+
message: 'No valid BASIC tokens detected',
|
|
62
|
+
fix: 'check for unsupported keywords, typos, or non-ASCII characters',
|
|
63
|
+
context: lineText,
|
|
64
|
+
}),
|
|
65
|
+
W_COMMENT_TARGET: (number, referringLines) => ({
|
|
66
|
+
message: `Line ${number} is comments-only but is referenced`,
|
|
67
|
+
fix: `move executable code onto line ${number} or update the reference`,
|
|
68
|
+
hint: referringLines ? `referenced by lines ${referringLines}` : undefined,
|
|
69
|
+
}),
|
|
70
|
+
W_UNREACHABLE: () => ({
|
|
71
|
+
message: 'Line appears unreachable from entry or any branch',
|
|
72
|
+
fix: 'add a control-flow path or delete the line',
|
|
73
|
+
hint: 'if this is a subroutine, ensure it is called via GOSUB.',
|
|
74
|
+
}),
|
|
75
|
+
E_ASSIGN_TO_FUNCTION: (functionName) => ({
|
|
76
|
+
message: `Cannot assign to BASIC function "${functionName}"`,
|
|
77
|
+
fix: 'use a variable name instead (functions are read-only)',
|
|
78
|
+
hint: 'BASIC functions like CHR$, LEFT$, MID$, etc. cannot be assigned values',
|
|
79
|
+
}),
|
|
80
|
+
E_VAR_INVALID_START: (varName) => ({
|
|
81
|
+
message: `Invalid variable name "${varName}" - must start with a letter`,
|
|
82
|
+
fix: 'rename the variable to start with A-Z',
|
|
83
|
+
hint: 'variable names must begin with an alphabetic character (A-Z)',
|
|
84
|
+
}),
|
|
85
|
+
W_VAR_NAME_TOO_LONG: (varName, effectiveName) => ({
|
|
86
|
+
message: `Variable "${varName}" exceeds 2 significant characters`,
|
|
87
|
+
fix: 'shorten to 2 characters plus optional type suffix ($, %, !, #)',
|
|
88
|
+
hint: `BASIC only recognizes first 2 characters - this is treated as "${effectiveName}"`,
|
|
89
|
+
}),
|
|
90
|
+
W_VAR_NAME_COLLISION: (varName, conflictingVars) => ({
|
|
91
|
+
message: `Variable "${varName}" conflicts with: ${conflictingVars.join(', ')}`,
|
|
92
|
+
fix: 'rename one of the variables to use different first 2 characters',
|
|
93
|
+
hint: 'BASIC only recognizes first 2 characters of the base name (plus type suffix). Variables of the same type with the same first 2 chars are the same variable',
|
|
94
|
+
}),
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=formatMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatMessage.js","sourceRoot":"","sources":["../../src/diagnostics/formatMessage.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,8 @@ export { squashBasicCode } from './squash/squash.js';
|
|
|
8
8
|
export { packProgram } from './pack/pack.js';
|
|
9
9
|
export { renumberProgram } from './renumber/renumber.js';
|
|
10
10
|
export { findCommentStart, stripComment, stripCommentsAndStrings } from './commentUtils.js';
|
|
11
|
-
export {
|
|
11
|
+
export { BASIC_KEYWORDS, KEYWORD_NAMES, getKeywordByName, getKeywordsByCategory, type BasicKeyword, type BasicParameter, type BasicType, type KeywordDocumentationEntry, } from './keywords.js';
|
|
12
|
+
export { KEYWORDS_BY_NAME, splitStatementsWithOffsets, normalizeStatement, extractArguments, inferVariableType, inferExpressionType, typeMatches, formatType, formatExpectedType, } from './languageFeatures.js';
|
|
13
|
+
export { diagBuilders, formatM100Diagnostic, type M100DiagCode, type M100DiagFormatInput, } from './diagnostics/formatMessage.js';
|
|
14
|
+
export { computeDiagnostics, type M100Diagnostic, type DiagnosticSeverity, } from './diagnostics/diagnostics.js';
|
|
15
|
+
export { collectProgramStructure, findLineReferenceSpans, containsKeywordOutsideStrings, extractLastStatement, type NumberedLineInfo, type LineControlInfo, type LineReference, type LineSource, type ProgramStructure, type ReferenceKeyword, type ReferenceSpan } from './utils/programAnalysis.js';
|
package/dist/index.js
CHANGED
|
@@ -7,5 +7,9 @@ export { squashBasicCode } from './squash/squash.js';
|
|
|
7
7
|
export { packProgram } from './pack/pack.js';
|
|
8
8
|
export { renumberProgram } from './renumber/renumber.js';
|
|
9
9
|
export { findCommentStart, stripComment, stripCommentsAndStrings } from './commentUtils.js';
|
|
10
|
-
export {
|
|
10
|
+
export { BASIC_KEYWORDS, KEYWORD_NAMES, getKeywordByName, getKeywordsByCategory, } from './keywords.js';
|
|
11
|
+
export { KEYWORDS_BY_NAME, splitStatementsWithOffsets, normalizeStatement, extractArguments, inferVariableType, inferExpressionType, typeMatches, formatType, formatExpectedType, } from './languageFeatures.js';
|
|
12
|
+
export { diagBuilders, formatM100Diagnostic, } from './diagnostics/formatMessage.js';
|
|
13
|
+
export { computeDiagnostics, } from './diagnostics/diagnostics.js';
|
|
14
|
+
export { collectProgramStructure, findLineReferenceSpans, containsKeywordOutsideStrings, extractLastStatement } from './utils/programAnalysis.js';
|
|
11
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,IAAI,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACrH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EACL,uBAAuB,EACvB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,IAAI,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACrH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GAKtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,GAGnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,oBAAoB,EAQrB,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type BasicType = 'string' | 'integer' | 'single' | 'double' | 'numeric' | 'any';
|
|
2
|
+
export interface KeywordDocumentationEntry {
|
|
3
|
+
variant: string;
|
|
4
|
+
description: string;
|
|
5
|
+
syntax: string;
|
|
6
|
+
longDescription: string;
|
|
7
|
+
}
|
|
8
|
+
export interface BasicParameter {
|
|
9
|
+
name: string;
|
|
10
|
+
type: BasicType | BasicType[];
|
|
11
|
+
optional?: boolean;
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface BasicKeyword {
|
|
15
|
+
name: string;
|
|
16
|
+
category: 'control' | 'function' | 'statement' | 'variable' | 'operator';
|
|
17
|
+
description: string;
|
|
18
|
+
syntax?: string;
|
|
19
|
+
requiresParentheses?: boolean;
|
|
20
|
+
returnType?: BasicType;
|
|
21
|
+
parameters?: BasicParameter[];
|
|
22
|
+
variants?: string[];
|
|
23
|
+
docEntries?: KeywordDocumentationEntry[];
|
|
24
|
+
}
|
|
25
|
+
export declare const BASIC_KEYWORDS: BasicKeyword[];
|
|
26
|
+
export declare function getKeywordByName(name: string): BasicKeyword | undefined;
|
|
27
|
+
export declare function getKeywordsByCategory(category: BasicKeyword['category']): BasicKeyword[];
|
|
28
|
+
export declare const KEYWORD_NAMES: string[];
|