diff --git a/src/plugins/flow.js b/src/plugins/flow.js index bd0426b0b5..7c85da6255 100644 --- a/src/plugins/flow.js +++ b/src/plugins/flow.js @@ -732,18 +732,24 @@ export default function (instance) { instance.extend("parseConditional", function (inner) { return function (expr, noIn, startPos, startLoc, refNeedsArrowPos) { - const state = this.state.clone(); - try { - return inner.call(this, expr, noIn, startPos, startLoc); - } catch (err) { - if (refNeedsArrowPos && err instanceof SyntaxError) { - this.state = state; - refNeedsArrowPos.start = this.state.start; - return expr; - } else { - throw err; + // only do the expensive clone if there is a question mark + // and if we come from inside parens + if (refNeedsArrowPos && this.match(tt.question)) { + const state = this.state.clone(); + try { + return inner.call(this, expr, noIn, startPos, startLoc); + } catch (err) { + if (err instanceof SyntaxError) { + this.state = state; + refNeedsArrowPos.start = err.pos || this.state.start; + return expr; + } else { + throw err; + } } } + + return inner.call(this, expr, noIn, startPos, startLoc); }; }); diff --git a/test/fixtures/flow/optional-type/2/options.json b/test/fixtures/flow/optional-type/2/options.json index 9e093bfdcd..e247a786c1 100644 --- a/test/fixtures/flow/optional-type/2/options.json +++ b/test/fixtures/flow/optional-type/2/options.json @@ -1,3 +1,3 @@ { - "throws": "Unexpected token (1:12)" + "throws": "Unexpected token (1:13)" }