diff --git a/lib/parser.js b/lib/parser.js index dc3eb54b..4145d7a3 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -19777,7 +19777,7 @@ module.exports = (function() { }; if (!options.raw) r = p = rp = id; - eval('\n // XXX: The functions below override the default code generated by PEGjs.\n // CoffeeScriptRedux has a preprocessor that adds control characters to\n // mark indents/outdents/etc for PEGjs. These characters cause the line,\n // column, and offset values to differ from the original input source code,\n // so this section exists to properly hide those control characters when\n // reporting location information. See #117 & #335.\n\n var csr$controlCharacterCount = 0;\n\n function offset() {\n return peg$reportedPos - csr$controlCharacterCount;\n }\n\n function peg$computePosDetails() {\n function advanceCachedReportedPos() {\n var ch;\n\n for (; peg$cachedPos < peg$reportedPos; peg$cachedPos++) {\n ch = input.charAt(peg$cachedPos);\n if (ch === "\\n") {\n if (!peg$cachedPosDetails.seenCR) { peg$cachedPosDetails.line++; }\n peg$cachedPosDetails.column = 1;\n peg$cachedPosDetails.seenCR = false;\n } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {\n peg$cachedPosDetails.line++;\n peg$cachedPosDetails.column = 1;\n peg$cachedPosDetails.seenCR = true;\n } else if(!/[\\uEFEF\\uEFFE\\uEFFF]/.test(ch)) {\n peg$cachedPosDetails.column++;\n peg$cachedPosDetails.seenCR = false;\n } else {\n csr$controlCharacterCount++;\n }\n }\n }\n\n if (peg$cachedPos !== peg$reportedPos) {\n if (peg$cachedPos > peg$reportedPos) {\n csr$controlCharacterCount = 0;\n peg$cachedPos = 0;\n peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };\n }\n advanceCachedReportedPos();\n }\n\n return peg$cachedPosDetails;\n }\n '); + eval('\n // XXX: The functions below override the default code generated by PEGjs.\n // CoffeeScriptRedux has a preprocessor that adds control characters to\n // mark indents/outdents/etc for PEGjs. These characters cause the line,\n // column, and offset values to differ from the original input source code,\n // so this section exists to properly hide those control characters when\n // reporting location information. See #117 & #335.\n\n var csr$controlCharacterCount = 0;\n\n function offset() {\n return peg$reportedPos - csr$controlCharacterCount;\n }\n\n function peg$computePosDetails(pos) {\n function advance(details, startPos, endPos) {\n var p, ch;\n\n for (p = startPos; p < endPos; p++) {\n ch = input.charAt(p);\n if (ch === "\\n") {\n if (!details.seenCR) { details.line++; }\n details.column = 1;\n details.seenCR = false;\n } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {\n details.line++;\n details.column = 1;\n details.seenCR = true;\n } else if(!/[\\uEFEF\\uEFFE\\uEFFF]/.test(ch)) {\n details.column++;\n details.seenCR = false;\n } else {\n csr$controlCharacterCount++;\n }\n }\n }\n\n if (peg$cachedPos !== pos) {\n if (peg$cachedPos > pos) {\n csr$controlCharacterCount = 0;\n peg$cachedPos = 0;\n peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };\n }\n advance(peg$cachedPosDetails, peg$cachedPos, pos);\n peg$cachedPos = pos;\n }\n\n return peg$cachedPosDetails;\n }\n '); function isOwn$(o, p) { return {}.hasOwnProperty.call(o, p); } diff --git a/src/grammar.pegcoffee b/src/grammar.pegcoffee index 862d9037..884d566a 100644 --- a/src/grammar.pegcoffee +++ b/src/grammar.pegcoffee @@ -272,36 +272,37 @@ return peg$reportedPos - csr$controlCharacterCount; } - function peg$computePosDetails() { - function advanceCachedReportedPos() { - var ch; + function peg$computePosDetails(pos) { + function advance(details, startPos, endPos) { + var p, ch; - for (; peg$cachedPos < peg$reportedPos; peg$cachedPos++) { - ch = input.charAt(peg$cachedPos); + for (p = startPos; p < endPos; p++) { + ch = input.charAt(p); if (ch === "\n") { - if (!peg$cachedPosDetails.seenCR) { peg$cachedPosDetails.line++; } - peg$cachedPosDetails.column = 1; - peg$cachedPosDetails.seenCR = false; + if (!details.seenCR) { details.line++; } + details.column = 1; + details.seenCR = false; } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { - peg$cachedPosDetails.line++; - peg$cachedPosDetails.column = 1; - peg$cachedPosDetails.seenCR = true; + details.line++; + details.column = 1; + details.seenCR = true; } else if(!/[\uEFEF\uEFFE\uEFFF]/.test(ch)) { - peg$cachedPosDetails.column++; - peg$cachedPosDetails.seenCR = false; + details.column++; + details.seenCR = false; } else { csr$controlCharacterCount++; } } } - if (peg$cachedPos !== peg$reportedPos) { - if (peg$cachedPos > peg$reportedPos) { + if (peg$cachedPos !== pos) { + if (peg$cachedPos > pos) { csr$controlCharacterCount = 0; peg$cachedPos = 0; peg$cachedPosDetails = { line: 1, column: 1, seenCR: false }; } - advanceCachedReportedPos(); + advance(peg$cachedPosDetails, peg$cachedPos, pos); + peg$cachedPos = pos; } return peg$cachedPosDetails;