diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index fc3f845dc4..56a2d3b61e 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -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]; } } } diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index f932e8771b..614c190d42 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -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 { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index feccd3a298..30952ec4f3 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -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 diff --git a/tests/baselines/reference/sourceMap-LineBreaks.js b/tests/baselines/reference/sourceMap-LineBreaks.js new file mode 100644 index 0000000000..2ed7da8cf3 --- /dev/null +++ b/tests/baselines/reference/sourceMap-LineBreaks.js @@ -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 \ No newline at end of file diff --git a/tests/baselines/reference/sourceMap-LineBreaks.js.map b/tests/baselines/reference/sourceMap-LineBreaks.js.map new file mode 100644 index 0000000000..59f3381d35 --- /dev/null +++ b/tests/baselines/reference/sourceMap-LineBreaks.js.map @@ -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"} \ No newline at end of file diff --git a/tests/baselines/reference/sourceMap-LineBreaks.sourcemap.txt b/tests/baselines/reference/sourceMap-LineBreaks.sourcemap.txt new file mode 100644 index 0000000000..5cda2ad1f8 --- /dev/null +++ b/tests/baselines/reference/sourceMap-LineBreaks.sourcemap.txt @@ -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 \ No newline at end of file diff --git a/tests/baselines/reference/sourceMap-LineBreaks.types b/tests/baselines/reference/sourceMap-LineBreaks.types new file mode 100644 index 0000000000..6e5456e8f9 --- /dev/null +++ b/tests/baselines/reference/sourceMap-LineBreaks.types @@ -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"; diff --git a/tests/cases/compiler/sourceMap-LineBreaks.ts b/tests/cases/compiler/sourceMap-LineBreaks.ts new file mode 100644 index 0000000000..0a765737a6 --- /dev/null +++ b/tests/cases/compiler/sourceMap-LineBreaks.ts @@ -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"; \ No newline at end of file