mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00: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:
		
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -128,6 +128,8 @@ oop.inherits(NRJavaScriptWorker, Mirror);
 | 
			
		||||
        if (!value)
 | 
			
		||||
            return this.sender.emit("annotate", []);
 | 
			
		||||
 | 
			
		||||
        var originalValue = value;
 | 
			
		||||
 | 
			
		||||
        // [Node-RED] wrap the code in a function
 | 
			
		||||
        value = "async function __nodered__(msg) {\n"+value+"\n}";
 | 
			
		||||
 | 
			
		||||
@@ -147,6 +149,7 @@ oop.inherits(NRJavaScriptWorker, Mirror);
 | 
			
		||||
                continue;
 | 
			
		||||
            var raw = error.raw;
 | 
			
		||||
            var type = "warning";
 | 
			
		||||
            var line = error.line - 2;
 | 
			
		||||
 | 
			
		||||
            if (raw == "Missing semicolon.") {
 | 
			
		||||
                var str = error.evidence.substr(error.character);
 | 
			
		||||
@@ -175,9 +178,62 @@ oop.inherits(NRJavaScriptWorker, Mirror);
 | 
			
		||||
                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({
 | 
			
		||||
                // [Node-RED] offset the row for the added line
 | 
			
		||||
                row: error.line-2,
 | 
			
		||||
                row: Math.max(0,line),
 | 
			
		||||
                column: error.character-1,
 | 
			
		||||
                text: error.reason,
 | 
			
		||||
                type: type,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user