Handles all the line breaks in calculation of line-character position

lineFeed = 0x0A,              // \n
        carriageReturn = 0x0D,        // \r
        lineSeparator = 0x2028,
        paragraphSeparator = 0x2029,
        nextLine = 0x0085,

Fixes #131
This commit is contained in:
Sheetal Nandi 2014-08-29 17:20:05 -07:00
parent 655039c9c7
commit c2b78ead05
8 changed files with 412 additions and 17 deletions

View file

@ -127,18 +127,10 @@ module ts {
function writeLiteral(s: string) {
if (s && s.length) {
write(s);
var pos = 0;
while (pos < s.length) {
switch (s.charCodeAt(pos++)) {
case CharacterCodes.carriageReturn:
if (pos < s.length && s.charCodeAt(pos) === CharacterCodes.lineFeed) {
pos++;
}
case CharacterCodes.lineFeed:
lineCount++;
linePos = output.length - s.length + pos;
break;
}
var lineStartsOfS = getLineStarts(s);
if (lineStartsOfS.length > 1) {
lineCount = lineCount + lineStartsOfS.length - 1;
linePos = linePos = output.length - s.length + lineStartsOfS[lineStartsOfS.length - 1];
}
}
}

View file

@ -249,7 +249,8 @@ module ts {
var pos = 0;
var lineStart = 0;
while (pos < text.length) {
switch (text.charCodeAt(pos++)) {
var ch = text.charCodeAt(pos++);
switch (ch) {
case CharacterCodes.carriageReturn:
if (text.charCodeAt(pos) === CharacterCodes.lineFeed) {
pos++;
@ -258,6 +259,12 @@ module ts {
result.push(lineStart);
lineStart = pos;
break;
default:
if (ch > CharacterCodes.maxAsciiCharacter && isLineBreak(ch)) {
result.push(lineStart);
lineStart = pos;
}
break;
}
}
result.push(lineStart);
@ -298,7 +305,7 @@ module ts {
}
export function isLineBreak(ch: number): boolean {
return ch === CharacterCodes.lineFeed || ch === CharacterCodes.carriageReturn || ch === CharacterCodes.lineSeparator || ch === CharacterCodes.paragraphSeparator;
return ch === CharacterCodes.lineFeed || ch === CharacterCodes.carriageReturn || ch === CharacterCodes.lineSeparator || ch === CharacterCodes.paragraphSeparator || ch === CharacterCodes.nextLine;
}
function isDigit(ch: number): boolean {

View file

@ -1007,9 +1007,6 @@ module ts {
carriageReturn = 0x0D, // \r
lineSeparator = 0x2028,
paragraphSeparator = 0x2029,
// REVIEW: do we need to support this? The scanner doesn't, but our IText does. This seems
// like an odd disparity? (Or maybe it's completely fine for them to be different).
nextLine = 0x0085,
// Unicode 3.0 space characters

View file

@ -0,0 +1,32 @@
//// [sourceMap-LineBreaks.ts]
var endsWithlineSeparator = 10; var endsWithParagraphSeparator = 10; var endsWithNextLine = 1;…var endsWithLineFeed = 1;
var endsWithCarriageReturnLineFeed = 1;
var endsWithCarriageReturn = 1; var endsWithLineFeedCarriageReturn = 1;
var endsWithLineFeedCarriageReturnLineFeed = 1;
var stringLiteralWithLineFeed = "line 1\
line 2";
var stringLiteralWithCarriageReturnLineFeed = "line 1\
line 2";
var stringLiteralWithCarriageReturn = "line 1\ line 2";
var stringLiteralWithLineSeparator = "line 1\line 2";var stringLiteralWithParagraphSeparator = "line 1\line 2";var stringLiteralWithNextLine = "line 1\…line 2";
//// [sourceMap-LineBreaks.js]
var endsWithlineSeparator = 10;
var endsWithParagraphSeparator = 10;
var endsWithNextLine = 1;
var endsWithLineFeed = 1;
var endsWithCarriageReturnLineFeed = 1;
var endsWithCarriageReturn = 1;
var endsWithLineFeedCarriageReturn = 1;
var endsWithLineFeedCarriageReturnLineFeed = 1;
var stringLiteralWithLineFeed = "line 1\
line 2";
var stringLiteralWithCarriageReturnLineFeed = "line 1\
line 2";
var stringLiteralWithCarriageReturn = "line 1\ line 2";
var stringLiteralWithLineSeparator = "line 1\line 2";
var stringLiteralWithParagraphSeparator = "line 1\line 2";
var stringLiteralWithNextLine = "line 1\…line 2";
//# sourceMappingURL=sourceMap-LineBreaks.js.map

View file

@ -0,0 +1,2 @@
//// [sourceMap-LineBreaks.js.map]
{"version":3,"file":"sourceMap-LineBreaks.js","sourceRoot":"","sources":["sourceMap-LineBreaks.ts"],"names":[],"mappings":"AAAA,IAAI,qBAAqB,GAAG,EAAE,CAAC;AAC/B,IAAI,0BAA0B,GAAG,EAAE,CAAC;AACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,IAAI,8BAA8B,GAAG,CAAC,CAAC;AACvC,IAAI,sBAAsB,GAAG,CAAC,CAAC;AAC/B,IAAI,8BAA8B,GAAG,CAAC,CAAC;AAEvC,IAAI,sCAAsC,GAAG,CAAC,CAAC;AAE/C,IAAI,yBAAyB,GAAG;OACzB,CAAC;AACR,IAAI,uCAAuC,GAAG;OACvC,CAAC;AACR,IAAI,+BAA+B,GAAG;OAC/B,CAAC;AAER,IAAI,8BAA8B,GAAG;OAC9B,CAAC;AACR,IAAI,mCAAmC,GAAG;OACnC,CAAC;AACR,IAAI,yBAAyB,GAAG;OACzB,CAAC"}

View file

@ -0,0 +1,321 @@
===================================================================
JsFile: sourceMap-LineBreaks.js
mapUrl: sourceMap-LineBreaks.js.map
sourceRoot:
sources: sourceMap-LineBreaks.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/sourceMap-LineBreaks.js
sourceFile:sourceMap-LineBreaks.ts
-------------------------------------------------------------------
>>>var endsWithlineSeparator = 10;
1 >
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^^
6 > ^
7 > ^^^^^^->
1 >
2 >var
3 > endsWithlineSeparator
4 > =
5 > 10
6 > ;
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
2 >Emitted(1, 5) Source(1, 5) + SourceIndex(0)
3 >Emitted(1, 26) Source(1, 26) + SourceIndex(0)
4 >Emitted(1, 29) Source(1, 29) + SourceIndex(0)
5 >Emitted(1, 31) Source(1, 31) + SourceIndex(0)
6 >Emitted(1, 32) Source(1, 32) + SourceIndex(0)
---
>>>var endsWithParagraphSeparator = 10;
1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^^
6 > ^
1-> >
2 >var
3 > endsWithParagraphSeparator
4 > =
5 > 10
6 > ;
1->Emitted(2, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(2, 5) Source(2, 5) + SourceIndex(0)
3 >Emitted(2, 31) Source(2, 31) + SourceIndex(0)
4 >Emitted(2, 34) Source(2, 34) + SourceIndex(0)
5 >Emitted(2, 36) Source(2, 36) + SourceIndex(0)
6 >Emitted(2, 37) Source(2, 37) + SourceIndex(0)
---
>>>var endsWithNextLine = 1;
1 >
2 >^^^^
3 > ^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^
6 > ^
7 > ^->
1 > >
2 >var
3 > endsWithNextLine
4 > =
5 > 1
6 > ;
1 >Emitted(3, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(3, 5) Source(3, 5) + SourceIndex(0)
3 >Emitted(3, 21) Source(3, 21) + SourceIndex(0)
4 >Emitted(3, 24) Source(3, 24) + SourceIndex(0)
5 >Emitted(3, 25) Source(3, 25) + SourceIndex(0)
6 >Emitted(3, 26) Source(3, 26) + SourceIndex(0)
---
>>>var endsWithLineFeed = 1;
1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^^^^^^^^^^->
1->… >
2 >var
3 > endsWithLineFeed
4 > =
5 > 1
6 > ;
1->Emitted(4, 1) Source(4, 1) + SourceIndex(0)
2 >Emitted(4, 5) Source(4, 5) + SourceIndex(0)
3 >Emitted(4, 21) Source(4, 21) + SourceIndex(0)
4 >Emitted(4, 24) Source(4, 24) + SourceIndex(0)
5 >Emitted(4, 25) Source(4, 25) + SourceIndex(0)
6 >Emitted(4, 26) Source(4, 26) + SourceIndex(0)
---
>>>var endsWithCarriageReturnLineFeed = 1;
1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^
6 > ^
1->
>
2 >var
3 > endsWithCarriageReturnLineFeed
4 > =
5 > 1
6 > ;
1->Emitted(5, 1) Source(5, 1) + SourceIndex(0)
2 >Emitted(5, 5) Source(5, 5) + SourceIndex(0)
3 >Emitted(5, 35) Source(5, 35) + SourceIndex(0)
4 >Emitted(5, 38) Source(5, 38) + SourceIndex(0)
5 >Emitted(5, 39) Source(5, 39) + SourceIndex(0)
6 >Emitted(5, 40) Source(5, 40) + SourceIndex(0)
---
>>>var endsWithCarriageReturn = 1;
1 >
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^^^^->
1 >
>
2 >var
3 > endsWithCarriageReturn
4 > =
5 > 1
6 > ;
1 >Emitted(6, 1) Source(6, 1) + SourceIndex(0)
2 >Emitted(6, 5) Source(6, 5) + SourceIndex(0)
3 >Emitted(6, 27) Source(6, 27) + SourceIndex(0)
4 >Emitted(6, 30) Source(6, 30) + SourceIndex(0)
5 >Emitted(6, 31) Source(6, 31) + SourceIndex(0)
6 >Emitted(6, 32) Source(6, 32) + SourceIndex(0)
---
>>>var endsWithLineFeedCarriageReturn = 1;
1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^^^^->
1-> >
2 >var
3 > endsWithLineFeedCarriageReturn
4 > =
5 > 1
6 > ;
1->Emitted(7, 1) Source(7, 1) + SourceIndex(0)
2 >Emitted(7, 5) Source(7, 5) + SourceIndex(0)
3 >Emitted(7, 35) Source(7, 35) + SourceIndex(0)
4 >Emitted(7, 38) Source(7, 38) + SourceIndex(0)
5 >Emitted(7, 39) Source(7, 39) + SourceIndex(0)
6 >Emitted(7, 40) Source(7, 40) + SourceIndex(0)
---
>>>var endsWithLineFeedCarriageReturnLineFeed = 1;
1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
5 > ^
6 > ^
1->
> >
2 >var
3 > endsWithLineFeedCarriageReturnLineFeed
4 > =
5 > 1
6 > ;
1->Emitted(8, 1) Source(9, 1) + SourceIndex(0)
2 >Emitted(8, 5) Source(9, 5) + SourceIndex(0)
3 >Emitted(8, 43) Source(9, 43) + SourceIndex(0)
4 >Emitted(8, 46) Source(9, 46) + SourceIndex(0)
5 >Emitted(8, 47) Source(9, 47) + SourceIndex(0)
6 >Emitted(8, 48) Source(9, 48) + SourceIndex(0)
---
>>>var stringLiteralWithLineFeed = "line 1\
1 >
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
1 >
>
>
2 >var
3 > stringLiteralWithLineFeed
4 > =
1 >Emitted(9, 1) Source(11, 1) + SourceIndex(0)
2 >Emitted(9, 5) Source(11, 5) + SourceIndex(0)
3 >Emitted(9, 30) Source(11, 30) + SourceIndex(0)
4 >Emitted(9, 33) Source(11, 33) + SourceIndex(0)
---
>>>line 2";
1 >^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >"line 1\
>line 2"
2 > ;
1 >Emitted(10, 8) Source(12, 8) + SourceIndex(0)
2 >Emitted(10, 9) Source(12, 9) + SourceIndex(0)
---
>>>var stringLiteralWithCarriageReturnLineFeed = "line 1\
1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
1->
>
2 >var
3 > stringLiteralWithCarriageReturnLineFeed
4 > =
1->Emitted(11, 1) Source(13, 1) + SourceIndex(0)
2 >Emitted(11, 5) Source(13, 5) + SourceIndex(0)
3 >Emitted(11, 44) Source(13, 44) + SourceIndex(0)
4 >Emitted(11, 47) Source(13, 47) + SourceIndex(0)
---
>>>line 2";
1 >^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >"line 1\
>line 2"
2 > ;
1 >Emitted(12, 8) Source(14, 8) + SourceIndex(0)
2 >Emitted(12, 9) Source(14, 9) + SourceIndex(0)
---
>>>var stringLiteralWithCarriageReturn = "line 1\ 1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
1->
>
2 >var
3 > stringLiteralWithCarriageReturn
4 > =
1->Emitted(13, 1) Source(15, 1) + SourceIndex(0)
2 >Emitted(13, 5) Source(15, 5) + SourceIndex(0)
3 >Emitted(13, 36) Source(15, 36) + SourceIndex(0)
4 >Emitted(13, 39) Source(15, 39) + SourceIndex(0)
---
>>>line 2";
1 >^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >"line 1\ >line 2"
2 > ;
1 >Emitted(14, 8) Source(16, 8) + SourceIndex(0)
2 >Emitted(14, 9) Source(16, 9) + SourceIndex(0)
---
>>>var stringLiteralWithLineSeparator = "line 1\1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
1->
>
>
2 >var
3 > stringLiteralWithLineSeparator
4 > =
1->Emitted(15, 1) Source(18, 1) + SourceIndex(0)
2 >Emitted(15, 5) Source(18, 5) + SourceIndex(0)
3 >Emitted(15, 35) Source(18, 35) + SourceIndex(0)
4 >Emitted(15, 38) Source(18, 38) + SourceIndex(0)
---
>>>line 2";
1 >^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >"line 1\ >line 2"
2 > ;
1 >Emitted(16, 8) Source(19, 8) + SourceIndex(0)
2 >Emitted(16, 9) Source(19, 9) + SourceIndex(0)
---
>>>var stringLiteralWithParagraphSeparator = "line 1\1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
1-> >
2 >var
3 > stringLiteralWithParagraphSeparator
4 > =
1->Emitted(17, 1) Source(20, 1) + SourceIndex(0)
2 >Emitted(17, 5) Source(20, 5) + SourceIndex(0)
3 >Emitted(17, 40) Source(20, 40) + SourceIndex(0)
4 >Emitted(17, 43) Source(20, 43) + SourceIndex(0)
---
>>>line 2";
1 >^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >"line 1\ >line 2"
2 > ;
1 >Emitted(18, 8) Source(21, 8) + SourceIndex(0)
2 >Emitted(18, 9) Source(21, 9) + SourceIndex(0)
---
>>>var stringLiteralWithNextLine = "line 1\…1->
2 >^^^^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^
1-> >
2 >var
3 > stringLiteralWithNextLine
4 > =
1->Emitted(19, 1) Source(22, 1) + SourceIndex(0)
2 >Emitted(19, 5) Source(22, 5) + SourceIndex(0)
3 >Emitted(19, 30) Source(22, 30) + SourceIndex(0)
4 >Emitted(19, 33) Source(22, 33) + SourceIndex(0)
---
>>>line 2";
1 >^^^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >"line 1\… >line 2"
2 > ;
1 >Emitted(20, 8) Source(23, 8) + SourceIndex(0)
2 >Emitted(20, 9) Source(23, 9) + SourceIndex(0)
---
>>>//# sourceMappingURL=sourceMap-LineBreaks.js.map

View file

@ -0,0 +1,30 @@
=== tests/cases/compiler/sourceMap-LineBreaks.ts ===
var endsWithlineSeparator = 10; var endsWithParagraphSeparator = 10; var endsWithNextLine = 1;…var endsWithLineFeed = 1;
>endsWithlineSeparator : number
var endsWithCarriageReturnLineFeed = 1;
>endsWithParagraphSeparator : number
var endsWithCarriageReturn = 1; var endsWithLineFeedCarriageReturn = 1;
>endsWithNextLine : number
var endsWithLineFeedCarriageReturnLineFeed = 1;
>endsWithLineFeed : number
>endsWithCarriageReturnLineFeed : number
var stringLiteralWithLineFeed = "line 1\
>endsWithCarriageReturn : number
line 2";
>endsWithLineFeedCarriageReturn : number
var stringLiteralWithCarriageReturnLineFeed = "line 1\
line 2";
>endsWithLineFeedCarriageReturnLineFeed : number
var stringLiteralWithCarriageReturn = "line 1\ line 2";
>stringLiteralWithLineFeed : string
var stringLiteralWithLineSeparator = "line 1\line 2";var stringLiteralWithParagraphSeparator = "line 1\line 2";var stringLiteralWithNextLine = "line 1\…line 2";

View file

@ -0,0 +1,14 @@
// @target: ES3
// @sourcemap: true
var endsWithlineSeparator = 10; var endsWithParagraphSeparator = 10; var endsWithNextLine = 1;…var endsWithLineFeed = 1;
var endsWithCarriageReturnLineFeed = 1;
var endsWithCarriageReturn = 1; var endsWithLineFeedCarriageReturn = 1;
var endsWithLineFeedCarriageReturnLineFeed = 1;
var stringLiteralWithLineFeed = "line 1\
line 2";
var stringLiteralWithCarriageReturnLineFeed = "line 1\
line 2";
var stringLiteralWithCarriageReturn = "line 1\ line 2";
var stringLiteralWithLineSeparator = "line 1\line 2";var stringLiteralWithParagraphSeparator = "line 1\line 2";var stringLiteralWithNextLine = "line 1\…line 2";