mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Ensure errors in ACE NRJavaScript mode are on valid lines
In the case of an "Unmatched {" error, it flags the { on the line we wrap the user's code in. That doesn't help the user. This fix moves such an error to the first valid { in the file. It handles ignoring { in comments or strings. It fails to ignore { inside regex. But that's an edge case on top of an edge case.
This commit is contained in:
parent
b8b0247717
commit
81dc3de26a
File diff suppressed because one or more lines are too long
@ -128,6 +128,8 @@ oop.inherits(NRJavaScriptWorker, Mirror);
|
|||||||
if (!value)
|
if (!value)
|
||||||
return this.sender.emit("annotate", []);
|
return this.sender.emit("annotate", []);
|
||||||
|
|
||||||
|
var originalValue = value;
|
||||||
|
|
||||||
// [Node-RED] wrap the code in a function
|
// [Node-RED] wrap the code in a function
|
||||||
value = "async function __nodered__(msg) {\n"+value+"\n}";
|
value = "async function __nodered__(msg) {\n"+value+"\n}";
|
||||||
|
|
||||||
@ -147,6 +149,7 @@ oop.inherits(NRJavaScriptWorker, Mirror);
|
|||||||
continue;
|
continue;
|
||||||
var raw = error.raw;
|
var raw = error.raw;
|
||||||
var type = "warning";
|
var type = "warning";
|
||||||
|
var line = error.line - 2;
|
||||||
|
|
||||||
if (raw == "Missing semicolon.") {
|
if (raw == "Missing semicolon.") {
|
||||||
var str = error.evidence.substr(error.character);
|
var str = error.evidence.substr(error.character);
|
||||||
@ -175,9 +178,62 @@ oop.inherits(NRJavaScriptWorker, Mirror);
|
|||||||
type = "info";
|
type = "info";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (raw === "Unmatched '{a}'." && line === -1) {
|
||||||
|
// This is an unmatched { error. It has incorrectly matched it
|
||||||
|
// against the { in the added line. Need to find the next valid {
|
||||||
|
// This code scans through the original code looking for the first '{'
|
||||||
|
// that is not in a comment or string.
|
||||||
|
// It will incorrectly find a '{' if it is inside a regex... but
|
||||||
|
// at least the error will be shown somwhere. There are only
|
||||||
|
// so many hours in the day to fix every tiny edge case of an
|
||||||
|
// edge case.
|
||||||
|
var inSingleComment = false;
|
||||||
|
var inMultiComment = false;
|
||||||
|
var inString = false;
|
||||||
|
var stringQ;
|
||||||
|
var lineNumber = 0;
|
||||||
|
for (var pos = 0;pos<originalValue.length;pos++) {
|
||||||
|
var c = originalValue[pos];
|
||||||
|
if (c === "\\") {
|
||||||
|
pos++;
|
||||||
|
} else if (inSingleComment) {
|
||||||
|
if (c === "\n") {
|
||||||
|
lineNumber++;
|
||||||
|
inSingleComment = false;
|
||||||
|
}
|
||||||
|
} else if (inMultiComment) {
|
||||||
|
if (c === "*" && originalValue[pos+1] === "/") {
|
||||||
|
pos++;
|
||||||
|
inMultiComment = false;
|
||||||
|
} else if (c === "\n") {
|
||||||
|
lineNumber++;
|
||||||
|
}
|
||||||
|
} else if (inString) {
|
||||||
|
if (c === stringQ) {
|
||||||
|
inString = false;
|
||||||
|
}
|
||||||
|
} else if (c === "'" || c === "\"") {
|
||||||
|
inString = true;
|
||||||
|
stringQ = c;
|
||||||
|
} else if (c === "/") {
|
||||||
|
if (originalValue[pos+1] === "/") {
|
||||||
|
inSingleComment = true;
|
||||||
|
} else if (originalValue[pos+1] === "*") {
|
||||||
|
inMultiComment = true;
|
||||||
|
}
|
||||||
|
} else if (c === "\n") {
|
||||||
|
lineNumber++;
|
||||||
|
} else if (c === "{") {
|
||||||
|
// found it!
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line = lineNumber;
|
||||||
|
}
|
||||||
|
|
||||||
errors.push({
|
errors.push({
|
||||||
// [Node-RED] offset the row for the added line
|
// [Node-RED] offset the row for the added line
|
||||||
row: error.line-2,
|
row: Math.max(0,line),
|
||||||
column: error.character-1,
|
column: error.character-1,
|
||||||
text: error.reason,
|
text: error.reason,
|
||||||
type: type,
|
type: type,
|
||||||
|
Loading…
Reference in New Issue
Block a user