From 7581a10497073d6355600928e41ddbddf4586e45 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 25 Feb 2015 16:45:45 -0800 Subject: [PATCH 1/7] Ensure that the cost for typechecking is not billed to the emit portion of the compiler. --- src/compiler/program.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index b74ef039fd6d7..a8e5b0b3a74b2 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -177,10 +177,15 @@ module ts { return { diagnostics: [], sourceMaps: undefined, emitSkipped: true }; } + // Create the emit resolver outside of the "emitTime" tracking code below. That way + // any cost associated with it (like type checking) are appropriate associated with + // the type-checking counter. + var emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile); + var start = new Date().getTime(); var emitResult = emitFiles( - getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile), + emitResolver, getEmitHost(writeFileCallback), sourceFile); From 4e99d5893c5c984d3904ea4b21aa4631d16a1bd8 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 25 Feb 2015 17:51:42 -0800 Subject: [PATCH 2/7] Added tests for testing escapes. --- ...CharactersThatArePartsOfEscapes01.errors.txt | 13 +++++++++++++ ...ngsPlainCharactersThatArePartsOfEscapes01.js | 17 +++++++++++++++++ ...lainCharactersThatArePartsOfEscapes01_ES6.js | 12 ++++++++++++ ...nCharactersThatArePartsOfEscapes01_ES6.types | 11 +++++++++++ ...ngsPlainCharactersThatArePartsOfEscapes02.js | 7 +++++++ ...PlainCharactersThatArePartsOfEscapes02.types | 5 +++++ ...lainCharactersThatArePartsOfEscapes02_ES6.js | 12 ++++++++++++ ...nCharactersThatArePartsOfEscapes02_ES6.types | 11 +++++++++++ .../templateStringControlCharacterEscapes01.js | 7 +++++++ ...emplateStringControlCharacterEscapes01.types | 6 ++++++ ...mplateStringControlCharacterEscapes01_ES6.js | 6 ++++++ ...ateStringControlCharacterEscapes01_ES6.types | 5 +++++ .../templateStringControlCharacterEscapes02.js | 7 +++++++ ...emplateStringControlCharacterEscapes02.types | 6 ++++++ ...mplateStringControlCharacterEscapes02_ES6.js | 6 ++++++ ...ateStringControlCharacterEscapes02_ES6.types | 5 +++++ .../templateStringControlCharacterEscapes03.js | 7 +++++++ ...emplateStringControlCharacterEscapes03.types | 6 ++++++ ...mplateStringControlCharacterEscapes03_ES6.js | 6 ++++++ ...ateStringControlCharacterEscapes03_ES6.types | 5 +++++ .../templateStringControlCharacterEscapes04.js | 7 +++++++ ...emplateStringControlCharacterEscapes04.types | 6 ++++++ ...mplateStringControlCharacterEscapes04_ES6.js | 6 ++++++ ...ateStringControlCharacterEscapes04_ES6.types | 5 +++++ ...ingPlainCharactersThatArePartsOfEscapes01.js | 6 ++++++ ...PlainCharactersThatArePartsOfEscapes01.types | 4 ++++ ...lainCharactersThatArePartsOfEscapes01_ES6.js | 6 ++++++ ...nCharactersThatArePartsOfEscapes01_ES6.types | 4 ++++ ...ingPlainCharactersThatArePartsOfEscapes02.js | 7 +++++++ ...PlainCharactersThatArePartsOfEscapes02.types | 5 +++++ ...lainCharactersThatArePartsOfEscapes02_ES6.js | 6 ++++++ ...nCharactersThatArePartsOfEscapes02_ES6.types | 4 ++++ ...ngsPlainCharactersThatArePartsOfEscapes01.ts | 7 +++++++ ...lainCharactersThatArePartsOfEscapes01_ES6.ts | 7 +++++++ ...ngsPlainCharactersThatArePartsOfEscapes02.ts | 3 +++ ...lainCharactersThatArePartsOfEscapes02_ES6.ts | 7 +++++++ .../templateStringControlCharacterEscapes01.ts | 3 +++ ...mplateStringControlCharacterEscapes01_ES6.ts | 3 +++ .../templateStringControlCharacterEscapes02.ts | 3 +++ ...mplateStringControlCharacterEscapes02_ES6.ts | 3 +++ .../templateStringControlCharacterEscapes03.ts | 3 +++ ...mplateStringControlCharacterEscapes03_ES6.ts | 3 +++ .../templateStringControlCharacterEscapes04.ts | 3 +++ ...mplateStringControlCharacterEscapes04_ES6.ts | 3 +++ ...ingPlainCharactersThatArePartsOfEscapes01.ts | 2 ++ ...lainCharactersThatArePartsOfEscapes01_ES6.ts | 3 +++ ...ingPlainCharactersThatArePartsOfEscapes02.ts | 3 +++ ...lainCharactersThatArePartsOfEscapes02_ES6.ts | 3 +++ 48 files changed, 285 insertions(+) create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.errors.txt create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.js create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.types create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.types create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.js create mode 100644 tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes01.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes01.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes02.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes02.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes03.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes03.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes04.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes04.types create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.js create mode 100644 tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.types create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.types create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.js create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.types create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.types create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.js create mode 100644 tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.types create mode 100644 tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts create mode 100644 tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.ts create mode 100644 tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02.ts create mode 100644 tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.ts diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.errors.txt b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.errors.txt new file mode 100644 index 0000000000000..93b22614b9568 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts(7,3): error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts (1 errors) ==== + + + function f(...x: any[]) { + + } + + f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. \ No newline at end of file diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js new file mode 100644 index 0000000000000..44eeeed4dfcbd --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js @@ -0,0 +1,17 @@ +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts] + + +function f(...x: any[]) { + +} + +f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` + +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js] +function f() { + var x = []; + for (var _i = 0; _i < arguments.length; _i++) { + x[_i - 0] = arguments[_i]; + } +} +f "0 1 2 3 4 5 6 7 8 \u0039 10 11 12 13 14 15 16 17 18 1\u0039 20 2028 202\u0039 0085 t v f b r n"; diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.js b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.js new file mode 100644 index 0000000000000..a3c6806b1d314 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.js @@ -0,0 +1,12 @@ +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.ts] + +function f(...x: any[]) { + +} + +f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` + +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.js] +function f(...x) { +} +f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n`; diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.types b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.types new file mode 100644 index 0000000000000..e1e63197c903b --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.types @@ -0,0 +1,11 @@ +=== tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.ts === + +function f(...x: any[]) { +>f : (...x: any[]) => void +>x : any[] + +} + +f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` +>f : (...x: any[]) => void + diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js new file mode 100644 index 0000000000000..6b087cc2df725 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js @@ -0,0 +1,7 @@ +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.ts] + + +`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` + +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js] +"0" + " " + "1" + " " + "2" + " " + "3" + " " + "4" + " " + "5" + " " + "6" + " " + "7" + " " + "8" + " " + "\u0039" + " " + "10" + " " + "11" + " " + "12" + " " + "13" + " " + "14" + " " + "15" + " " + "16" + " " + "17" + " " + "18" + " " + "1\u0039" + " " + "20" + " " + "2028" + " " + "202\u0039" + " " + "0085" + " " + "t" + " " + "v" + " " + "f" + " " + "b" + " " + "r" + " " + "n"; diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.types b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.types new file mode 100644 index 0000000000000..3ee1a72f8e24d --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.ts === + +No type information for this code. +No type information for this code.`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.js b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.js new file mode 100644 index 0000000000000..46eb5e90cd954 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.js @@ -0,0 +1,12 @@ +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.ts] + +function f(...x: any[]) { + +} + +f `0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` + +//// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.js] +function f(...x) { +} +f `0${" "}1${" "}2${" "}3${" "}4${" "}5${" "}6${" "}7${" "}8${" "}9${" "}10${" "}11${" "}12${" "}13${" "}14${" "}15${" "}16${" "}17${" "}18${" "}19${" "}20${" "}2028${" "}2029${" "}0085${" "}t${" "}v${" "}f${" "}b${" "}r${" "}n`; diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.types b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.types new file mode 100644 index 0000000000000..727aa7daeb0a9 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.types @@ -0,0 +1,11 @@ +=== tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.ts === + +function f(...x: any[]) { +>f : (...x: any[]) => void +>x : any[] + +} + +f `0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` +>f : (...x: any[]) => void + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes01.js b/tests/baselines/reference/templateStringControlCharacterEscapes01.js new file mode 100644 index 0000000000000..1b129e802e3c8 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes01.js @@ -0,0 +1,7 @@ +//// [templateStringControlCharacterEscapes01.ts] + + +var x = `\0\x00\u0000 0 00 0000`; + +//// [templateStringControlCharacterEscapes01.js] +var x = "\0\0\0 0 00 0000"; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes01.types b/tests/baselines/reference/templateStringControlCharacterEscapes01.types new file mode 100644 index 0000000000000..9a7a04c99a4ab --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes01.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01.ts === + + +var x = `\0\x00\u0000 0 00 0000`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.js b/tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.js new file mode 100644 index 0000000000000..9015655576c02 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.js @@ -0,0 +1,6 @@ +//// [templateStringControlCharacterEscapes01_ES6.ts] + +var x = `\0\x00\u0000 0 00 0000`; + +//// [templateStringControlCharacterEscapes01_ES6.js] +var x = `\0\x00\u0000 0 00 0000`; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.types b/tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.types new file mode 100644 index 0000000000000..5decfbc2924c9 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes01_ES6.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01_ES6.ts === + +var x = `\0\x00\u0000 0 00 0000`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes02.js b/tests/baselines/reference/templateStringControlCharacterEscapes02.js new file mode 100644 index 0000000000000..eec39954b0847 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes02.js @@ -0,0 +1,7 @@ +//// [templateStringControlCharacterEscapes02.ts] + + +var x = `\x19\u0019 19`; + +//// [templateStringControlCharacterEscapes02.js] +var x = " 1\u0039"; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes02.types b/tests/baselines/reference/templateStringControlCharacterEscapes02.types new file mode 100644 index 0000000000000..f47a3f69a7791 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes02.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02.ts === + + +var x = `\x19\u0019 19`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.js b/tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.js new file mode 100644 index 0000000000000..2d76674b4dd1e --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.js @@ -0,0 +1,6 @@ +//// [templateStringControlCharacterEscapes02_ES6.ts] + +var x = `\x19\u0019 19`; + +//// [templateStringControlCharacterEscapes02_ES6.js] +var x = `\x19\u0019 19`; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.types b/tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.types new file mode 100644 index 0000000000000..e7e123e0ab3fb --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes02_ES6.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02_ES6.ts === + +var x = `\x19\u0019 19`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes03.js b/tests/baselines/reference/templateStringControlCharacterEscapes03.js new file mode 100644 index 0000000000000..1be2852214be7 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes03.js @@ -0,0 +1,7 @@ +//// [templateStringControlCharacterEscapes03.ts] + + +var x = `\x1F\u001f 1F 1f`; + +//// [templateStringControlCharacterEscapes03.js] +var x = " 1F 1f"; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes03.types b/tests/baselines/reference/templateStringControlCharacterEscapes03.types new file mode 100644 index 0000000000000..2341046056094 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes03.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03.ts === + + +var x = `\x1F\u001f 1F 1f`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.js b/tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.js new file mode 100644 index 0000000000000..b9b3df266d97d --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.js @@ -0,0 +1,6 @@ +//// [templateStringControlCharacterEscapes03_ES6.ts] + +var x = `\x1F\u001f 1F 1f`; + +//// [templateStringControlCharacterEscapes03_ES6.js] +var x = `\x1F\u001f 1F 1f`; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.types b/tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.types new file mode 100644 index 0000000000000..03642563b8a87 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes03_ES6.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03_ES6.ts === + +var x = `\x1F\u001f 1F 1f`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes04.js b/tests/baselines/reference/templateStringControlCharacterEscapes04.js new file mode 100644 index 0000000000000..70636a584b439 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes04.js @@ -0,0 +1,7 @@ +//// [templateStringControlCharacterEscapes04.ts] + + +var x = `\x20\u0020 20`; + +//// [templateStringControlCharacterEscapes04.js] +var x = " 20"; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes04.types b/tests/baselines/reference/templateStringControlCharacterEscapes04.types new file mode 100644 index 0000000000000..00aca41a83ad8 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes04.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04.ts === + + +var x = `\x20\u0020 20`; +>x : string + diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.js b/tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.js new file mode 100644 index 0000000000000..17461fb084188 --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.js @@ -0,0 +1,6 @@ +//// [templateStringControlCharacterEscapes04_ES6.ts] + +var x = `\x20\u0020 20`; + +//// [templateStringControlCharacterEscapes04_ES6.js] +var x = `\x20\u0020 20`; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.types b/tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.types new file mode 100644 index 0000000000000..0b993a8b2dc6a --- /dev/null +++ b/tests/baselines/reference/templateStringControlCharacterEscapes04_ES6.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04_ES6.ts === + +var x = `\x20\u0020 20`; +>x : string + diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js new file mode 100644 index 0000000000000..580a5179a99e1 --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js @@ -0,0 +1,6 @@ +//// [templateStringPlainCharactersThatArePartsOfEscapes01.ts] + +`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` + +//// [templateStringPlainCharactersThatArePartsOfEscapes01.js] +"0 1 2 3 4 5 6 7 8 \u0039 10 11 12 13 14 15 16 17 18 1\u0039 20 2028 202\u0039 0085 t v f b r n"; diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.types b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.types new file mode 100644 index 0000000000000..2b77345f8ffac --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01.ts === + +No type information for this code.`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.js b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.js new file mode 100644 index 0000000000000..4b599ee1d55b1 --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.js @@ -0,0 +1,6 @@ +//// [templateStringPlainCharactersThatArePartsOfEscapes01_ES6.ts] + +`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` + +//// [templateStringPlainCharactersThatArePartsOfEscapes01_ES6.js] +`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n`; diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.types b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.types new file mode 100644 index 0000000000000..33c8839e194c6 --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.ts === + +No type information for this code.`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js new file mode 100644 index 0000000000000..79c1d350eb11b --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js @@ -0,0 +1,7 @@ +//// [templateStringPlainCharactersThatArePartsOfEscapes02.ts] + + +`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` + +//// [templateStringPlainCharactersThatArePartsOfEscapes02.js] +"0" + " " + "1" + " " + "2" + " " + "3" + " " + "4" + " " + "5" + " " + "6" + " " + "7" + " " + "8" + " " + "\u0039" + " " + "10" + " " + "11" + " " + "12" + " " + "13" + " " + "14" + " " + "15" + " " + "16" + " " + "17" + " " + "18" + " " + "1\u0039" + " " + "20" + " " + "2028" + " " + "202\u0039" + " " + "0085" + " " + "t" + " " + "v" + " " + "f" + " " + "b" + " " + "r" + " " + "n"; diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.types b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.types new file mode 100644 index 0000000000000..f630d9e71e633 --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02.ts === + +No type information for this code. +No type information for this code.`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.js b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.js new file mode 100644 index 0000000000000..0924c35b6ce17 --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.js @@ -0,0 +1,6 @@ +//// [templateStringPlainCharactersThatArePartsOfEscapes02_ES6.ts] + +`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` + +//// [templateStringPlainCharactersThatArePartsOfEscapes02_ES6.js] +`0${" "}1${" "}2${" "}3${" "}4${" "}5${" "}6${" "}7${" "}8${" "}9${" "}10${" "}11${" "}12${" "}13${" "}14${" "}15${" "}16${" "}17${" "}18${" "}19${" "}20${" "}2028${" "}2029${" "}0085${" "}t${" "}v${" "}f${" "}b${" "}r${" "}n`; diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.types b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.types new file mode 100644 index 0000000000000..934e0fc495cd1 --- /dev/null +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.ts === + +No type information for this code.`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` +No type information for this code. \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts new file mode 100644 index 0000000000000..70f0a82a25ff7 --- /dev/null +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.ts @@ -0,0 +1,7 @@ + + +function f(...x: any[]) { + +} + +f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.ts new file mode 100644 index 0000000000000..2bb885e597952 --- /dev/null +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01_ES6.ts @@ -0,0 +1,7 @@ +// @target: es6 + +function f(...x: any[]) { + +} + +f `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.ts new file mode 100644 index 0000000000000..33b9d27a2332a --- /dev/null +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.ts @@ -0,0 +1,3 @@ + + +`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.ts new file mode 100644 index 0000000000000..716279970681b --- /dev/null +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02_ES6.ts @@ -0,0 +1,7 @@ +// @target: es6 + +function f(...x: any[]) { + +} + +f `0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01.ts new file mode 100644 index 0000000000000..dda77a70cad08 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01.ts @@ -0,0 +1,3 @@ + + +var x = `\0\x00\u0000 0 00 0000`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01_ES6.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01_ES6.ts new file mode 100644 index 0000000000000..9875706896f6b --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes01_ES6.ts @@ -0,0 +1,3 @@ +// @target: es6 + +var x = `\0\x00\u0000 0 00 0000`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02.ts new file mode 100644 index 0000000000000..a583517e98798 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02.ts @@ -0,0 +1,3 @@ + + +var x = `\x19\u0019 19`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02_ES6.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02_ES6.ts new file mode 100644 index 0000000000000..4b514ba80c696 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes02_ES6.ts @@ -0,0 +1,3 @@ +// @target: es6 + +var x = `\x19\u0019 19`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03.ts new file mode 100644 index 0000000000000..755cdedc27055 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03.ts @@ -0,0 +1,3 @@ + + +var x = `\x1F\u001f 1F 1f`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03_ES6.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03_ES6.ts new file mode 100644 index 0000000000000..a24d3b57ae3ff --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes03_ES6.ts @@ -0,0 +1,3 @@ +// @target: es6 + +var x = `\x1F\u001f 1F 1f`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04.ts new file mode 100644 index 0000000000000..19820e9daaab9 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04.ts @@ -0,0 +1,3 @@ + + +var x = `\x20\u0020 20`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04_ES6.ts b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04_ES6.ts new file mode 100644 index 0000000000000..4502654577598 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringControlCharacterEscapes04_ES6.ts @@ -0,0 +1,3 @@ +// @target: es6 + +var x = `\x20\u0020 20`; \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01.ts b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01.ts new file mode 100644 index 0000000000000..4f0d66e74a23b --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01.ts @@ -0,0 +1,2 @@ + +`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.ts b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.ts new file mode 100644 index 0000000000000..73ac486431407 --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes01_ES6.ts @@ -0,0 +1,3 @@ +// @target: es6 + +`0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02.ts b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02.ts new file mode 100644 index 0000000000000..33b9d27a2332a --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02.ts @@ -0,0 +1,3 @@ + + +`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.ts b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.ts new file mode 100644 index 0000000000000..04b69b7f7062b --- /dev/null +++ b/tests/cases/conformance/es6/templates/templateStringPlainCharactersThatArePartsOfEscapes02_ES6.ts @@ -0,0 +1,3 @@ +// @target: es6 + +`0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` \ No newline at end of file From 389cff94bc9b9b054d3c03fcdf0a193d9963565c Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 25 Feb 2015 18:01:23 -0800 Subject: [PATCH 3/7] Fixed character escaping for characters with values below 0x20 and '9'. --- src/compiler/core.ts | 4 ++-- ...edTemplateStringsPlainCharactersThatArePartsOfEscapes01.js | 2 +- ...edTemplateStringsPlainCharactersThatArePartsOfEscapes02.js | 2 +- .../reference/templateStringControlCharacterEscapes02.js | 2 +- .../reference/templateStringControlCharacterEscapes03.js | 2 +- .../templateStringPlainCharactersThatArePartsOfEscapes01.js | 2 +- .../templateStringPlainCharactersThatArePartsOfEscapes02.js | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index d527b62005ec2..e27d3cb520740 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -607,7 +607,7 @@ module ts { } var backslashOrDoubleQuote = /[\"\\]/g; - var escapedCharsRegExp = /[\0-\19\t\v\f\b\0\r\n\u2028\u2029\u0085]/g; + var escapedCharsRegExp = /[\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g; var escapedCharsMap: Map = { "\0": "\\0", "\t": "\\t", @@ -624,7 +624,7 @@ module ts { }; /** - * Based heavily on the abstract 'Quote' operation from ECMA-262 (24.3.2.2), + * Based heavily on the abstract 'Quote'/ 'QuoteJSONString' operation from ECMA-262 (24.3.2.2), * but augmented for a few select characters. * Note that this doesn't actually wrap the input in double quotes. */ diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js index 44eeeed4dfcbd..5e5feac077bb4 100644 --- a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes01.js @@ -14,4 +14,4 @@ function f() { x[_i - 0] = arguments[_i]; } } -f "0 1 2 3 4 5 6 7 8 \u0039 10 11 12 13 14 15 16 17 18 1\u0039 20 2028 202\u0039 0085 t v f b r n"; +f "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n"; diff --git a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js index 6b087cc2df725..ca192ef98d394 100644 --- a/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js +++ b/tests/baselines/reference/taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js @@ -4,4 +4,4 @@ `0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` //// [taggedTemplateStringsPlainCharactersThatArePartsOfEscapes02.js] -"0" + " " + "1" + " " + "2" + " " + "3" + " " + "4" + " " + "5" + " " + "6" + " " + "7" + " " + "8" + " " + "\u0039" + " " + "10" + " " + "11" + " " + "12" + " " + "13" + " " + "14" + " " + "15" + " " + "16" + " " + "17" + " " + "18" + " " + "1\u0039" + " " + "20" + " " + "2028" + " " + "202\u0039" + " " + "0085" + " " + "t" + " " + "v" + " " + "f" + " " + "b" + " " + "r" + " " + "n"; +"0" + " " + "1" + " " + "2" + " " + "3" + " " + "4" + " " + "5" + " " + "6" + " " + "7" + " " + "8" + " " + "9" + " " + "10" + " " + "11" + " " + "12" + " " + "13" + " " + "14" + " " + "15" + " " + "16" + " " + "17" + " " + "18" + " " + "19" + " " + "20" + " " + "2028" + " " + "2029" + " " + "0085" + " " + "t" + " " + "v" + " " + "f" + " " + "b" + " " + "r" + " " + "n"; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes02.js b/tests/baselines/reference/templateStringControlCharacterEscapes02.js index eec39954b0847..5b5d34dae021d 100644 --- a/tests/baselines/reference/templateStringControlCharacterEscapes02.js +++ b/tests/baselines/reference/templateStringControlCharacterEscapes02.js @@ -4,4 +4,4 @@ var x = `\x19\u0019 19`; //// [templateStringControlCharacterEscapes02.js] -var x = " 1\u0039"; +var x = "\u0019\u0019 19"; diff --git a/tests/baselines/reference/templateStringControlCharacterEscapes03.js b/tests/baselines/reference/templateStringControlCharacterEscapes03.js index 1be2852214be7..ae9774d952a53 100644 --- a/tests/baselines/reference/templateStringControlCharacterEscapes03.js +++ b/tests/baselines/reference/templateStringControlCharacterEscapes03.js @@ -4,4 +4,4 @@ var x = `\x1F\u001f 1F 1f`; //// [templateStringControlCharacterEscapes03.js] -var x = " 1F 1f"; +var x = "\u001f\u001f 1F 1f"; diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js index 580a5179a99e1..62629f3284f2a 100644 --- a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes01.js @@ -3,4 +3,4 @@ `0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n` //// [templateStringPlainCharactersThatArePartsOfEscapes01.js] -"0 1 2 3 4 5 6 7 8 \u0039 10 11 12 13 14 15 16 17 18 1\u0039 20 2028 202\u0039 0085 t v f b r n"; +"0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2028 2029 0085 t v f b r n"; diff --git a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js index 79c1d350eb11b..27090032ab93a 100644 --- a/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js +++ b/tests/baselines/reference/templateStringPlainCharactersThatArePartsOfEscapes02.js @@ -4,4 +4,4 @@ `0${ " " }1${ " " }2${ " " }3${ " " }4${ " " }5${ " " }6${ " " }7${ " " }8${ " " }9${ " " }10${ " " }11${ " " }12${ " " }13${ " " }14${ " " }15${ " " }16${ " " }17${ " " }18${ " " }19${ " " }20${ " " }2028${ " " }2029${ " " }0085${ " " }t${ " " }v${ " " }f${ " " }b${ " " }r${ " " }n` //// [templateStringPlainCharactersThatArePartsOfEscapes02.js] -"0" + " " + "1" + " " + "2" + " " + "3" + " " + "4" + " " + "5" + " " + "6" + " " + "7" + " " + "8" + " " + "\u0039" + " " + "10" + " " + "11" + " " + "12" + " " + "13" + " " + "14" + " " + "15" + " " + "16" + " " + "17" + " " + "18" + " " + "1\u0039" + " " + "20" + " " + "2028" + " " + "202\u0039" + " " + "0085" + " " + "t" + " " + "v" + " " + "f" + " " + "b" + " " + "r" + " " + "n"; +"0" + " " + "1" + " " + "2" + " " + "3" + " " + "4" + " " + "5" + " " + "6" + " " + "7" + " " + "8" + " " + "9" + " " + "10" + " " + "11" + " " + "12" + " " + "13" + " " + "14" + " " + "15" + " " + "16" + " " + "17" + " " + "18" + " " + "19" + " " + "20" + " " + "2028" + " " + "2029" + " " + "0085" + " " + "t" + " " + "v" + " " + "f" + " " + "b" + " " + "r" + " " + "n"; From ff24b21d4090f7f65bdef8ee99ff969a080ddfb5 Mon Sep 17 00:00:00 2001 From: steveluc Date: Mon, 23 Feb 2015 23:44:15 -0800 Subject: [PATCH 4/7] Update project structure after change. After each change a timer is started. If timer finishes before another change takes place, project structure will be updated to reflect any changes in reference comments or import statements. --- src/server/editorServices.ts | 30 ++++++++++++++++-------------- src/server/server.ts | 7 +++++-- src/server/session.ts | 32 ++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index d7eda52ce38fe..d3bf1718a283f 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -101,13 +101,7 @@ module ts.server { } getScriptFileNames() { - var filenames: string[] = []; - for (var filename in this.filenameToScript) { - if (this.filenameToScript[filename] && this.filenameToScript[filename].isOpen) { - filenames.push(filename); - } - } - return filenames; + return this.roots.map(root => root.fileName); } getScriptVersion(filename: string) { @@ -536,15 +530,20 @@ module ts.server { updateProjectStructure() { this.log("updating project structure from ...", "Info"); this.printProjects(); + var openFilesReferenced: ScriptInfo[] = []; + var unattachedOpenFiles: ScriptInfo[] = []; for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { - var refdFile = this.openFilesReferenced[i]; - refdFile.defaultProject.updateGraph(); - var sourceFile = refdFile.defaultProject.getSourceFile(refdFile); - if (!sourceFile) { - this.openFilesReferenced = copyListRemovingItem(refdFile, this.openFilesReferenced); - this.addOpenFile(refdFile); + var referencedFile = this.openFilesReferenced[i]; + referencedFile.defaultProject.updateGraph(); + var sourceFile = referencedFile.defaultProject.getSourceFile(referencedFile); + if (sourceFile) { + openFilesReferenced.push(referencedFile); + } + else { + unattachedOpenFiles.push(referencedFile); } } + this.openFilesReferenced = openFilesReferenced; var openFileRoots: ScriptInfo[] = []; for (var i = 0, len = this.openFileRoots.length; i < len; i++) { var rootFile = this.openFileRoots[i]; @@ -555,12 +554,15 @@ module ts.server { openFileRoots.push(rootFile); } else { - // remove project from inferred projects list + // remove project from inferred projects list because root captured this.inferredProjects = copyListRemovingItem(rootedProject, this.inferredProjects); this.openFilesReferenced.push(rootFile); } } this.openFileRoots = openFileRoots; + for (var i = 0, len = unattachedOpenFiles.length; i < len; i++) { + this.addOpenFile(unattachedOpenFiles[i]); + } this.printProjects(); } diff --git a/src/server/server.ts b/src/server/server.ts index 2b9040b4df3a5..c48ba9513471e 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -206,7 +206,10 @@ module ts.server { } }; - + var ioSession = new IOSession(ts.sys, logger); + process.on('uncaughtException', function(err: Error) { + ioSession.logError(err, "unknown"); + }); // Start listening - new IOSession(ts.sys, logger).listen(); + ioSession.listen(); } \ No newline at end of file diff --git a/src/server/session.ts b/src/server/session.ts index 21238e8899246..7e9c6972a1f78 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -181,18 +181,29 @@ module ts.server { } semanticCheck(file: string, project: Project) { - var diags = project.compilerService.languageService.getSemanticDiagnostics(file); - if (diags) { - var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); - this.event({ file: file, diagnostics: bakedDiags }, "semanticDiag"); + try { + var diags = project.compilerService.languageService.getSemanticDiagnostics(file); + + if (diags) { + var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); + this.event({ file: file, diagnostics: bakedDiags }, "semanticDiag"); + } + } + catch (err) { + this.logError(err, "semantic check"); } } syntacticCheck(file: string, project: Project) { - var diags = project.compilerService.languageService.getSyntacticDiagnostics(file); - if (diags) { - var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); - this.event({ file: file, diagnostics: bakedDiags }, "syntaxDiag"); + try { + var diags = project.compilerService.languageService.getSyntacticDiagnostics(file); + if (diags) { + var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); + this.event({ file: file, diagnostics: bakedDiags }, "syntaxDiag"); + } + } + catch (err) { + this.logError(err, "syntactic check"); } } @@ -553,10 +564,7 @@ module ts.server { compilerService.host.editScript(file, start, end, insertString); this.changeSeq++; } - // update project structure on idle commented out - // until we can have the host return only the root files - // from getScriptFileNames() - //this.updateProjectStructure(this.changeSeq, (n) => n == this.changeSeq); + this.updateProjectStructure(this.changeSeq, (n) => n == this.changeSeq); } } From 455c27ce001ac0738aba351c51f6f225cf3af3b5 Mon Sep 17 00:00:00 2001 From: steveluc Date: Tue, 24 Feb 2015 00:08:34 -0800 Subject: [PATCH 5/7] Added comments for updateProjectStructure. --- src/server/editorServices.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index d3bf1718a283f..49a1ac4784c4f 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -530,8 +530,15 @@ module ts.server { updateProjectStructure() { this.log("updating project structure from ...", "Info"); this.printProjects(); + + // First loop through all open files that are referenced by projects but are not + // project roots. For each referenced file, see if the default project still + // references that file. If so, then just keep the file in the referenced list. + // If not, add the file to an unattached list, to be rechecked later. + var openFilesReferenced: ScriptInfo[] = []; var unattachedOpenFiles: ScriptInfo[] = []; + for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { var referencedFile = this.openFilesReferenced[i]; referencedFile.defaultProject.updateGraph(); @@ -544,6 +551,14 @@ module ts.server { } } this.openFilesReferenced = openFilesReferenced; + + // Then, loop through all of the open files that are project roots. + // For each root file, note the project that it roots. Then see if + // any other projects newly reference the file. If zero projects + // newly reference the file, keep it as a root. If one or more + // projects newly references the file, remove its project from the + // inferred projects list (since it is no longer a root) and add + // the file to the open, referenced file list. var openFileRoots: ScriptInfo[] = []; for (var i = 0, len = this.openFileRoots.length; i < len; i++) { var rootFile = this.openFileRoots[i]; @@ -560,6 +575,10 @@ module ts.server { } } this.openFileRoots = openFileRoots; + + // Finally, if we found any open, referenced files that are no longer + // referenced by their default project, treat them as newly opened + // by the editor. for (var i = 0, len = unattachedOpenFiles.length; i < len; i++) { this.addOpenFile(unattachedOpenFiles[i]); } From d827d8c378492016e1e45ae4e464c1dcd851cee2 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 25 Feb 2015 21:46:55 -0800 Subject: [PATCH 6/7] 'from' is a contextual keyword, and should only be recognized as by the parser as such. --- src/compiler/types.ts | 7 +-- .../baselines/reference/APISample_compile.js | 48 ++++++++--------- .../reference/APISample_compile.types | 52 +++++++++---------- tests/baselines/reference/APISample_linter.js | 48 ++++++++--------- .../reference/APISample_linter.types | 52 +++++++++---------- .../reference/APISample_transform.js | 48 ++++++++--------- .../reference/APISample_transform.types | 52 +++++++++---------- .../baselines/reference/APISample_watcher.js | 48 ++++++++--------- .../reference/APISample_watcher.types | 52 +++++++++---------- .../baselines/reference/fromAsIdentifier1.js | 5 ++ .../reference/fromAsIdentifier1.types | 4 ++ .../baselines/reference/fromAsIdentifier2.js | 7 +++ .../reference/fromAsIdentifier2.types | 5 ++ tests/cases/compiler/fromAsIdentifier1.ts | 1 + tests/cases/compiler/fromAsIdentifier2.ts | 2 + 15 files changed, 228 insertions(+), 203 deletions(-) create mode 100644 tests/baselines/reference/fromAsIdentifier1.js create mode 100644 tests/baselines/reference/fromAsIdentifier1.types create mode 100644 tests/baselines/reference/fromAsIdentifier2.js create mode 100644 tests/baselines/reference/fromAsIdentifier2.types create mode 100644 tests/cases/compiler/fromAsIdentifier1.ts create mode 100644 tests/cases/compiler/fromAsIdentifier2.ts diff --git a/src/compiler/types.ts b/src/compiler/types.ts index a81da0eaf741c..d1730ce1f1b0d 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -121,7 +121,6 @@ module ts { WithKeyword, // Strict mode reserved words AsKeyword, - FromKeyword, ImplementsKeyword, InterfaceKeyword, LetKeyword, @@ -131,7 +130,7 @@ module ts { PublicKeyword, StaticKeyword, YieldKeyword, - // TypeScript keywords + // Contextual keywords AnyKeyword, BooleanKeyword, ConstructorKeyword, @@ -144,7 +143,9 @@ module ts { StringKeyword, SymbolKeyword, TypeKeyword, + FromKeyword, OfKeyword, // LastKeyword and LastToken + // Parse tree nodes // Names @@ -279,7 +280,7 @@ module ts { FirstPunctuation = OpenBraceToken, LastPunctuation = CaretEqualsToken, FirstToken = Unknown, - LastToken = OfKeyword, + LastToken = LastKeyword, FirstTriviaToken = SingleLineCommentTrivia, LastTriviaToken = ConflictMarkerTrivia, FirstLiteralToken = NumericLiteral, diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index ba9aced3b24d6..5381b327504b4 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -161,28 +161,28 @@ declare module "typescript" { WhileKeyword = 99, WithKeyword = 100, AsKeyword = 101, - FromKeyword = 102, - ImplementsKeyword = 103, - InterfaceKeyword = 104, - LetKeyword = 105, - PackageKeyword = 106, - PrivateKeyword = 107, - ProtectedKeyword = 108, - PublicKeyword = 109, - StaticKeyword = 110, - YieldKeyword = 111, - AnyKeyword = 112, - BooleanKeyword = 113, - ConstructorKeyword = 114, - DeclareKeyword = 115, - GetKeyword = 116, - ModuleKeyword = 117, - RequireKeyword = 118, - NumberKeyword = 119, - SetKeyword = 120, - StringKeyword = 121, - SymbolKeyword = 122, - TypeKeyword = 123, + ImplementsKeyword = 102, + InterfaceKeyword = 103, + LetKeyword = 104, + PackageKeyword = 105, + PrivateKeyword = 106, + ProtectedKeyword = 107, + PublicKeyword = 108, + StaticKeyword = 109, + YieldKeyword = 110, + AnyKeyword = 111, + BooleanKeyword = 112, + ConstructorKeyword = 113, + DeclareKeyword = 114, + GetKeyword = 115, + ModuleKeyword = 116, + RequireKeyword = 117, + NumberKeyword = 118, + SetKeyword = 119, + StringKeyword = 120, + SymbolKeyword = 121, + TypeKeyword = 122, + FromKeyword = 123, OfKeyword = 124, QualifiedName = 125, ComputedPropertyName = 126, @@ -288,8 +288,8 @@ declare module "typescript" { LastReservedWord = 100, FirstKeyword = 65, LastKeyword = 124, - FirstFutureReservedWord = 103, - LastFutureReservedWord = 111, + FirstFutureReservedWord = 102, + LastFutureReservedWord = 110, FirstTypeNode = 139, LastTypeNode = 147, FirstPunctuation = 14, diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index 3ad078773dac8..106fa45e42468 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -501,72 +501,72 @@ declare module "typescript" { AsKeyword = 101, >AsKeyword : SyntaxKind - FromKeyword = 102, ->FromKeyword : SyntaxKind - - ImplementsKeyword = 103, + ImplementsKeyword = 102, >ImplementsKeyword : SyntaxKind - InterfaceKeyword = 104, + InterfaceKeyword = 103, >InterfaceKeyword : SyntaxKind - LetKeyword = 105, + LetKeyword = 104, >LetKeyword : SyntaxKind - PackageKeyword = 106, + PackageKeyword = 105, >PackageKeyword : SyntaxKind - PrivateKeyword = 107, + PrivateKeyword = 106, >PrivateKeyword : SyntaxKind - ProtectedKeyword = 108, + ProtectedKeyword = 107, >ProtectedKeyword : SyntaxKind - PublicKeyword = 109, + PublicKeyword = 108, >PublicKeyword : SyntaxKind - StaticKeyword = 110, + StaticKeyword = 109, >StaticKeyword : SyntaxKind - YieldKeyword = 111, + YieldKeyword = 110, >YieldKeyword : SyntaxKind - AnyKeyword = 112, + AnyKeyword = 111, >AnyKeyword : SyntaxKind - BooleanKeyword = 113, + BooleanKeyword = 112, >BooleanKeyword : SyntaxKind - ConstructorKeyword = 114, + ConstructorKeyword = 113, >ConstructorKeyword : SyntaxKind - DeclareKeyword = 115, + DeclareKeyword = 114, >DeclareKeyword : SyntaxKind - GetKeyword = 116, + GetKeyword = 115, >GetKeyword : SyntaxKind - ModuleKeyword = 117, + ModuleKeyword = 116, >ModuleKeyword : SyntaxKind - RequireKeyword = 118, + RequireKeyword = 117, >RequireKeyword : SyntaxKind - NumberKeyword = 119, + NumberKeyword = 118, >NumberKeyword : SyntaxKind - SetKeyword = 120, + SetKeyword = 119, >SetKeyword : SyntaxKind - StringKeyword = 121, + StringKeyword = 120, >StringKeyword : SyntaxKind - SymbolKeyword = 122, + SymbolKeyword = 121, >SymbolKeyword : SyntaxKind - TypeKeyword = 123, + TypeKeyword = 122, >TypeKeyword : SyntaxKind + FromKeyword = 123, +>FromKeyword : SyntaxKind + OfKeyword = 124, >OfKeyword : SyntaxKind @@ -882,10 +882,10 @@ declare module "typescript" { LastKeyword = 124, >LastKeyword : SyntaxKind - FirstFutureReservedWord = 103, + FirstFutureReservedWord = 102, >FirstFutureReservedWord : SyntaxKind - LastFutureReservedWord = 111, + LastFutureReservedWord = 110, >LastFutureReservedWord : SyntaxKind FirstTypeNode = 139, diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 54bb4a0dd80a3..47183c920b49f 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -192,28 +192,28 @@ declare module "typescript" { WhileKeyword = 99, WithKeyword = 100, AsKeyword = 101, - FromKeyword = 102, - ImplementsKeyword = 103, - InterfaceKeyword = 104, - LetKeyword = 105, - PackageKeyword = 106, - PrivateKeyword = 107, - ProtectedKeyword = 108, - PublicKeyword = 109, - StaticKeyword = 110, - YieldKeyword = 111, - AnyKeyword = 112, - BooleanKeyword = 113, - ConstructorKeyword = 114, - DeclareKeyword = 115, - GetKeyword = 116, - ModuleKeyword = 117, - RequireKeyword = 118, - NumberKeyword = 119, - SetKeyword = 120, - StringKeyword = 121, - SymbolKeyword = 122, - TypeKeyword = 123, + ImplementsKeyword = 102, + InterfaceKeyword = 103, + LetKeyword = 104, + PackageKeyword = 105, + PrivateKeyword = 106, + ProtectedKeyword = 107, + PublicKeyword = 108, + StaticKeyword = 109, + YieldKeyword = 110, + AnyKeyword = 111, + BooleanKeyword = 112, + ConstructorKeyword = 113, + DeclareKeyword = 114, + GetKeyword = 115, + ModuleKeyword = 116, + RequireKeyword = 117, + NumberKeyword = 118, + SetKeyword = 119, + StringKeyword = 120, + SymbolKeyword = 121, + TypeKeyword = 122, + FromKeyword = 123, OfKeyword = 124, QualifiedName = 125, ComputedPropertyName = 126, @@ -319,8 +319,8 @@ declare module "typescript" { LastReservedWord = 100, FirstKeyword = 65, LastKeyword = 124, - FirstFutureReservedWord = 103, - LastFutureReservedWord = 111, + FirstFutureReservedWord = 102, + LastFutureReservedWord = 110, FirstTypeNode = 139, LastTypeNode = 147, FirstPunctuation = 14, diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 59bb6cc3b8c21..776e7c0bbc17f 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -647,72 +647,72 @@ declare module "typescript" { AsKeyword = 101, >AsKeyword : SyntaxKind - FromKeyword = 102, ->FromKeyword : SyntaxKind - - ImplementsKeyword = 103, + ImplementsKeyword = 102, >ImplementsKeyword : SyntaxKind - InterfaceKeyword = 104, + InterfaceKeyword = 103, >InterfaceKeyword : SyntaxKind - LetKeyword = 105, + LetKeyword = 104, >LetKeyword : SyntaxKind - PackageKeyword = 106, + PackageKeyword = 105, >PackageKeyword : SyntaxKind - PrivateKeyword = 107, + PrivateKeyword = 106, >PrivateKeyword : SyntaxKind - ProtectedKeyword = 108, + ProtectedKeyword = 107, >ProtectedKeyword : SyntaxKind - PublicKeyword = 109, + PublicKeyword = 108, >PublicKeyword : SyntaxKind - StaticKeyword = 110, + StaticKeyword = 109, >StaticKeyword : SyntaxKind - YieldKeyword = 111, + YieldKeyword = 110, >YieldKeyword : SyntaxKind - AnyKeyword = 112, + AnyKeyword = 111, >AnyKeyword : SyntaxKind - BooleanKeyword = 113, + BooleanKeyword = 112, >BooleanKeyword : SyntaxKind - ConstructorKeyword = 114, + ConstructorKeyword = 113, >ConstructorKeyword : SyntaxKind - DeclareKeyword = 115, + DeclareKeyword = 114, >DeclareKeyword : SyntaxKind - GetKeyword = 116, + GetKeyword = 115, >GetKeyword : SyntaxKind - ModuleKeyword = 117, + ModuleKeyword = 116, >ModuleKeyword : SyntaxKind - RequireKeyword = 118, + RequireKeyword = 117, >RequireKeyword : SyntaxKind - NumberKeyword = 119, + NumberKeyword = 118, >NumberKeyword : SyntaxKind - SetKeyword = 120, + SetKeyword = 119, >SetKeyword : SyntaxKind - StringKeyword = 121, + StringKeyword = 120, >StringKeyword : SyntaxKind - SymbolKeyword = 122, + SymbolKeyword = 121, >SymbolKeyword : SyntaxKind - TypeKeyword = 123, + TypeKeyword = 122, >TypeKeyword : SyntaxKind + FromKeyword = 123, +>FromKeyword : SyntaxKind + OfKeyword = 124, >OfKeyword : SyntaxKind @@ -1028,10 +1028,10 @@ declare module "typescript" { LastKeyword = 124, >LastKeyword : SyntaxKind - FirstFutureReservedWord = 103, + FirstFutureReservedWord = 102, >FirstFutureReservedWord : SyntaxKind - LastFutureReservedWord = 111, + LastFutureReservedWord = 110, >LastFutureReservedWord : SyntaxKind FirstTypeNode = 139, diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 42bb19f5b68b1..ea323ba927ff4 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -193,28 +193,28 @@ declare module "typescript" { WhileKeyword = 99, WithKeyword = 100, AsKeyword = 101, - FromKeyword = 102, - ImplementsKeyword = 103, - InterfaceKeyword = 104, - LetKeyword = 105, - PackageKeyword = 106, - PrivateKeyword = 107, - ProtectedKeyword = 108, - PublicKeyword = 109, - StaticKeyword = 110, - YieldKeyword = 111, - AnyKeyword = 112, - BooleanKeyword = 113, - ConstructorKeyword = 114, - DeclareKeyword = 115, - GetKeyword = 116, - ModuleKeyword = 117, - RequireKeyword = 118, - NumberKeyword = 119, - SetKeyword = 120, - StringKeyword = 121, - SymbolKeyword = 122, - TypeKeyword = 123, + ImplementsKeyword = 102, + InterfaceKeyword = 103, + LetKeyword = 104, + PackageKeyword = 105, + PrivateKeyword = 106, + ProtectedKeyword = 107, + PublicKeyword = 108, + StaticKeyword = 109, + YieldKeyword = 110, + AnyKeyword = 111, + BooleanKeyword = 112, + ConstructorKeyword = 113, + DeclareKeyword = 114, + GetKeyword = 115, + ModuleKeyword = 116, + RequireKeyword = 117, + NumberKeyword = 118, + SetKeyword = 119, + StringKeyword = 120, + SymbolKeyword = 121, + TypeKeyword = 122, + FromKeyword = 123, OfKeyword = 124, QualifiedName = 125, ComputedPropertyName = 126, @@ -320,8 +320,8 @@ declare module "typescript" { LastReservedWord = 100, FirstKeyword = 65, LastKeyword = 124, - FirstFutureReservedWord = 103, - LastFutureReservedWord = 111, + FirstFutureReservedWord = 102, + LastFutureReservedWord = 110, FirstTypeNode = 139, LastTypeNode = 147, FirstPunctuation = 14, diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index b3aca49554755..9abc0385d0791 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -597,72 +597,72 @@ declare module "typescript" { AsKeyword = 101, >AsKeyword : SyntaxKind - FromKeyword = 102, ->FromKeyword : SyntaxKind - - ImplementsKeyword = 103, + ImplementsKeyword = 102, >ImplementsKeyword : SyntaxKind - InterfaceKeyword = 104, + InterfaceKeyword = 103, >InterfaceKeyword : SyntaxKind - LetKeyword = 105, + LetKeyword = 104, >LetKeyword : SyntaxKind - PackageKeyword = 106, + PackageKeyword = 105, >PackageKeyword : SyntaxKind - PrivateKeyword = 107, + PrivateKeyword = 106, >PrivateKeyword : SyntaxKind - ProtectedKeyword = 108, + ProtectedKeyword = 107, >ProtectedKeyword : SyntaxKind - PublicKeyword = 109, + PublicKeyword = 108, >PublicKeyword : SyntaxKind - StaticKeyword = 110, + StaticKeyword = 109, >StaticKeyword : SyntaxKind - YieldKeyword = 111, + YieldKeyword = 110, >YieldKeyword : SyntaxKind - AnyKeyword = 112, + AnyKeyword = 111, >AnyKeyword : SyntaxKind - BooleanKeyword = 113, + BooleanKeyword = 112, >BooleanKeyword : SyntaxKind - ConstructorKeyword = 114, + ConstructorKeyword = 113, >ConstructorKeyword : SyntaxKind - DeclareKeyword = 115, + DeclareKeyword = 114, >DeclareKeyword : SyntaxKind - GetKeyword = 116, + GetKeyword = 115, >GetKeyword : SyntaxKind - ModuleKeyword = 117, + ModuleKeyword = 116, >ModuleKeyword : SyntaxKind - RequireKeyword = 118, + RequireKeyword = 117, >RequireKeyword : SyntaxKind - NumberKeyword = 119, + NumberKeyword = 118, >NumberKeyword : SyntaxKind - SetKeyword = 120, + SetKeyword = 119, >SetKeyword : SyntaxKind - StringKeyword = 121, + StringKeyword = 120, >StringKeyword : SyntaxKind - SymbolKeyword = 122, + SymbolKeyword = 121, >SymbolKeyword : SyntaxKind - TypeKeyword = 123, + TypeKeyword = 122, >TypeKeyword : SyntaxKind + FromKeyword = 123, +>FromKeyword : SyntaxKind + OfKeyword = 124, >OfKeyword : SyntaxKind @@ -978,10 +978,10 @@ declare module "typescript" { LastKeyword = 124, >LastKeyword : SyntaxKind - FirstFutureReservedWord = 103, + FirstFutureReservedWord = 102, >FirstFutureReservedWord : SyntaxKind - LastFutureReservedWord = 111, + LastFutureReservedWord = 110, >LastFutureReservedWord : SyntaxKind FirstTypeNode = 139, diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index cafb7f94ce178..3e80b34ba0ee3 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -230,28 +230,28 @@ declare module "typescript" { WhileKeyword = 99, WithKeyword = 100, AsKeyword = 101, - FromKeyword = 102, - ImplementsKeyword = 103, - InterfaceKeyword = 104, - LetKeyword = 105, - PackageKeyword = 106, - PrivateKeyword = 107, - ProtectedKeyword = 108, - PublicKeyword = 109, - StaticKeyword = 110, - YieldKeyword = 111, - AnyKeyword = 112, - BooleanKeyword = 113, - ConstructorKeyword = 114, - DeclareKeyword = 115, - GetKeyword = 116, - ModuleKeyword = 117, - RequireKeyword = 118, - NumberKeyword = 119, - SetKeyword = 120, - StringKeyword = 121, - SymbolKeyword = 122, - TypeKeyword = 123, + ImplementsKeyword = 102, + InterfaceKeyword = 103, + LetKeyword = 104, + PackageKeyword = 105, + PrivateKeyword = 106, + ProtectedKeyword = 107, + PublicKeyword = 108, + StaticKeyword = 109, + YieldKeyword = 110, + AnyKeyword = 111, + BooleanKeyword = 112, + ConstructorKeyword = 113, + DeclareKeyword = 114, + GetKeyword = 115, + ModuleKeyword = 116, + RequireKeyword = 117, + NumberKeyword = 118, + SetKeyword = 119, + StringKeyword = 120, + SymbolKeyword = 121, + TypeKeyword = 122, + FromKeyword = 123, OfKeyword = 124, QualifiedName = 125, ComputedPropertyName = 126, @@ -357,8 +357,8 @@ declare module "typescript" { LastReservedWord = 100, FirstKeyword = 65, LastKeyword = 124, - FirstFutureReservedWord = 103, - LastFutureReservedWord = 111, + FirstFutureReservedWord = 102, + LastFutureReservedWord = 110, FirstTypeNode = 139, LastTypeNode = 147, FirstPunctuation = 14, diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 3a987c0296fc3..79c2177ce79be 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -770,72 +770,72 @@ declare module "typescript" { AsKeyword = 101, >AsKeyword : SyntaxKind - FromKeyword = 102, ->FromKeyword : SyntaxKind - - ImplementsKeyword = 103, + ImplementsKeyword = 102, >ImplementsKeyword : SyntaxKind - InterfaceKeyword = 104, + InterfaceKeyword = 103, >InterfaceKeyword : SyntaxKind - LetKeyword = 105, + LetKeyword = 104, >LetKeyword : SyntaxKind - PackageKeyword = 106, + PackageKeyword = 105, >PackageKeyword : SyntaxKind - PrivateKeyword = 107, + PrivateKeyword = 106, >PrivateKeyword : SyntaxKind - ProtectedKeyword = 108, + ProtectedKeyword = 107, >ProtectedKeyword : SyntaxKind - PublicKeyword = 109, + PublicKeyword = 108, >PublicKeyword : SyntaxKind - StaticKeyword = 110, + StaticKeyword = 109, >StaticKeyword : SyntaxKind - YieldKeyword = 111, + YieldKeyword = 110, >YieldKeyword : SyntaxKind - AnyKeyword = 112, + AnyKeyword = 111, >AnyKeyword : SyntaxKind - BooleanKeyword = 113, + BooleanKeyword = 112, >BooleanKeyword : SyntaxKind - ConstructorKeyword = 114, + ConstructorKeyword = 113, >ConstructorKeyword : SyntaxKind - DeclareKeyword = 115, + DeclareKeyword = 114, >DeclareKeyword : SyntaxKind - GetKeyword = 116, + GetKeyword = 115, >GetKeyword : SyntaxKind - ModuleKeyword = 117, + ModuleKeyword = 116, >ModuleKeyword : SyntaxKind - RequireKeyword = 118, + RequireKeyword = 117, >RequireKeyword : SyntaxKind - NumberKeyword = 119, + NumberKeyword = 118, >NumberKeyword : SyntaxKind - SetKeyword = 120, + SetKeyword = 119, >SetKeyword : SyntaxKind - StringKeyword = 121, + StringKeyword = 120, >StringKeyword : SyntaxKind - SymbolKeyword = 122, + SymbolKeyword = 121, >SymbolKeyword : SyntaxKind - TypeKeyword = 123, + TypeKeyword = 122, >TypeKeyword : SyntaxKind + FromKeyword = 123, +>FromKeyword : SyntaxKind + OfKeyword = 124, >OfKeyword : SyntaxKind @@ -1151,10 +1151,10 @@ declare module "typescript" { LastKeyword = 124, >LastKeyword : SyntaxKind - FirstFutureReservedWord = 103, + FirstFutureReservedWord = 102, >FirstFutureReservedWord : SyntaxKind - LastFutureReservedWord = 111, + LastFutureReservedWord = 110, >LastFutureReservedWord : SyntaxKind FirstTypeNode = 139, diff --git a/tests/baselines/reference/fromAsIdentifier1.js b/tests/baselines/reference/fromAsIdentifier1.js new file mode 100644 index 0000000000000..54054e9f3e8e7 --- /dev/null +++ b/tests/baselines/reference/fromAsIdentifier1.js @@ -0,0 +1,5 @@ +//// [fromAsIdentifier1.ts] +var from; + +//// [fromAsIdentifier1.js] +var from; diff --git a/tests/baselines/reference/fromAsIdentifier1.types b/tests/baselines/reference/fromAsIdentifier1.types new file mode 100644 index 0000000000000..988a80f3337bb --- /dev/null +++ b/tests/baselines/reference/fromAsIdentifier1.types @@ -0,0 +1,4 @@ +=== tests/cases/compiler/fromAsIdentifier1.ts === +var from; +>from : any + diff --git a/tests/baselines/reference/fromAsIdentifier2.js b/tests/baselines/reference/fromAsIdentifier2.js new file mode 100644 index 0000000000000..efdbdb3c57df2 --- /dev/null +++ b/tests/baselines/reference/fromAsIdentifier2.js @@ -0,0 +1,7 @@ +//// [fromAsIdentifier2.ts] +"use strict"; +var from; + +//// [fromAsIdentifier2.js] +"use strict"; +var from; diff --git a/tests/baselines/reference/fromAsIdentifier2.types b/tests/baselines/reference/fromAsIdentifier2.types new file mode 100644 index 0000000000000..5faf9ec6f6c86 --- /dev/null +++ b/tests/baselines/reference/fromAsIdentifier2.types @@ -0,0 +1,5 @@ +=== tests/cases/compiler/fromAsIdentifier2.ts === +"use strict"; +var from; +>from : any + diff --git a/tests/cases/compiler/fromAsIdentifier1.ts b/tests/cases/compiler/fromAsIdentifier1.ts new file mode 100644 index 0000000000000..91497ab477ed4 --- /dev/null +++ b/tests/cases/compiler/fromAsIdentifier1.ts @@ -0,0 +1 @@ +var from; \ No newline at end of file diff --git a/tests/cases/compiler/fromAsIdentifier2.ts b/tests/cases/compiler/fromAsIdentifier2.ts new file mode 100644 index 0000000000000..037e2128ce969 --- /dev/null +++ b/tests/cases/compiler/fromAsIdentifier2.ts @@ -0,0 +1,2 @@ +"use strict"; +var from; \ No newline at end of file From 85e7721e692d539d167db56bdc8b82721e2b52e6 Mon Sep 17 00:00:00 2001 From: Tingan Ho Date: Fri, 27 Feb 2015 11:23:14 +0800 Subject: [PATCH 7/7] Adds indentation option --- src/compiler/commandLineParser.ts | 8 +++- .../diagnosticInformationMap.generated.ts | 2 + src/compiler/diagnosticMessages.json | 8 ++++ src/compiler/emitter.ts | 45 ++++++++++--------- src/compiler/parser.ts | 19 ++++---- src/compiler/program.ts | 8 ++-- src/compiler/tsc.ts | 4 +- src/compiler/types.ts | 11 ++++- src/harness/fourslash.ts | 2 +- src/harness/harness.ts | 17 ++++++- src/services/services.ts | 11 ++--- src/services/utilities.ts | 2 +- .../baselines/reference/APISample_compile.js | 4 ++ tests/cases/unittests/incrementalParser.ts | 2 +- 14 files changed, 96 insertions(+), 47 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 4ba2da757e5d8..06230a16d0023 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -141,6 +141,12 @@ module ts { experimental: true }, { + name: "indentSize", + type: { "2": IndentSize.Narrow, "4": IndentSize.Wide }, + description: Diagnostics.Specify_indent_size, + error: Diagnostics.Argument_for_indent_size_must_be_2_or_4 + }, + { name: "target", shortName: "t", type: { "es3": ScriptTarget.ES3, "es5": ScriptTarget.ES5, "es6": ScriptTarget.ES6 }, @@ -161,7 +167,7 @@ module ts { description: Diagnostics.Watch_input_files, } ]; - + export function parseCommandLine(commandLine: string[]): ParsedCommandLine { var options: CompilerOptions = {}; var fileNames: string[] = []; diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 9169a7bf688cc..d6ac5b9b1754f 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -451,6 +451,8 @@ module ts { File_0_must_have_extension_ts_or_d_ts: { code: 6054, category: DiagnosticCategory.Error, key: "File '{0}' must have extension '.ts' or '.d.ts'." }, Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." }, Do_not_emit_declarations_for_code_that_has_an_internal_annotation: { code: 6056, category: DiagnosticCategory.Message, key: "Do not emit declarations for code that has an '@internal' annotation." }, + Specify_indent_size: { code: 6057, category: DiagnosticCategory.Message, key: "Specify indent size." }, + Argument_for_indent_size_must_be_2_or_4: { code: 6058, category: DiagnosticCategory.Message, key: "Argument for indent size must be 2 or 4." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 38a67dc6ed442..6487fb55f70cf 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1797,6 +1797,14 @@ "category": "Message", "code": 6056 }, + "Specify indent size.": { + "category": "Message", + "code": 6057 + }, + "Argument for indent size must be 2 or 4.": { + "category": "Message", + "code": 6058 + }, "Variable '{0}' implicitly has an '{1}' type.": { "category": "Error", diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 4f2f62fa47e7a..965b4a805ada9 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -53,16 +53,19 @@ module ts { referencePathsOutput: string; } - var indentStrings: string[] = ["", " "]; - export function getIndentString(level: number) { - if (indentStrings[level] === undefined) { - indentStrings[level] = getIndentString(level - 1) + indentStrings[1]; + var indentStrings: string[][] = [["", " "], ["", " "]]; + export function getIndentString(level: number, indentSize: IndentSize) { + if (indentStrings[indentSize][level] === undefined) { + indentStrings[indentSize][level] = getIndentString(level - 1, indentSize) + indentStrings[indentSize][1]; } - return indentStrings[level]; + return indentStrings[indentSize][level]; } - function getIndentSize() { - return indentStrings[1].length; + function getIndentSize(indentSize: IndentSize): number { + if(indentSize === IndentSize.Narrow) { + return 2; + } + return 4; } export function shouldEmitToOwnFile(sourceFile: SourceFile, compilerOptions: CompilerOptions): boolean { @@ -79,7 +82,7 @@ module ts { return isExternalModule(sourceFile) || isDeclarationFile(sourceFile); } - function createTextWriter(newLine: String): EmitTextWriter { + function createTextWriter(newLine: String, indentSize: IndentSize): EmitTextWriter { var output = ""; var indent = 0; var lineStart = true; @@ -89,7 +92,7 @@ module ts { function write(s: string) { if (s && s.length) { if (lineStart) { - output += getIndentString(indent); + output += getIndentString(indent, indentSize); lineStart = false; } output += s; @@ -140,7 +143,7 @@ module ts { getIndent: () => indent, getTextPos: () => output.length, getLine: () => lineCount + 1, - getColumn: () => lineStart ? indent * getIndentSize() + 1 : output.length - linePos + 1, + getColumn: () => lineStart ? indent * getIndentSize(indentSize) + 1 : output.length - linePos + 1, getText: () => output, }; } @@ -183,6 +186,7 @@ module ts { if (currentSourceFile.text.charCodeAt(comment.pos + 1) === CharacterCodes.asterisk) { var firstCommentLineAndCharacter = getLineAndCharacterOfPosition(currentSourceFile, comment.pos); var lineCount = getLineStarts(currentSourceFile).length; + var indentSize = typeof currentSourceFile.indentSize === 'number' ? currentSourceFile.indentSize : IndentSize.Wide; var firstCommentLineIndent: number; for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) { var nextLineStart = (currentLine + 1) === lineCount @@ -192,11 +196,11 @@ module ts { if (pos !== comment.pos) { // If we are not emitting first line, we need to write the spaces to adjust the alignment if (firstCommentLineIndent === undefined) { - firstCommentLineIndent = calculateIndent(getStartPositionOfLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos); + firstCommentLineIndent = calculateIndent(getStartPositionOfLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos, indentSize); } // These are number of spaces writer is going to write at current indent - var currentWriterIndentSpacing = writer.getIndent() * getIndentSize(); + var currentWriterIndentSpacing = writer.getIndent() * getIndentSize(indentSize); // Number of spaces we want to be writing // eg: Assume writer indent @@ -212,10 +216,10 @@ module ts { // More right indented comment */ --4 = 8 - 4 + 11 // class c { } // } - var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(pos, nextLineStart); + var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(pos, nextLineStart, currentSourceFile.indentSize); if (spacesToEmit > 0) { - var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize(); - var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize()); + var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize(indentSize); + var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize(indentSize), indentSize); // Write indent size string ( in eg 1: = "", 2: "" , 3: string with 8 spaces 4: string with 12 spaces writer.rawWrite(indentSizeSpaceString); @@ -259,12 +263,12 @@ module ts { } } - function calculateIndent(pos: number, end: number) { + function calculateIndent(pos: number, end: number, indentSize: IndentSize) { var currentLineIndent = 0; for (; pos < end && isWhiteSpace(currentSourceFile.text.charCodeAt(pos)); pos++) { if (currentSourceFile.text.charCodeAt(pos) === CharacterCodes.tab) { // Tabs = TabSize = indent size and go to next tabStop - currentLineIndent += getIndentSize() - (currentLineIndent % getIndentSize()); + currentLineIndent += getIndentSize(indentSize) - (currentLineIndent % getIndentSize(indentSize)); } else { // Single space @@ -357,7 +361,7 @@ module ts { var newLine = host.getNewLine(); var compilerOptions = host.getCompilerOptions(); var languageVersion = compilerOptions.target || ScriptTarget.ES3; - + var indentSize = typeof compilerOptions.indentSize === 'number' ? compilerOptions.indentSize : IndentSize.Wide; var write: (s: string) => void; var writeLine: () => void; var increaseIndent: () => void; @@ -452,7 +456,7 @@ module ts { } function createAndSetNewTextWriterWithSymbolWriter(): EmitTextWriterWithSymbolWriter { - var writer = createTextWriter(newLine); + var writer = createTextWriter(newLine, indentSize); writer.trackSymbol = trackSymbol; writer.writeKeyword = writer.write; writer.writeOperator = writer.write; @@ -1528,6 +1532,7 @@ module ts { export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile): EmitResult { var compilerOptions = host.getCompilerOptions(); var languageVersion = compilerOptions.target || ScriptTarget.ES3; + var indentSize = typeof compilerOptions.indentSize === 'number' ? compilerOptions.indentSize : IndentSize.Wide; var sourceMapDataList: SourceMapData[] = compilerOptions.sourceMap ? [] : undefined; var diagnostics: Diagnostic[] = []; var newLine = host.getNewLine(); @@ -1565,7 +1570,7 @@ module ts { }; function emitJavaScript(jsFilePath: string, root?: SourceFile) { - var writer = createTextWriter(newLine); + var writer = createTextWriter(newLine, indentSize); var write = writer.write; var writeTextOfNode = writer.writeTextOfNode; var writeLine = writer.writeLine; diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 9dc8a4755276f..276c63b83e3c7 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -760,11 +760,11 @@ module ts { if (sourceFile.statements.length === 0) { // If we don't have any statements in the current source file, then there's no real // way to incrementally parse. So just do a full parse instead. - return parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, /*syntaxCursor*/ undefined, /*setNodeParents*/ true) + return parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, sourceFile.indentSize, /*syntaxCursor*/ undefined, /*setNodeParents*/ true) } // Make sure we're not trying to incrementally update a source file more than once. Once - // we do an update the original source file is considered unusbale from that point onwards. + // we do an update the original source file is considered unusbale from that point onwards. // // This is because we do incremental parsing in-place. i.e. we take nodes from the old // tree and give them new positions and parents. From that point on, trusting the old @@ -817,14 +817,14 @@ module ts { // Now that we've set up our internal incremental state just proceed and parse the // source file in the normal fashion. When possible the parser will retrieve and // reuse nodes from the old tree. - // + // // Note: passing in 'true' for setNodeParents is very important. When incrementally // parsing, we will be reusing nodes from the old tree, and placing it into new - // parents. If we don't set the parents now, we'll end up with an observably - // inconsistent tree. Setting the parents on the new tree should be very fast. We + // parents. If we don't set the parents now, we'll end up with an observably + // inconsistent tree. Setting the parents on the new tree should be very fast. We // will immediately bail out of walking any subtrees when we can see that their parents // are already correct. - var result = parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, /* setParentNode */ true) + var result = parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, sourceFile.indentSize, syntaxCursor, /* setParentNode */ true) return result; } @@ -971,15 +971,15 @@ module ts { } } - export function createSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, setParentNodes = false): SourceFile { + export function createSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, indentSize: IndentSize, setParentNodes = false): SourceFile { var start = new Date().getTime(); - var result = parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes); + var result = parseSourceFile(fileName, sourceText, languageVersion, indentSize, /*syntaxCursor*/ undefined, setParentNodes); parseTime += new Date().getTime() - start; return result; } - function parseSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, syntaxCursor: SyntaxCursor, setParentNodes = false): SourceFile { + function parseSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, indentSize: IndentSize, syntaxCursor: SyntaxCursor, setParentNodes = false): SourceFile { var parsingContext: ParsingContext = 0; var identifiers: Map = {}; var identifierCount = 0; @@ -995,6 +995,7 @@ module ts { sourceFile.parseDiagnostics = []; sourceFile.bindDiagnostics = []; sourceFile.languageVersion = languageVersion; + sourceFile.indentSize = indentSize; sourceFile.fileName = normalizePath(fileName); sourceFile.flags = fileExtensionIs(sourceFile.fileName, ".d.ts") ? NodeFlags.DeclarationFile : 0; diff --git a/src/compiler/program.ts b/src/compiler/program.ts index a8e5b0b3a74b2..a8db53caa0103 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -13,11 +13,11 @@ module ts { // otherwise use toLowerCase as a canonical form. return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(); } - + // returned by CScript sys environment var unsupportedFileEncodingErrorCode = -2147024809; - function getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile { + function getSourceFile(fileName: string, languageVersion: ScriptTarget, indentSize: IndentSize, onError?: (message: string) => void): SourceFile { try { var text = sys.readFile(fileName, options.charset); } @@ -30,7 +30,7 @@ module ts { text = ""; } - return text !== undefined ? createSourceFile(fileName, text, languageVersion) : undefined; + return text !== undefined ? createSourceFile(fileName, text, languageVersion, indentSize) : undefined; } function writeFile(fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { @@ -304,7 +304,7 @@ module ts { } // We haven't looked for this file, do so now and cache result - var file = filesByName[canonicalName] = host.getSourceFile(fileName, options.target, hostErrorMessage => { + var file = filesByName[canonicalName] = host.getSourceFile(fileName, options.target, options.indentSize, hostErrorMessage => { if (refFile) { diagnostics.add(createFileDiagnostic(refFile, refStart, refLength, Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage)); diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index a3755650aed18..9542cfa56ecdd 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -258,7 +258,7 @@ module ts { reportDiagnostic(createCompilerDiagnostic(Diagnostics.Compilation_complete_Watching_for_file_changes)); } - function getSourceFile(fileName: string, languageVersion: ScriptTarget, onError ?: (message: string) => void) { + function getSourceFile(fileName: string, languageVersion: ScriptTarget, indentSize: IndentSize, onError ?: (message: string) => void) { // Return existing SourceFile object if one is available if (cachedProgram) { var sourceFile = cachedProgram.getSourceFile(fileName); @@ -268,7 +268,7 @@ module ts { } } // Use default host function - var sourceFile = hostGetSourceFile(fileName, languageVersion, onError); + var sourceFile = hostGetSourceFile(fileName, languageVersion, indentSize, onError); if (sourceFile && commandLine.options.watch) { // Attach a file watcher sourceFile.fileWatcher = sys.watchFile(sourceFile.fileName, () => sourceFileChanged(sourceFile)); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index d1730ce1f1b0d..bb56241c8f908 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -962,8 +962,9 @@ module ts { // The first node that causes this file to be an external module externalModuleIndicator: Node; languageVersion: ScriptTarget; + indentSize: IndentSize; identifiers: Map; - + /* @internal */ nodeCount: number; /* @internal */ identifierCount: number; /* @internal */ symbolCount: number; @@ -1550,6 +1551,7 @@ module ts { sourceRoot?: string; suppressImplicitAnyIndexErrors?: boolean; target?: ScriptTarget; + indentSize?: IndentSize; version?: boolean; watch?: boolean; stripInternal?: boolean; @@ -1577,6 +1579,11 @@ module ts { Latest = ES6, } + export const enum IndentSize { + Narrow = 0, + Wide = 1, + } + export interface ParsedCommandLine { options: CompilerOptions; fileNames: string[]; @@ -1735,7 +1742,7 @@ module ts { } export interface CompilerHost { - getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile; + getSourceFile(fileName: string, languageVersion: ScriptTarget, indentSize: IndentSize, onError?: (message: string) => void): SourceFile; getDefaultLibFileName(options: CompilerOptions): string; getCancellationToken? (): CancellationToken; writeFile: WriteFileCallback; diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index d8b7c358a5548..69bad1cc4f37e 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1436,7 +1436,7 @@ module FourSlash { var content = this.getFileContent(this.activeFile.fileName); var referenceSourceFile = ts.createLanguageServiceSourceFile( - this.activeFile.fileName, createScriptSnapShot(content), ts.ScriptTarget.Latest, /*version:*/ "0", /*setNodeParents:*/ false); + this.activeFile.fileName, createScriptSnapShot(content), ts.ScriptTarget.Latest, ts.IndentSize.Wide, /*version:*/ "0", /*setNodeParents:*/ false); var referenceSyntaxDiagnostics = referenceSourceFile.parseDiagnostics; Utils.assertDiagnosticsEquals(incrementalSyntaxDiagnostics, referenceSyntaxDiagnostics); diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 26c06c7950c65..af0a976d9e5c3 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -798,7 +798,7 @@ module Harness { export function createSourceFileAndAssertInvariants(fileName: string, sourceText: string, languageVersion: ts.ScriptTarget, assertInvariants = true) { // Only set the parent nodes if we're asserting invariants. We don't need them otherwise. - var result = ts.createSourceFile(fileName, sourceText, languageVersion, /*setParentNodes:*/ assertInvariants); + var result = ts.createSourceFile(fileName, sourceText, languageVersion, ts.IndentSize.Wide, /*setParentNodes:*/ assertInvariants); if (assertInvariants) { Utils.assertInvariants(result, /*parent:*/ undefined); } @@ -934,6 +934,7 @@ module Harness { options = options || { noResolve: false }; options.target = options.target || ts.ScriptTarget.ES3; + options.indentSize = options.indentSize || ts.IndentSize.Wide; options.module = options.module || ts.ModuleKind.None; options.noErrorTruncation = true; @@ -981,6 +982,20 @@ module Harness { } break; + case "indentsize": + if (typeof setting.value === "string") { + if (setting.value.toLowerCase() === "2") { + options.indentSize = ts.IndentSize.Narrow; + } else if (setting.value.toLowerCase() === "4") { + options.indentSize = ts.IndentSize.Wide; + } else { + throw new Error('Unknown compile target ' + setting.value); + } + } else { + options.indentSize = setting.value; + } + + case 'noemitonerror': options.noEmitOnError = !!setting.value; break; diff --git a/src/services/services.ts b/src/services/services.ts index 58c1d08110af4..a1384557ae77b 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -742,6 +742,7 @@ module ts { public symbolCount: number; public version: string; public languageVersion: ScriptTarget; + public indentSize: IndentSize; public identifiers: Map; public nameTable: Map; @@ -1614,7 +1615,7 @@ module ts { if (this.currentFileName !== fileName) { // This is a new file, just parse it - sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents:*/ true); + sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, IndentSize.Wide, version, /*setNodeParents:*/ true); } else if (this.currentFileVersion !== version) { // This is the same file, just a newer version. Incrementally parse the file. @@ -1639,8 +1640,8 @@ module ts { sourceFile.scriptSnapshot = scriptSnapshot; } - export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean): SourceFile { - var sourceFile = createSourceFile(fileName, scriptSnapshot.getText(0, scriptSnapshot.getLength()), scriptTarget, setNodeParents); + export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, indentSize: IndentSize, version: string, setNodeParents: boolean): SourceFile { + var sourceFile = createSourceFile(fileName, scriptSnapshot.getText(0, scriptSnapshot.getLength()), scriptTarget, indentSize, setNodeParents); setSourceFileFields(sourceFile, scriptSnapshot, version); // after full parsing we can use table with interned strings as name table sourceFile.nameTable = sourceFile.identifiers; @@ -1667,7 +1668,7 @@ module ts { } // Otherwise, just create a new source file. - return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents:*/ true); + return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, sourceFile.indentSize, version, /*setNodeParents:*/ true); } export function createDocumentRegistry(): DocumentRegistry { @@ -1716,7 +1717,7 @@ module ts { var bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); var entry = lookUp(bucket, fileName); if (!entry) { - var sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents:*/ false); + var sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, compilationSettings.indentSize, version, /*setNodeParents:*/ false); bucket[fileName] = entry = { sourceFile: sourceFile, diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 1315652304552..de348f824d42e 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -363,7 +363,7 @@ module ts { function writeIndent() { if (lineStart) { - var indentString = getIndentString(indent); + var indentString = getIndentString(indent, IndentSize.Wide); if (indentString) { displayParts.push(displayPart(indentString, SymbolDisplayPartKind.space)); } diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index 5381b327504b4..275377f21d45c 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -1247,6 +1247,10 @@ declare module "typescript" { ES6 = 2, Latest = 2, } + const enum IndentSize { + Narrow = 0, + Wide = 1, + } interface ParsedCommandLine { options: CompilerOptions; fileNames: string[]; diff --git a/tests/cases/unittests/incrementalParser.ts b/tests/cases/unittests/incrementalParser.ts index 54adcaf345f08..3bdabc2d44e4b 100644 --- a/tests/cases/unittests/incrementalParser.ts +++ b/tests/cases/unittests/incrementalParser.ts @@ -20,7 +20,7 @@ module ts { } function createTree(text: IScriptSnapshot, version: string) { - return createLanguageServiceSourceFile(/*fileName:*/ "", text, ScriptTarget.Latest, version, /*setNodeParents:*/ true) + return createLanguageServiceSourceFile(/*fileName:*/ "", text, ScriptTarget.Latest, IndentSize.Wide, version, /*setNodeParents:*/ true) } function assertSameDiagnostics(file1: SourceFile, file2: SourceFile) {