fix(vscode): repair WRN language diagnostics and activation
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
"use strict";
|
||||
|
||||
const assert = require("node:assert");
|
||||
const { test } = require("node:test");
|
||||
const Module = require("node:module");
|
||||
|
||||
const originalLoad = Module._load;
|
||||
Module._load = function load(request, parent, isMain) {
|
||||
if (request === "vscode") {
|
||||
return {
|
||||
Diagnostic: class Diagnostic {
|
||||
constructor(range, message, severity) {
|
||||
this.range = range;
|
||||
this.message = message;
|
||||
this.severity = severity;
|
||||
}
|
||||
},
|
||||
DiagnosticSeverity: { Error: 0, Warning: 1 },
|
||||
Range: class Range {
|
||||
constructor(start, end) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
return originalLoad.call(this, request, parent, isMain);
|
||||
};
|
||||
const {
|
||||
findTopLevelDeclaration,
|
||||
maskLeadingTrivia,
|
||||
validateBalancedCharacters,
|
||||
} = require("../src/diagnostics");
|
||||
Module._load = originalLoad;
|
||||
|
||||
function mockDocument(source) {
|
||||
return {
|
||||
positionAt(offset) {
|
||||
return offset;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
test("recognizes a WRN declaration after leading line comments", () => {
|
||||
const source = `// Component summary
|
||||
// More details
|
||||
|
||||
component ThemeToggle {
|
||||
view { <button>Toggle</button> }
|
||||
}`;
|
||||
|
||||
const declaration = findTopLevelDeclaration({}, source);
|
||||
|
||||
assert.equal(declaration.kind, "component");
|
||||
assert.equal(declaration.name, "ThemeToggle");
|
||||
assert.equal(declaration.diagnostic, undefined);
|
||||
});
|
||||
|
||||
test("masks only leading trivia and preserves source offsets", () => {
|
||||
const source = "\uFEFF// Summary\r\npage Home {\n // member comment\n}";
|
||||
const masked = maskLeadingTrivia(source);
|
||||
|
||||
assert.equal(masked.length, source.length);
|
||||
assert.equal(masked.indexOf("page Home"), source.indexOf("page Home"));
|
||||
assert.match(masked, /\/\/ member comment/);
|
||||
});
|
||||
|
||||
test("ignores apostrophes and brackets in line comments when checking balance", () => {
|
||||
const source = `// The framework's theme runtime binds the click }
|
||||
component ThemeToggle {
|
||||
props {
|
||||
label = "Toggle theme"
|
||||
class = ""
|
||||
}
|
||||
view { <button class="{class}" data-wire-theme-toggle><slot>{label}</slot></button> }
|
||||
}`;
|
||||
|
||||
const diagnostics = validateBalancedCharacters(mockDocument(source), source);
|
||||
|
||||
assert.deepEqual(diagnostics, []);
|
||||
});
|
||||
Reference in New Issue
Block a user