1
0
Fork 0
mirror of https://github.com/jashkenas/coffeescript.git synced 2022-11-09 12:23:24 -05:00

Merge pull request #3539 from minodisk/fix-heregex-interpolation

Fix wrong location issue in heregex interpolation
This commit is contained in:
Michael Ficarra 2014-07-13 21:10:03 -07:00
commit 3ec10df4a1
3 changed files with 171 additions and 6 deletions

View file

@ -290,7 +290,8 @@
this.token('CALL_START', '(', 0, 0); this.token('CALL_START', '(', 0, 0);
tokens = []; tokens = [];
_ref2 = this.interpolateString(body, { _ref2 = this.interpolateString(body, {
regex: true regex: true,
strOffset: 3
}); });
for (_i = 0, _len = _ref2.length; _i < _len; _i++) { for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
token = _ref2[_i]; token = _ref2[_i];

View file

@ -263,7 +263,7 @@ exports.Lexer = class Lexer
@token 'IDENTIFIER', 'RegExp', 0, 0 @token 'IDENTIFIER', 'RegExp', 0, 0
@token 'CALL_START', '(', 0, 0 @token 'CALL_START', '(', 0, 0
tokens = [] tokens = []
for token in @interpolateString(body, regex: yes) for token in @interpolateString(body, regex: yes, strOffset: 3)
[tag, value] = token [tag, value] = token
if tag is 'TOKENS' if tag is 'TOKENS'
tokens.push value... tokens.push value...

View file

@ -128,10 +128,6 @@ test 'Verify locations in string interpolation (in "string", multiple interpolat
eq tokens.length, 10 eq tokens.length, 10
[{}, {}, {}, a, {}, b, {}, c] = tokens [{}, {}, {}, a, {}, b, {}, c] = tokens
console.log a
console.log b
console.log c
eq a[2].first_line, 1 eq a[2].first_line, 1
eq a[2].first_column, 2 eq a[2].first_column, 2
eq a[2].last_line, 1 eq a[2].last_line, 1
@ -315,6 +311,174 @@ test 'Verify locations in string interpolation (in """string""", multiple interp
eq c[2].last_line, 9 eq c[2].last_line, 9
eq c[2].last_column, 2 eq c[2].last_column, 2
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->
tokens = CoffeeScript.tokens '///#{a}b#{c}///'
eq tokens.length, 11
[{}, {}, {}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 0
eq a[2].first_column, 5
eq a[2].last_line, 0
eq a[2].last_column, 5
eq b[2].first_line, 0
eq b[2].first_column, 7
eq b[2].last_line, 0
eq b[2].last_column, 7
eq c[2].first_line, 0
eq c[2].first_column, 10
eq c[2].last_line, 0
eq c[2].last_column, 10
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->
tokens = CoffeeScript.tokens '///a#{b}c///'
eq tokens.length, 9
[{}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 0
eq a[2].first_column, 3
eq a[2].last_line, 0
eq a[2].last_column, 3
eq b[2].first_line, 0
eq b[2].first_column, 6
eq b[2].last_line, 0
eq b[2].last_column, 6
eq c[2].first_line, 0
eq c[2].first_column, 8
eq c[2].last_line, 0
eq c[2].last_column, 8
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->
tokens = CoffeeScript.tokens '///#{a}\nb\n#{c}///'
eq tokens.length, 11
[{}, {}, {}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 0
eq a[2].first_column, 5
eq a[2].last_line, 0
eq a[2].last_column, 5
eq b[2].first_line, 0
eq b[2].first_column, 7
eq b[2].last_line, 1
eq b[2].last_column, 1
eq c[2].first_line, 2
eq c[2].first_column, 2
eq c[2].last_line, 2
eq c[2].last_column, 2
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->
tokens = CoffeeScript.tokens '///#{a}\n\n\nb\n\n\n#{c}///'
eq tokens.length, 11
[{}, {}, {}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 0
eq a[2].first_column, 5
eq a[2].last_line, 0
eq a[2].last_column, 5
eq b[2].first_line, 0
eq b[2].first_column, 7
eq b[2].last_line, 5
eq b[2].last_column, 0
eq c[2].first_line, 6
eq c[2].first_column, 2
eq c[2].last_line, 6
eq c[2].last_column, 2
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->
tokens = CoffeeScript.tokens '///a\n\n\n#{b}\n\n\nc///'
eq tokens.length, 9
[{}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 0
eq a[2].first_column, 3
eq a[2].last_line, 2
eq a[2].last_column, 0
eq b[2].first_line, 3
eq b[2].first_column, 2
eq b[2].last_line, 3
eq b[2].last_column, 2
eq c[2].first_line, 3
eq c[2].first_column, 4
eq c[2].last_line, 6
eq c[2].last_column, 0
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and stating with linebreak)', ->
tokens = CoffeeScript.tokens '///\n#{a}\nb\n#{c}///'
eq tokens.length, 11
[{}, {}, {}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 1
eq a[2].first_column, 2
eq a[2].last_line, 1
eq a[2].last_column, 2
eq b[2].first_line, 1
eq b[2].first_column, 4
eq b[2].last_line, 2
eq b[2].last_column, 1
eq c[2].first_line, 3
eq c[2].first_column, 2
eq c[2].last_line, 3
eq c[2].last_column, 2
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and stating with linebreak)', ->
tokens = CoffeeScript.tokens '///\n\n\n#{a}\n\n\nb\n\n\n#{c}///'
eq tokens.length, 11
[{}, {}, {}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 3
eq a[2].first_column, 2
eq a[2].last_line, 3
eq a[2].last_column, 2
eq b[2].first_line, 3
eq b[2].first_column, 4
eq b[2].last_line, 8
eq b[2].last_column, 0
eq c[2].first_line, 9
eq c[2].first_column, 2
eq c[2].last_line, 9
eq c[2].last_column, 2
test 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and stating with linebreak)', ->
tokens = CoffeeScript.tokens '///\n\n\na\n\n\n#{b}\n\n\nc///'
eq tokens.length, 9
[{}, {}, a, {}, b, {}, c] = tokens
eq a[2].first_line, 0
eq a[2].first_column, 3
eq a[2].last_line, 5
eq a[2].last_column, 0
eq b[2].first_line, 6
eq b[2].first_column, 2
eq b[2].last_line, 6
eq b[2].last_column, 2
eq c[2].first_line, 6
eq c[2].first_column, 4
eq c[2].last_line, 9
eq c[2].last_column, 0
test "Verify all tokens get a location", -> test "Verify all tokens get a location", ->
doesNotThrow -> doesNotThrow ->
tokens = CoffeeScript.tokens testScript tokens = CoffeeScript.tokens testScript