From 2ea51b02cc9a573a0a9f2b020e49118c2c00fb81 Mon Sep 17 00:00:00 2001 From: satyr Date: Wed, 7 Sep 2011 02:54:11 +0900 Subject: [PATCH] fixed #1102; lexer: cleaned up `unfinished` --- lib/coffee-script/lexer.js | 8 +++----- src/lexer.coffee | 13 ++----------- test/operators.coffee | 4 ++++ 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/lib/coffee-script/lexer.js b/lib/coffee-script/lexer.js index 62b2d3ca51..d4be86c8bb 100644 --- a/lib/coffee-script/lexer.js +++ b/lib/coffee-script/lexer.js @@ -1,5 +1,5 @@ (function() { - var ASSIGNED, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref; + var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref; var __hasProp = Object.prototype.hasOwnProperty, __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (__hasProp.call(this, i) && this[i] === item) return i; @@ -504,8 +504,8 @@ return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]); }; Lexer.prototype.unfinished = function() { - var prev, value; - return LINE_CONTINUER.test(this.chunk) || (prev = last(this.tokens, 1)) && prev[0] !== '.' && (value = this.value()) && !value.reserved && NO_NEWLINE.test(value) && !CODE.test(value) && !ASSIGNED.test(this.chunk); + var _ref2; + return LINE_CONTINUER.test(this.chunk) || ((_ref2 = this.tag()) === '\\' || _ref2 === '.' || _ref2 === '?.' || _ref2 === 'UNARY' || _ref2 === 'MATH' || _ref2 === '+' || _ref2 === '-' || _ref2 === 'SHIFT' || _ref2 === 'RELATION' || _ref2 === 'COMPARE' || _ref2 === 'LOGIC' || _ref2 === 'COMPOUND_ASSIGN' || _ref2 === 'THROW' || _ref2 === 'EXTENDS'); }; Lexer.prototype.escapeLines = function(str, heredoc) { return str.replace(MULTILINER, heredoc ? '\\n' : ''); @@ -565,10 +565,8 @@ MULTILINER = /\n/g; HEREDOC_INDENT = /\n+([^\n\S]*)/g; HEREDOC_ILLEGAL = /\*\//; - ASSIGNED = /^\s*@?([$A-Za-z_][$\w\x7f-\uffff]*|['"].*['"])[^\n\S]*?[:=][^:=>]/; LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; TRAILING_SPACES = /\s+$/; - NO_NEWLINE = /^(?:[-+*&|\/%=<>!.\\][<>=&|]*|and|or|is(?:nt)?|n(?:ot|ew)|delete|typeof|instanceof)$/; COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']; UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']; LOGIC = ['&&', '||', '&', '|', '^']; diff --git a/src/lexer.coffee b/src/lexer.coffee index 13a076ef5d..7a07912682 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -489,9 +489,8 @@ exports.Lexer = class Lexer # Are we in the midst of an unfinished expression? unfinished: -> LINE_CONTINUER.test(@chunk) or - (prev = last @tokens, 1) and prev[0] isnt '.' and - (value = @value()) and not value.reserved and - NO_NEWLINE.test(value) and not CODE.test(value) and not ASSIGNED.test(@chunk) + @tag() in ['\\', '.', '?.', 'UNARY', 'MATH', '+', '-', 'SHIFT', 'RELATION' + 'COMPARE', 'LOGIC', 'COMPOUND_ASSIGN', 'THROW', 'EXTENDS'] # Converts newlines for string literals. escapeLines: (str, heredoc) -> @@ -610,18 +609,10 @@ HEREDOC_INDENT = /\n+([^\n\S]*)/g HEREDOC_ILLEGAL = /\*\// -ASSIGNED = /^\s*@?([$A-Za-z_][$\w\x7f-\uffff]*|['"].*['"])[^\n\S]*?[:=][^:=>]/ - LINE_CONTINUER = /// ^ \s* (?: , | \??\.(?![.\d]) | :: ) /// TRAILING_SPACES = /\s+$/ -NO_NEWLINE = /// ^ (?: # non-capturing group - [-+*&|/%=<>!.\\][<>=&|]* | # symbol operators - and | or | is(?:nt)? | n(?:ot|ew) | # word operators - delete | typeof | instanceof -) $ /// - # Compound assignment tokens. COMPOUND_ASSIGN = [ '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=' diff --git a/test/operators.coffee b/test/operators.coffee index a32447cde4..21a8ce3937 100644 --- a/test/operators.coffee +++ b/test/operators.coffee @@ -243,3 +243,7 @@ test "#1234: Applying a splat to :: applies the splat to the wrong object", -> arr = [] eq nonce, C::method arr... # should be applied to `C::` + +test "#1102: String literal prevents line continuation", -> + eq "': '", '' + + "': '"