From acd4914c0e1f745e5699e224e15706f804c241ea Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 31 Jan 2015 21:14:28 -0800 Subject: [PATCH 001/106] Rename the main node package filename to match the package name --- Jakefile | 8 ++++++-- package.json | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Jakefile b/Jakefile index 15661debff6..2d6db20d386 100644 --- a/Jakefile +++ b/Jakefile @@ -323,6 +323,7 @@ var tscFile = path.join(builtLocalDirectory, compilerFilename); compileFile(tscFile, compilerSources, [builtLocalDirectory, copyright].concat(compilerSources), [copyright], /*useBuiltCompiler:*/ false); var servicesFile = path.join(builtLocalDirectory, "typescriptServices.js"); +var nodePackageFile = path.join(builtLocalDirectory, "typescript.js"); compileFile(servicesFile, servicesSources,[builtLocalDirectory, copyright].concat(servicesSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, @@ -331,7 +332,10 @@ compileFile(servicesFile, servicesSources,[builtLocalDirectory, copyright].conca /*outDir*/ undefined, /*preserveConstEnums*/ true, /*keepComments*/ false, - /*noResolve*/ false); + /*noResolve*/ false, + /*callback*/ function () { + jake.cpR(servicesFile, nodePackageFile, {silent: true}); + }); var nodeDefinitionsFile = path.join(builtLocalDirectory, "typescript.d.ts"); var standaloneDefinitionsFile = path.join(builtLocalDirectory, "typescriptServices.d.ts"); @@ -425,7 +429,7 @@ task("generate-spec", [specMd]) // Makes a new LKG. This target does not build anything, but errors if not all the outputs are present in the built/local directory desc("Makes a new LKG out of the built js files"); task("LKG", ["clean", "release", "local"].concat(libraryTargets), function() { - var expectedFiles = [tscFile, servicesFile, nodeDefinitionsFile, standaloneDefinitionsFile, internalNodeDefinitionsFile, internalStandaloneDefinitionsFile].concat(libraryTargets); + var expectedFiles = [tscFile, servicesFile, nodePackageFile, nodeDefinitionsFile, standaloneDefinitionsFile, internalNodeDefinitionsFile, internalStandaloneDefinitionsFile].concat(libraryTargets); var missingFiles = expectedFiles.filter(function (f) { return !fs.existsSync(f); }); diff --git a/package.json b/package.json index 2bd89706606..94b5435be19 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "url": "https://github.com/Microsoft/TypeScript.git" }, "preferGlobal": true, - "main": "./bin/typescriptServices.js", + "main": "./bin/typescript.js", "bin": { "tsc": "./bin/tsc" }, From 11d75ef4ce1d341c9cc26eb96e8dca41ba70843d Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 26 Jan 2015 14:34:22 -0800 Subject: [PATCH 002/106] Allow Symbol indexer in ES6 --- src/compiler/checker.ts | 24 ++++++++++++------- .../diagnosticInformationMap.generated.ts | 3 ++- src/compiler/diagnosticMessages.json | 7 +++++- src/compiler/utilities.ts | 7 ++++++ .../reference/arraySigChecking.errors.txt | 4 ++-- ...eReferenceWithoutTypeArgument.d.errors.txt | 4 ++-- ...ypeReferenceWithoutTypeArgument.errors.txt | 4 ++-- ...peReferenceWithoutTypeArgument2.errors.txt | 4 ++-- ...peReferenceWithoutTypeArgument3.errors.txt | 4 ++-- .../reference/indexTypeCheck.errors.txt | 4 ++-- .../parserES5SymbolIndexer1.errors.txt | 12 ++++++++++ .../parserES5SymbolIndexer2.errors.txt | 12 ++++++++++ .../parserES5SymbolIndexer3.errors.txt | 12 ++++++++++ .../parserIndexSignature6.errors.txt | 4 ++-- .../parserIndexSignature8.errors.txt | 8 +++---- .../reference/parserSymbolIndexer1.js | 6 +++++ .../reference/parserSymbolIndexer1.types | 8 +++++++ .../reference/parserSymbolIndexer2.js | 11 +++++++++ .../reference/parserSymbolIndexer2.types | 8 +++++++ .../reference/parserSymbolIndexer3.errors.txt | 9 +++++++ .../reference/parserSymbolIndexer4.js | 7 ++++++ .../reference/parserSymbolIndexer4.types | 8 +++++++ .../reference/parserSymbolIndexer5.errors.txt | 21 ++++++++++++++++ .../Symbols/parserES5SymbolIndexer1.ts | 4 ++++ .../Symbols/parserES5SymbolIndexer2.ts | 4 ++++ .../Symbols/parserES5SymbolIndexer3.ts | 4 ++++ .../Symbols/parserSymbolIndexer1.ts | 4 ++++ .../Symbols/parserSymbolIndexer2.ts | 4 ++++ .../Symbols/parserSymbolIndexer3.ts | 4 ++++ .../Symbols/parserSymbolIndexer4.ts | 4 ++++ .../Symbols/parserSymbolIndexer5.ts | 4 ++++ 31 files changed, 195 insertions(+), 28 deletions(-) create mode 100644 tests/baselines/reference/parserES5SymbolIndexer1.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolIndexer2.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolIndexer3.errors.txt create mode 100644 tests/baselines/reference/parserSymbolIndexer1.js create mode 100644 tests/baselines/reference/parserSymbolIndexer1.types create mode 100644 tests/baselines/reference/parserSymbolIndexer2.js create mode 100644 tests/baselines/reference/parserSymbolIndexer2.types create mode 100644 tests/baselines/reference/parserSymbolIndexer3.errors.txt create mode 100644 tests/baselines/reference/parserSymbolIndexer4.js create mode 100644 tests/baselines/reference/parserSymbolIndexer4.types create mode 100644 tests/baselines/reference/parserSymbolIndexer5.errors.txt create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7c43b8bb233..56f5ec09001 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10472,25 +10472,33 @@ module ts { return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_exactly_one_parameter); } } - else if (parameter.dotDotDotToken) { + if (parameter.dotDotDotToken) { return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.An_index_signature_cannot_have_a_rest_parameter); } - else if (parameter.flags & NodeFlags.Modifier) { + if (parameter.flags & NodeFlags.Modifier) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier); } - else if (parameter.questionToken) { + if (parameter.questionToken) { return grammarErrorOnNode(parameter.questionToken, Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark); } - else if (parameter.initializer) { + if (parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_cannot_have_an_initializer); } - else if (!parameter.type) { + if (!parameter.type) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_must_have_a_type_annotation); } - else if (parameter.type.kind !== SyntaxKind.StringKeyword && parameter.type.kind !== SyntaxKind.NumberKeyword) { - return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_or_number); + if (parameter.type.kind !== SyntaxKind.StringKeyword && parameter.type.kind !== SyntaxKind.NumberKeyword) { + if (isESSymbolTypeNode(parameter.type)) { + if (languageVersion < ScriptTarget.ES6) { + return grammarErrorOnNode(parameter.type, Diagnostics.Symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher); + } + // No error for parameter type + } + else { + return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_number_or_Symbol); + } } - else if (!node.type) { + if (!node.type) { return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_a_type_annotation); } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 1188d346191..c6a7ad81334 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -19,7 +19,7 @@ module ts { An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: DiagnosticCategory.Error, key: "An index signature parameter cannot have an initializer." }, An_index_signature_must_have_a_type_annotation: { code: 1021, category: DiagnosticCategory.Error, key: "An index signature must have a type annotation." }, An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: DiagnosticCategory.Error, key: "An index signature parameter must have a type annotation." }, - An_index_signature_parameter_type_must_be_string_or_number: { code: 1023, category: DiagnosticCategory.Error, key: "An index signature parameter type must be 'string' or 'number'." }, + An_index_signature_parameter_type_must_be_string_number_or_Symbol: { code: 1023, category: DiagnosticCategory.Error, key: "An index signature parameter type must be 'string', 'number', or 'Symbol'." }, A_class_or_interface_declaration_can_only_have_one_extends_clause: { code: 1024, category: DiagnosticCategory.Error, key: "A class or interface declaration can only have one 'extends' clause." }, An_extends_clause_must_precede_an_implements_clause: { code: 1025, category: DiagnosticCategory.Error, key: "An 'extends' clause must precede an 'implements' clause." }, A_class_can_only_extend_a_single_class: { code: 1026, category: DiagnosticCategory.Error, key: "A class can only extend a single class." }, @@ -147,6 +147,7 @@ module ts { Merge_conflict_marker_encountered: { code: 1185, category: DiagnosticCategory.Error, key: "Merge conflict marker encountered." }, A_rest_element_cannot_have_an_initializer: { code: 1186, category: DiagnosticCategory.Error, key: "A rest element cannot have an initializer." }, A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." }, + Symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1188, category: DiagnosticCategory.Error, key: "'Symbol' indexers are only available when targeting ECMAScript 6 and higher.", isEarly: true }, Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." }, Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." }, Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index b1a794716a4..0cf83d7b185 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -67,7 +67,7 @@ "category": "Error", "code": 1022 }, - "An index signature parameter type must be 'string' or 'number'.": { + "An index signature parameter type must be 'string', 'number', or 'Symbol'.": { "category": "Error", "code": 1023 }, @@ -579,6 +579,11 @@ "category": "Error", "code": 1187 }, + "'Symbol' indexers are only available when targeting ECMAScript 6 and higher.": { + "category": "Error", + "code": 1188, + "isEarly": true + }, "Duplicate identifier '{0}'.": { "category": "Error", diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5a50e2799dc..8c3dd112b15 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -835,6 +835,13 @@ module ts { return SyntaxKind.FirstTriviaToken <= token && token <= SyntaxKind.LastTriviaToken; } + export function isESSymbolTypeNode(node: Node): boolean { + return node.kind === SyntaxKind.TypeReference && + (node).typeArguments === undefined && + (node).typeName.kind === SyntaxKind.Identifier && + ((node).typeName).text === "Symbol"; + } + export function isModifier(token: SyntaxKind): boolean { switch (token) { case SyntaxKind.PublicKeyword: diff --git a/tests/baselines/reference/arraySigChecking.errors.txt b/tests/baselines/reference/arraySigChecking.errors.txt index b70b659773c..82a32dbda4d 100644 --- a/tests/baselines/reference/arraySigChecking.errors.txt +++ b/tests/baselines/reference/arraySigChecking.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. tests/cases/compiler/arraySigChecking.ts(18,5): error TS2322: Type 'void[]' is not assignable to type 'string[]'. Type 'void' is not assignable to type 'string'. tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' is not assignable to type 'number[][][]'. @@ -20,7 +20,7 @@ tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' var foo: { [index: any]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. } interface myInt { diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt index 6c98d419dec..68543a10b01 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(10,21): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,26): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,26): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(14,23): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -36,7 +36,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). declare var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt index d57f3c2fc0d..9076b86ff3e 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(10,13): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,14): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,18): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,14): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,18): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(14,13): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -46,7 +46,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt index 745da9aa106..ca79c04f6ed 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(10,13): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,14): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,18): error TS2314: Generic type 'I' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,14): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,18): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(14,13): error TS2314: Generic type 'I' requires 1 type argument(s). @@ -46,7 +46,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'I' requires 1 type argument(s). var d: { [x: I]: I }; ~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. ~ !!! error TS2314: Generic type 'I' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt index 1fec52356a2..7154a90cb8a 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(10,21): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(11,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(11,26): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,19): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,26): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(14,23): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -36,7 +36,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). declare var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/indexTypeCheck.errors.txt b/tests/baselines/reference/indexTypeCheck.errors.txt index 03d0e2ce8ed..0914ea9ca7b 100644 --- a/tests/baselines/reference/indexTypeCheck.errors.txt +++ b/tests/baselines/reference/indexTypeCheck.errors.txt @@ -4,7 +4,7 @@ tests/cases/compiler/indexTypeCheck.ts(17,2): error TS2413: Numeric index type ' tests/cases/compiler/indexTypeCheck.ts(22,2): error TS2413: Numeric index type 'Orange' is not assignable to string index type 'Yellow'. tests/cases/compiler/indexTypeCheck.ts(27,2): error TS2413: Numeric index type 'number' is not assignable to string index type 'string'. tests/cases/compiler/indexTypeCheck.ts(32,3): error TS1096: An index signature must have exactly one parameter. -tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. @@ -58,7 +58,7 @@ tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression interface Magenta { [p:Purple]; // error ~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. } var yellow: Yellow; diff --git a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt new file mode 100644 index 00000000000..8128f95d3b6 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts (2 errors) ==== + interface I { + [s: Symbol]: string; + ~~~~~~ +!!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt new file mode 100644 index 00000000000..b1904d0fe53 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts (2 errors) ==== + class C { + [s: Symbol]: string; + ~~~~~~ +!!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt new file mode 100644 index 00000000000..bc1bc64aeda --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts (2 errors) ==== + var x: { + [s: Symbol]: string; + ~~~~~~ +!!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature6.errors.txt b/tests/baselines/reference/parserIndexSignature6.errors.txt index db53f219832..eae5aae90c9 100644 --- a/tests/baselines/reference/parserIndexSignature6.errors.txt +++ b/tests/baselines/reference/parserIndexSignature6.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts(2,4): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts(2,4): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. ==== tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts (1 errors) ==== interface I { [a:boolean] ~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature8.errors.txt b/tests/baselines/reference/parserIndexSignature8.errors.txt index 87369df1b76..859d373eca4 100644 --- a/tests/baselines/reference/parserIndexSignature8.errors.txt +++ b/tests/baselines/reference/parserIndexSignature8.errors.txt @@ -1,12 +1,12 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(1,13): error TS1023: An index signature parameter type must be 'string' or 'number'. -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(2,14): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(1,13): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(2,14): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. ==== tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts (2 errors) ==== var foo: { [index: any]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. var foo2: { [index: RegExp]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string' or 'number'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer1.js b/tests/baselines/reference/parserSymbolIndexer1.js new file mode 100644 index 00000000000..4c99edda168 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer1.js @@ -0,0 +1,6 @@ +//// [parserSymbolIndexer1.ts] +interface I { + [s: Symbol]: string; +} + +//// [parserSymbolIndexer1.js] diff --git a/tests/baselines/reference/parserSymbolIndexer1.types b/tests/baselines/reference/parserSymbolIndexer1.types new file mode 100644 index 00000000000..86020c8cbdd --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer1.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts === +interface I { +>I : I + + [s: Symbol]: string; +>s : Symbol +>Symbol : Symbol +} diff --git a/tests/baselines/reference/parserSymbolIndexer2.js b/tests/baselines/reference/parserSymbolIndexer2.js new file mode 100644 index 00000000000..1acae44ae2a --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer2.js @@ -0,0 +1,11 @@ +//// [parserSymbolIndexer2.ts] +class C { + [s: Symbol]: string; +} + +//// [parserSymbolIndexer2.js] +var C = (function () { + function C() { + } + return C; +})(); diff --git a/tests/baselines/reference/parserSymbolIndexer2.types b/tests/baselines/reference/parserSymbolIndexer2.types new file mode 100644 index 00000000000..ffa9ff96346 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer2.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts === +class C { +>C : C + + [s: Symbol]: string; +>s : Symbol +>Symbol : Symbol +} diff --git a/tests/baselines/reference/parserSymbolIndexer3.errors.txt b/tests/baselines/reference/parserSymbolIndexer3.errors.txt new file mode 100644 index 00000000000..f5066a09ee9 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer3.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts(2,5): error TS1145: Modifiers not permitted on index signature members. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts (1 errors) ==== + class C { + static [s: Symbol]: string; + ~~~~~~ +!!! error TS1145: Modifiers not permitted on index signature members. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer4.js b/tests/baselines/reference/parserSymbolIndexer4.js new file mode 100644 index 00000000000..607b1ada481 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer4.js @@ -0,0 +1,7 @@ +//// [parserSymbolIndexer4.ts] +var x: { + [s: Symbol]: string; +} + +//// [parserSymbolIndexer4.js] +var x; diff --git a/tests/baselines/reference/parserSymbolIndexer4.types b/tests/baselines/reference/parserSymbolIndexer4.types new file mode 100644 index 00000000000..0f632e5dc32 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer4.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts === +var x: { +>x : {} + + [s: Symbol]: string; +>s : Symbol +>Symbol : Symbol +} diff --git a/tests/baselines/reference/parserSymbolIndexer5.errors.txt b/tests/baselines/reference/parserSymbolIndexer5.errors.txt new file mode 100644 index 00000000000..611ad109a34 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer5.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,6): error TS2304: Cannot find name 's'. +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,7): error TS1005: ']' expected. +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,15): error TS1005: ',' expected. +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,16): error TS1136: Property assignment expected. +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(3,1): error TS1005: ':' expected. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts (5 errors) ==== + var x = { + [s: Symbol]: "" + ~ +!!! error TS2304: Cannot find name 's'. + ~ +!!! error TS1005: ']' expected. + ~ +!!! error TS1005: ',' expected. + ~ +!!! error TS1136: Property assignment expected. + } + ~ +!!! error TS1005: ':' expected. \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts new file mode 100644 index 00000000000..f90f804a615 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts @@ -0,0 +1,4 @@ +//@target: ES5 +interface I { + [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts new file mode 100644 index 00000000000..1f13320f5d1 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts @@ -0,0 +1,4 @@ +//@target: ES5 +class C { + [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts new file mode 100644 index 00000000000..1e3829f9e40 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts @@ -0,0 +1,4 @@ +//@target: ES5 +var x: { + [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts new file mode 100644 index 00000000000..668ebb496f4 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts @@ -0,0 +1,4 @@ +//@target: ES6 +interface I { + [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts new file mode 100644 index 00000000000..cf4ee50974e --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts @@ -0,0 +1,4 @@ +//@target: ES6 +class C { + [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts new file mode 100644 index 00000000000..f7f7154af35 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts @@ -0,0 +1,4 @@ +//@target: ES6 +class C { + static [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts new file mode 100644 index 00000000000..99e8112ce55 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var x: { + [s: Symbol]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts new file mode 100644 index 00000000000..8c468043a8f --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var x = { + [s: Symbol]: "" +} \ No newline at end of file From b30d8f39c23b08063c12e9b11a6e5577cc0b537a Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 27 Jan 2015 16:07:01 -0800 Subject: [PATCH 003/106] Change computed property error messages to be about symbols --- src/compiler/checker.ts | 14 +++--- .../diagnosticInformationMap.generated.ts | 10 ++--- src/compiler/diagnosticMessages.json | 10 ++--- .../computedPropertyNames12.errors.txt | 44 +++++++++---------- .../computedPropertyNames35.errors.txt | 4 +- .../computedPropertyNames42.errors.txt | 4 +- ...edPropertyNamesDeclarationEmit3.errors.txt | 4 +- ...edPropertyNamesDeclarationEmit4.errors.txt | 4 +- ...omputedPropertyNamesOnOverloads.errors.txt | 8 ++-- tests/baselines/reference/giant.errors.txt | 32 +++++++------- ...SignatureMustHaveTypeAnnotation.errors.txt | 8 ++-- .../indexSignatureWithInitializer.errors.txt | 8 ++-- .../indexWithoutParamType2.errors.txt | 4 +- .../parserComputedPropertyName10.errors.txt | 4 +- .../parserComputedPropertyName11.errors.txt | 4 +- .../parserComputedPropertyName13.errors.txt | 4 +- .../parserComputedPropertyName14.errors.txt | 4 +- .../parserComputedPropertyName15.errors.txt | 4 +- .../parserComputedPropertyName18.errors.txt | 4 +- .../parserComputedPropertyName19.errors.txt | 4 +- .../parserComputedPropertyName20.errors.txt | 4 +- .../parserComputedPropertyName21.errors.txt | 4 +- .../parserComputedPropertyName22.errors.txt | 4 +- .../parserComputedPropertyName25.errors.txt | 4 +- .../parserComputedPropertyName28.errors.txt | 8 ++-- .../parserComputedPropertyName29.errors.txt | 8 ++-- .../parserComputedPropertyName31.errors.txt | 8 ++-- .../parserComputedPropertyName32.errors.txt | 4 +- .../parserComputedPropertyName36.errors.txt | 4 +- .../parserComputedPropertyName7.errors.txt | 4 +- .../parserComputedPropertyName8.errors.txt | 4 +- .../parserComputedPropertyName9.errors.txt | 4 +- .../parserES5ComputedPropertyName1.errors.txt | 4 +- ...parserES5ComputedPropertyName10.errors.txt | 4 +- ...parserES5ComputedPropertyName11.errors.txt | 4 +- .../parserES5ComputedPropertyName5.errors.txt | 4 +- .../parserES5ComputedPropertyName7.errors.txt | 4 +- .../parserES5ComputedPropertyName8.errors.txt | 4 +- .../parserES5ComputedPropertyName9.errors.txt | 4 +- .../parserIndexSignature11.errors.txt | 4 +- .../parserIndexSignature4.errors.txt | 4 +- .../parserIndexSignature5.errors.txt | 4 +- .../reference/propertyAssignment.errors.txt | 4 +- 43 files changed, 143 insertions(+), 143 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 56f5ec09001..70aa5187549 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10803,17 +10803,17 @@ module ts { // and accessors are not allowed in ambient contexts in general, // so this error only really matters for methods. if (isInAmbientContext(node)) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_an_ambient_context); + return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_Symbol); } else if (!node.body) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_method_overloads); + return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_Symbol); } } else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_interfaces); + return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol); } else if (node.parent.kind === SyntaxKind.TypeLiteral) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_type_literals); + return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol); } } @@ -11084,17 +11084,17 @@ module ts { function checkGrammarProperty(node: PropertyDeclaration) { if (node.parent.kind === SyntaxKind.ClassDeclaration) { if (checkGrammarForInvalidQuestionMark(node, node.questionToken, Diagnostics.A_class_member_cannot_be_declared_optional) || - checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_class_property_declarations)) { + checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_Symbol)) { return true; } } else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) { - if (checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_interfaces)) { + if (checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol)) { return true; } } else if (node.parent.kind === SyntaxKind.TypeLiteral) { - if (checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_type_literals)) { + if (checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol)) { return true; } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index c6a7ad81334..6c89679a0a0 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -123,12 +123,12 @@ module ts { An_object_member_cannot_be_declared_optional: { code: 1162, category: DiagnosticCategory.Error, key: "An object member cannot be declared optional." }, yield_expression_must_be_contained_within_a_generator_declaration: { code: 1163, category: DiagnosticCategory.Error, key: "'yield' expression must be contained_within a generator declaration." }, Computed_property_names_are_not_allowed_in_enums: { code: 1164, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in enums." }, - Computed_property_names_are_not_allowed_in_an_ambient_context: { code: 1165, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in an ambient context." }, - Computed_property_names_are_not_allowed_in_class_property_declarations: { code: 1166, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in class property declarations." }, + A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_Symbol: { code: 1165, category: DiagnosticCategory.Error, key: "A computed property name in an ambient context must directly refer to a built-in Symbol." }, + A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_Symbol: { code: 1166, category: DiagnosticCategory.Error, key: "A computed property name in a class property declaration must directly refer to a built-in Symbol." }, Computed_property_names_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1167, category: DiagnosticCategory.Error, key: "Computed property names are only available when targeting ECMAScript 6 and higher." }, - Computed_property_names_are_not_allowed_in_method_overloads: { code: 1168, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in method overloads." }, - Computed_property_names_are_not_allowed_in_interfaces: { code: 1169, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in interfaces." }, - Computed_property_names_are_not_allowed_in_type_literals: { code: 1170, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in type literals." }, + A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_Symbol: { code: 1168, category: DiagnosticCategory.Error, key: "A computed property name in a method overload must directly refer to a built-in Symbol." }, + A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol: { code: 1169, category: DiagnosticCategory.Error, key: "A computed property name in an interface must directly refer to a built-in Symbol." }, + A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol: { code: 1170, category: DiagnosticCategory.Error, key: "A computed property name in a type literal must directly refer to a built-in Symbol." }, A_comma_expression_is_not_allowed_in_a_computed_property_name: { code: 1171, category: DiagnosticCategory.Error, key: "A comma expression is not allowed in a computed property name." }, extends_clause_already_seen: { code: 1172, category: DiagnosticCategory.Error, key: "'extends' clause already seen." }, extends_clause_must_precede_implements_clause: { code: 1173, category: DiagnosticCategory.Error, key: "'extends' clause must precede 'implements' clause." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 0cf83d7b185..709750679dc 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -483,11 +483,11 @@ "category": "Error", "code": 1164 }, - "Computed property names are not allowed in an ambient context.": { + "A computed property name in an ambient context must directly refer to a built-in Symbol.": { "category": "Error", "code": 1165 }, - "Computed property names are not allowed in class property declarations.": { + "A computed property name in a class property declaration must directly refer to a built-in Symbol.": { "category": "Error", "code": 1166 }, @@ -495,15 +495,15 @@ "category": "Error", "code": 1167 }, - "Computed property names are not allowed in method overloads.": { + "A computed property name in a method overload must directly refer to a built-in Symbol.": { "category": "Error", "code": 1168 }, - "Computed property names are not allowed in interfaces.": { + "A computed property name in an interface must directly refer to a built-in Symbol.": { "category": "Error", "code": 1169 }, - "Computed property names are not allowed in type literals.": { + "A computed property name in a type literal must directly refer to a built-in Symbol.": { "category": "Error", "code": 1170 }, diff --git a/tests/baselines/reference/computedPropertyNames12.errors.txt b/tests/baselines/reference/computedPropertyNames12.errors.txt index 56774fe8dae..f0fd658c33a 100644 --- a/tests/baselines/reference/computedPropertyNames12.errors.txt +++ b/tests/baselines/reference/computedPropertyNames12.errors.txt @@ -1,14 +1,14 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(5,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(6,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(7,12): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(8,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(9,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(10,12): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(11,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(12,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(13,12): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(14,5): error TS1166: Computed property names are not allowed in class property declarations. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(15,12): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(5,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(6,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(7,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(8,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(9,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(10,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(11,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(12,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(13,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(14,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(15,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts (11 errors) ==== @@ -18,35 +18,35 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(15,12) class C { [s]: number; ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. [n] = n; ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. static [s + s]: string; ~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. [s + n] = 2; ~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. [+s]: typeof s; ~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. static [""]: number; ~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. [0]: number; ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. [a]: number; ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. static [true]: number; ~~~~~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. [`hello bye`] = 0; ~~~~~~~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. static [`hello ${a} bye`] = 0 ~~~~~~~~~~~~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames35.errors.txt b/tests/baselines/reference/computedPropertyNames35.errors.txt index 01c4614e84a..c9986864b0e 100644 --- a/tests/baselines/reference/computedPropertyNames35.errors.txt +++ b/tests/baselines/reference/computedPropertyNames35.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,10): error TS2466: A computed property name cannot reference a type parameter from its containing type. @@ -8,7 +8,7 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,10): bar(): string; [foo()](): void; ~~~~~~~~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2466: A computed property name cannot reference a type parameter from its containing type. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames42.errors.txt b/tests/baselines/reference/computedPropertyNames42.errors.txt index 059b3117a43..2c05e8869c0 100644 --- a/tests/baselines/reference/computedPropertyNames42.errors.txt +++ b/tests/baselines/reference/computedPropertyNames42.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): error TS2411: Property '[""]' of type 'Foo' is not assignable to string index type 'Foo2'. @@ -12,7 +12,7 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): // Computed properties [""]: Foo; ~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~~~~~~~~~~ !!! error TS2411: Property '[""]' of type 'Foo' is not assignable to string index type 'Foo2'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt b/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt index 69ff2b9e452..ab2d1822e4c 100644 --- a/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt +++ b/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit3.ts(2,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit3.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit3.ts (1 errors) ==== interface I { ["" + ""](): void; ~~~~~~~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt b/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt index 53eb057f8a1..f366427d525 100644 --- a/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt +++ b/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit4.ts(2,5): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit4.ts(2,5): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit4.ts (1 errors) ==== var v: { ["" + ""](): void; ~~~~~~~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt b/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt index b3c2957a13f..64b6ba87452 100644 --- a/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt +++ b/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(4,5): error TS1168: Computed property names are not allowed in method overloads. -tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(5,5): error TS1168: Computed property names are not allowed in method overloads. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(4,5): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(5,5): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts (2 errors) ==== @@ -8,9 +8,9 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads. class C { [methodName](v: string); ~~~~~~~~~~~~ -!!! error TS1168: Computed property names are not allowed in method overloads. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. [methodName](); ~~~~~~~~~~~~ -!!! error TS1168: Computed property names are not allowed in method overloads. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. [methodName](v?: string) { } } \ No newline at end of file diff --git a/tests/baselines/reference/giant.errors.txt b/tests/baselines/reference/giant.errors.txt index e8c574d2115..99a4360ac52 100644 --- a/tests/baselines/reference/giant.errors.txt +++ b/tests/baselines/reference/giant.errors.txt @@ -16,7 +16,7 @@ tests/cases/compiler/giant.ts(34,16): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(35,12): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(36,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(36,16): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(61,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(61,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(61,6): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(62,5): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(63,6): error TS1096: An index signature must have exactly one parameter. @@ -39,7 +39,7 @@ tests/cases/compiler/giant.ts(98,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(99,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(100,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(100,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(125,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(125,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(125,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(126,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(127,10): error TS1096: An index signature must have exactly one parameter. @@ -63,7 +63,7 @@ tests/cases/compiler/giant.ts(177,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(178,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(179,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(179,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(204,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(204,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(204,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(205,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(206,10): error TS1096: An index signature must have exactly one parameter. @@ -119,7 +119,7 @@ tests/cases/compiler/giant.ts(292,16): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(293,12): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(294,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(294,16): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(319,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(319,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(319,6): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(320,5): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(321,6): error TS1096: An index signature must have exactly one parameter. @@ -142,7 +142,7 @@ tests/cases/compiler/giant.ts(356,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(357,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(358,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(358,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(383,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(383,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(383,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(384,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(385,10): error TS1096: An index signature must have exactly one parameter. @@ -166,7 +166,7 @@ tests/cases/compiler/giant.ts(435,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(436,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(437,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(437,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(462,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(462,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(462,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(463,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(464,10): error TS1096: An index signature must have exactly one parameter. @@ -238,7 +238,7 @@ tests/cases/compiler/giant.ts(556,21): error TS1036: Statements are not allowed tests/cases/compiler/giant.ts(558,24): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(561,21): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(563,21): error TS1184: An implementation cannot be declared in ambient contexts. -tests/cases/compiler/giant.ts(587,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(587,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(587,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(588,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(589,10): error TS1096: An index signature must have exactly one parameter. @@ -255,7 +255,7 @@ tests/cases/compiler/giant.ts(621,26): error TS1184: An implementation cannot be tests/cases/compiler/giant.ts(623,24): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(626,21): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(628,21): error TS1184: An implementation cannot be declared in ambient contexts. -tests/cases/compiler/giant.ts(653,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/giant.ts(653,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/giant.ts(653,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(654,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(655,10): error TS1096: An index signature must have exactly one parameter. @@ -364,7 +364,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -474,7 +474,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -601,7 +601,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -828,7 +828,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -938,7 +938,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -1065,7 +1065,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -1334,7 +1334,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -1434,7 +1434,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; diff --git a/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt b/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt index 82e96bf3846..e8b8ed9d488 100644 --- a/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt +++ b/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt @@ -1,7 +1,7 @@ -tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(3,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(3,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(3,6): error TS2304: Cannot find name 'x'. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(4,5): error TS1021: An index signature must have a type annotation. -tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(9,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(9,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(9,6): error TS2304: Cannot find name 'x'. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(14,5): error TS1021: An index signature must have a type annotation. @@ -11,7 +11,7 @@ tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(14,5): error TS1021 // Used to be indexer, now it is a computed property [x]: string; ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'x'. [x: string]; @@ -23,7 +23,7 @@ tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(14,5): error TS1021 // Used to be indexer, now it is a computed property [x]: string ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'x'. diff --git a/tests/baselines/reference/indexSignatureWithInitializer.errors.txt b/tests/baselines/reference/indexSignatureWithInitializer.errors.txt index d6f547a25cb..b7298e6b5e7 100644 --- a/tests/baselines/reference/indexSignatureWithInitializer.errors.txt +++ b/tests/baselines/reference/indexSignatureWithInitializer.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/indexSignatureWithInitializer.ts(3,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/compiler/indexSignatureWithInitializer.ts(3,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/compiler/indexSignatureWithInitializer.ts(3,6): error TS2304: Cannot find name 'x'. -tests/cases/compiler/indexSignatureWithInitializer.ts(7,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/compiler/indexSignatureWithInitializer.ts(7,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/compiler/indexSignatureWithInitializer.ts(7,6): error TS2304: Cannot find name 'x'. @@ -9,7 +9,7 @@ tests/cases/compiler/indexSignatureWithInitializer.ts(7,6): error TS2304: Cannot interface I { [x = '']: string; ~~~~~~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'x'. } @@ -17,7 +17,7 @@ tests/cases/compiler/indexSignatureWithInitializer.ts(7,6): error TS2304: Cannot class C { [x = 0]: string ~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'x'. } \ No newline at end of file diff --git a/tests/baselines/reference/indexWithoutParamType2.errors.txt b/tests/baselines/reference/indexWithoutParamType2.errors.txt index 468368b5f23..163b7b98753 100644 --- a/tests/baselines/reference/indexWithoutParamType2.errors.txt +++ b/tests/baselines/reference/indexWithoutParamType2.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/indexWithoutParamType2.ts(3,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/compiler/indexWithoutParamType2.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/compiler/indexWithoutParamType2.ts(3,6): error TS2304: Cannot find name 'x'. @@ -7,7 +7,7 @@ tests/cases/compiler/indexWithoutParamType2.ts(3,6): error TS2304: Cannot find n // Used to be indexer, now it is a computed property [x]: string ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'x'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName10.errors.txt b/tests/baselines/reference/parserComputedPropertyName10.errors.txt index 061e2c40c2d..96ed65032af 100644 --- a/tests/baselines/reference/parserComputedPropertyName10.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName10.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName10.ts(2,4): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName10.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName10.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e] = 1 ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName11.errors.txt b/tests/baselines/reference/parserComputedPropertyName11.errors.txt index 65748f72b24..2083c5bc819 100644 --- a/tests/baselines/reference/parserComputedPropertyName11.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName11.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName11.ts(2,4): error TS1168: Computed property names are not allowed in method overloads. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName11.ts(2,4): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName11.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e](); ~~~ -!!! error TS1168: Computed property names are not allowed in method overloads. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName13.errors.txt b/tests/baselines/reference/parserComputedPropertyName13.errors.txt index b209f3c7d01..e0d06224488 100644 --- a/tests/baselines/reference/parserComputedPropertyName13.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName13.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts(1,10): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts (2 errors) ==== var v: { [e]: number }; ~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName14.errors.txt b/tests/baselines/reference/parserComputedPropertyName14.errors.txt index 6ac2d276a80..99e36669f50 100644 --- a/tests/baselines/reference/parserComputedPropertyName14.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName14.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts(1,10): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts (2 errors) ==== var v: { [e](): number }; ~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName15.errors.txt b/tests/baselines/reference/parserComputedPropertyName15.errors.txt index f66e5930c26..1985338e19f 100644 --- a/tests/baselines/reference/parserComputedPropertyName15.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName15.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts(1,31): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts(1,31): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts(1,32): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts (2 errors) ==== var v: { [e: number]: string; [e]: number }; ~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName18.errors.txt b/tests/baselines/reference/parserComputedPropertyName18.errors.txt index f7485a127cb..9a78c057cc7 100644 --- a/tests/baselines/reference/parserComputedPropertyName18.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName18.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts(1,10): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts (2 errors) ==== var v: { [e]?(): number }; ~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName19.errors.txt b/tests/baselines/reference/parserComputedPropertyName19.errors.txt index 65c22ff36c3..412995f93e0 100644 --- a/tests/baselines/reference/parserComputedPropertyName19.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName19.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts(1,10): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts (2 errors) ==== var v: { [e]? }; ~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName20.errors.txt b/tests/baselines/reference/parserComputedPropertyName20.errors.txt index d65dfede1d2..7c93d63a7ef 100644 --- a/tests/baselines/reference/parserComputedPropertyName20.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName20.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName20.ts(2,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName20.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName20.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP interface I { [e](): number ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName21.errors.txt b/tests/baselines/reference/parserComputedPropertyName21.errors.txt index 5a9738a23a6..603940f24b2 100644 --- a/tests/baselines/reference/parserComputedPropertyName21.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName21.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName21.ts(2,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName21.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName21.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP interface I { [e]: number ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName22.errors.txt b/tests/baselines/reference/parserComputedPropertyName22.errors.txt index ce20dd0c587..2cdd5321e02 100644 --- a/tests/baselines/reference/parserComputedPropertyName22.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName22.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName22.ts(2,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName22.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName22.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP declare class C { [e]: number ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName25.errors.txt b/tests/baselines/reference/parserComputedPropertyName25.errors.txt index 8d26c8afdb7..d0b632aa2ec 100644 --- a/tests/baselines/reference/parserComputedPropertyName25.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName25.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(3,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(3,6): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(4,6): error TS2304: Cannot find name 'e2'. @@ -8,7 +8,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP // No ASI [e] = 0 ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. [e2] = 1 diff --git a/tests/baselines/reference/parserComputedPropertyName28.errors.txt b/tests/baselines/reference/parserComputedPropertyName28.errors.txt index c522ec031eb..70a010092e4 100644 --- a/tests/baselines/reference/parserComputedPropertyName28.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName28.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(2,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(2,6): error TS2304: Cannot find name 'e'. -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(3,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(3,6): error TS2304: Cannot find name 'e2'. @@ -8,12 +8,12 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e]: number = 0; ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. [e2]: number ~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~~ !!! error TS2304: Cannot find name 'e2'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName29.errors.txt b/tests/baselines/reference/parserComputedPropertyName29.errors.txt index 5e6baed0f06..54d3f9746ff 100644 --- a/tests/baselines/reference/parserComputedPropertyName29.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName29.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,6): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,11): error TS2304: Cannot find name 'id'. -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(4,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(4,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(4,6): error TS2304: Cannot find name 'e2'. @@ -10,14 +10,14 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP // yes ASI [e] = id++ ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. ~~ !!! error TS2304: Cannot find name 'id'. [e2]: number ~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~~ !!! error TS2304: Cannot find name 'e2'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName31.errors.txt b/tests/baselines/reference/parserComputedPropertyName31.errors.txt index 97a3b1ee187..ef4f34bd3e3 100644 --- a/tests/baselines/reference/parserComputedPropertyName31.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName31.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(3,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(3,6): error TS2304: Cannot find name 'e'. -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(4,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(4,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(4,6): error TS2304: Cannot find name 'e2'. @@ -9,12 +9,12 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP // yes ASI [e]: number ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. [e2]: number ~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~~ !!! error TS2304: Cannot find name 'e2'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName32.errors.txt b/tests/baselines/reference/parserComputedPropertyName32.errors.txt index da423baaa05..b70d346ce1e 100644 --- a/tests/baselines/reference/parserComputedPropertyName32.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName32.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName32.ts(2,5): error TS1165: Computed property names are not allowed in an ambient context. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName32.ts(2,5): error TS1165: A computed property name in an ambient context must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName32.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP declare class C { [e](): number ~~~ -!!! error TS1165: Computed property names are not allowed in an ambient context. +!!! error TS1165: A computed property name in an ambient context must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName36.errors.txt b/tests/baselines/reference/parserComputedPropertyName36.errors.txt index 1b4130b0e27..3536ead6ebe 100644 --- a/tests/baselines/reference/parserComputedPropertyName36.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName36.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName36.ts(2,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName36.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName36.ts(2,6): error TS2304: Cannot find name 'public'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [public ]: string; ~~~~~~~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~~~~~~ !!! error TS2304: Cannot find name 'public'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName7.errors.txt b/tests/baselines/reference/parserComputedPropertyName7.errors.txt index bcf39b0ca0a..833383b64c9 100644 --- a/tests/baselines/reference/parserComputedPropertyName7.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName7.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName7.ts(2,4): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName7.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName7.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e] ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName8.errors.txt b/tests/baselines/reference/parserComputedPropertyName8.errors.txt index 250c7a52c6e..d8798997f59 100644 --- a/tests/baselines/reference/parserComputedPropertyName8.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName8.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName8.ts(2,11): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName8.ts(2,11): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName8.ts(2,12): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { public [e] ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName9.errors.txt b/tests/baselines/reference/parserComputedPropertyName9.errors.txt index fd434046564..ce97d134718 100644 --- a/tests/baselines/reference/parserComputedPropertyName9.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName9.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,4): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,5): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,9): error TS2304: Cannot find name 'Type'. @@ -7,7 +7,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e]: Type ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. ~~~~ diff --git a/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt index 55af923e54b..7dc962d83b0 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName1.ts(2,5): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName1.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName1.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput declare class C { [e]: number ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt index 7db85cdef35..76a2a986261 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName10.ts(2,4): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName10.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName10.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e] = 1 ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt index ead27a994d1..41d146ba518 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName11.ts(2,4): error TS1168: Computed property names are not allowed in method overloads. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName11.ts(2,4): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName11.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e](); ~~~ -!!! error TS1168: Computed property names are not allowed in method overloads. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt index 122ca20a0e4..d375f202918 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName5.ts(2,5): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName5.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName5.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput interface I { [e]: number ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt index d38d57d87be..849cdc6d2a1 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName7.ts(2,4): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName7.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName7.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e] ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt index e52727c6929..84cf5e849f6 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts(1,10): error TS1170: Computed property names are not allowed in type literals. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts (2 errors) ==== var v: { [e]: number }; ~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt index 8cbe0ffcf8d..da62c00cd0f 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,4): error TS1166: Computed property names are not allowed in class property declarations. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,5): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,9): error TS2304: Cannot find name 'Type'. @@ -7,7 +7,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e]: Type ~~~ -!!! error TS1166: Computed property names are not allowed in class property declarations. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'e'. ~~~~ diff --git a/tests/baselines/reference/parserIndexSignature11.errors.txt b/tests/baselines/reference/parserIndexSignature11.errors.txt index 8cf474b19bb..b3c29f44d99 100644 --- a/tests/baselines/reference/parserIndexSignature11.errors.txt +++ b/tests/baselines/reference/parserIndexSignature11.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(2,9): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(2,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(2,10): error TS2304: Cannot find name 'p'. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(3,9): error TS1021: An index signature must have a type annotation. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(4,10): error TS1096: An index signature must have exactly one parameter. @@ -8,7 +8,7 @@ tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature1 interface I { [p]; // Used to be indexer, now it is a computed property ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; diff --git a/tests/baselines/reference/parserIndexSignature4.errors.txt b/tests/baselines/reference/parserIndexSignature4.errors.txt index d625f27eb6f..f67ea364c46 100644 --- a/tests/baselines/reference/parserIndexSignature4.errors.txt +++ b/tests/baselines/reference/parserIndexSignature4.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4.ts(2,3): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4.ts(2,3): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4.ts(2,4): error TS2304: Cannot find name 'a'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4 interface I { [a = 0] // Used to be indexer, now it is a computed property ~~~~~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'a'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature5.errors.txt b/tests/baselines/reference/parserIndexSignature5.errors.txt index 3f3415973d9..85c9e0a21a1 100644 --- a/tests/baselines/reference/parserIndexSignature5.errors.txt +++ b/tests/baselines/reference/parserIndexSignature5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5.ts(2,3): error TS1169: Computed property names are not allowed in interfaces. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5.ts(2,3): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5.ts(2,4): error TS2304: Cannot find name 'a'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5 interface I { [a] // Used to be indexer, now it is a computed property ~~~ -!!! error TS1169: Computed property names are not allowed in interfaces. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. ~ !!! error TS2304: Cannot find name 'a'. } \ No newline at end of file diff --git a/tests/baselines/reference/propertyAssignment.errors.txt b/tests/baselines/reference/propertyAssignment.errors.txt index 51850754a9a..54a74e1b129 100644 --- a/tests/baselines/reference/propertyAssignment.errors.txt +++ b/tests/baselines/reference/propertyAssignment.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/propertyAssignment.ts(6,13): error TS1170: Computed property names are not allowed in type literals. +tests/cases/compiler/propertyAssignment.ts(6,13): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. tests/cases/compiler/propertyAssignment.ts(6,14): error TS2304: Cannot find name 'index'. tests/cases/compiler/propertyAssignment.ts(14,1): error TS2322: Type '{ x: number; }' is not assignable to type 'new () => any'. tests/cases/compiler/propertyAssignment.ts(16,1): error TS2322: Type '{ x: number; }' is not assignable to type '() => void'. @@ -12,7 +12,7 @@ tests/cases/compiler/propertyAssignment.ts(16,1): error TS2322: Type '{ x: numbe var foo2: { [index]; } // should be an error, used to be indexer, now it is a computed property ~~~~~~~ -!!! error TS1170: Computed property names are not allowed in type literals. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. ~~~~~ !!! error TS2304: Cannot find name 'index'. var bar2: { x : number; } From 39952b1a934b34666219b7e81aee2cf15abc9dad Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 27 Jan 2015 17:35:29 -0800 Subject: [PATCH 004/106] Syntactically allow computed properties everywhere if the name looks like a built in Symbol --- src/compiler/checker.ts | 20 +++++++++---------- src/compiler/utilities.ts | 14 +++++++++++-- .../parserES5SymbolProperty1.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty2.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty3.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty4.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty5.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty6.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty7.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty8.errors.txt | 12 +++++++++++ .../parserES5SymbolProperty9.errors.txt | 12 +++++++++++ .../parserSymbolProperty1.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty1.js | 6 ++++++ .../parserSymbolProperty2.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty2.js | 6 ++++++ .../parserSymbolProperty3.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty3.js | 6 ++++++ .../parserSymbolProperty4.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty4.js | 6 ++++++ .../parserSymbolProperty5.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty5.js | 11 ++++++++++ .../parserSymbolProperty6.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty6.js | 12 +++++++++++ .../parserSymbolProperty7.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty7.js | 13 ++++++++++++ .../parserSymbolProperty8.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty8.js | 7 +++++++ .../parserSymbolProperty9.errors.txt | 9 +++++++++ .../reference/parserSymbolProperty9.js | 7 +++++++ .../Symbols/parserES5SymbolProperty1.ts | 4 ++++ .../Symbols/parserES5SymbolProperty2.ts | 4 ++++ .../Symbols/parserES5SymbolProperty3.ts | 4 ++++ .../Symbols/parserES5SymbolProperty4.ts | 4 ++++ .../Symbols/parserES5SymbolProperty5.ts | 4 ++++ .../Symbols/parserES5SymbolProperty6.ts | 4 ++++ .../Symbols/parserES5SymbolProperty7.ts | 4 ++++ .../Symbols/parserES5SymbolProperty8.ts | 4 ++++ .../Symbols/parserES5SymbolProperty9.ts | 4 ++++ .../Symbols/parserSymbolProperty1.ts | 4 ++++ .../Symbols/parserSymbolProperty2.ts | 4 ++++ .../Symbols/parserSymbolProperty3.ts | 4 ++++ .../Symbols/parserSymbolProperty4.ts | 4 ++++ .../Symbols/parserSymbolProperty5.ts | 4 ++++ .../Symbols/parserSymbolProperty6.ts | 4 ++++ .../Symbols/parserSymbolProperty7.ts | 4 ++++ .../Symbols/parserSymbolProperty8.ts | 4 ++++ .../Symbols/parserSymbolProperty9.ts | 4 ++++ 47 files changed, 357 insertions(+), 12 deletions(-) create mode 100644 tests/baselines/reference/parserES5SymbolProperty1.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty2.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty3.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty4.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty5.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty6.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty7.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty8.errors.txt create mode 100644 tests/baselines/reference/parserES5SymbolProperty9.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty1.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty1.js create mode 100644 tests/baselines/reference/parserSymbolProperty2.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty2.js create mode 100644 tests/baselines/reference/parserSymbolProperty3.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty3.js create mode 100644 tests/baselines/reference/parserSymbolProperty4.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty4.js create mode 100644 tests/baselines/reference/parserSymbolProperty5.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty5.js create mode 100644 tests/baselines/reference/parserSymbolProperty6.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty6.js create mode 100644 tests/baselines/reference/parserSymbolProperty7.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty7.js create mode 100644 tests/baselines/reference/parserSymbolProperty8.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty8.js create mode 100644 tests/baselines/reference/parserSymbolProperty9.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty9.js create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 70aa5187549..65a97f2b2f4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7487,7 +7487,7 @@ module ts { function checkPropertyDeclaration(node: PropertyDeclaration) { // Grammar checking - checkGrammarModifiers(node) || checkGrammarProperty(node); + checkGrammarModifiers(node) || checkGrammarProperty(node) || checkGrammarComputedPropertyName(node.name); checkVariableLikeDeclaration(node); } @@ -10771,8 +10771,8 @@ module ts { } } - function checkGrammarForDisallowedComputedProperty(node: DeclarationName, message: DiagnosticMessage) { - if (node.kind === SyntaxKind.ComputedPropertyName) { + function checkGrammarForNonSymbolComputedProperty(node: DeclarationName, message: DiagnosticMessage) { + if (node.kind === SyntaxKind.ComputedPropertyName && !isWellKnownSymbolSyntactically((node).expression)) { return grammarErrorOnNode(node, message); } } @@ -10803,17 +10803,17 @@ module ts { // and accessors are not allowed in ambient contexts in general, // so this error only really matters for methods. if (isInAmbientContext(node)) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_Symbol); } else if (!node.body) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_Symbol); } } else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol); } else if (node.parent.kind === SyntaxKind.TypeLiteral) { - return checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol); } } @@ -11084,17 +11084,17 @@ module ts { function checkGrammarProperty(node: PropertyDeclaration) { if (node.parent.kind === SyntaxKind.ClassDeclaration) { if (checkGrammarForInvalidQuestionMark(node, node.questionToken, Diagnostics.A_class_member_cannot_be_declared_optional) || - checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_Symbol)) { + checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_Symbol)) { return true; } } else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) { - if (checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol)) { + if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol)) { return true; } } else if (node.parent.kind === SyntaxKind.TypeLiteral) { - if (checkGrammarForDisallowedComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol)) { + if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol)) { return true; } } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 8c3dd112b15..d543c749089 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -835,11 +835,21 @@ module ts { return SyntaxKind.FirstTriviaToken <= token && token <= SyntaxKind.LastTriviaToken; } + export function isWellKnownSymbolSyntactically(node: Node): boolean { + return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); + } + export function isESSymbolTypeNode(node: Node): boolean { return node.kind === SyntaxKind.TypeReference && (node).typeArguments === undefined && - (node).typeName.kind === SyntaxKind.Identifier && - ((node).typeName).text === "Symbol"; + isESSymbolIdentifier((node).typeName); + } + + /** + * Includes the word "Symbol" with unicode escapes + */ + export function isESSymbolIdentifier(node: Node): boolean { + return node.kind === SyntaxKind.Identifier && (node).text === "Symbol"; } export function isModifier(token: SyntaxKind): boolean { diff --git a/tests/baselines/reference/parserES5SymbolProperty1.errors.txt b/tests/baselines/reference/parserES5SymbolProperty1.errors.txt new file mode 100644 index 00000000000..e82ac4c3bc6 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty1.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts (2 errors) ==== + interface I { + [Symbol.iterator]: string; + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty2.errors.txt b/tests/baselines/reference/parserES5SymbolProperty2.errors.txt new file mode 100644 index 00000000000..c8ca6613da8 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty2.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts (2 errors) ==== + interface I { + [Symbol.unscopables](): string; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty3.errors.txt b/tests/baselines/reference/parserES5SymbolProperty3.errors.txt new file mode 100644 index 00000000000..4bd883b44b7 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty3.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts (2 errors) ==== + declare class C { + [Symbol.unscopables](): string; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty4.errors.txt b/tests/baselines/reference/parserES5SymbolProperty4.errors.txt new file mode 100644 index 00000000000..cdc5510766e --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty4.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts (2 errors) ==== + declare class C { + [Symbol.isRegExp]: string; + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty5.errors.txt b/tests/baselines/reference/parserES5SymbolProperty5.errors.txt new file mode 100644 index 00000000000..2e80a55b47e --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty5.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts (2 errors) ==== + class C { + [Symbol.isRegExp]: string; + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty6.errors.txt b/tests/baselines/reference/parserES5SymbolProperty6.errors.txt new file mode 100644 index 00000000000..615be8ca8da --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty6.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts (2 errors) ==== + class C { + [Symbol.toStringTag]: string = ""; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty7.errors.txt b/tests/baselines/reference/parserES5SymbolProperty7.errors.txt new file mode 100644 index 00000000000..fa43310f0a7 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty7.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts (2 errors) ==== + class C { + [Symbol.toStringTag](): void { } + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty8.errors.txt b/tests/baselines/reference/parserES5SymbolProperty8.errors.txt new file mode 100644 index 00000000000..ce7ce5b8319 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty8.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts (2 errors) ==== + var x: { + [Symbol.toPrimitive](): string + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolProperty9.errors.txt b/tests/baselines/reference/parserES5SymbolProperty9.errors.txt new file mode 100644 index 00000000000..90c3785c938 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty9.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts(2,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts (2 errors) ==== + var x: { + [Symbol.toPrimitive]: string + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty1.errors.txt b/tests/baselines/reference/parserSymbolProperty1.errors.txt new file mode 100644 index 00000000000..40f15966703 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty1.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts (1 errors) ==== + interface I { + [Symbol.iterator]: string; + ~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty1.js b/tests/baselines/reference/parserSymbolProperty1.js new file mode 100644 index 00000000000..6bcede608fb --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty1.js @@ -0,0 +1,6 @@ +//// [parserSymbolProperty1.ts] +interface I { + [Symbol.iterator]: string; +} + +//// [parserSymbolProperty1.js] diff --git a/tests/baselines/reference/parserSymbolProperty2.errors.txt b/tests/baselines/reference/parserSymbolProperty2.errors.txt new file mode 100644 index 00000000000..fa6f99c2695 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty2.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts (1 errors) ==== + interface I { + [Symbol.unscopables](): string; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty2.js b/tests/baselines/reference/parserSymbolProperty2.js new file mode 100644 index 00000000000..6530072d46f --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty2.js @@ -0,0 +1,6 @@ +//// [parserSymbolProperty2.ts] +interface I { + [Symbol.unscopables](): string; +} + +//// [parserSymbolProperty2.js] diff --git a/tests/baselines/reference/parserSymbolProperty3.errors.txt b/tests/baselines/reference/parserSymbolProperty3.errors.txt new file mode 100644 index 00000000000..2b9ecdc7705 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty3.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts (1 errors) ==== + declare class C { + [Symbol.unscopables](): string; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty3.js b/tests/baselines/reference/parserSymbolProperty3.js new file mode 100644 index 00000000000..5b1b48254b1 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty3.js @@ -0,0 +1,6 @@ +//// [parserSymbolProperty3.ts] +declare class C { + [Symbol.unscopables](): string; +} + +//// [parserSymbolProperty3.js] diff --git a/tests/baselines/reference/parserSymbolProperty4.errors.txt b/tests/baselines/reference/parserSymbolProperty4.errors.txt new file mode 100644 index 00000000000..2405651b0b1 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty4.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts (1 errors) ==== + declare class C { + [Symbol.isRegExp]: string; + ~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty4.js b/tests/baselines/reference/parserSymbolProperty4.js new file mode 100644 index 00000000000..f79db0b1d79 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty4.js @@ -0,0 +1,6 @@ +//// [parserSymbolProperty4.ts] +declare class C { + [Symbol.isRegExp]: string; +} + +//// [parserSymbolProperty4.js] diff --git a/tests/baselines/reference/parserSymbolProperty5.errors.txt b/tests/baselines/reference/parserSymbolProperty5.errors.txt new file mode 100644 index 00000000000..8eb85a293f5 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty5.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts (1 errors) ==== + class C { + [Symbol.isRegExp]: string; + ~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty5.js b/tests/baselines/reference/parserSymbolProperty5.js new file mode 100644 index 00000000000..922e1fb0323 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty5.js @@ -0,0 +1,11 @@ +//// [parserSymbolProperty5.ts] +class C { + [Symbol.isRegExp]: string; +} + +//// [parserSymbolProperty5.js] +var C = (function () { + function C() { + } + return C; +})(); diff --git a/tests/baselines/reference/parserSymbolProperty6.errors.txt b/tests/baselines/reference/parserSymbolProperty6.errors.txt new file mode 100644 index 00000000000..8fde6aac4a8 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty6.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts (1 errors) ==== + class C { + [Symbol.toStringTag]: string = ""; + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty6.js b/tests/baselines/reference/parserSymbolProperty6.js new file mode 100644 index 00000000000..cbc06cd2951 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty6.js @@ -0,0 +1,12 @@ +//// [parserSymbolProperty6.ts] +class C { + [Symbol.toStringTag]: string = ""; +} + +//// [parserSymbolProperty6.js] +var C = (function () { + function C() { + this[Symbol.toStringTag] = ""; + } + return C; +})(); diff --git a/tests/baselines/reference/parserSymbolProperty7.errors.txt b/tests/baselines/reference/parserSymbolProperty7.errors.txt new file mode 100644 index 00000000000..b55bbaa11ae --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty7.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts (1 errors) ==== + class C { + [Symbol.toStringTag](): void { } + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty7.js b/tests/baselines/reference/parserSymbolProperty7.js new file mode 100644 index 00000000000..9d34b9e3bce --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty7.js @@ -0,0 +1,13 @@ +//// [parserSymbolProperty7.ts] +class C { + [Symbol.toStringTag](): void { } +} + +//// [parserSymbolProperty7.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.toStringTag] = function () { + }; + return C; +})(); diff --git a/tests/baselines/reference/parserSymbolProperty8.errors.txt b/tests/baselines/reference/parserSymbolProperty8.errors.txt new file mode 100644 index 00000000000..c37219682df --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty8.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts (1 errors) ==== + var x: { + [Symbol.toPrimitive](): string + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty8.js b/tests/baselines/reference/parserSymbolProperty8.js new file mode 100644 index 00000000000..f312ede6b1d --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty8.js @@ -0,0 +1,7 @@ +//// [parserSymbolProperty8.ts] +var x: { + [Symbol.toPrimitive](): string +} + +//// [parserSymbolProperty8.js] +var x; diff --git a/tests/baselines/reference/parserSymbolProperty9.errors.txt b/tests/baselines/reference/parserSymbolProperty9.errors.txt new file mode 100644 index 00000000000..b229d29b1b4 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty9.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts (1 errors) ==== + var x: { + [Symbol.toPrimitive]: string + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty9.js b/tests/baselines/reference/parserSymbolProperty9.js new file mode 100644 index 00000000000..6efc6650ea0 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty9.js @@ -0,0 +1,7 @@ +//// [parserSymbolProperty9.ts] +var x: { + [Symbol.toPrimitive]: string +} + +//// [parserSymbolProperty9.js] +var x; diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts new file mode 100644 index 00000000000..64ca01bba6c --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty1.ts @@ -0,0 +1,4 @@ +//@target: ES5 +interface I { + [Symbol.iterator]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts new file mode 100644 index 00000000000..cc606c2e6a3 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty2.ts @@ -0,0 +1,4 @@ +//@target: ES5 +interface I { + [Symbol.unscopables](): string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts new file mode 100644 index 00000000000..978d4ef95f0 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty3.ts @@ -0,0 +1,4 @@ +//@target: ES5 +declare class C { + [Symbol.unscopables](): string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts new file mode 100644 index 00000000000..7f16672ebd2 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty4.ts @@ -0,0 +1,4 @@ +//@target: ES5 +declare class C { + [Symbol.isRegExp]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts new file mode 100644 index 00000000000..fb7f00d7694 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty5.ts @@ -0,0 +1,4 @@ +//@target: ES5 +class C { + [Symbol.isRegExp]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts new file mode 100644 index 00000000000..3fc8e6f8979 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty6.ts @@ -0,0 +1,4 @@ +//@target: ES5 +class C { + [Symbol.toStringTag]: string = ""; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts new file mode 100644 index 00000000000..a27636388c0 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty7.ts @@ -0,0 +1,4 @@ +//@target: ES5 +class C { + [Symbol.toStringTag](): void { } +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts new file mode 100644 index 00000000000..78e5738f7da --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty8.ts @@ -0,0 +1,4 @@ +//@target: ES5 +var x: { + [Symbol.toPrimitive](): string +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts new file mode 100644 index 00000000000..7838df4d8fc --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolProperty9.ts @@ -0,0 +1,4 @@ +//@target: ES5 +var x: { + [Symbol.toPrimitive]: string +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts new file mode 100644 index 00000000000..d29272fd561 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts @@ -0,0 +1,4 @@ +//@target: ES6 +interface I { + [Symbol.iterator]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts new file mode 100644 index 00000000000..3ef11e99aa9 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts @@ -0,0 +1,4 @@ +//@target: ES6 +interface I { + [Symbol.unscopables](): string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts new file mode 100644 index 00000000000..d63302991d0 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts @@ -0,0 +1,4 @@ +//@target: ES6 +declare class C { + [Symbol.unscopables](): string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts new file mode 100644 index 00000000000..6a0962f15cb --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts @@ -0,0 +1,4 @@ +//@target: ES6 +declare class C { + [Symbol.isRegExp]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts new file mode 100644 index 00000000000..5f3fbaeaaea --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts @@ -0,0 +1,4 @@ +//@target: ES6 +class C { + [Symbol.isRegExp]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts new file mode 100644 index 00000000000..24d67c8b707 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts @@ -0,0 +1,4 @@ +//@target: ES6 +class C { + [Symbol.toStringTag]: string = ""; +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts new file mode 100644 index 00000000000..69f2f4b30f8 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts @@ -0,0 +1,4 @@ +//@target: ES6 +class C { + [Symbol.toStringTag](): void { } +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts new file mode 100644 index 00000000000..dcc6d5b7615 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var x: { + [Symbol.toPrimitive](): string +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts new file mode 100644 index 00000000000..b7093f188d2 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var x: { + [Symbol.toPrimitive]: string +} \ No newline at end of file From d78862433211e6ae693df6728adbf37c57562ee6 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 27 Jan 2015 17:38:14 -0800 Subject: [PATCH 005/106] Move hasDynamicName to utilities.ts --- src/compiler/binder.ts | 11 ----------- src/compiler/utilities.ts | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index c1b9d76f1b5..78fe4af0a1e 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -51,17 +51,6 @@ module ts { } } - /** - * A declaration has a dynamic name if both of the following are true: - * 1. The declaration has a computed property name - * 2. The computed name is *not* expressed as Symbol., where name - * is a property of the Symbol constructor that denotes a built in - * Symbol. - */ - export function hasDynamicName(declaration: Declaration): boolean { - return declaration.name && declaration.name.kind === SyntaxKind.ComputedPropertyName; - } - export function bindSourceFile(file: SourceFile): void { var start = new Date().getTime(); bindSourceFileWorker(file); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index d543c749089..c9d3dfc94ba 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -835,6 +835,17 @@ module ts { return SyntaxKind.FirstTriviaToken <= token && token <= SyntaxKind.LastTriviaToken; } + /** + * A declaration has a dynamic name if both of the following are true: + * 1. The declaration has a computed property name + * 2. The computed name is *not* expressed as Symbol., where name + * is a property of the Symbol constructor that denotes a built in + * Symbol. + */ + export function hasDynamicName(declaration: Declaration): boolean { + return declaration.name && declaration.name.kind === SyntaxKind.ComputedPropertyName; + } + export function isWellKnownSymbolSyntactically(node: Node): boolean { return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); } From 07f3641af2b3def43c823ff8287fb065628a09b6 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 28 Jan 2015 10:46:22 -0800 Subject: [PATCH 006/106] Update hasDynamicName to take well known symbols into account --- src/compiler/utilities.ts | 4 +++- .../baselines/reference/parserSymbolProperty1.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty1.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty2.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty2.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty3.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty3.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty4.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty4.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty5.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty5.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty6.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty6.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty7.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty7.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty8.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty8.types | 9 +++++++++ .../baselines/reference/parserSymbolProperty9.errors.txt | 9 --------- tests/baselines/reference/parserSymbolProperty9.types | 9 +++++++++ 19 files changed, 84 insertions(+), 82 deletions(-) delete mode 100644 tests/baselines/reference/parserSymbolProperty1.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty1.types delete mode 100644 tests/baselines/reference/parserSymbolProperty2.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty2.types delete mode 100644 tests/baselines/reference/parserSymbolProperty3.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty3.types delete mode 100644 tests/baselines/reference/parserSymbolProperty4.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty4.types delete mode 100644 tests/baselines/reference/parserSymbolProperty5.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty5.types delete mode 100644 tests/baselines/reference/parserSymbolProperty6.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty6.types delete mode 100644 tests/baselines/reference/parserSymbolProperty7.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty7.types delete mode 100644 tests/baselines/reference/parserSymbolProperty8.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty8.types delete mode 100644 tests/baselines/reference/parserSymbolProperty9.errors.txt create mode 100644 tests/baselines/reference/parserSymbolProperty9.types diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index c9d3dfc94ba..6dc6d86fc04 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -843,7 +843,9 @@ module ts { * Symbol. */ export function hasDynamicName(declaration: Declaration): boolean { - return declaration.name && declaration.name.kind === SyntaxKind.ComputedPropertyName; + return declaration.name && + declaration.name.kind === SyntaxKind.ComputedPropertyName && + !isWellKnownSymbolSyntactically((declaration.name).expression); } export function isWellKnownSymbolSyntactically(node: Node): boolean { diff --git a/tests/baselines/reference/parserSymbolProperty1.errors.txt b/tests/baselines/reference/parserSymbolProperty1.errors.txt deleted file mode 100644 index 40f15966703..00000000000 --- a/tests/baselines/reference/parserSymbolProperty1.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts (1 errors) ==== - interface I { - [Symbol.iterator]: string; - ~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty1.types b/tests/baselines/reference/parserSymbolProperty1.types new file mode 100644 index 00000000000..ab68b0bc7ac --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty1.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty1.ts === +interface I { +>I : I + + [Symbol.iterator]: string; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty2.errors.txt b/tests/baselines/reference/parserSymbolProperty2.errors.txt deleted file mode 100644 index fa6f99c2695..00000000000 --- a/tests/baselines/reference/parserSymbolProperty2.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts (1 errors) ==== - interface I { - [Symbol.unscopables](): string; - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty2.types b/tests/baselines/reference/parserSymbolProperty2.types new file mode 100644 index 00000000000..02ba4c21a8a --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty2.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty2.ts === +interface I { +>I : I + + [Symbol.unscopables](): string; +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty3.errors.txt b/tests/baselines/reference/parserSymbolProperty3.errors.txt deleted file mode 100644 index 2b9ecdc7705..00000000000 --- a/tests/baselines/reference/parserSymbolProperty3.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts (1 errors) ==== - declare class C { - [Symbol.unscopables](): string; - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty3.types b/tests/baselines/reference/parserSymbolProperty3.types new file mode 100644 index 00000000000..4f0245cee6f --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty3.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty3.ts === +declare class C { +>C : C + + [Symbol.unscopables](): string; +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty4.errors.txt b/tests/baselines/reference/parserSymbolProperty4.errors.txt deleted file mode 100644 index 2405651b0b1..00000000000 --- a/tests/baselines/reference/parserSymbolProperty4.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts (1 errors) ==== - declare class C { - [Symbol.isRegExp]: string; - ~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty4.types b/tests/baselines/reference/parserSymbolProperty4.types new file mode 100644 index 00000000000..9fcd6c4a29e --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty4.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty4.ts === +declare class C { +>C : C + + [Symbol.isRegExp]: string; +>Symbol.isRegExp : Symbol +>Symbol : SymbolConstructor +>isRegExp : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty5.errors.txt b/tests/baselines/reference/parserSymbolProperty5.errors.txt deleted file mode 100644 index 8eb85a293f5..00000000000 --- a/tests/baselines/reference/parserSymbolProperty5.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts (1 errors) ==== - class C { - [Symbol.isRegExp]: string; - ~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty5.types b/tests/baselines/reference/parserSymbolProperty5.types new file mode 100644 index 00000000000..1cdaa6ec694 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty5.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty5.ts === +class C { +>C : C + + [Symbol.isRegExp]: string; +>Symbol.isRegExp : Symbol +>Symbol : SymbolConstructor +>isRegExp : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty6.errors.txt b/tests/baselines/reference/parserSymbolProperty6.errors.txt deleted file mode 100644 index 8fde6aac4a8..00000000000 --- a/tests/baselines/reference/parserSymbolProperty6.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts (1 errors) ==== - class C { - [Symbol.toStringTag]: string = ""; - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty6.types b/tests/baselines/reference/parserSymbolProperty6.types new file mode 100644 index 00000000000..7f14f36d28d --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty6.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty6.ts === +class C { +>C : C + + [Symbol.toStringTag]: string = ""; +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty7.errors.txt b/tests/baselines/reference/parserSymbolProperty7.errors.txt deleted file mode 100644 index b55bbaa11ae..00000000000 --- a/tests/baselines/reference/parserSymbolProperty7.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts (1 errors) ==== - class C { - [Symbol.toStringTag](): void { } - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty7.types b/tests/baselines/reference/parserSymbolProperty7.types new file mode 100644 index 00000000000..ce62cd93498 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty7.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty7.ts === +class C { +>C : C + + [Symbol.toStringTag](): void { } +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty8.errors.txt b/tests/baselines/reference/parserSymbolProperty8.errors.txt deleted file mode 100644 index c37219682df..00000000000 --- a/tests/baselines/reference/parserSymbolProperty8.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts (1 errors) ==== - var x: { - [Symbol.toPrimitive](): string - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty8.types b/tests/baselines/reference/parserSymbolProperty8.types new file mode 100644 index 00000000000..cc3a20af9be --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty8.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts === +var x: { +>x : {} + + [Symbol.toPrimitive](): string +>Symbol.toPrimitive : Symbol +>Symbol : SymbolConstructor +>toPrimitive : Symbol +} diff --git a/tests/baselines/reference/parserSymbolProperty9.errors.txt b/tests/baselines/reference/parserSymbolProperty9.errors.txt deleted file mode 100644 index b229d29b1b4..00000000000 --- a/tests/baselines/reference/parserSymbolProperty9.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - - -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts (1 errors) ==== - var x: { - [Symbol.toPrimitive]: string - ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. - } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolProperty9.types b/tests/baselines/reference/parserSymbolProperty9.types new file mode 100644 index 00000000000..77746283990 --- /dev/null +++ b/tests/baselines/reference/parserSymbolProperty9.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts === +var x: { +>x : {} + + [Symbol.toPrimitive]: string +>Symbol.toPrimitive : Symbol +>Symbol : SymbolConstructor +>toPrimitive : Symbol +} From f344654460c0772eb781754a0c5b460cf740e114 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 28 Jan 2015 15:57:47 -0800 Subject: [PATCH 007/106] Add named property symbol for known Symbol properties --- src/compiler/binder.ts | 9 +++++++-- src/compiler/checker.ts | 10 ++++++++-- src/compiler/utilities.ts | 2 +- tests/baselines/reference/parserSymbolProperty8.types | 2 +- tests/baselines/reference/parserSymbolProperty9.types | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 78fe4af0a1e..3f17d26d2b2 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -87,13 +87,18 @@ module ts { if (symbolKind & SymbolFlags.Value && !symbol.valueDeclaration) symbol.valueDeclaration = node; } - // Should not be called on a declaration with a computed property name. + // Should not be called on a declaration with a computed property name, + // unless it is a well known Symbol. function getDeclarationName(node: Declaration): string { if (node.name) { if (node.kind === SyntaxKind.ModuleDeclaration && node.name.kind === SyntaxKind.StringLiteral) { return '"' + (node.name).text + '"'; } - Debug.assert(!hasDynamicName(node)); + if (node.name.kind === SyntaxKind.ComputedPropertyName) { + var nameExpression = (node.name).expression; + Debug.assert(isWellKnownSymbolSyntactically(nameExpression)); + return "__@" + (nameExpression).name.text; + } return (node.name).text; } switch (node.kind) { diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 65a97f2b2f4..5a5d5931c27 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -706,9 +706,15 @@ module ts { return type; } - // A reserved member name starts with two underscores followed by a non-underscore + // A reserved member name starts with two underscores, but the third character cannot be an underscore + // or the @ symbol. A third underscore indicates an escaped form of an identifer that started + // with at least two underscores. The @ character indicates that the name is denoted by a well known ES + // Symbol instance. function isReservedMemberName(name: string) { - return name.charCodeAt(0) === CharacterCodes._ && name.charCodeAt(1) === CharacterCodes._ && name.charCodeAt(2) !== CharacterCodes._; + return name.charCodeAt(0) === CharacterCodes._ && + name.charCodeAt(1) === CharacterCodes._ && + name.charCodeAt(2) !== CharacterCodes._ && + name.charCodeAt(2) !== CharacterCodes.at; } function getNamedMembers(members: SymbolTable): Symbol[] { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6dc6d86fc04..abf902d5fd1 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -848,7 +848,7 @@ module ts { !isWellKnownSymbolSyntactically((declaration.name).expression); } - export function isWellKnownSymbolSyntactically(node: Node): boolean { + export function isWellKnownSymbolSyntactically(node: Expression): boolean { return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); } diff --git a/tests/baselines/reference/parserSymbolProperty8.types b/tests/baselines/reference/parserSymbolProperty8.types index cc3a20af9be..048885dfd38 100644 --- a/tests/baselines/reference/parserSymbolProperty8.types +++ b/tests/baselines/reference/parserSymbolProperty8.types @@ -1,6 +1,6 @@ === tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty8.ts === var x: { ->x : {} +>x : { [Symbol.toPrimitive](): string; } [Symbol.toPrimitive](): string >Symbol.toPrimitive : Symbol diff --git a/tests/baselines/reference/parserSymbolProperty9.types b/tests/baselines/reference/parserSymbolProperty9.types index 77746283990..cc3b35d3302 100644 --- a/tests/baselines/reference/parserSymbolProperty9.types +++ b/tests/baselines/reference/parserSymbolProperty9.types @@ -1,6 +1,6 @@ === tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolProperty9.ts === var x: { ->x : {} +>x : { [Symbol.toPrimitive]: string; } [Symbol.toPrimitive]: string >Symbol.toPrimitive : Symbol From 30892af5636b462d2ead50ad334e6db653b51df9 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 28 Jan 2015 16:14:46 -0800 Subject: [PATCH 008/106] Change computed property error message to mention Symbols --- src/compiler/checker.ts | 2 +- .../diagnosticInformationMap.generated.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- .../computedPropertyNames14.errors.txt | 24 +++++++++---------- .../computedPropertyNames15.errors.txt | 8 +++---- .../computedPropertyNames17.errors.txt | 24 +++++++++---------- .../computedPropertyNames3.errors.txt | 16 ++++++------- .../computedPropertyNames5.errors.txt | 24 +++++++++---------- .../computedPropertyNames6.errors.txt | 8 +++---- .../computedPropertyNames8.errors.txt | 8 +++---- .../computedPropertyNames9.errors.txt | 4 ++-- .../parserComputedPropertyName41.errors.txt | 4 ++-- 12 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5a5d5931c27..b59221175e2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5517,7 +5517,7 @@ module ts { // This will allow types number, string, or any. It will also allow enums, the unknown // type, and any union of these types (like string | number). if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike)) { - error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_or_any); + error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_Symbol_or_any); } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 6c89679a0a0..96a01b89abb 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -300,7 +300,7 @@ module ts { Type_0_is_not_an_array_type: { code: 2461, category: DiagnosticCategory.Error, key: "Type '{0}' is not an array type." }, A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: DiagnosticCategory.Error, key: "A rest element must be last in an array destructuring pattern" }, A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: DiagnosticCategory.Error, key: "A binding pattern parameter cannot be optional in an implementation signature." }, - A_computed_property_name_must_be_of_type_string_number_or_any: { code: 2464, category: DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', or 'any'." }, + A_computed_property_name_must_be_of_type_string_number_Symbol_or_any: { code: 2464, category: DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', 'Symbol', or 'any'." }, this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: DiagnosticCategory.Error, key: "'this' cannot be referenced in a computed property name." }, super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." }, A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2466, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 709750679dc..39328ff7aef 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1193,7 +1193,7 @@ "category": "Error", "code": 2463 }, - "A computed property name must be of type 'string', 'number', or 'any'.": { + "A computed property name must be of type 'string', 'number', 'Symbol', or 'any'.": { "category": "Error", "code": 2464 }, diff --git a/tests/baselines/reference/computedPropertyNames14.errors.txt b/tests/baselines/reference/computedPropertyNames14.errors.txt index 1cf5b1445f2..23d22be0780 100644 --- a/tests/baselines/reference/computedPropertyNames14.errors.txt +++ b/tests/baselines/reference/computedPropertyNames14.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(6,12): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(8,12): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(6,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(8,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts (6 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(8,12): class C { [b]() {} ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static [true]() { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [[]]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static [{}]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [undefined]() { } ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static [null]() { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames15.errors.txt b/tests/baselines/reference/computedPropertyNames15.errors.txt index 0e759668a95..dc0ffb5fe46 100644 --- a/tests/baselines/reference/computedPropertyNames15.errors.txt +++ b/tests/baselines/reference/computedPropertyNames15.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts (2 errors) ==== @@ -10,8 +10,8 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(7,5): [p1]() { } [p2]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [p3]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames17.errors.txt b/tests/baselines/reference/computedPropertyNames17.errors.txt index b236ae3245e..78ce6d5e433 100644 --- a/tests/baselines/reference/computedPropertyNames17.errors.txt +++ b/tests/baselines/reference/computedPropertyNames17.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(3,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(4,16): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(8,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(3,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(4,16): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(8,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts (6 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(8,9): class C { get [b]() { return 0;} ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static set [true](v) { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. get [[]]() { return 0; } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. set [{}](v) { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static get [undefined]() { return 0; } ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. set [null](v) { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames3.errors.txt b/tests/baselines/reference/computedPropertyNames3.errors.txt index 080bff1ab9a..23dbcf7d9b1 100644 --- a/tests/baselines/reference/computedPropertyNames3.errors.txt +++ b/tests/baselines/reference/computedPropertyNames3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(5,9): error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts (6 errors) ==== @@ -12,19 +12,19 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): [0 + 1]() { } static [() => { }]() { } ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. get [delete id]() { } ~~~~~~~~~~~ !!! error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. set [[0, 1]](v) { } ~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static get [""]() { } ~~~~~~~~~~~~ !!! error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. ~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. static set [id.toString()](v) { } } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames5.errors.txt b/tests/baselines/reference/computedPropertyNames5.errors.txt index 2b8cf5503b8..d8fa1d30750 100644 --- a/tests/baselines/reference/computedPropertyNames5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames5.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(8,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(8,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts (6 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(8,5): e var v = { [b]: 0, ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [true]: 1, ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [[]]: 0, ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [{}]: 0, ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [undefined]: undefined, ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [null]: null ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames6.errors.txt b/tests/baselines/reference/computedPropertyNames6.errors.txt index 57798e9f6b6..3ee4387610b 100644 --- a/tests/baselines/reference/computedPropertyNames6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames6.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts (2 errors) ==== @@ -10,8 +10,8 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(7,5): e [p1]: 0, [p2]: 1, ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [p3]: 2 ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames8.errors.txt b/tests/baselines/reference/computedPropertyNames8.errors.txt index 515af1f4fc4..f45280c517c 100644 --- a/tests/baselines/reference/computedPropertyNames8.errors.txt +++ b/tests/baselines/reference/computedPropertyNames8.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts (2 errors) ==== @@ -9,9 +9,9 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(6,9): e var v = { [t]: 0, ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. [u]: 1 ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. }; } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames9.errors.txt b/tests/baselines/reference/computedPropertyNames9.errors.txt index d87576f1f77..ba27c193767 100644 --- a/tests/baselines/reference/computedPropertyNames9.errors.txt +++ b/tests/baselines/reference/computedPropertyNames9.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts(9,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts(9,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts (1 errors) ==== @@ -12,5 +12,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts(9,5): e [f(0)]: 0, [f(true)]: 0 ~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName41.errors.txt b/tests/baselines/reference/parserComputedPropertyName41.errors.txt index 65d4ec8627f..3de11e5218a 100644 --- a/tests/baselines/reference/parserComputedPropertyName41.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName41.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName41.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName41.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName41.ts (1 errors) ==== var v = { [0 in []]: true ~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. } \ No newline at end of file From 9cb38fb5f2cf88fc39773f59454a3664ffbbccfc Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 29 Jan 2015 17:15:57 -0800 Subject: [PATCH 009/106] Create global Symbol type --- src/compiler/checker.ts | 81 +++++++++++++------ .../diagnosticInformationMap.generated.ts | 1 + src/compiler/diagnosticMessages.json | 4 + .../reference/parserForStatement3.errors.txt | 5 +- .../reference/parserForStatement6.errors.txt | 4 +- .../reference/parserForStatement7.errors.txt | 4 +- tests/baselines/reference/symbolProperty1.js | 20 +++++ .../baselines/reference/symbolProperty1.types | 21 +++++ tests/baselines/reference/symbolProperty2.js | 20 +++++ .../baselines/reference/symbolProperty2.types | 22 +++++ .../reference/symbolProperty3.errors.txt | 20 +++++ tests/baselines/reference/symbolProperty3.js | 20 +++++ tests/baselines/reference/symbolProperty4.js | 18 +++++ .../baselines/reference/symbolProperty4.types | 20 +++++ tests/baselines/reference/symbolProperty5.js | 18 +++++ .../baselines/reference/symbolProperty5.types | 23 ++++++ tests/baselines/reference/symbolProperty6.js | 26 ++++++ .../baselines/reference/symbolProperty6.types | 27 +++++++ .../reference/symbolProperty7.errors.txt | 17 ++++ tests/baselines/reference/symbolProperty8.js | 7 ++ .../baselines/reference/symbolProperty8.types | 14 ++++ .../es6/Symbols/symbolProperty1.ts | 9 +++ .../es6/Symbols/symbolProperty2.ts | 9 +++ .../es6/Symbols/symbolProperty3.ts | 9 +++ .../es6/Symbols/symbolProperty4.ts | 8 ++ .../es6/Symbols/symbolProperty5.ts | 8 ++ .../es6/Symbols/symbolProperty6.ts | 9 +++ .../es6/Symbols/symbolProperty7.ts | 9 +++ .../es6/Symbols/symbolProperty8.ts | 5 ++ 29 files changed, 427 insertions(+), 31 deletions(-) create mode 100644 tests/baselines/reference/symbolProperty1.js create mode 100644 tests/baselines/reference/symbolProperty1.types create mode 100644 tests/baselines/reference/symbolProperty2.js create mode 100644 tests/baselines/reference/symbolProperty2.types create mode 100644 tests/baselines/reference/symbolProperty3.errors.txt create mode 100644 tests/baselines/reference/symbolProperty3.js create mode 100644 tests/baselines/reference/symbolProperty4.js create mode 100644 tests/baselines/reference/symbolProperty4.types create mode 100644 tests/baselines/reference/symbolProperty5.js create mode 100644 tests/baselines/reference/symbolProperty5.types create mode 100644 tests/baselines/reference/symbolProperty6.js create mode 100644 tests/baselines/reference/symbolProperty6.types create mode 100644 tests/baselines/reference/symbolProperty7.errors.txt create mode 100644 tests/baselines/reference/symbolProperty8.js create mode 100644 tests/baselines/reference/symbolProperty8.types create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty1.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty2.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty3.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty4.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty5.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty6.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty7.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty8.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b59221175e2..7e652f30c62 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -84,6 +84,7 @@ module ts { var globals: SymbolTable = {}; var globalArraySymbol: Symbol; + var globalESSymbolConstructorSymbol: Symbol; var globalObjectType: ObjectType; var globalFunctionType: ObjectType; @@ -93,6 +94,8 @@ module ts { var globalBooleanType: ObjectType; var globalRegExpType: ObjectType; var globalTemplateStringsArrayType: ObjectType; + var globalESSymbolType: ObjectType; + var globalESSymbolConstructorType: ObjectType; var anyArrayType: Type; @@ -3005,12 +3008,20 @@ module ts { return type; } - function getGlobalSymbol(name: string): Symbol { - return resolveName(undefined, name, SymbolFlags.Type, Diagnostics.Cannot_find_global_type_0, name); + function getGlobalValueSymbol(name: string): Symbol { + return getGlobalSymbol(name, SymbolFlags.Value, Diagnostics.Cannot_find_global_value_0); + } + + function getGlobalTypeSymbol(name: string): Symbol { + return getGlobalSymbol(name, SymbolFlags.Type, Diagnostics.Cannot_find_global_type_0); + } + + function getGlobalSymbol(name: string, meaning: SymbolFlags, diagnostic: DiagnosticMessage): Symbol { + return resolveName(undefined, name, meaning, diagnostic, name); } function getGlobalType(name: string): ObjectType { - return getTypeOfGlobalSymbol(getGlobalSymbol(name), 0); + return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), 0); } function createArrayType(elementType: Type): Type { @@ -5481,7 +5492,7 @@ module ts { function isNumericComputedName(name: ComputedPropertyName): boolean { // It seems odd to consider an expression of type Any to result in a numeric name, // but this behavior is consistent with checkIndexedAccess - return isTypeOfKind(checkComputedPropertyName(name), TypeFlags.Any | TypeFlags.NumberLike); + return isTypeOfKind(checkComputedPropertyName(name), TypeFlags.Any | TypeFlags.NumberLike, /*includeESSymbols*/ false); } function isNumericLiteralName(name: string) { @@ -5514,9 +5525,9 @@ module ts { if (!links.resolvedType) { links.resolvedType = checkExpression(node.expression); - // This will allow types number, string, or any. It will also allow enums, the unknown + // This will allow types number, string, Symbol or any. It will also allow enums, the unknown // type, and any union of these types (like string | number). - if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike)) { + if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike, /*includeESSymbols*/ true)) { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_Symbol_or_any); } } @@ -5781,10 +5792,10 @@ module ts { } // Check for compatible indexer types. - if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike)) { + if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike, /*includeESSymbols*/ true)) { // Try to use a number indexer. - if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.NumberLike)) { + if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.NumberLike, /*includeESSymbols*/ false)) { var numberIndexType = getIndexTypeOfType(objectType, IndexKind.Number); if (numberIndexType) { return numberIndexType; @@ -6722,7 +6733,7 @@ module ts { } function checkArithmeticOperandType(operand: Node, type: Type, diagnostic: DiagnosticMessage): boolean { - if (!isTypeOfKind(type, TypeFlags.Any | TypeFlags.NumberLike)) { + if (!isTypeOfKind(type, TypeFlags.Any | TypeFlags.NumberLike, /*includeESSymbols*/ false)) { error(operand, diagnostic); return false; } @@ -6874,19 +6885,28 @@ module ts { } // Return true if type has the given flags, or is a union type composed of types that all have those flags - function isTypeOfKind(type: Type, kind: TypeFlags): boolean { + // If include includeESSymbols is true, then check if the type (or union constituents) is an ESSymbol + // if it does not match the kind. This is necessary because ESSymbol has no corresponding flag. + function isTypeOfKind(type: Type, kind: TypeFlags, includeESSymbols: boolean): boolean { if (type.flags & kind) { return true; } if (type.flags & TypeFlags.Union) { var types = (type).types; for (var i = 0; i < types.length; i++) { - if (!(types[i].flags & kind)) { - return false; + if (types[i].flags & kind) { + continue; } + if (includeESSymbols && types[i] === globalESSymbolType) { + continue; + } + return false; } return true; } + if (includeESSymbols) { + return type === globalESSymbolType; + } return false; } @@ -6904,7 +6924,11 @@ module ts { // and the right operand to be of type Any or a subtype of the 'Function' interface type. // The result is always of the Boolean primitive type. // NOTE: do not raise error if leftType is unknown as related error was already reported - if (isTypeOfKind(leftType, TypeFlags.Primitive)) { + // + // The reason for globalESSymbolType !== unknownType is that if the type is unknownType, we don't want to error. + // If the globalESSymbolType is also unknownType, then by including globalESSymbolType, we will error + // on unknownType, because transitively, type will be the same as globalESSymbolType. + if (isTypeOfKind(leftType, TypeFlags.Primitive, /*includeESSymbols*/ globalESSymbolType !== unknownType)) { error(node.left, Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } // NOTE: do not raise error if right is unknown as related error was already reported @@ -6919,10 +6943,10 @@ module ts { // The in operator requires the left operand to be of type Any, the String primitive type, or the Number primitive type, // and the right operand to be of type Any, an object type, or a type parameter type. // The result is always of the Boolean primitive type. - if (!isTypeOfKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike)) { + if (!isTypeOfKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike, /*includeESSymbols*/ true)) { error(node.left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_types_any_string_or_number); } - if (!isTypeOfKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { + if (!isTypeOfKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter, /*includeESSymbols*/ false)) { error(node.right, Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } return booleanType; @@ -7083,12 +7107,12 @@ module ts { if (rightType.flags & (TypeFlags.Undefined | TypeFlags.Null)) rightType = leftType; var resultType: Type; - if (isTypeOfKind(leftType, TypeFlags.NumberLike) && isTypeOfKind(rightType, TypeFlags.NumberLike)) { + if (isTypeOfKind(leftType, TypeFlags.NumberLike, /*includeESSymbols*/ false) && isTypeOfKind(rightType, TypeFlags.NumberLike, /*includeESSymbols*/ false)) { // Operands of an enum type are treated as having the primitive type Number. // If both operands are of the Number primitive type, the result is of the Number primitive type. resultType = numberType; } - else if (isTypeOfKind(leftType, TypeFlags.StringLike) || isTypeOfKind(rightType, TypeFlags.StringLike)) { + else if (isTypeOfKind(leftType, TypeFlags.StringLike, /*includeESSymbols*/ false) || isTypeOfKind(rightType, TypeFlags.StringLike, /*includeESSymbols*/ false)) { // If one or both operands are of the String primitive type, the result is of the String primitive type. resultType = stringType; } @@ -8454,7 +8478,7 @@ module ts { // and Expr must be an expression of type Any, an object type, or a type parameter type. var varExpr = node.initializer; var exprType = checkExpression(varExpr); - if (exprType !== anyType && exprType !== stringType) { + if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.StringLike, /*includeESSymbols*/ true)) { error(varExpr, Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any); } else { @@ -8466,7 +8490,7 @@ module ts { var exprType = checkExpression(node.expression); // unknownType is returned i.e. if node.expression is identifier whose name cannot be resolved // in this case error about missing name is already reported - do not report extra one - if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { + if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter, /*includeESSymbols*/ false)) { error(node.expression, Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter); } @@ -10251,7 +10275,7 @@ module ts { getSymbolLinks(unknownSymbol).type = unknownType; globals[undefinedSymbol.name] = undefinedSymbol; // Initialize special types - globalArraySymbol = getGlobalSymbol("Array"); + globalArraySymbol = getGlobalTypeSymbol("Array"); globalArrayType = getTypeOfGlobalSymbol(globalArraySymbol, 1); globalObjectType = getGlobalType("Object"); globalFunctionType = getGlobalType("Function"); @@ -10259,11 +10283,22 @@ module ts { globalNumberType = getGlobalType("Number"); globalBooleanType = getGlobalType("Boolean"); globalRegExpType = getGlobalType("RegExp"); + // If we're in ES6 mode, load the TemplateStringsArray. // Otherwise, default to 'unknown' for the purposes of type checking in LS scenarios. - globalTemplateStringsArrayType = languageVersion >= ScriptTarget.ES6 - ? getGlobalType("TemplateStringsArray") - : unknownType; + if (languageVersion >= ScriptTarget.ES6) { + globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray"); + globalESSymbolType = getGlobalType("Symbol"); + globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"); + globalESSymbolConstructorType = getTypeOfGlobalSymbol(globalESSymbolConstructorSymbol, /*arity*/ 0); + } + else { + globalTemplateStringsArrayType = unknownType; + globalESSymbolType = unknownType; + globalESSymbolConstructorSymbol = unknownSymbol; + globalESSymbolConstructorType = unknownType; + } + anyArrayType = createArrayType(anyType); } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 96a01b89abb..0955702fe02 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -304,6 +304,7 @@ module ts { this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: DiagnosticCategory.Error, key: "'this' cannot be referenced in a computed property name." }, super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." }, A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2466, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, + Cannot_find_global_value_0: { code: 2468, category: DiagnosticCategory.Error, key: "Cannot find global value '{0}'." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 39328ff7aef..581f8a5cafe 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1209,6 +1209,10 @@ "category": "Error", "code": 2466 }, + "Cannot find global value '{0}'.": { + "category": "Error", + "code": 2468 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/parserForStatement3.errors.txt b/tests/baselines/reference/parserForStatement3.errors.txt index 533958505c1..06c3f083d45 100644 --- a/tests/baselines/reference/parserForStatement3.errors.txt +++ b/tests/baselines/reference/parserForStatement3.errors.txt @@ -1,5 +1,4 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,5): error TS2304: Cannot find name 'd'. -tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,5): error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,10): error TS2304: Cannot find name '_'. tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,15): error TS2304: Cannot find name 'a'. tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,18): error TS2304: Cannot find name '_'. @@ -7,12 +6,10 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,2 tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts(1,30): error TS2304: Cannot find name 'b'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts (7 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement3.ts (6 errors) ==== for(d in _.jh[a]=_.jh[a]||[],b); ~ !!! error TS2304: Cannot find name 'd'. - ~ -!!! error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. ~ !!! error TS2304: Cannot find name '_'. ~ diff --git a/tests/baselines/reference/parserForStatement6.errors.txt b/tests/baselines/reference/parserForStatement6.errors.txt index a098141c81b..a41f103e929 100644 --- a/tests/baselines/reference/parserForStatement6.errors.txt +++ b/tests/baselines/reference/parserForStatement6.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement6.ts(1,6): error TS2304: Cannot find name 'foo'. -tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement6.ts(1,6): error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. +tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement6.ts(1,6): error TS2406: Invalid left-hand side in 'for...in' statement. tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement6.ts(1,15): error TS2304: Cannot find name 'b'. @@ -8,7 +8,7 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement6.ts(1,1 ~~~ !!! error TS2304: Cannot find name 'foo'. ~~~~~ -!!! error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. +!!! error TS2406: Invalid left-hand side in 'for...in' statement. ~ !!! error TS2304: Cannot find name 'b'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForStatement7.errors.txt b/tests/baselines/reference/parserForStatement7.errors.txt index da1f1ce6808..3aa67480105 100644 --- a/tests/baselines/reference/parserForStatement7.errors.txt +++ b/tests/baselines/reference/parserForStatement7.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement7.ts(1,6): error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. +tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement7.ts(1,6): error TS2406: Invalid left-hand side in 'for...in' statement. tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement7.ts(1,10): error TS2304: Cannot find name 'foo'. tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement7.ts(1,19): error TS2304: Cannot find name 'b'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement7.ts(1,1 ==== tests/cases/conformance/parser/ecmascript5/Statements/parserForStatement7.ts (3 errors) ==== for (new foo() in b) { ~~~~~~~~~ -!!! error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. +!!! error TS2406: Invalid left-hand side in 'for...in' statement. ~~~ !!! error TS2304: Cannot find name 'foo'. ~ diff --git a/tests/baselines/reference/symbolProperty1.js b/tests/baselines/reference/symbolProperty1.js new file mode 100644 index 00000000000..e5189d0c88f --- /dev/null +++ b/tests/baselines/reference/symbolProperty1.js @@ -0,0 +1,20 @@ +//// [symbolProperty1.ts] +var s: Symbol; +var x = { + [s]: 0, + [s]() { }, + get [s]() { + return 0; + } +} + +//// [symbolProperty1.js] +var s; +var x = { + [s]: 0, + [s]() { + }, + get [s]() { + return 0; + } +}; diff --git a/tests/baselines/reference/symbolProperty1.types b/tests/baselines/reference/symbolProperty1.types new file mode 100644 index 00000000000..9c24051449e --- /dev/null +++ b/tests/baselines/reference/symbolProperty1.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty1.ts === +var s: Symbol; +>s : Symbol +>Symbol : Symbol + +var x = { +>x : {} +>{ [s]: 0, [s]() { }, get [s]() { return 0; }} : {} + + [s]: 0, +>s : Symbol + + [s]() { }, +>s : Symbol + + get [s]() { +>s : Symbol + + return 0; + } +} diff --git a/tests/baselines/reference/symbolProperty2.js b/tests/baselines/reference/symbolProperty2.js new file mode 100644 index 00000000000..5c0f89b0257 --- /dev/null +++ b/tests/baselines/reference/symbolProperty2.js @@ -0,0 +1,20 @@ +//// [symbolProperty2.ts] +var s = Symbol(); +var x = { + [s]: 0, + [s]() { }, + get [s]() { + return 0; + } +} + +//// [symbolProperty2.js] +var s = Symbol(); +var x = { + [s]: 0, + [s]() { + }, + get [s]() { + return 0; + } +}; diff --git a/tests/baselines/reference/symbolProperty2.types b/tests/baselines/reference/symbolProperty2.types new file mode 100644 index 00000000000..d45ff4584f6 --- /dev/null +++ b/tests/baselines/reference/symbolProperty2.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty2.ts === +var s = Symbol(); +>s : Symbol +>Symbol() : Symbol +>Symbol : SymbolConstructor + +var x = { +>x : {} +>{ [s]: 0, [s]() { }, get [s]() { return 0; }} : {} + + [s]: 0, +>s : Symbol + + [s]() { }, +>s : Symbol + + get [s]() { +>s : Symbol + + return 0; + } +} diff --git a/tests/baselines/reference/symbolProperty3.errors.txt b/tests/baselines/reference/symbolProperty3.errors.txt new file mode 100644 index 00000000000..44c75a3ef7b --- /dev/null +++ b/tests/baselines/reference/symbolProperty3.errors.txt @@ -0,0 +1,20 @@ +tests/cases/conformance/es6/Symbols/symbolProperty3.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty3.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty3.ts (3 errors) ==== + var s = Symbol; + var x = { + [s]: 0, + ~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. + [s]() { }, + ~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. + get [s]() { + ~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. + return 0; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty3.js b/tests/baselines/reference/symbolProperty3.js new file mode 100644 index 00000000000..6159b10f9f3 --- /dev/null +++ b/tests/baselines/reference/symbolProperty3.js @@ -0,0 +1,20 @@ +//// [symbolProperty3.ts] +var s = Symbol; +var x = { + [s]: 0, + [s]() { }, + get [s]() { + return 0; + } +} + +//// [symbolProperty3.js] +var s = Symbol; +var x = { + [s]: 0, + [s]() { + }, + get [s]() { + return 0; + } +}; diff --git a/tests/baselines/reference/symbolProperty4.js b/tests/baselines/reference/symbolProperty4.js new file mode 100644 index 00000000000..be7cdab5f85 --- /dev/null +++ b/tests/baselines/reference/symbolProperty4.js @@ -0,0 +1,18 @@ +//// [symbolProperty4.ts] +var x = { + [Symbol()]: 0, + [Symbol()]() { }, + get [Symbol()]() { + return 0; + } +} + +//// [symbolProperty4.js] +var x = { + [Symbol()]: 0, + [Symbol()]() { + }, + get [Symbol()]() { + return 0; + } +}; diff --git a/tests/baselines/reference/symbolProperty4.types b/tests/baselines/reference/symbolProperty4.types new file mode 100644 index 00000000000..af3d7a85590 --- /dev/null +++ b/tests/baselines/reference/symbolProperty4.types @@ -0,0 +1,20 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty4.ts === +var x = { +>x : {} +>{ [Symbol()]: 0, [Symbol()]() { }, get [Symbol()]() { return 0; }} : {} + + [Symbol()]: 0, +>Symbol() : Symbol +>Symbol : SymbolConstructor + + [Symbol()]() { }, +>Symbol() : Symbol +>Symbol : SymbolConstructor + + get [Symbol()]() { +>Symbol() : Symbol +>Symbol : SymbolConstructor + + return 0; + } +} diff --git a/tests/baselines/reference/symbolProperty5.js b/tests/baselines/reference/symbolProperty5.js new file mode 100644 index 00000000000..9f0ff3d688f --- /dev/null +++ b/tests/baselines/reference/symbolProperty5.js @@ -0,0 +1,18 @@ +//// [symbolProperty5.ts] +var x = { + [Symbol.iterator]: 0, + [Symbol.isRegExp]() { }, + get [Symbol.toStringTag]() { + return 0; + } +} + +//// [symbolProperty5.js] +var x = { + [Symbol.iterator]: 0, + [Symbol.isRegExp]() { + }, + get [Symbol.toStringTag]() { + return 0; + } +}; diff --git a/tests/baselines/reference/symbolProperty5.types b/tests/baselines/reference/symbolProperty5.types new file mode 100644 index 00000000000..d39025ae85b --- /dev/null +++ b/tests/baselines/reference/symbolProperty5.types @@ -0,0 +1,23 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty5.ts === +var x = { +>x : { [Symbol.iterator]: number; [Symbol.isRegExp](): void; [Symbol.toStringTag]: number; } +>{ [Symbol.iterator]: 0, [Symbol.isRegExp]() { }, get [Symbol.toStringTag]() { return 0; }} : { [Symbol.iterator]: number; [Symbol.isRegExp](): void; [Symbol.toStringTag]: number; } + + [Symbol.iterator]: 0, +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol + + [Symbol.isRegExp]() { }, +>Symbol.isRegExp : Symbol +>Symbol : SymbolConstructor +>isRegExp : Symbol + + get [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return 0; + } +} diff --git a/tests/baselines/reference/symbolProperty6.js b/tests/baselines/reference/symbolProperty6.js new file mode 100644 index 00000000000..114999dc873 --- /dev/null +++ b/tests/baselines/reference/symbolProperty6.js @@ -0,0 +1,26 @@ +//// [symbolProperty6.ts] +class C { + [Symbol.iterator] = 0; + [Symbol.unscopables]: number; + [Symbol.isRegExp]() { } + get [Symbol.toStringTag]() { + return 0; + } +} + +//// [symbolProperty6.js] +var C = (function () { + function C() { + this[Symbol.iterator] = 0; + } + C.prototype[Symbol.isRegExp] = function () { + }; + Object.defineProperty(C.prototype, Symbol.toStringTag, { + get: function () { + return 0; + }, + enumerable: true, + configurable: true + }); + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty6.types b/tests/baselines/reference/symbolProperty6.types new file mode 100644 index 00000000000..703ef4506a8 --- /dev/null +++ b/tests/baselines/reference/symbolProperty6.types @@ -0,0 +1,27 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty6.ts === +class C { +>C : C + + [Symbol.iterator] = 0; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol + + [Symbol.unscopables]: number; +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol + + [Symbol.isRegExp]() { } +>Symbol.isRegExp : Symbol +>Symbol : SymbolConstructor +>isRegExp : Symbol + + get [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return 0; + } +} diff --git a/tests/baselines/reference/symbolProperty7.errors.txt b/tests/baselines/reference/symbolProperty7.errors.txt new file mode 100644 index 00000000000..0fe3597a10e --- /dev/null +++ b/tests/baselines/reference/symbolProperty7.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/es6/Symbols/symbolProperty7.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/Symbols/symbolProperty7.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty7.ts (2 errors) ==== + class C { + [Symbol()] = 0; + ~~~~~~~~~~ +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. + [Symbol()]: number; + ~~~~~~~~~~ +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. + [Symbol()]() { } + get [Symbol()]() { + return 0; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty8.js b/tests/baselines/reference/symbolProperty8.js new file mode 100644 index 00000000000..6f3ec6cfa26 --- /dev/null +++ b/tests/baselines/reference/symbolProperty8.js @@ -0,0 +1,7 @@ +//// [symbolProperty8.ts] +interface I { + [Symbol.unscopables]: number; + [Symbol.isRegExp](); +} + +//// [symbolProperty8.js] diff --git a/tests/baselines/reference/symbolProperty8.types b/tests/baselines/reference/symbolProperty8.types new file mode 100644 index 00000000000..d1bab0615ed --- /dev/null +++ b/tests/baselines/reference/symbolProperty8.types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty8.ts === +interface I { +>I : I + + [Symbol.unscopables]: number; +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol + + [Symbol.isRegExp](); +>Symbol.isRegExp : Symbol +>Symbol : SymbolConstructor +>isRegExp : Symbol +} diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty1.ts b/tests/cases/conformance/es6/Symbols/symbolProperty1.ts new file mode 100644 index 00000000000..033f1b5cbda --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty1.ts @@ -0,0 +1,9 @@ +//@target: ES6 +var s: Symbol; +var x = { + [s]: 0, + [s]() { }, + get [s]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty2.ts b/tests/cases/conformance/es6/Symbols/symbolProperty2.ts new file mode 100644 index 00000000000..44a2ba13874 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty2.ts @@ -0,0 +1,9 @@ +//@target: ES6 +var s = Symbol(); +var x = { + [s]: 0, + [s]() { }, + get [s]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty3.ts b/tests/cases/conformance/es6/Symbols/symbolProperty3.ts new file mode 100644 index 00000000000..027e93a86ad --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty3.ts @@ -0,0 +1,9 @@ +//@target: ES6 +var s = Symbol; +var x = { + [s]: 0, + [s]() { }, + get [s]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty4.ts b/tests/cases/conformance/es6/Symbols/symbolProperty4.ts new file mode 100644 index 00000000000..b6079bb31b3 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty4.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var x = { + [Symbol()]: 0, + [Symbol()]() { }, + get [Symbol()]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty5.ts b/tests/cases/conformance/es6/Symbols/symbolProperty5.ts new file mode 100644 index 00000000000..84cb12a9de8 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty5.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var x = { + [Symbol.iterator]: 0, + [Symbol.isRegExp]() { }, + get [Symbol.toStringTag]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty6.ts b/tests/cases/conformance/es6/Symbols/symbolProperty6.ts new file mode 100644 index 00000000000..ff17b977c38 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty6.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C { + [Symbol.iterator] = 0; + [Symbol.unscopables]: number; + [Symbol.isRegExp]() { } + get [Symbol.toStringTag]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty7.ts b/tests/cases/conformance/es6/Symbols/symbolProperty7.ts new file mode 100644 index 00000000000..972e96c282b --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty7.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C { + [Symbol()] = 0; + [Symbol()]: number; + [Symbol()]() { } + get [Symbol()]() { + return 0; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty8.ts b/tests/cases/conformance/es6/Symbols/symbolProperty8.ts new file mode 100644 index 00000000000..14b4a32688f --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty8.ts @@ -0,0 +1,5 @@ +//@target: ES6 +interface I { + [Symbol.unscopables]: number; + [Symbol.isRegExp](); +} \ No newline at end of file From 25fcbe2f9ec163da94fef1cfd2251d27c74333e0 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 29 Jan 2015 19:17:16 -0800 Subject: [PATCH 010/106] Change certain hasDynamicName checks to check the SyntaxKind instead --- src/compiler/checker.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7e652f30c62..68d41199de2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7243,7 +7243,7 @@ module ts { } function checkPropertyAssignment(node: PropertyAssignment, contextualMapper?: TypeMapper): Type { - if (hasDynamicName(node)) { + if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); } @@ -7254,7 +7254,7 @@ module ts { // Grammar checking checkGrammarMethod(node); - if (hasDynamicName(node)) { + if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); } @@ -8066,12 +8066,13 @@ module ts { function checkFunctionLikeDeclaration(node: FunctionLikeDeclaration): void { checkSignatureDeclaration(node); - if (hasDynamicName(node)) { + if (node.name.kind === SyntaxKind.ComputedPropertyName) { // This check will account for methods in class/interface declarations, // as well as accessors in classes/object literals checkComputedPropertyName(node.name); } - else { + + if (!hasDynamicName(node)) { // first we want to check the local symbol that contain this declaration // - if node.localSymbol !== undefined - this is current declaration is exported and localSymbol points to the local symbol // - if node.localSymbol === undefined - this node is non-exported so we can just pick the result of getSymbolOfNode @@ -8300,12 +8301,11 @@ module ts { function checkVariableLikeDeclaration(node: VariableLikeDeclaration) { checkSourceElement(node.type); // For a computed property, just check the initializer and exit - if (hasDynamicName(node)) { + if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); if (node.initializer) { checkExpressionCached(node.initializer); } - return; } // For a binding pattern, check contained binding elements if (isBindingPattern(node.name)) { From b60fa1467f94da0566d94bebec061a5cd28f35b9 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 30 Jan 2015 14:57:51 -0800 Subject: [PATCH 011/106] Add tests for operators with symbol operand --- .../reference/symbolType1.errors.txt | 11 ++++ tests/baselines/reference/symbolType1.js | 7 +++ .../reference/symbolType10.errors.txt | 34 ++++++++++++ tests/baselines/reference/symbolType10.js | 16 ++++++ tests/baselines/reference/symbolType11.js | 17 ++++++ tests/baselines/reference/symbolType12.js | 55 +++++++++++++++++++ tests/baselines/reference/symbolType13.js | 17 ++++++ tests/baselines/reference/symbolType2.js | 7 +++ tests/baselines/reference/symbolType3.js | 23 ++++++++ .../reference/symbolType4.errors.txt | 12 ++++ tests/baselines/reference/symbolType4.js | 9 +++ .../reference/symbolType5.errors.txt | 34 ++++++++++++ tests/baselines/reference/symbolType5.js | 16 ++++++ tests/baselines/reference/symbolType6.js | 21 +++++++ .../reference/symbolType7.errors.txt | 37 +++++++++++++ tests/baselines/reference/symbolType7.js | 17 ++++++ tests/baselines/reference/symbolType8.js | 21 +++++++ tests/baselines/reference/symbolType9.js | 21 +++++++ tests/baselines/reference/symbolType9.types | 44 +++++++++++++++ .../conformance/es6/Symbols/symbolType1.ts | 3 + .../conformance/es6/Symbols/symbolType10.ts | 8 +++ .../conformance/es6/Symbols/symbolType11.ts | 8 +++ .../conformance/es6/Symbols/symbolType12.ts | 27 +++++++++ .../conformance/es6/Symbols/symbolType13.ts | 7 +++ .../conformance/es6/Symbols/symbolType2.ts | 3 + .../conformance/es6/Symbols/symbolType3.ts | 11 ++++ .../conformance/es6/Symbols/symbolType4.ts | 4 ++ .../conformance/es6/Symbols/symbolType5.ts | 8 +++ .../conformance/es6/Symbols/symbolType6.ts | 10 ++++ .../conformance/es6/Symbols/symbolType7.ts | 8 +++ .../conformance/es6/Symbols/symbolType8.ts | 10 ++++ .../conformance/es6/Symbols/symbolType9.ts | 10 ++++ 32 files changed, 536 insertions(+) create mode 100644 tests/baselines/reference/symbolType1.errors.txt create mode 100644 tests/baselines/reference/symbolType1.js create mode 100644 tests/baselines/reference/symbolType10.errors.txt create mode 100644 tests/baselines/reference/symbolType10.js create mode 100644 tests/baselines/reference/symbolType11.js create mode 100644 tests/baselines/reference/symbolType12.js create mode 100644 tests/baselines/reference/symbolType13.js create mode 100644 tests/baselines/reference/symbolType2.js create mode 100644 tests/baselines/reference/symbolType3.js create mode 100644 tests/baselines/reference/symbolType4.errors.txt create mode 100644 tests/baselines/reference/symbolType4.js create mode 100644 tests/baselines/reference/symbolType5.errors.txt create mode 100644 tests/baselines/reference/symbolType5.js create mode 100644 tests/baselines/reference/symbolType6.js create mode 100644 tests/baselines/reference/symbolType7.errors.txt create mode 100644 tests/baselines/reference/symbolType7.js create mode 100644 tests/baselines/reference/symbolType8.js create mode 100644 tests/baselines/reference/symbolType9.js create mode 100644 tests/baselines/reference/symbolType9.types create mode 100644 tests/cases/conformance/es6/Symbols/symbolType1.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType10.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType11.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType12.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType13.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType2.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType3.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType4.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType5.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType6.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType7.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType8.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType9.ts diff --git a/tests/baselines/reference/symbolType1.errors.txt b/tests/baselines/reference/symbolType1.errors.txt new file mode 100644 index 00000000000..db535f57625 --- /dev/null +++ b/tests/baselines/reference/symbolType1.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/es6/Symbols/symbolType1.ts(1,1): error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter. +tests/cases/conformance/es6/Symbols/symbolType1.ts(2,19): error TS2359: The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type. + + +==== tests/cases/conformance/es6/Symbols/symbolType1.ts (2 errors) ==== + Symbol() instanceof Symbol; + ~~~~~~~~ +!!! error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter. + Symbol instanceof Symbol(); + ~~~~~~~~ +!!! error TS2359: The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType1.js b/tests/baselines/reference/symbolType1.js new file mode 100644 index 00000000000..a3b00871c4e --- /dev/null +++ b/tests/baselines/reference/symbolType1.js @@ -0,0 +1,7 @@ +//// [symbolType1.ts] +Symbol() instanceof Symbol; +Symbol instanceof Symbol(); + +//// [symbolType1.js] +Symbol() instanceof Symbol; +Symbol instanceof Symbol(); diff --git a/tests/baselines/reference/symbolType10.errors.txt b/tests/baselines/reference/symbolType10.errors.txt new file mode 100644 index 00000000000..852f863bae8 --- /dev/null +++ b/tests/baselines/reference/symbolType10.errors.txt @@ -0,0 +1,34 @@ +tests/cases/conformance/es6/Symbols/symbolType10.ts(2,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(2,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(3,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(3,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(4,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(4,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(6,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType10.ts(7,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + +==== tests/cases/conformance/es6/Symbols/symbolType10.ts (8 errors) ==== + var s = Symbol.for("bitwise"); + s & s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s | s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s ^ s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + s & 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + 0 | s; + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType10.js b/tests/baselines/reference/symbolType10.js new file mode 100644 index 00000000000..378479fb70f --- /dev/null +++ b/tests/baselines/reference/symbolType10.js @@ -0,0 +1,16 @@ +//// [symbolType10.ts] +var s = Symbol.for("bitwise"); +s & s; +s | s; +s ^ s; + +s & 0; +0 | s; + +//// [symbolType10.js] +var s = Symbol.for("bitwise"); +s & s; +s | s; +s ^ s; +s & 0; +0 | s; diff --git a/tests/baselines/reference/symbolType11.js b/tests/baselines/reference/symbolType11.js new file mode 100644 index 00000000000..3328be28d15 --- /dev/null +++ b/tests/baselines/reference/symbolType11.js @@ -0,0 +1,17 @@ +//// [symbolType11.ts] +var s = Symbol.for("logical"); +s && s; +s && []; +0 && s; +s || s; +s || 1; +({}) || s; + +//// [symbolType11.js] +var s = Symbol.for("logical"); +s && s; +s && []; +0 && s; +s || s; +s || 1; +({}) || s; diff --git a/tests/baselines/reference/symbolType12.js b/tests/baselines/reference/symbolType12.js new file mode 100644 index 00000000000..05d7fa03eb6 --- /dev/null +++ b/tests/baselines/reference/symbolType12.js @@ -0,0 +1,55 @@ +//// [symbolType12.ts] +var s = Symbol.for("assign"); +var str = ""; +s *= s; +s *= 0; +s /= s; +s /= 0; +s %= s; +s %= 0; +s += s; +s += 0; +s += ""; +str += s; +s -= s; +s -= 0; +s <<= s; +s <<= 0; +s >>= s; +s >>= 0; +s >>>= s; +s >>>= 0; +s &= s; +s &= 0; +s ^= s; +s ^= 0; +s |= s; +s |= 0; + +//// [symbolType12.js] +var s = Symbol.for("assign"); +var str = ""; +s *= s; +s *= 0; +s /= s; +s /= 0; +s %= s; +s %= 0; +s += s; +s += 0; +s += ""; +str += s; +s -= s; +s -= 0; +s <<= s; +s <<= 0; +s >>= s; +s >>= 0; +s >>>= s; +s >>>= 0; +s &= s; +s &= 0; +s ^= s; +s ^= 0; +s |= s; +s |= 0; diff --git a/tests/baselines/reference/symbolType13.js b/tests/baselines/reference/symbolType13.js new file mode 100644 index 00000000000..56aef2cc8e6 --- /dev/null +++ b/tests/baselines/reference/symbolType13.js @@ -0,0 +1,17 @@ +//// [symbolType13.ts] +var s = Symbol(); +var x: any; + +for (s in {}) { } +for (x in s) { } +for (var y in s) { } + +//// [symbolType13.js] +var s = Symbol(); +var x; +for (s in {}) { +} +for (x in s) { +} +for (var y in s) { +} diff --git a/tests/baselines/reference/symbolType2.js b/tests/baselines/reference/symbolType2.js new file mode 100644 index 00000000000..e15e4da626e --- /dev/null +++ b/tests/baselines/reference/symbolType2.js @@ -0,0 +1,7 @@ +//// [symbolType2.ts] +Symbol.isConcatSpreadable in {}; +"" in Symbol.toPrimitive; + +//// [symbolType2.js] +Symbol.isConcatSpreadable in {}; +"" in Symbol.toPrimitive; diff --git a/tests/baselines/reference/symbolType3.js b/tests/baselines/reference/symbolType3.js new file mode 100644 index 00000000000..088449a3a89 --- /dev/null +++ b/tests/baselines/reference/symbolType3.js @@ -0,0 +1,23 @@ +//// [symbolType3.ts] +var s = Symbol(); +delete Symbol.iterator; +void Symbol.toPrimitive; +typeof Symbol.toStringTag; +++s; +--s; ++ Symbol(); +- Symbol(); +~ Symbol(); +! Symbol(); + +//// [symbolType3.js] +var s = Symbol(); +delete Symbol.iterator; +void Symbol.toPrimitive; +typeof Symbol.toStringTag; +++s; +--s; ++Symbol(); +-Symbol(); +~Symbol(); +!Symbol(); diff --git a/tests/baselines/reference/symbolType4.errors.txt b/tests/baselines/reference/symbolType4.errors.txt new file mode 100644 index 00000000000..210fe94b8d7 --- /dev/null +++ b/tests/baselines/reference/symbolType4.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/es6/Symbols/symbolType4.ts(2,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType4.ts(3,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + + +==== tests/cases/conformance/es6/Symbols/symbolType4.ts (2 errors) ==== + var s = Symbol.for("postfix"); + s++; + ~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + s--; + ~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType4.js b/tests/baselines/reference/symbolType4.js new file mode 100644 index 00000000000..321de5a3bf9 --- /dev/null +++ b/tests/baselines/reference/symbolType4.js @@ -0,0 +1,9 @@ +//// [symbolType4.ts] +var s = Symbol.for("postfix"); +s++; +s--; + +//// [symbolType4.js] +var s = Symbol.for("postfix"); +s++; +s--; diff --git a/tests/baselines/reference/symbolType5.errors.txt b/tests/baselines/reference/symbolType5.errors.txt new file mode 100644 index 00000000000..af70aad0f26 --- /dev/null +++ b/tests/baselines/reference/symbolType5.errors.txt @@ -0,0 +1,34 @@ +tests/cases/conformance/es6/Symbols/symbolType5.ts(2,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(2,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(3,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(3,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(4,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(4,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(6,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType5.ts(7,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + +==== tests/cases/conformance/es6/Symbols/symbolType5.ts (8 errors) ==== + var s = Symbol.for("multiply"); + s * s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s / s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s % s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + s * 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + 0 / s; + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType5.js b/tests/baselines/reference/symbolType5.js new file mode 100644 index 00000000000..ce76e034bd9 --- /dev/null +++ b/tests/baselines/reference/symbolType5.js @@ -0,0 +1,16 @@ +//// [symbolType5.ts] +var s = Symbol.for("multiply"); +s * s; +s / s; +s % s; + +s * 0; +0 / s; + +//// [symbolType5.js] +var s = Symbol.for("multiply"); +s * s; +s / s; +s % s; +s * 0; +0 / s; diff --git a/tests/baselines/reference/symbolType6.js b/tests/baselines/reference/symbolType6.js new file mode 100644 index 00000000000..ad16baa28b4 --- /dev/null +++ b/tests/baselines/reference/symbolType6.js @@ -0,0 +1,21 @@ +//// [symbolType6.ts] +var s = Symbol.for("add"); +s + s; +s - s; +s + ""; +s + 0; +"" + s; +0 + s; +s - 0; +0 - s; + +//// [symbolType6.js] +var s = Symbol.for("add"); +s + s; +s - s; +s + ""; +s + 0; +"" + s; +0 + s; +s - 0; +0 - s; diff --git a/tests/baselines/reference/symbolType7.errors.txt b/tests/baselines/reference/symbolType7.errors.txt new file mode 100644 index 00000000000..80ecd2486ff --- /dev/null +++ b/tests/baselines/reference/symbolType7.errors.txt @@ -0,0 +1,37 @@ +tests/cases/conformance/es6/Symbols/symbolType7.ts(2,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(2,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(3,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(4,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(4,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(5,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(6,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(6,7): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType7.ts(7,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + +==== tests/cases/conformance/es6/Symbols/symbolType7.ts (9 errors) ==== + var s = Symbol.for("shift"); + s << s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s << 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >> s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >> 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >>> s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >>> 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType7.js b/tests/baselines/reference/symbolType7.js new file mode 100644 index 00000000000..47ace567a3d --- /dev/null +++ b/tests/baselines/reference/symbolType7.js @@ -0,0 +1,17 @@ +//// [symbolType7.ts] +var s = Symbol.for("shift"); +s << s; +s << 0; +s >> s; +s >> 0; +s >>> s; +s >>> 0; + +//// [symbolType7.js] +var s = Symbol.for("shift"); +s << s; +s << 0; +s >> s; +s >> 0; +s >>> s; +s >>> 0; diff --git a/tests/baselines/reference/symbolType8.js b/tests/baselines/reference/symbolType8.js new file mode 100644 index 00000000000..e80dea220b9 --- /dev/null +++ b/tests/baselines/reference/symbolType8.js @@ -0,0 +1,21 @@ +//// [symbolType8.ts] +var s = Symbol.for("compare"); +s < s; +s < 0; +s > s; +s > 0; +s <= s; +s <= 0; +s >= s; +s >= 0; + +//// [symbolType8.js] +var s = Symbol.for("compare"); +s < s; +s < 0; +s > s; +s > 0; +s <= s; +s <= 0; +s >= s; +s >= 0; diff --git a/tests/baselines/reference/symbolType9.js b/tests/baselines/reference/symbolType9.js new file mode 100644 index 00000000000..c9b0c801cc8 --- /dev/null +++ b/tests/baselines/reference/symbolType9.js @@ -0,0 +1,21 @@ +//// [symbolType9.ts] +var s = Symbol.for("equal"); +s == s; +s == true; +s != s; +0 != s; +s === s; +s === 1; +s !== s; +false !== s; + +//// [symbolType9.js] +var s = Symbol.for("equal"); +s == s; +s == true; +s != s; +0 != s; +s === s; +s === 1; +s !== s; +false !== s; diff --git a/tests/baselines/reference/symbolType9.types b/tests/baselines/reference/symbolType9.types new file mode 100644 index 00000000000..f2d1af709ac --- /dev/null +++ b/tests/baselines/reference/symbolType9.types @@ -0,0 +1,44 @@ +=== tests/cases/conformance/es6/Symbols/symbolType9.ts === +var s = Symbol.for("equal"); +>s : Symbol +>Symbol.for("equal") : Symbol +>Symbol.for : (key: string) => Symbol +>Symbol : SymbolConstructor +>for : (key: string) => Symbol + +s == s; +>s == s : boolean +>s : Symbol +>s : Symbol + +s == true; +>s == true : boolean +>s : Symbol + +s != s; +>s != s : boolean +>s : Symbol +>s : Symbol + +0 != s; +>0 != s : boolean +>s : Symbol + +s === s; +>s === s : boolean +>s : Symbol +>s : Symbol + +s === 1; +>s === 1 : boolean +>s : Symbol + +s !== s; +>s !== s : boolean +>s : Symbol +>s : Symbol + +false !== s; +>false !== s : boolean +>s : Symbol + diff --git a/tests/cases/conformance/es6/Symbols/symbolType1.ts b/tests/cases/conformance/es6/Symbols/symbolType1.ts new file mode 100644 index 00000000000..3945ecc76e8 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType1.ts @@ -0,0 +1,3 @@ +//@target: ES6 +Symbol() instanceof Symbol; +Symbol instanceof Symbol(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType10.ts b/tests/cases/conformance/es6/Symbols/symbolType10.ts new file mode 100644 index 00000000000..a1ee87de159 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType10.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var s = Symbol.for("bitwise"); +s & s; +s | s; +s ^ s; + +s & 0; +0 | s; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType11.ts b/tests/cases/conformance/es6/Symbols/symbolType11.ts new file mode 100644 index 00000000000..8b9661bb046 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType11.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var s = Symbol.for("logical"); +s && s; +s && []; +0 && s; +s || s; +s || 1; +({}) || s; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType12.ts b/tests/cases/conformance/es6/Symbols/symbolType12.ts new file mode 100644 index 00000000000..7197c13497d --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType12.ts @@ -0,0 +1,27 @@ +//@target: ES6 +var s = Symbol.for("assign"); +var str = ""; +s *= s; +s *= 0; +s /= s; +s /= 0; +s %= s; +s %= 0; +s += s; +s += 0; +s += ""; +str += s; +s -= s; +s -= 0; +s <<= s; +s <<= 0; +s >>= s; +s >>= 0; +s >>>= s; +s >>>= 0; +s &= s; +s &= 0; +s ^= s; +s ^= 0; +s |= s; +s |= 0; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType13.ts b/tests/cases/conformance/es6/Symbols/symbolType13.ts new file mode 100644 index 00000000000..4b657c4c37a --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType13.ts @@ -0,0 +1,7 @@ +//@target: ES6 +var s = Symbol(); +var x: any; + +for (s in {}) { } +for (x in s) { } +for (var y in s) { } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType2.ts b/tests/cases/conformance/es6/Symbols/symbolType2.ts new file mode 100644 index 00000000000..54954c17bd3 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType2.ts @@ -0,0 +1,3 @@ +//@target: ES6 +Symbol.isConcatSpreadable in {}; +"" in Symbol.toPrimitive; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType3.ts b/tests/cases/conformance/es6/Symbols/symbolType3.ts new file mode 100644 index 00000000000..ca098fe0695 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType3.ts @@ -0,0 +1,11 @@ +//@target: ES6 +var s = Symbol(); +delete Symbol.iterator; +void Symbol.toPrimitive; +typeof Symbol.toStringTag; +++s; +--s; ++ Symbol(); +- Symbol(); +~ Symbol(); +! Symbol(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType4.ts b/tests/cases/conformance/es6/Symbols/symbolType4.ts new file mode 100644 index 00000000000..bd5b5ba1a06 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType4.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var s = Symbol.for("postfix"); +s++; +s--; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType5.ts b/tests/cases/conformance/es6/Symbols/symbolType5.ts new file mode 100644 index 00000000000..302cfcafdf3 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType5.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var s = Symbol.for("multiply"); +s * s; +s / s; +s % s; + +s * 0; +0 / s; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType6.ts b/tests/cases/conformance/es6/Symbols/symbolType6.ts new file mode 100644 index 00000000000..b6f58ac5b29 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType6.ts @@ -0,0 +1,10 @@ +//@target: ES6 +var s = Symbol.for("add"); +s + s; +s - s; +s + ""; +s + 0; +"" + s; +0 + s; +s - 0; +0 - s; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType7.ts b/tests/cases/conformance/es6/Symbols/symbolType7.ts new file mode 100644 index 00000000000..841ca9e8b10 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType7.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var s = Symbol.for("shift"); +s << s; +s << 0; +s >> s; +s >> 0; +s >>> s; +s >>> 0; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType8.ts b/tests/cases/conformance/es6/Symbols/symbolType8.ts new file mode 100644 index 00000000000..4970ae0a9ca --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType8.ts @@ -0,0 +1,10 @@ +//@target: ES6 +var s = Symbol.for("compare"); +s < s; +s < 0; +s > s; +s > 0; +s <= s; +s <= 0; +s >= s; +s >= 0; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType9.ts b/tests/cases/conformance/es6/Symbols/symbolType9.ts new file mode 100644 index 00000000000..1fa43143640 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType9.ts @@ -0,0 +1,10 @@ +//@target: ES6 +var s = Symbol.for("equal"); +s == s; +s == true; +s != s; +0 != s; +s === s; +s === 1; +s !== s; +false !== s; \ No newline at end of file From 779661c8dafd36e2cbd70dc4d7ac645369c4f1e0 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 2 Feb 2015 12:48:18 -0800 Subject: [PATCH 012/106] Add tests for symbol properties --- .../conformance/es6/Symbols/symbolProperty10.ts | 11 +++++++++++ .../conformance/es6/Symbols/symbolProperty11.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty12.ts | 11 +++++++++++ .../conformance/es6/Symbols/symbolProperty13.ts | 17 +++++++++++++++++ .../conformance/es6/Symbols/symbolProperty14.ts | 17 +++++++++++++++++ .../conformance/es6/Symbols/symbolProperty15.ts | 15 +++++++++++++++ .../conformance/es6/Symbols/symbolProperty16.ts | 17 +++++++++++++++++ .../conformance/es6/Symbols/symbolProperty17.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty18.ts | 10 ++++++++++ .../conformance/es6/Symbols/symbolProperty19.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty20.ts | 10 ++++++++++ .../conformance/es6/Symbols/symbolProperty21.ts | 13 +++++++++++++ .../conformance/es6/Symbols/symbolProperty22.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty23.ts | 10 ++++++++++ .../conformance/es6/Symbols/symbolProperty24.ts | 10 ++++++++++ .../conformance/es6/Symbols/symbolProperty25.ts | 10 ++++++++++ .../conformance/es6/Symbols/symbolProperty26.ts | 12 ++++++++++++ .../conformance/es6/Symbols/symbolProperty27.ts | 12 ++++++++++++ .../conformance/es6/Symbols/symbolProperty28.ts | 11 +++++++++++ .../conformance/es6/Symbols/symbolProperty29.ts | 7 +++++++ .../conformance/es6/Symbols/symbolProperty30.ts | 7 +++++++ .../conformance/es6/Symbols/symbolProperty31.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty32.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty33.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty34.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty35.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty36.ts | 5 +++++ .../conformance/es6/Symbols/symbolProperty37.ts | 5 +++++ .../conformance/es6/Symbols/symbolProperty38.ts | 7 +++++++ .../conformance/es6/Symbols/symbolProperty39.ts | 11 +++++++++++ .../conformance/es6/Symbols/symbolProperty40.ts | 12 ++++++++++++ .../conformance/es6/Symbols/symbolProperty41.ts | 12 ++++++++++++ .../conformance/es6/Symbols/symbolProperty42.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty43.ts | 5 +++++ .../conformance/es6/Symbols/symbolProperty44.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty45.ts | 9 +++++++++ .../conformance/es6/Symbols/symbolProperty46.ts | 12 ++++++++++++ .../conformance/es6/Symbols/symbolProperty47.ts | 12 ++++++++++++ .../conformance/es6/Symbols/symbolProperty48.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty49.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty50.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty51.ts | 8 ++++++++ .../conformance/es6/Symbols/symbolProperty52.ts | 6 ++++++ .../conformance/es6/Symbols/symbolProperty53.ts | 4 ++++ .../conformance/es6/Symbols/symbolProperty54.ts | 4 ++++ .../conformance/es6/Symbols/symbolProperty9.ts | 11 +++++++++++ 46 files changed, 443 insertions(+) create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty10.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty11.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty12.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty13.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty14.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty15.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty16.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty17.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty18.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty19.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty20.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty21.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty22.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty23.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty24.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty25.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty26.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty27.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty28.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty29.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty30.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty31.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty32.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty33.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty34.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty35.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty36.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty37.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty38.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty39.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty40.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty41.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty42.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty43.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty44.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty45.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty46.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty47.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty48.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty49.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty50.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty51.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty52.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty53.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty54.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty9.ts diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty10.ts b/tests/cases/conformance/es6/Symbols/symbolProperty10.ts new file mode 100644 index 00000000000..0f63356eaf6 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty10.ts @@ -0,0 +1,11 @@ +//@target: ES6 +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]?: { x }; +} + +var i: I; +i = new C; +var c: C = i; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty11.ts b/tests/cases/conformance/es6/Symbols/symbolProperty11.ts new file mode 100644 index 00000000000..1377970613d --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty11.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C { } +interface I { + [Symbol.iterator]?: { x }; +} + +var i: I; +i = new C; +var c: C = i; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty12.ts b/tests/cases/conformance/es6/Symbols/symbolProperty12.ts new file mode 100644 index 00000000000..5a835a34b62 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty12.ts @@ -0,0 +1,11 @@ +//@target: ES6 +class C { + private [Symbol.iterator]: { x }; +} +interface I { + [Symbol.iterator]: { x }; +} + +var i: I; +i = new C; +var c: C = i; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty13.ts b/tests/cases/conformance/es6/Symbols/symbolProperty13.ts new file mode 100644 index 00000000000..4b5023e1d06 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty13.ts @@ -0,0 +1,17 @@ +//@target: ES6 +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty14.ts b/tests/cases/conformance/es6/Symbols/symbolProperty14.ts new file mode 100644 index 00000000000..0109ec3be25 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty14.ts @@ -0,0 +1,17 @@ +//@target: ES6 +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]?: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty15.ts b/tests/cases/conformance/es6/Symbols/symbolProperty15.ts new file mode 100644 index 00000000000..3ec6c6ecc7a --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty15.ts @@ -0,0 +1,15 @@ +//@target: ES6 +class C { } +interface I { + [Symbol.iterator]?: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty16.ts b/tests/cases/conformance/es6/Symbols/symbolProperty16.ts new file mode 100644 index 00000000000..2b3a976df98 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty16.ts @@ -0,0 +1,17 @@ +//@target: ES6 +class C { + private [Symbol.iterator]: { x }; +} +interface I { + [Symbol.iterator]: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty17.ts b/tests/cases/conformance/es6/Symbols/symbolProperty17.ts new file mode 100644 index 00000000000..450fbb70dd6 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty17.ts @@ -0,0 +1,9 @@ +//@target: ES6 +interface I { + [Symbol.iterator]: number; + [s: Symbol]: string; + "__@iterator": string; +} + +var i: I; +var it = i[Symbol.iterator]; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty18.ts b/tests/cases/conformance/es6/Symbols/symbolProperty18.ts new file mode 100644 index 00000000000..2fabea34960 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty18.ts @@ -0,0 +1,10 @@ +//@target: ES6 +var i = { + [Symbol.iterator]: 0, + [Symbol.toStringTag]() { return "" }, + set [Symbol.toPrimitive](p: boolean) { } +} + +var it = i[Symbol.iterator]; +var str = i[Symbol.toStringTag](); +i[Symbol.toPrimitive] = false; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty19.ts b/tests/cases/conformance/es6/Symbols/symbolProperty19.ts new file mode 100644 index 00000000000..df9b99f5ca4 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty19.ts @@ -0,0 +1,8 @@ +//@target: ES6 +var i = { + [Symbol.iterator]: { p: null }, + [Symbol.toStringTag]() { return { p: undefined }; } +} + +var it = i[Symbol.iterator]; +var str = i[Symbol.toStringTag](); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty20.ts b/tests/cases/conformance/es6/Symbols/symbolProperty20.ts new file mode 100644 index 00000000000..7180ceec87d --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty20.ts @@ -0,0 +1,10 @@ +//@target: ES6 +interface I { + [Symbol.iterator]: (s: string) => string; + [Symbol.toStringTag](s: number): number; +} + +var i: I = { + [Symbol.iterator]: s => s, + [Symbol.toStringTag](n) { return n; } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty21.ts b/tests/cases/conformance/es6/Symbols/symbolProperty21.ts new file mode 100644 index 00000000000..52e84a00425 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty21.ts @@ -0,0 +1,13 @@ +//@target: ES6 +interface I { + [Symbol.unscopables]: T; + [Symbol.isConcatSpreadable]: U; +} + +declare function foo(p: I): { t: T; u: U }; + +foo({ + [Symbol.isConcatSpreadable]: "", + [Symbol.isRegExp]: 0, + [Symbol.unscopables]: true +}); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty22.ts b/tests/cases/conformance/es6/Symbols/symbolProperty22.ts new file mode 100644 index 00000000000..a0eec6dd471 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty22.ts @@ -0,0 +1,8 @@ +//@target: ES6 +interface I { + [Symbol.unscopables](x: T): U; +} + +declare function foo(p1: T, p2: I): U; + +foo("", { [Symbol.unscopables]: s => s.length }); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty23.ts b/tests/cases/conformance/es6/Symbols/symbolProperty23.ts new file mode 100644 index 00000000000..6d8a2108720 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty23.ts @@ -0,0 +1,10 @@ +//@target: ES6 +interface I { + [Symbol.toPrimitive]: () => boolean; +} + +class C implements I { + [Symbol.toPrimitive]() { + return true; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty24.ts b/tests/cases/conformance/es6/Symbols/symbolProperty24.ts new file mode 100644 index 00000000000..8e1c35879ab --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty24.ts @@ -0,0 +1,10 @@ +//@target: ES6 +interface I { + [Symbol.toPrimitive]: () => boolean; +} + +class C implements I { + [Symbol.toPrimitive]() { + return ""; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty25.ts b/tests/cases/conformance/es6/Symbols/symbolProperty25.ts new file mode 100644 index 00000000000..ee571174933 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty25.ts @@ -0,0 +1,10 @@ +//@target: ES6 +interface I { + [Symbol.toPrimitive]: () => boolean; +} + +class C implements I { + [Symbol.toStringTag]() { + return ""; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty26.ts b/tests/cases/conformance/es6/Symbols/symbolProperty26.ts new file mode 100644 index 00000000000..88b7d168d64 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty26.ts @@ -0,0 +1,12 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return ""; + } +} + +class C2 extends C1 { + [Symbol.toStringTag]() { + return ""; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty27.ts b/tests/cases/conformance/es6/Symbols/symbolProperty27.ts new file mode 100644 index 00000000000..c6283595575 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty27.ts @@ -0,0 +1,12 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return {}; + } +} + +class C2 extends C1 { + [Symbol.toStringTag]() { + return ""; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty28.ts b/tests/cases/conformance/es6/Symbols/symbolProperty28.ts new file mode 100644 index 00000000000..7f68444a75e --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty28.ts @@ -0,0 +1,11 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} + +class C2 extends C1 { } + +var c: C2; +var obj = c[Symbol.toStringTag]().x; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty29.ts b/tests/cases/conformance/es6/Symbols/symbolProperty29.ts new file mode 100644 index 00000000000..43701b715f9 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty29.ts @@ -0,0 +1,7 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + [s: Symbol]: () => { x: string }; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty30.ts b/tests/cases/conformance/es6/Symbols/symbolProperty30.ts new file mode 100644 index 00000000000..e2460604a87 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty30.ts @@ -0,0 +1,7 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + [s: Symbol]: () => { x: number }; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty31.ts b/tests/cases/conformance/es6/Symbols/symbolProperty31.ts new file mode 100644 index 00000000000..6d39675bf52 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty31.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 extends C1 { + [s: Symbol]: () => { x: string }; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty32.ts b/tests/cases/conformance/es6/Symbols/symbolProperty32.ts new file mode 100644 index 00000000000..873187ff614 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty32.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 extends C1 { + [s: Symbol]: () => { x: number }; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty33.ts b/tests/cases/conformance/es6/Symbols/symbolProperty33.ts new file mode 100644 index 00000000000..12669f89d6f --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty33.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C1 extends C2 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 { + [s: Symbol]: () => { x: string }; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty34.ts b/tests/cases/conformance/es6/Symbols/symbolProperty34.ts new file mode 100644 index 00000000000..5d41b87002d --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty34.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C1 extends C2 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 { + [s: Symbol]: () => { x: number }; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty35.ts b/tests/cases/conformance/es6/Symbols/symbolProperty35.ts new file mode 100644 index 00000000000..2d9527e2fd4 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty35.ts @@ -0,0 +1,9 @@ +//@target: ES6 +interface I1 { + [Symbol.toStringTag](): { x: string } +} +interface I2 { + [Symbol.toStringTag](): { x: number } +} + +interface I3 extends I1, I2 { } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty36.ts b/tests/cases/conformance/es6/Symbols/symbolProperty36.ts new file mode 100644 index 00000000000..709ea39cd5d --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty36.ts @@ -0,0 +1,5 @@ +//@target: ES6 +var x = { + [Symbol.isConcatSpreadable]: 0, + [Symbol.isConcatSpreadable]: 1 +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty37.ts b/tests/cases/conformance/es6/Symbols/symbolProperty37.ts new file mode 100644 index 00000000000..7a6c86a7bea --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty37.ts @@ -0,0 +1,5 @@ +//@target: ES6 +interface I { + [Symbol.isConcatSpreadable]: string; + [Symbol.isConcatSpreadable]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty38.ts b/tests/cases/conformance/es6/Symbols/symbolProperty38.ts new file mode 100644 index 00000000000..c8683344edc --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty38.ts @@ -0,0 +1,7 @@ +//@target: ES6 +interface I { + [Symbol.isConcatSpreadable]: string; +} +interface I { + [Symbol.isConcatSpreadable]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty39.ts b/tests/cases/conformance/es6/Symbols/symbolProperty39.ts new file mode 100644 index 00000000000..af3a95eb155 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty39.ts @@ -0,0 +1,11 @@ +//@target: ES6 +class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; + [Symbol.iterator](x: any) { + return undefined; + } + [Symbol.iterator](x: any) { + return undefined; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty40.ts b/tests/cases/conformance/es6/Symbols/symbolProperty40.ts new file mode 100644 index 00000000000..91fd953a4d7 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty40.ts @@ -0,0 +1,12 @@ +//@target: ES6 +class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; + [Symbol.iterator](x: any) { + return undefined; + } +} + +var c = new C; +c[Symbol.iterator](""); +c[Symbol.iterator](0); diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty41.ts b/tests/cases/conformance/es6/Symbols/symbolProperty41.ts new file mode 100644 index 00000000000..9c9583264cd --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty41.ts @@ -0,0 +1,12 @@ +//@target: ES6 +class C { + [Symbol.iterator](x: string): { x: string }; + [Symbol.iterator](x: "hello"): { x: string; hello: string }; + [Symbol.iterator](x: any) { + return undefined; + } +} + +var c = new C; +c[Symbol.iterator](""); +c[Symbol.iterator]("hello"); diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty42.ts b/tests/cases/conformance/es6/Symbols/symbolProperty42.ts new file mode 100644 index 00000000000..79fbce7bb90 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty42.ts @@ -0,0 +1,8 @@ +//@target: ES6 +class C { + [Symbol.iterator](x: string): string; + static [Symbol.iterator](x: number): number; + [Symbol.iterator](x: any) { + return undefined; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty43.ts b/tests/cases/conformance/es6/Symbols/symbolProperty43.ts new file mode 100644 index 00000000000..c524b6423a5 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty43.ts @@ -0,0 +1,5 @@ +//@target: ES6 +class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty44.ts b/tests/cases/conformance/es6/Symbols/symbolProperty44.ts new file mode 100644 index 00000000000..a6281592605 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty44.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C { + get [Symbol.hasInstance]() { + return ""; + } + get [Symbol.hasInstance]() { + return ""; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty45.ts b/tests/cases/conformance/es6/Symbols/symbolProperty45.ts new file mode 100644 index 00000000000..cfdcc317646 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty45.ts @@ -0,0 +1,9 @@ +//@target: ES6 +class C { + get [Symbol.hasInstance]() { + return ""; + } + get [Symbol.toPrimitive]() { + return ""; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty46.ts b/tests/cases/conformance/es6/Symbols/symbolProperty46.ts new file mode 100644 index 00000000000..84ce050ac1c --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty46.ts @@ -0,0 +1,12 @@ +//@target: ES6 +class C { + get [Symbol.hasInstance]() { + return ""; + } + // Should take a string + set [Symbol.hasInstance](x) { + } +} + +(new C)[Symbol.hasInstance] = 0; +(new C)[Symbol.hasInstance] = ""; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty47.ts b/tests/cases/conformance/es6/Symbols/symbolProperty47.ts new file mode 100644 index 00000000000..05e46aaee75 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty47.ts @@ -0,0 +1,12 @@ +//@target: ES6 +class C { + get [Symbol.hasInstance]() { + return ""; + } + // Should take a string + set [Symbol.hasInstance](x: number) { + } +} + +(new C)[Symbol.hasInstance] = 0; +(new C)[Symbol.hasInstance] = ""; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty48.ts b/tests/cases/conformance/es6/Symbols/symbolProperty48.ts new file mode 100644 index 00000000000..77ce9303b44 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty48.ts @@ -0,0 +1,8 @@ +//@target: ES6 +module M { + var Symbol; + + class C { + [Symbol.iterator]() { } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty49.ts b/tests/cases/conformance/es6/Symbols/symbolProperty49.ts new file mode 100644 index 00000000000..bc34e146f2c --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty49.ts @@ -0,0 +1,8 @@ +//@target: ES6 +module M { + export var Symbol; + + class C { + [Symbol.iterator]() { } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty50.ts b/tests/cases/conformance/es6/Symbols/symbolProperty50.ts new file mode 100644 index 00000000000..8bcf25fab29 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty50.ts @@ -0,0 +1,8 @@ +//@target: ES6 +module M { + interface Symbol { } + + class C { + [Symbol.iterator]() { } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty51.ts b/tests/cases/conformance/es6/Symbols/symbolProperty51.ts new file mode 100644 index 00000000000..3da5d45bf84 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty51.ts @@ -0,0 +1,8 @@ +//@target: ES6 +module M { + module Symbol { } + + class C { + [Symbol.iterator]() { } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty52.ts b/tests/cases/conformance/es6/Symbols/symbolProperty52.ts new file mode 100644 index 00000000000..324278ea804 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty52.ts @@ -0,0 +1,6 @@ +//@target: ES6 +var obj = { + [Symbol.nonsense]: 0 +}; + +obj = {}; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty53.ts b/tests/cases/conformance/es6/Symbols/symbolProperty53.ts new file mode 100644 index 00000000000..04cdf21a67e --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty53.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var obj = { + [Symbol.for]: 0 +}; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty54.ts b/tests/cases/conformance/es6/Symbols/symbolProperty54.ts new file mode 100644 index 00000000000..b3eab2a54a1 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty54.ts @@ -0,0 +1,4 @@ +//@target: ES6 +var obj = { + [Symbol.prototype]: 0 +}; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty9.ts b/tests/cases/conformance/es6/Symbols/symbolProperty9.ts new file mode 100644 index 00000000000..33ffcb5ee25 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty9.ts @@ -0,0 +1,11 @@ +//@target: ES6 +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]: { x }; +} + +var i: I; +i = new C; +var c: C = i; \ No newline at end of file From 95af9978e19551b6ce94eac64dfcbd1acb9203bf Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 2 Feb 2015 17:19:27 -0800 Subject: [PATCH 013/106] Accept correct baselines for symbol property tests --- .../reference/symbolProperty10.errors.txt | 22 ++++++++ tests/baselines/reference/symbolProperty10.js | 21 +++++++ tests/baselines/reference/symbolProperty11.js | 19 +++++++ .../reference/symbolProperty11.types | 29 ++++++++++ .../reference/symbolProperty12.errors.txt | 23 ++++++++ tests/baselines/reference/symbolProperty12.js | 21 +++++++ tests/baselines/reference/symbolProperty13.js | 27 +++++++++ .../reference/symbolProperty13.types | 56 +++++++++++++++++++ tests/baselines/reference/symbolProperty14.js | 27 +++++++++ .../reference/symbolProperty14.types | 56 +++++++++++++++++++ tests/baselines/reference/symbolProperty15.js | 25 +++++++++ .../reference/symbolProperty15.types | 49 ++++++++++++++++ tests/baselines/reference/symbolProperty16.js | 27 +++++++++ .../reference/symbolProperty16.types | 55 ++++++++++++++++++ tests/baselines/reference/symbolProperty17.js | 13 +++++ tests/baselines/reference/symbolProperty18.js | 23 ++++++++ tests/baselines/reference/symbolProperty19.js | 18 ++++++ tests/baselines/reference/symbolProperty20.js | 18 ++++++ .../reference/symbolProperty20.types | 37 ++++++++++++ tests/baselines/reference/symbolProperty21.js | 20 +++++++ .../reference/symbolProperty21.types | 53 ++++++++++++++++++ tests/baselines/reference/symbolProperty22.js | 11 ++++ .../reference/symbolProperty22.types | 40 +++++++++++++ tests/baselines/reference/symbolProperty23.js | 20 +++++++ .../reference/symbolProperty23.types | 22 ++++++++ .../reference/symbolProperty24.errors.txt | 21 +++++++ tests/baselines/reference/symbolProperty24.js | 20 +++++++ .../reference/symbolProperty25.errors.txt | 17 ++++++ tests/baselines/reference/symbolProperty25.js | 20 +++++++ tests/baselines/reference/symbolProperty26.js | 38 +++++++++++++ .../reference/symbolProperty26.types | 25 +++++++++ tests/baselines/reference/symbolProperty27.js | 38 +++++++++++++ .../reference/symbolProperty27.types | 26 +++++++++ tests/baselines/reference/symbolProperty28.js | 36 ++++++++++++ tests/baselines/reference/symbolProperty29.js | 17 ++++++ .../reference/symbolProperty29.types | 18 ++++++ tests/baselines/reference/symbolProperty30.js | 17 ++++++ tests/baselines/reference/symbolProperty31.js | 32 +++++++++++ .../reference/symbolProperty31.types | 23 ++++++++ tests/baselines/reference/symbolProperty32.js | 32 +++++++++++ tests/baselines/reference/symbolProperty33.js | 32 +++++++++++ .../reference/symbolProperty33.types | 23 ++++++++ tests/baselines/reference/symbolProperty34.js | 32 +++++++++++ tests/baselines/reference/symbolProperty35.js | 11 ++++ .../reference/symbolProperty36.errors.txt | 13 +++++ tests/baselines/reference/symbolProperty36.js | 11 ++++ .../reference/symbolProperty37.errors.txt | 13 +++++ tests/baselines/reference/symbolProperty37.js | 7 +++ .../reference/symbolProperty38.errors.txt | 15 +++++ tests/baselines/reference/symbolProperty38.js | 9 +++ .../reference/symbolProperty39.errors.txt | 25 +++++++++ tests/baselines/reference/symbolProperty39.js | 24 ++++++++ tests/baselines/reference/symbolProperty40.js | 26 +++++++++ tests/baselines/reference/symbolProperty41.js | 26 +++++++++ .../reference/symbolProperty42.errors.txt | 16 ++++++ tests/baselines/reference/symbolProperty42.js | 18 ++++++ .../reference/symbolProperty43.errors.txt | 10 ++++ tests/baselines/reference/symbolProperty43.js | 12 ++++ .../reference/symbolProperty44.errors.txt | 17 ++++++ tests/baselines/reference/symbolProperty44.js | 30 ++++++++++ tests/baselines/reference/symbolProperty45.js | 30 ++++++++++ .../reference/symbolProperty45.types | 19 +++++++ tests/baselines/reference/symbolProperty46.js | 35 ++++++++++++ .../reference/symbolProperty47.errors.txt | 17 ++++++ tests/baselines/reference/symbolProperty47.js | 35 ++++++++++++ tests/baselines/reference/symbolProperty48.js | 21 +++++++ tests/baselines/reference/symbolProperty49.js | 21 +++++++ tests/baselines/reference/symbolProperty50.js | 20 +++++++ .../reference/symbolProperty50.types | 16 ++++++ tests/baselines/reference/symbolProperty51.js | 20 +++++++ .../reference/symbolProperty51.types | 16 ++++++ .../reference/symbolProperty52.errors.txt | 16 ++++++ tests/baselines/reference/symbolProperty52.js | 12 ++++ .../reference/symbolProperty53.errors.txt | 9 +++ tests/baselines/reference/symbolProperty53.js | 9 +++ tests/baselines/reference/symbolProperty54.js | 9 +++ .../reference/symbolProperty9.errors.txt | 22 ++++++++ tests/baselines/reference/symbolProperty9.js | 21 +++++++ 78 files changed, 1830 insertions(+) create mode 100644 tests/baselines/reference/symbolProperty10.errors.txt create mode 100644 tests/baselines/reference/symbolProperty10.js create mode 100644 tests/baselines/reference/symbolProperty11.js create mode 100644 tests/baselines/reference/symbolProperty11.types create mode 100644 tests/baselines/reference/symbolProperty12.errors.txt create mode 100644 tests/baselines/reference/symbolProperty12.js create mode 100644 tests/baselines/reference/symbolProperty13.js create mode 100644 tests/baselines/reference/symbolProperty13.types create mode 100644 tests/baselines/reference/symbolProperty14.js create mode 100644 tests/baselines/reference/symbolProperty14.types create mode 100644 tests/baselines/reference/symbolProperty15.js create mode 100644 tests/baselines/reference/symbolProperty15.types create mode 100644 tests/baselines/reference/symbolProperty16.js create mode 100644 tests/baselines/reference/symbolProperty16.types create mode 100644 tests/baselines/reference/symbolProperty17.js create mode 100644 tests/baselines/reference/symbolProperty18.js create mode 100644 tests/baselines/reference/symbolProperty19.js create mode 100644 tests/baselines/reference/symbolProperty20.js create mode 100644 tests/baselines/reference/symbolProperty20.types create mode 100644 tests/baselines/reference/symbolProperty21.js create mode 100644 tests/baselines/reference/symbolProperty21.types create mode 100644 tests/baselines/reference/symbolProperty22.js create mode 100644 tests/baselines/reference/symbolProperty22.types create mode 100644 tests/baselines/reference/symbolProperty23.js create mode 100644 tests/baselines/reference/symbolProperty23.types create mode 100644 tests/baselines/reference/symbolProperty24.errors.txt create mode 100644 tests/baselines/reference/symbolProperty24.js create mode 100644 tests/baselines/reference/symbolProperty25.errors.txt create mode 100644 tests/baselines/reference/symbolProperty25.js create mode 100644 tests/baselines/reference/symbolProperty26.js create mode 100644 tests/baselines/reference/symbolProperty26.types create mode 100644 tests/baselines/reference/symbolProperty27.js create mode 100644 tests/baselines/reference/symbolProperty27.types create mode 100644 tests/baselines/reference/symbolProperty28.js create mode 100644 tests/baselines/reference/symbolProperty29.js create mode 100644 tests/baselines/reference/symbolProperty29.types create mode 100644 tests/baselines/reference/symbolProperty30.js create mode 100644 tests/baselines/reference/symbolProperty31.js create mode 100644 tests/baselines/reference/symbolProperty31.types create mode 100644 tests/baselines/reference/symbolProperty32.js create mode 100644 tests/baselines/reference/symbolProperty33.js create mode 100644 tests/baselines/reference/symbolProperty33.types create mode 100644 tests/baselines/reference/symbolProperty34.js create mode 100644 tests/baselines/reference/symbolProperty35.js create mode 100644 tests/baselines/reference/symbolProperty36.errors.txt create mode 100644 tests/baselines/reference/symbolProperty36.js create mode 100644 tests/baselines/reference/symbolProperty37.errors.txt create mode 100644 tests/baselines/reference/symbolProperty37.js create mode 100644 tests/baselines/reference/symbolProperty38.errors.txt create mode 100644 tests/baselines/reference/symbolProperty38.js create mode 100644 tests/baselines/reference/symbolProperty39.errors.txt create mode 100644 tests/baselines/reference/symbolProperty39.js create mode 100644 tests/baselines/reference/symbolProperty40.js create mode 100644 tests/baselines/reference/symbolProperty41.js create mode 100644 tests/baselines/reference/symbolProperty42.errors.txt create mode 100644 tests/baselines/reference/symbolProperty42.js create mode 100644 tests/baselines/reference/symbolProperty43.errors.txt create mode 100644 tests/baselines/reference/symbolProperty43.js create mode 100644 tests/baselines/reference/symbolProperty44.errors.txt create mode 100644 tests/baselines/reference/symbolProperty44.js create mode 100644 tests/baselines/reference/symbolProperty45.js create mode 100644 tests/baselines/reference/symbolProperty45.types create mode 100644 tests/baselines/reference/symbolProperty46.js create mode 100644 tests/baselines/reference/symbolProperty47.errors.txt create mode 100644 tests/baselines/reference/symbolProperty47.js create mode 100644 tests/baselines/reference/symbolProperty48.js create mode 100644 tests/baselines/reference/symbolProperty49.js create mode 100644 tests/baselines/reference/symbolProperty50.js create mode 100644 tests/baselines/reference/symbolProperty50.types create mode 100644 tests/baselines/reference/symbolProperty51.js create mode 100644 tests/baselines/reference/symbolProperty51.types create mode 100644 tests/baselines/reference/symbolProperty52.errors.txt create mode 100644 tests/baselines/reference/symbolProperty52.js create mode 100644 tests/baselines/reference/symbolProperty53.errors.txt create mode 100644 tests/baselines/reference/symbolProperty53.js create mode 100644 tests/baselines/reference/symbolProperty54.js create mode 100644 tests/baselines/reference/symbolProperty9.errors.txt create mode 100644 tests/baselines/reference/symbolProperty9.js diff --git a/tests/baselines/reference/symbolProperty10.errors.txt b/tests/baselines/reference/symbolProperty10.errors.txt new file mode 100644 index 00000000000..513d5792c5e --- /dev/null +++ b/tests/baselines/reference/symbolProperty10.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/es6/Symbols/symbolProperty10.ts(10,5): error TS2322: Type 'I' is not assignable to type 'C'. + Types of property '[Symbol.iterator]' are incompatible. + Type '{ x: any; }' is not assignable to type '{ x: any; y: any; }'. + Property 'y' is missing in type '{ x: any; }'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty10.ts (1 errors) ==== + class C { + [Symbol.iterator]: { x; y }; + } + interface I { + [Symbol.iterator]?: { x }; + } + + var i: I; + i = new C; + var c: C = i; + ~ +!!! error TS2322: Type 'I' is not assignable to type 'C'. +!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible. +!!! error TS2322: Type '{ x: any; }' is not assignable to type '{ x: any; y: any; }'. +!!! error TS2322: Property 'y' is missing in type '{ x: any; }'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty10.js b/tests/baselines/reference/symbolProperty10.js new file mode 100644 index 00000000000..5b4e44f11ab --- /dev/null +++ b/tests/baselines/reference/symbolProperty10.js @@ -0,0 +1,21 @@ +//// [symbolProperty10.ts] +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]?: { x }; +} + +var i: I; +i = new C; +var c: C = i; + +//// [symbolProperty10.js] +var C = (function () { + function C() { + } + return C; +})(); +var i; +i = new C; +var c = i; diff --git a/tests/baselines/reference/symbolProperty11.js b/tests/baselines/reference/symbolProperty11.js new file mode 100644 index 00000000000..83a380c79e7 --- /dev/null +++ b/tests/baselines/reference/symbolProperty11.js @@ -0,0 +1,19 @@ +//// [symbolProperty11.ts] +class C { } +interface I { + [Symbol.iterator]?: { x }; +} + +var i: I; +i = new C; +var c: C = i; + +//// [symbolProperty11.js] +var C = (function () { + function C() { + } + return C; +})(); +var i; +i = new C; +var c = i; diff --git a/tests/baselines/reference/symbolProperty11.types b/tests/baselines/reference/symbolProperty11.types new file mode 100644 index 00000000000..9ba956293af --- /dev/null +++ b/tests/baselines/reference/symbolProperty11.types @@ -0,0 +1,29 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty11.ts === +class C { } +>C : C + +interface I { +>I : I + + [Symbol.iterator]?: { x }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +} + +var i: I; +>i : I +>I : I + +i = new C; +>i = new C : C +>i : I +>new C : C +>C : typeof C + +var c: C = i; +>c : C +>C : C +>i : I + diff --git a/tests/baselines/reference/symbolProperty12.errors.txt b/tests/baselines/reference/symbolProperty12.errors.txt new file mode 100644 index 00000000000..5ec8d645203 --- /dev/null +++ b/tests/baselines/reference/symbolProperty12.errors.txt @@ -0,0 +1,23 @@ +tests/cases/conformance/es6/Symbols/symbolProperty12.ts(9,1): error TS2322: Type 'C' is not assignable to type 'I'. + Property '[Symbol.iterator]' is private in type 'C' but not in type 'I'. +tests/cases/conformance/es6/Symbols/symbolProperty12.ts(10,5): error TS2322: Type 'I' is not assignable to type 'C'. + Property '[Symbol.iterator]' is private in type 'C' but not in type 'I'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty12.ts (2 errors) ==== + class C { + private [Symbol.iterator]: { x }; + } + interface I { + [Symbol.iterator]: { x }; + } + + var i: I; + i = new C; + ~ +!!! error TS2322: Type 'C' is not assignable to type 'I'. +!!! error TS2322: Property '[Symbol.iterator]' is private in type 'C' but not in type 'I'. + var c: C = i; + ~ +!!! error TS2322: Type 'I' is not assignable to type 'C'. +!!! error TS2322: Property '[Symbol.iterator]' is private in type 'C' but not in type 'I'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty12.js b/tests/baselines/reference/symbolProperty12.js new file mode 100644 index 00000000000..9f63f86bc18 --- /dev/null +++ b/tests/baselines/reference/symbolProperty12.js @@ -0,0 +1,21 @@ +//// [symbolProperty12.ts] +class C { + private [Symbol.iterator]: { x }; +} +interface I { + [Symbol.iterator]: { x }; +} + +var i: I; +i = new C; +var c: C = i; + +//// [symbolProperty12.js] +var C = (function () { + function C() { + } + return C; +})(); +var i; +i = new C; +var c = i; diff --git a/tests/baselines/reference/symbolProperty13.js b/tests/baselines/reference/symbolProperty13.js new file mode 100644 index 00000000000..1cf24a49c7e --- /dev/null +++ b/tests/baselines/reference/symbolProperty13.js @@ -0,0 +1,27 @@ +//// [symbolProperty13.ts] +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); + +//// [symbolProperty13.js] +var C = (function () { + function C() { + } + return C; +})(); +foo(new C); +var i; +bar(i); diff --git a/tests/baselines/reference/symbolProperty13.types b/tests/baselines/reference/symbolProperty13.types new file mode 100644 index 00000000000..231b7905b68 --- /dev/null +++ b/tests/baselines/reference/symbolProperty13.types @@ -0,0 +1,56 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty13.ts === +class C { +>C : C + + [Symbol.iterator]: { x; y }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +>y : any +} +interface I { +>I : I + + [Symbol.iterator]: { x }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +} + +declare function foo(i: I): I; +>foo : { (i: I): I; (a: any): any; } +>i : I +>I : I +>I : I + +declare function foo(a: any): any; +>foo : { (i: I): I; (a: any): any; } +>a : any + +declare function bar(i: C): C; +>bar : { (i: C): C; (a: any): any; } +>i : C +>C : C +>C : C + +declare function bar(a: any): any; +>bar : { (i: C): C; (a: any): any; } +>a : any + +foo(new C); +>foo(new C) : I +>foo : { (i: I): I; (a: any): any; } +>new C : C +>C : typeof C + +var i: I; +>i : I +>I : I + +bar(i); +>bar(i) : any +>bar : { (i: C): C; (a: any): any; } +>i : I + diff --git a/tests/baselines/reference/symbolProperty14.js b/tests/baselines/reference/symbolProperty14.js new file mode 100644 index 00000000000..0283cb01b79 --- /dev/null +++ b/tests/baselines/reference/symbolProperty14.js @@ -0,0 +1,27 @@ +//// [symbolProperty14.ts] +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]?: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); + +//// [symbolProperty14.js] +var C = (function () { + function C() { + } + return C; +})(); +foo(new C); +var i; +bar(i); diff --git a/tests/baselines/reference/symbolProperty14.types b/tests/baselines/reference/symbolProperty14.types new file mode 100644 index 00000000000..1032e83644c --- /dev/null +++ b/tests/baselines/reference/symbolProperty14.types @@ -0,0 +1,56 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty14.ts === +class C { +>C : C + + [Symbol.iterator]: { x; y }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +>y : any +} +interface I { +>I : I + + [Symbol.iterator]?: { x }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +} + +declare function foo(i: I): I; +>foo : { (i: I): I; (a: any): any; } +>i : I +>I : I +>I : I + +declare function foo(a: any): any; +>foo : { (i: I): I; (a: any): any; } +>a : any + +declare function bar(i: C): C; +>bar : { (i: C): C; (a: any): any; } +>i : C +>C : C +>C : C + +declare function bar(a: any): any; +>bar : { (i: C): C; (a: any): any; } +>a : any + +foo(new C); +>foo(new C) : I +>foo : { (i: I): I; (a: any): any; } +>new C : C +>C : typeof C + +var i: I; +>i : I +>I : I + +bar(i); +>bar(i) : any +>bar : { (i: C): C; (a: any): any; } +>i : I + diff --git a/tests/baselines/reference/symbolProperty15.js b/tests/baselines/reference/symbolProperty15.js new file mode 100644 index 00000000000..0c198037093 --- /dev/null +++ b/tests/baselines/reference/symbolProperty15.js @@ -0,0 +1,25 @@ +//// [symbolProperty15.ts] +class C { } +interface I { + [Symbol.iterator]?: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); + +//// [symbolProperty15.js] +var C = (function () { + function C() { + } + return C; +})(); +foo(new C); +var i; +bar(i); diff --git a/tests/baselines/reference/symbolProperty15.types b/tests/baselines/reference/symbolProperty15.types new file mode 100644 index 00000000000..863872c29c0 --- /dev/null +++ b/tests/baselines/reference/symbolProperty15.types @@ -0,0 +1,49 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty15.ts === +class C { } +>C : C + +interface I { +>I : I + + [Symbol.iterator]?: { x }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +} + +declare function foo(i: I): I; +>foo : { (i: I): I; (a: any): any; } +>i : I +>I : I +>I : I + +declare function foo(a: any): any; +>foo : { (i: I): I; (a: any): any; } +>a : any + +declare function bar(i: C): C; +>bar : { (i: C): C; (a: any): any; } +>i : C +>C : C +>C : C + +declare function bar(a: any): any; +>bar : { (i: C): C; (a: any): any; } +>a : any + +foo(new C); +>foo(new C) : any +>foo : { (i: I): I; (a: any): any; } +>new C : C +>C : typeof C + +var i: I; +>i : I +>I : I + +bar(i); +>bar(i) : C +>bar : { (i: C): C; (a: any): any; } +>i : I + diff --git a/tests/baselines/reference/symbolProperty16.js b/tests/baselines/reference/symbolProperty16.js new file mode 100644 index 00000000000..1a1f3f857af --- /dev/null +++ b/tests/baselines/reference/symbolProperty16.js @@ -0,0 +1,27 @@ +//// [symbolProperty16.ts] +class C { + private [Symbol.iterator]: { x }; +} +interface I { + [Symbol.iterator]: { x }; +} + +declare function foo(i: I): I; +declare function foo(a: any): any; + +declare function bar(i: C): C; +declare function bar(a: any): any; + +foo(new C); +var i: I; +bar(i); + +//// [symbolProperty16.js] +var C = (function () { + function C() { + } + return C; +})(); +foo(new C); +var i; +bar(i); diff --git a/tests/baselines/reference/symbolProperty16.types b/tests/baselines/reference/symbolProperty16.types new file mode 100644 index 00000000000..172c5a1ea10 --- /dev/null +++ b/tests/baselines/reference/symbolProperty16.types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty16.ts === +class C { +>C : C + + private [Symbol.iterator]: { x }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +} +interface I { +>I : I + + [Symbol.iterator]: { x }; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>x : any +} + +declare function foo(i: I): I; +>foo : { (i: I): I; (a: any): any; } +>i : I +>I : I +>I : I + +declare function foo(a: any): any; +>foo : { (i: I): I; (a: any): any; } +>a : any + +declare function bar(i: C): C; +>bar : { (i: C): C; (a: any): any; } +>i : C +>C : C +>C : C + +declare function bar(a: any): any; +>bar : { (i: C): C; (a: any): any; } +>a : any + +foo(new C); +>foo(new C) : any +>foo : { (i: I): I; (a: any): any; } +>new C : C +>C : typeof C + +var i: I; +>i : I +>I : I + +bar(i); +>bar(i) : any +>bar : { (i: C): C; (a: any): any; } +>i : I + diff --git a/tests/baselines/reference/symbolProperty17.js b/tests/baselines/reference/symbolProperty17.js new file mode 100644 index 00000000000..9aa603910cd --- /dev/null +++ b/tests/baselines/reference/symbolProperty17.js @@ -0,0 +1,13 @@ +//// [symbolProperty17.ts] +interface I { + [Symbol.iterator]: number; + [s: Symbol]: string; + "__@iterator": string; +} + +var i: I; +var it = i[Symbol.iterator]; + +//// [symbolProperty17.js] +var i; +var it = i[Symbol.iterator]; diff --git a/tests/baselines/reference/symbolProperty18.js b/tests/baselines/reference/symbolProperty18.js new file mode 100644 index 00000000000..ff69588be31 --- /dev/null +++ b/tests/baselines/reference/symbolProperty18.js @@ -0,0 +1,23 @@ +//// [symbolProperty18.ts] +var i = { + [Symbol.iterator]: 0, + [Symbol.toStringTag]() { return "" }, + set [Symbol.toPrimitive](p: boolean) { } +} + +var it = i[Symbol.iterator]; +var str = i[Symbol.toStringTag](); +i[Symbol.toPrimitive] = false; + +//// [symbolProperty18.js] +var i = { + [Symbol.iterator]: 0, + [Symbol.toStringTag]() { + return ""; + }, + set [Symbol.toPrimitive](p) { + } +}; +var it = i[Symbol.iterator]; +var str = i[Symbol.toStringTag](); +i[Symbol.toPrimitive] = false; diff --git a/tests/baselines/reference/symbolProperty19.js b/tests/baselines/reference/symbolProperty19.js new file mode 100644 index 00000000000..c64541691cc --- /dev/null +++ b/tests/baselines/reference/symbolProperty19.js @@ -0,0 +1,18 @@ +//// [symbolProperty19.ts] +var i = { + [Symbol.iterator]: { p: null }, + [Symbol.toStringTag]() { return { p: undefined }; } +} + +var it = i[Symbol.iterator]; +var str = i[Symbol.toStringTag](); + +//// [symbolProperty19.js] +var i = { + [Symbol.iterator]: { p: null }, + [Symbol.toStringTag]() { + return { p: undefined }; + } +}; +var it = i[Symbol.iterator]; +var str = i[Symbol.toStringTag](); diff --git a/tests/baselines/reference/symbolProperty20.js b/tests/baselines/reference/symbolProperty20.js new file mode 100644 index 00000000000..558305a577d --- /dev/null +++ b/tests/baselines/reference/symbolProperty20.js @@ -0,0 +1,18 @@ +//// [symbolProperty20.ts] +interface I { + [Symbol.iterator]: (s: string) => string; + [Symbol.toStringTag](s: number): number; +} + +var i: I = { + [Symbol.iterator]: s => s, + [Symbol.toStringTag](n) { return n; } +} + +//// [symbolProperty20.js] +var i = { + [Symbol.iterator]: s => { return s; }, + [Symbol.toStringTag](n) { + return n; + } +}; diff --git a/tests/baselines/reference/symbolProperty20.types b/tests/baselines/reference/symbolProperty20.types new file mode 100644 index 00000000000..94ef4a0f2db --- /dev/null +++ b/tests/baselines/reference/symbolProperty20.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty20.ts === +interface I { +>I : I + + [Symbol.iterator]: (s: string) => string; +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>s : string + + [Symbol.toStringTag](s: number): number; +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol +>s : number +} + +var i: I = { +>i : I +>I : I +>{ [Symbol.iterator]: s => s, [Symbol.toStringTag](n) { return n; }} : { [Symbol.iterator]: (s: string) => string; [Symbol.toStringTag](n: number): number; } + + [Symbol.iterator]: s => s, +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol +>s => s : (s: string) => string +>s : string +>s : string + + [Symbol.toStringTag](n) { return n; } +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol +>n : number +>n : number +} diff --git a/tests/baselines/reference/symbolProperty21.js b/tests/baselines/reference/symbolProperty21.js new file mode 100644 index 00000000000..13eaf06a97b --- /dev/null +++ b/tests/baselines/reference/symbolProperty21.js @@ -0,0 +1,20 @@ +//// [symbolProperty21.ts] +interface I { + [Symbol.unscopables]: T; + [Symbol.isConcatSpreadable]: U; +} + +declare function foo(p: I): { t: T; u: U }; + +foo({ + [Symbol.isConcatSpreadable]: "", + [Symbol.isRegExp]: 0, + [Symbol.unscopables]: true +}); + +//// [symbolProperty21.js] +foo({ + [Symbol.isConcatSpreadable]: "", + [Symbol.isRegExp]: 0, + [Symbol.unscopables]: true +}); diff --git a/tests/baselines/reference/symbolProperty21.types b/tests/baselines/reference/symbolProperty21.types new file mode 100644 index 00000000000..f364b7e3599 --- /dev/null +++ b/tests/baselines/reference/symbolProperty21.types @@ -0,0 +1,53 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty21.ts === +interface I { +>I : I +>T : T +>U : U + + [Symbol.unscopables]: T; +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol +>T : T + + [Symbol.isConcatSpreadable]: U; +>Symbol.isConcatSpreadable : Symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : Symbol +>U : U +} + +declare function foo(p: I): { t: T; u: U }; +>foo : (p: I) => { t: T; u: U; } +>T : T +>U : U +>p : I +>I : I +>T : T +>U : U +>t : T +>T : T +>u : U +>U : U + +foo({ +>foo({ [Symbol.isConcatSpreadable]: "", [Symbol.isRegExp]: 0, [Symbol.unscopables]: true}) : { t: boolean; u: string; } +>foo : (p: I) => { t: T; u: U; } +>{ [Symbol.isConcatSpreadable]: "", [Symbol.isRegExp]: 0, [Symbol.unscopables]: true} : { [Symbol.isConcatSpreadable]: string; [Symbol.isRegExp]: number; [Symbol.unscopables]: boolean; } + + [Symbol.isConcatSpreadable]: "", +>Symbol.isConcatSpreadable : Symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : Symbol + + [Symbol.isRegExp]: 0, +>Symbol.isRegExp : Symbol +>Symbol : SymbolConstructor +>isRegExp : Symbol + + [Symbol.unscopables]: true +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol + +}); diff --git a/tests/baselines/reference/symbolProperty22.js b/tests/baselines/reference/symbolProperty22.js new file mode 100644 index 00000000000..35757182143 --- /dev/null +++ b/tests/baselines/reference/symbolProperty22.js @@ -0,0 +1,11 @@ +//// [symbolProperty22.ts] +interface I { + [Symbol.unscopables](x: T): U; +} + +declare function foo(p1: T, p2: I): U; + +foo("", { [Symbol.unscopables]: s => s.length }); + +//// [symbolProperty22.js] +foo("", { [Symbol.unscopables]: s => { return s.length; } }); diff --git a/tests/baselines/reference/symbolProperty22.types b/tests/baselines/reference/symbolProperty22.types new file mode 100644 index 00000000000..c89af9afbd5 --- /dev/null +++ b/tests/baselines/reference/symbolProperty22.types @@ -0,0 +1,40 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty22.ts === +interface I { +>I : I +>T : T +>U : U + + [Symbol.unscopables](x: T): U; +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol +>x : T +>T : T +>U : U +} + +declare function foo(p1: T, p2: I): U; +>foo : (p1: T, p2: I) => U +>T : T +>U : U +>p1 : T +>T : T +>p2 : I +>I : I +>T : T +>U : U +>U : U + +foo("", { [Symbol.unscopables]: s => s.length }); +>foo("", { [Symbol.unscopables]: s => s.length }) : number +>foo : (p1: T, p2: I) => U +>{ [Symbol.unscopables]: s => s.length } : { [Symbol.unscopables]: (s: string) => number; } +>Symbol.unscopables : Symbol +>Symbol : SymbolConstructor +>unscopables : Symbol +>s => s.length : (s: string) => number +>s : string +>s.length : number +>s : string +>length : number + diff --git a/tests/baselines/reference/symbolProperty23.js b/tests/baselines/reference/symbolProperty23.js new file mode 100644 index 00000000000..b3291ad34e8 --- /dev/null +++ b/tests/baselines/reference/symbolProperty23.js @@ -0,0 +1,20 @@ +//// [symbolProperty23.ts] +interface I { + [Symbol.toPrimitive]: () => boolean; +} + +class C implements I { + [Symbol.toPrimitive]() { + return true; + } +} + +//// [symbolProperty23.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.toPrimitive] = function () { + return true; + }; + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty23.types b/tests/baselines/reference/symbolProperty23.types new file mode 100644 index 00000000000..99480f03b01 --- /dev/null +++ b/tests/baselines/reference/symbolProperty23.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty23.ts === +interface I { +>I : I + + [Symbol.toPrimitive]: () => boolean; +>Symbol.toPrimitive : Symbol +>Symbol : SymbolConstructor +>toPrimitive : Symbol +} + +class C implements I { +>C : C +>I : I + + [Symbol.toPrimitive]() { +>Symbol.toPrimitive : Symbol +>Symbol : SymbolConstructor +>toPrimitive : Symbol + + return true; + } +} diff --git a/tests/baselines/reference/symbolProperty24.errors.txt b/tests/baselines/reference/symbolProperty24.errors.txt new file mode 100644 index 00000000000..25cba184e25 --- /dev/null +++ b/tests/baselines/reference/symbolProperty24.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/es6/Symbols/symbolProperty24.ts(5,7): error TS2420: Class 'C' incorrectly implements interface 'I'. + Types of property '[Symbol.toPrimitive]' are incompatible. + Type '() => string' is not assignable to type '() => boolean'. + Type 'string' is not assignable to type 'boolean'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty24.ts (1 errors) ==== + interface I { + [Symbol.toPrimitive]: () => boolean; + } + + class C implements I { + ~ +!!! error TS2420: Class 'C' incorrectly implements interface 'I'. +!!! error TS2420: Types of property '[Symbol.toPrimitive]' are incompatible. +!!! error TS2420: Type '() => string' is not assignable to type '() => boolean'. +!!! error TS2420: Type 'string' is not assignable to type 'boolean'. + [Symbol.toPrimitive]() { + return ""; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty24.js b/tests/baselines/reference/symbolProperty24.js new file mode 100644 index 00000000000..b5d059dd29f --- /dev/null +++ b/tests/baselines/reference/symbolProperty24.js @@ -0,0 +1,20 @@ +//// [symbolProperty24.ts] +interface I { + [Symbol.toPrimitive]: () => boolean; +} + +class C implements I { + [Symbol.toPrimitive]() { + return ""; + } +} + +//// [symbolProperty24.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.toPrimitive] = function () { + return ""; + }; + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty25.errors.txt b/tests/baselines/reference/symbolProperty25.errors.txt new file mode 100644 index 00000000000..a6cde31c1ad --- /dev/null +++ b/tests/baselines/reference/symbolProperty25.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/es6/Symbols/symbolProperty25.ts(5,7): error TS2420: Class 'C' incorrectly implements interface 'I'. + Property '[Symbol.toPrimitive]' is missing in type 'C'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty25.ts (1 errors) ==== + interface I { + [Symbol.toPrimitive]: () => boolean; + } + + class C implements I { + ~ +!!! error TS2420: Class 'C' incorrectly implements interface 'I'. +!!! error TS2420: Property '[Symbol.toPrimitive]' is missing in type 'C'. + [Symbol.toStringTag]() { + return ""; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty25.js b/tests/baselines/reference/symbolProperty25.js new file mode 100644 index 00000000000..c932da1e3eb --- /dev/null +++ b/tests/baselines/reference/symbolProperty25.js @@ -0,0 +1,20 @@ +//// [symbolProperty25.ts] +interface I { + [Symbol.toPrimitive]: () => boolean; +} + +class C implements I { + [Symbol.toStringTag]() { + return ""; + } +} + +//// [symbolProperty25.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.toStringTag] = function () { + return ""; + }; + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty26.js b/tests/baselines/reference/symbolProperty26.js new file mode 100644 index 00000000000..9e98027603d --- /dev/null +++ b/tests/baselines/reference/symbolProperty26.js @@ -0,0 +1,38 @@ +//// [symbolProperty26.ts] +class C1 { + [Symbol.toStringTag]() { + return ""; + } +} + +class C2 extends C1 { + [Symbol.toStringTag]() { + return ""; + } +} + +//// [symbolProperty26.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return ""; + }; + return C1; +})(); +var C2 = (function (_super) { + __extends(C2, _super); + function C2() { + _super.apply(this, arguments); + } + C2.prototype[Symbol.toStringTag] = function () { + return ""; + }; + return C2; +})(C1); diff --git a/tests/baselines/reference/symbolProperty26.types b/tests/baselines/reference/symbolProperty26.types new file mode 100644 index 00000000000..258347bd4fa --- /dev/null +++ b/tests/baselines/reference/symbolProperty26.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty26.ts === +class C1 { +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return ""; + } +} + +class C2 extends C1 { +>C2 : C2 +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return ""; + } +} diff --git a/tests/baselines/reference/symbolProperty27.js b/tests/baselines/reference/symbolProperty27.js new file mode 100644 index 00000000000..f19d05233cb --- /dev/null +++ b/tests/baselines/reference/symbolProperty27.js @@ -0,0 +1,38 @@ +//// [symbolProperty27.ts] +class C1 { + [Symbol.toStringTag]() { + return {}; + } +} + +class C2 extends C1 { + [Symbol.toStringTag]() { + return ""; + } +} + +//// [symbolProperty27.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return {}; + }; + return C1; +})(); +var C2 = (function (_super) { + __extends(C2, _super); + function C2() { + _super.apply(this, arguments); + } + C2.prototype[Symbol.toStringTag] = function () { + return ""; + }; + return C2; +})(C1); diff --git a/tests/baselines/reference/symbolProperty27.types b/tests/baselines/reference/symbolProperty27.types new file mode 100644 index 00000000000..e6df5fa008f --- /dev/null +++ b/tests/baselines/reference/symbolProperty27.types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty27.ts === +class C1 { +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return {}; +>{} : {} + } +} + +class C2 extends C1 { +>C2 : C2 +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return ""; + } +} diff --git a/tests/baselines/reference/symbolProperty28.js b/tests/baselines/reference/symbolProperty28.js new file mode 100644 index 00000000000..219a192e381 --- /dev/null +++ b/tests/baselines/reference/symbolProperty28.js @@ -0,0 +1,36 @@ +//// [symbolProperty28.ts] +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} + +class C2 extends C1 { } + +var c: C2; +var obj = c[Symbol.toStringTag]().x; + +//// [symbolProperty28.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(); +var C2 = (function (_super) { + __extends(C2, _super); + function C2() { + _super.apply(this, arguments); + } + return C2; +})(C1); +var c; +var obj = c[Symbol.toStringTag]().x; diff --git a/tests/baselines/reference/symbolProperty29.js b/tests/baselines/reference/symbolProperty29.js new file mode 100644 index 00000000000..87088daa0a4 --- /dev/null +++ b/tests/baselines/reference/symbolProperty29.js @@ -0,0 +1,17 @@ +//// [symbolProperty29.ts] +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + [s: Symbol]: () => { x: string }; +} + +//// [symbolProperty29.js] +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(); diff --git a/tests/baselines/reference/symbolProperty29.types b/tests/baselines/reference/symbolProperty29.types new file mode 100644 index 00000000000..8ea46a1ac72 --- /dev/null +++ b/tests/baselines/reference/symbolProperty29.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty29.ts === +class C1 { +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return { x: "" }; +>{ x: "" } : { x: string; } +>x : string + } + [s: Symbol]: () => { x: string }; +>s : Symbol +>Symbol : Symbol +>x : string +} diff --git a/tests/baselines/reference/symbolProperty30.js b/tests/baselines/reference/symbolProperty30.js new file mode 100644 index 00000000000..daa08c51af1 --- /dev/null +++ b/tests/baselines/reference/symbolProperty30.js @@ -0,0 +1,17 @@ +//// [symbolProperty30.ts] +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + [s: Symbol]: () => { x: number }; +} + +//// [symbolProperty30.js] +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(); diff --git a/tests/baselines/reference/symbolProperty31.js b/tests/baselines/reference/symbolProperty31.js new file mode 100644 index 00000000000..986f49ad6ff --- /dev/null +++ b/tests/baselines/reference/symbolProperty31.js @@ -0,0 +1,32 @@ +//// [symbolProperty31.ts] +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 extends C1 { + [s: Symbol]: () => { x: string }; +} + +//// [symbolProperty31.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(); +var C2 = (function (_super) { + __extends(C2, _super); + function C2() { + _super.apply(this, arguments); + } + return C2; +})(C1); diff --git a/tests/baselines/reference/symbolProperty31.types b/tests/baselines/reference/symbolProperty31.types new file mode 100644 index 00000000000..460bf4f62ec --- /dev/null +++ b/tests/baselines/reference/symbolProperty31.types @@ -0,0 +1,23 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty31.ts === +class C1 { +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return { x: "" }; +>{ x: "" } : { x: string; } +>x : string + } +} +class C2 extends C1 { +>C2 : C2 +>C1 : C1 + + [s: Symbol]: () => { x: string }; +>s : Symbol +>Symbol : Symbol +>x : string +} diff --git a/tests/baselines/reference/symbolProperty32.js b/tests/baselines/reference/symbolProperty32.js new file mode 100644 index 00000000000..260a88b41dd --- /dev/null +++ b/tests/baselines/reference/symbolProperty32.js @@ -0,0 +1,32 @@ +//// [symbolProperty32.ts] +class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 extends C1 { + [s: Symbol]: () => { x: number }; +} + +//// [symbolProperty32.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function () { + function C1() { + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(); +var C2 = (function (_super) { + __extends(C2, _super); + function C2() { + _super.apply(this, arguments); + } + return C2; +})(C1); diff --git a/tests/baselines/reference/symbolProperty33.js b/tests/baselines/reference/symbolProperty33.js new file mode 100644 index 00000000000..f891ba271d1 --- /dev/null +++ b/tests/baselines/reference/symbolProperty33.js @@ -0,0 +1,32 @@ +//// [symbolProperty33.ts] +class C1 extends C2 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 { + [s: Symbol]: () => { x: string }; +} + +//// [symbolProperty33.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function (_super) { + __extends(C1, _super); + function C1() { + _super.apply(this, arguments); + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(C2); +var C2 = (function () { + function C2() { + } + return C2; +})(); diff --git a/tests/baselines/reference/symbolProperty33.types b/tests/baselines/reference/symbolProperty33.types new file mode 100644 index 00000000000..cc2c1687622 --- /dev/null +++ b/tests/baselines/reference/symbolProperty33.types @@ -0,0 +1,23 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty33.ts === +class C1 extends C2 { +>C1 : C1 +>C2 : C2 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : Symbol +>Symbol : SymbolConstructor +>toStringTag : Symbol + + return { x: "" }; +>{ x: "" } : { x: string; } +>x : string + } +} +class C2 { +>C2 : C2 + + [s: Symbol]: () => { x: string }; +>s : Symbol +>Symbol : Symbol +>x : string +} diff --git a/tests/baselines/reference/symbolProperty34.js b/tests/baselines/reference/symbolProperty34.js new file mode 100644 index 00000000000..9a35db2c20f --- /dev/null +++ b/tests/baselines/reference/symbolProperty34.js @@ -0,0 +1,32 @@ +//// [symbolProperty34.ts] +class C1 extends C2 { + [Symbol.toStringTag]() { + return { x: "" }; + } +} +class C2 { + [s: Symbol]: () => { x: number }; +} + +//// [symbolProperty34.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var C1 = (function (_super) { + __extends(C1, _super); + function C1() { + _super.apply(this, arguments); + } + C1.prototype[Symbol.toStringTag] = function () { + return { x: "" }; + }; + return C1; +})(C2); +var C2 = (function () { + function C2() { + } + return C2; +})(); diff --git a/tests/baselines/reference/symbolProperty35.js b/tests/baselines/reference/symbolProperty35.js new file mode 100644 index 00000000000..c96e4ce28b1 --- /dev/null +++ b/tests/baselines/reference/symbolProperty35.js @@ -0,0 +1,11 @@ +//// [symbolProperty35.ts] +interface I1 { + [Symbol.toStringTag](): { x: string } +} +interface I2 { + [Symbol.toStringTag](): { x: number } +} + +interface I3 extends I1, I2 { } + +//// [symbolProperty35.js] diff --git a/tests/baselines/reference/symbolProperty36.errors.txt b/tests/baselines/reference/symbolProperty36.errors.txt new file mode 100644 index 00000000000..6fe3299ab90 --- /dev/null +++ b/tests/baselines/reference/symbolProperty36.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/Symbols/symbolProperty36.ts(2,5): error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. +tests/cases/conformance/es6/Symbols/symbolProperty36.ts(3,5): error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty36.ts (2 errors) ==== + var x = { + [Symbol.isConcatSpreadable]: 0, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + [Symbol.isConcatSpreadable]: 1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty36.js b/tests/baselines/reference/symbolProperty36.js new file mode 100644 index 00000000000..35d29d4892d --- /dev/null +++ b/tests/baselines/reference/symbolProperty36.js @@ -0,0 +1,11 @@ +//// [symbolProperty36.ts] +var x = { + [Symbol.isConcatSpreadable]: 0, + [Symbol.isConcatSpreadable]: 1 +} + +//// [symbolProperty36.js] +var x = { + [Symbol.isConcatSpreadable]: 0, + [Symbol.isConcatSpreadable]: 1 +}; diff --git a/tests/baselines/reference/symbolProperty37.errors.txt b/tests/baselines/reference/symbolProperty37.errors.txt new file mode 100644 index 00000000000..96e10e7f2a4 --- /dev/null +++ b/tests/baselines/reference/symbolProperty37.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/Symbols/symbolProperty37.ts(2,5): error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. +tests/cases/conformance/es6/Symbols/symbolProperty37.ts(3,5): error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty37.ts (2 errors) ==== + interface I { + [Symbol.isConcatSpreadable]: string; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + [Symbol.isConcatSpreadable]: string; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty37.js b/tests/baselines/reference/symbolProperty37.js new file mode 100644 index 00000000000..2aaf97ef300 --- /dev/null +++ b/tests/baselines/reference/symbolProperty37.js @@ -0,0 +1,7 @@ +//// [symbolProperty37.ts] +interface I { + [Symbol.isConcatSpreadable]: string; + [Symbol.isConcatSpreadable]: string; +} + +//// [symbolProperty37.js] diff --git a/tests/baselines/reference/symbolProperty38.errors.txt b/tests/baselines/reference/symbolProperty38.errors.txt new file mode 100644 index 00000000000..a519f7eb9a3 --- /dev/null +++ b/tests/baselines/reference/symbolProperty38.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/es6/Symbols/symbolProperty38.ts(2,5): error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. +tests/cases/conformance/es6/Symbols/symbolProperty38.ts(5,5): error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty38.ts (2 errors) ==== + interface I { + [Symbol.isConcatSpreadable]: string; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + } + interface I { + [Symbol.isConcatSpreadable]: string; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.isConcatSpreadable]'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty38.js b/tests/baselines/reference/symbolProperty38.js new file mode 100644 index 00000000000..b90b4d8081d --- /dev/null +++ b/tests/baselines/reference/symbolProperty38.js @@ -0,0 +1,9 @@ +//// [symbolProperty38.ts] +interface I { + [Symbol.isConcatSpreadable]: string; +} +interface I { + [Symbol.isConcatSpreadable]: string; +} + +//// [symbolProperty38.js] diff --git a/tests/baselines/reference/symbolProperty39.errors.txt b/tests/baselines/reference/symbolProperty39.errors.txt new file mode 100644 index 00000000000..62dbdfc591c --- /dev/null +++ b/tests/baselines/reference/symbolProperty39.errors.txt @@ -0,0 +1,25 @@ +tests/cases/conformance/es6/Symbols/symbolProperty39.ts(2,5): error TS2393: Duplicate function implementation. +tests/cases/conformance/es6/Symbols/symbolProperty39.ts(3,5): error TS2393: Duplicate function implementation. +tests/cases/conformance/es6/Symbols/symbolProperty39.ts(4,5): error TS2393: Duplicate function implementation. +tests/cases/conformance/es6/Symbols/symbolProperty39.ts(7,5): error TS2393: Duplicate function implementation. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty39.ts (4 errors) ==== + class C { + [Symbol.iterator](x: string): string; + ~~~~~~~~~~~~~~~~~ +!!! error TS2393: Duplicate function implementation. + [Symbol.iterator](x: number): number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2393: Duplicate function implementation. + [Symbol.iterator](x: any) { + ~~~~~~~~~~~~~~~~~ +!!! error TS2393: Duplicate function implementation. + return undefined; + } + [Symbol.iterator](x: any) { + ~~~~~~~~~~~~~~~~~ +!!! error TS2393: Duplicate function implementation. + return undefined; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty39.js b/tests/baselines/reference/symbolProperty39.js new file mode 100644 index 00000000000..18551d20c0b --- /dev/null +++ b/tests/baselines/reference/symbolProperty39.js @@ -0,0 +1,24 @@ +//// [symbolProperty39.ts] +class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; + [Symbol.iterator](x: any) { + return undefined; + } + [Symbol.iterator](x: any) { + return undefined; + } +} + +//// [symbolProperty39.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function (x) { + return undefined; + }; + C.prototype[Symbol.iterator] = function (x) { + return undefined; + }; + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty40.js b/tests/baselines/reference/symbolProperty40.js new file mode 100644 index 00000000000..15d8c5c6fba --- /dev/null +++ b/tests/baselines/reference/symbolProperty40.js @@ -0,0 +1,26 @@ +//// [symbolProperty40.ts] +class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; + [Symbol.iterator](x: any) { + return undefined; + } +} + +var c = new C; +c[Symbol.iterator](""); +c[Symbol.iterator](0); + + +//// [symbolProperty40.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function (x) { + return undefined; + }; + return C; +})(); +var c = new C; +c[Symbol.iterator](""); +c[Symbol.iterator](0); diff --git a/tests/baselines/reference/symbolProperty41.js b/tests/baselines/reference/symbolProperty41.js new file mode 100644 index 00000000000..d26b2c7682a --- /dev/null +++ b/tests/baselines/reference/symbolProperty41.js @@ -0,0 +1,26 @@ +//// [symbolProperty41.ts] +class C { + [Symbol.iterator](x: string): { x: string }; + [Symbol.iterator](x: "hello"): { x: string; hello: string }; + [Symbol.iterator](x: any) { + return undefined; + } +} + +var c = new C; +c[Symbol.iterator](""); +c[Symbol.iterator]("hello"); + + +//// [symbolProperty41.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function (x) { + return undefined; + }; + return C; +})(); +var c = new C; +c[Symbol.iterator](""); +c[Symbol.iterator]("hello"); diff --git a/tests/baselines/reference/symbolProperty42.errors.txt b/tests/baselines/reference/symbolProperty42.errors.txt new file mode 100644 index 00000000000..291c1c1cc50 --- /dev/null +++ b/tests/baselines/reference/symbolProperty42.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/es6/Symbols/symbolProperty42.ts(3,12): error TS2388: Function overload must not be static. +tests/cases/conformance/es6/Symbols/symbolProperty42.ts(4,5): error TS2387: Function overload must be static. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty42.ts (2 errors) ==== + class C { + [Symbol.iterator](x: string): string; + static [Symbol.iterator](x: number): number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2388: Function overload must not be static. + [Symbol.iterator](x: any) { + ~~~~~~~~~~~~~~~~~ +!!! error TS2387: Function overload must be static. + return undefined; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty42.js b/tests/baselines/reference/symbolProperty42.js new file mode 100644 index 00000000000..1990f54066c --- /dev/null +++ b/tests/baselines/reference/symbolProperty42.js @@ -0,0 +1,18 @@ +//// [symbolProperty42.ts] +class C { + [Symbol.iterator](x: string): string; + static [Symbol.iterator](x: number): number; + [Symbol.iterator](x: any) { + return undefined; + } +} + +//// [symbolProperty42.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function (x) { + return undefined; + }; + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty43.errors.txt b/tests/baselines/reference/symbolProperty43.errors.txt new file mode 100644 index 00000000000..c5124c4cd22 --- /dev/null +++ b/tests/baselines/reference/symbolProperty43.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/es6/Symbols/symbolProperty43.ts(3,5): error TS2391: Function implementation is missing or not immediately following the declaration. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty43.ts (1 errors) ==== + class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2391: Function implementation is missing or not immediately following the declaration. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty43.js b/tests/baselines/reference/symbolProperty43.js new file mode 100644 index 00000000000..fcb1fd3f8e5 --- /dev/null +++ b/tests/baselines/reference/symbolProperty43.js @@ -0,0 +1,12 @@ +//// [symbolProperty43.ts] +class C { + [Symbol.iterator](x: string): string; + [Symbol.iterator](x: number): number; +} + +//// [symbolProperty43.js] +var C = (function () { + function C() { + } + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty44.errors.txt b/tests/baselines/reference/symbolProperty44.errors.txt new file mode 100644 index 00000000000..2cef480e736 --- /dev/null +++ b/tests/baselines/reference/symbolProperty44.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/es6/Symbols/symbolProperty44.ts(2,9): error TS2300: Duplicate identifier '[Symbol.hasInstance]'. +tests/cases/conformance/es6/Symbols/symbolProperty44.ts(5,9): error TS2300: Duplicate identifier '[Symbol.hasInstance]'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty44.ts (2 errors) ==== + class C { + get [Symbol.hasInstance]() { + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.hasInstance]'. + return ""; + } + get [Symbol.hasInstance]() { + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2300: Duplicate identifier '[Symbol.hasInstance]'. + return ""; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty44.js b/tests/baselines/reference/symbolProperty44.js new file mode 100644 index 00000000000..ff3dc81a6fa --- /dev/null +++ b/tests/baselines/reference/symbolProperty44.js @@ -0,0 +1,30 @@ +//// [symbolProperty44.ts] +class C { + get [Symbol.hasInstance]() { + return ""; + } + get [Symbol.hasInstance]() { + return ""; + } +} + +//// [symbolProperty44.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.hasInstance, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, Symbol.hasInstance, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty45.js b/tests/baselines/reference/symbolProperty45.js new file mode 100644 index 00000000000..d056aba9f56 --- /dev/null +++ b/tests/baselines/reference/symbolProperty45.js @@ -0,0 +1,30 @@ +//// [symbolProperty45.ts] +class C { + get [Symbol.hasInstance]() { + return ""; + } + get [Symbol.toPrimitive]() { + return ""; + } +} + +//// [symbolProperty45.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.hasInstance, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, Symbol.toPrimitive, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + return C; +})(); diff --git a/tests/baselines/reference/symbolProperty45.types b/tests/baselines/reference/symbolProperty45.types new file mode 100644 index 00000000000..41e50387f00 --- /dev/null +++ b/tests/baselines/reference/symbolProperty45.types @@ -0,0 +1,19 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty45.ts === +class C { +>C : C + + get [Symbol.hasInstance]() { +>Symbol.hasInstance : Symbol +>Symbol : SymbolConstructor +>hasInstance : Symbol + + return ""; + } + get [Symbol.toPrimitive]() { +>Symbol.toPrimitive : Symbol +>Symbol : SymbolConstructor +>toPrimitive : Symbol + + return ""; + } +} diff --git a/tests/baselines/reference/symbolProperty46.js b/tests/baselines/reference/symbolProperty46.js new file mode 100644 index 00000000000..eb21e584941 --- /dev/null +++ b/tests/baselines/reference/symbolProperty46.js @@ -0,0 +1,35 @@ +//// [symbolProperty46.ts] +class C { + get [Symbol.hasInstance]() { + return ""; + } + // Should take a string + set [Symbol.hasInstance](x) { + } +} + +(new C)[Symbol.hasInstance] = 0; +(new C)[Symbol.hasInstance] = ""; + +//// [symbolProperty46.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.hasInstance, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, Symbol.hasInstance, { + // Should take a string + set: function (x) { + }, + enumerable: true, + configurable: true + }); + return C; +})(); +(new C)[Symbol.hasInstance] = 0; +(new C)[Symbol.hasInstance] = ""; diff --git a/tests/baselines/reference/symbolProperty47.errors.txt b/tests/baselines/reference/symbolProperty47.errors.txt new file mode 100644 index 00000000000..8d16be2fd57 --- /dev/null +++ b/tests/baselines/reference/symbolProperty47.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Type 'string' is not assignable to type 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (1 errors) ==== + class C { + get [Symbol.hasInstance]() { + return ""; + ~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. + } + // Should take a string + set [Symbol.hasInstance](x: number) { + } + } + + (new C)[Symbol.hasInstance] = 0; + (new C)[Symbol.hasInstance] = ""; \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty47.js b/tests/baselines/reference/symbolProperty47.js new file mode 100644 index 00000000000..9dbd03e90a1 --- /dev/null +++ b/tests/baselines/reference/symbolProperty47.js @@ -0,0 +1,35 @@ +//// [symbolProperty47.ts] +class C { + get [Symbol.hasInstance]() { + return ""; + } + // Should take a string + set [Symbol.hasInstance](x: number) { + } +} + +(new C)[Symbol.hasInstance] = 0; +(new C)[Symbol.hasInstance] = ""; + +//// [symbolProperty47.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.hasInstance, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, Symbol.hasInstance, { + // Should take a string + set: function (x) { + }, + enumerable: true, + configurable: true + }); + return C; +})(); +(new C)[Symbol.hasInstance] = 0; +(new C)[Symbol.hasInstance] = ""; diff --git a/tests/baselines/reference/symbolProperty48.js b/tests/baselines/reference/symbolProperty48.js new file mode 100644 index 00000000000..b0dc2b46dba --- /dev/null +++ b/tests/baselines/reference/symbolProperty48.js @@ -0,0 +1,21 @@ +//// [symbolProperty48.ts] +module M { + var Symbol; + + class C { + [Symbol.iterator]() { } + } +} + +//// [symbolProperty48.js] +var M; +(function (M) { + var Symbol; + var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; + })(); +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty49.js b/tests/baselines/reference/symbolProperty49.js new file mode 100644 index 00000000000..ea6e6f2c523 --- /dev/null +++ b/tests/baselines/reference/symbolProperty49.js @@ -0,0 +1,21 @@ +//// [symbolProperty49.ts] +module M { + export var Symbol; + + class C { + [Symbol.iterator]() { } + } +} + +//// [symbolProperty49.js] +var M; +(function (M) { + M.Symbol; + var C = (function () { + function C() { + } + C.prototype[M.Symbol.iterator] = function () { + }; + return C; + })(); +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty50.js b/tests/baselines/reference/symbolProperty50.js new file mode 100644 index 00000000000..0a668e95509 --- /dev/null +++ b/tests/baselines/reference/symbolProperty50.js @@ -0,0 +1,20 @@ +//// [symbolProperty50.ts] +module M { + interface Symbol { } + + class C { + [Symbol.iterator]() { } + } +} + +//// [symbolProperty50.js] +var M; +(function (M) { + var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; + })(); +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty50.types b/tests/baselines/reference/symbolProperty50.types new file mode 100644 index 00000000000..6715f8bce2f --- /dev/null +++ b/tests/baselines/reference/symbolProperty50.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty50.ts === +module M { +>M : typeof M + + interface Symbol { } +>Symbol : Symbol + + class C { +>C : C + + [Symbol.iterator]() { } +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol + } +} diff --git a/tests/baselines/reference/symbolProperty51.js b/tests/baselines/reference/symbolProperty51.js new file mode 100644 index 00000000000..b3b9902fcd6 --- /dev/null +++ b/tests/baselines/reference/symbolProperty51.js @@ -0,0 +1,20 @@ +//// [symbolProperty51.ts] +module M { + module Symbol { } + + class C { + [Symbol.iterator]() { } + } +} + +//// [symbolProperty51.js] +var M; +(function (M) { + var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; + })(); +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty51.types b/tests/baselines/reference/symbolProperty51.types new file mode 100644 index 00000000000..b039e3e3b80 --- /dev/null +++ b/tests/baselines/reference/symbolProperty51.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty51.ts === +module M { +>M : typeof M + + module Symbol { } +>Symbol : unknown + + class C { +>C : C + + [Symbol.iterator]() { } +>Symbol.iterator : Symbol +>Symbol : SymbolConstructor +>iterator : Symbol + } +} diff --git a/tests/baselines/reference/symbolProperty52.errors.txt b/tests/baselines/reference/symbolProperty52.errors.txt new file mode 100644 index 00000000000..484dffbea96 --- /dev/null +++ b/tests/baselines/reference/symbolProperty52.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/es6/Symbols/symbolProperty52.ts(2,13): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'. +tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'. + Property '[Symbol.nonsense]' is missing in type '{}'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (2 errors) ==== + var obj = { + [Symbol.nonsense]: 0 + ~~~~~~~~ +!!! error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'. + }; + + obj = {}; + ~~~ +!!! error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'. +!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty52.js b/tests/baselines/reference/symbolProperty52.js new file mode 100644 index 00000000000..e3542b5a85f --- /dev/null +++ b/tests/baselines/reference/symbolProperty52.js @@ -0,0 +1,12 @@ +//// [symbolProperty52.ts] +var obj = { + [Symbol.nonsense]: 0 +}; + +obj = {}; + +//// [symbolProperty52.js] +var obj = { + [Symbol.nonsense]: 0 +}; +obj = {}; diff --git a/tests/baselines/reference/symbolProperty53.errors.txt b/tests/baselines/reference/symbolProperty53.errors.txt new file mode 100644 index 00000000000..87ec693263e --- /dev/null +++ b/tests/baselines/reference/symbolProperty53.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (1 errors) ==== + var obj = { + [Symbol.for]: 0 + ~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. + }; \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty53.js b/tests/baselines/reference/symbolProperty53.js new file mode 100644 index 00000000000..f302dff8924 --- /dev/null +++ b/tests/baselines/reference/symbolProperty53.js @@ -0,0 +1,9 @@ +//// [symbolProperty53.ts] +var obj = { + [Symbol.for]: 0 +}; + +//// [symbolProperty53.js] +var obj = { + [Symbol.for]: 0 +}; diff --git a/tests/baselines/reference/symbolProperty54.js b/tests/baselines/reference/symbolProperty54.js new file mode 100644 index 00000000000..ace8a7ca926 --- /dev/null +++ b/tests/baselines/reference/symbolProperty54.js @@ -0,0 +1,9 @@ +//// [symbolProperty54.ts] +var obj = { + [Symbol.prototype]: 0 +}; + +//// [symbolProperty54.js] +var obj = { + [Symbol.prototype]: 0 +}; diff --git a/tests/baselines/reference/symbolProperty9.errors.txt b/tests/baselines/reference/symbolProperty9.errors.txt new file mode 100644 index 00000000000..e621ab6c5a6 --- /dev/null +++ b/tests/baselines/reference/symbolProperty9.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/es6/Symbols/symbolProperty9.ts(10,5): error TS2322: Type 'I' is not assignable to type 'C'. + Types of property '[Symbol.iterator]' are incompatible. + Type '{ x: any; }' is not assignable to type '{ x: any; y: any; }'. + Property 'y' is missing in type '{ x: any; }'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty9.ts (1 errors) ==== + class C { + [Symbol.iterator]: { x; y }; + } + interface I { + [Symbol.iterator]: { x }; + } + + var i: I; + i = new C; + var c: C = i; + ~ +!!! error TS2322: Type 'I' is not assignable to type 'C'. +!!! error TS2322: Types of property '[Symbol.iterator]' are incompatible. +!!! error TS2322: Type '{ x: any; }' is not assignable to type '{ x: any; y: any; }'. +!!! error TS2322: Property 'y' is missing in type '{ x: any; }'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty9.js b/tests/baselines/reference/symbolProperty9.js new file mode 100644 index 00000000000..f97a1d44a21 --- /dev/null +++ b/tests/baselines/reference/symbolProperty9.js @@ -0,0 +1,21 @@ +//// [symbolProperty9.ts] +class C { + [Symbol.iterator]: { x; y }; +} +interface I { + [Symbol.iterator]: { x }; +} + +var i: I; +i = new C; +var c: C = i; + +//// [symbolProperty9.js] +var C = (function () { + function C() { + } + return C; +})(); +var i; +i = new C; +var c = i; From e508bf7e86939819a11a3591ba2bf204e6ac19e1 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 3 Feb 2015 15:50:56 -0800 Subject: [PATCH 014/106] Add symbol keyword --- src/compiler/checker.ts | 3 ++- src/compiler/emitter.ts | 1 + src/compiler/parser.ts | 2 ++ src/compiler/scanner.ts | 1 + src/compiler/types.ts | 1 + src/compiler/utilities.ts | 6 ------ src/services/formatting/tokenRange.ts | 2 +- src/services/services.ts | 3 ++- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 68d41199de2..fde878c0533 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9751,6 +9751,7 @@ module ts { case SyntaxKind.NumberKeyword: case SyntaxKind.StringKeyword: case SyntaxKind.BooleanKeyword: + case SyntaxKind.SymbolKeyword: return true; case SyntaxKind.VoidKeyword: return node.parent.kind !== SyntaxKind.VoidExpression; @@ -10529,7 +10530,7 @@ module ts { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_must_have_a_type_annotation); } if (parameter.type.kind !== SyntaxKind.StringKeyword && parameter.type.kind !== SyntaxKind.NumberKeyword) { - if (isESSymbolTypeNode(parameter.type)) { + if (parameter.type.kind === SyntaxKind.SymbolKeyword) { if (languageVersion < ScriptTarget.ES6) { return grammarErrorOnNode(parameter.type, Diagnostics.Symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher); } diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 5acaf560273..4d7c7f9d3b0 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -579,6 +579,7 @@ module ts { case SyntaxKind.StringKeyword: case SyntaxKind.NumberKeyword: case SyntaxKind.BooleanKeyword: + case SyntaxKind.SymbolKeyword: case SyntaxKind.VoidKeyword: case SyntaxKind.StringLiteral: return writeTextOfNode(currentSourceFile, type); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 6942be3cf13..642821ffbcd 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2515,6 +2515,7 @@ module ts { case SyntaxKind.StringKeyword: case SyntaxKind.NumberKeyword: case SyntaxKind.BooleanKeyword: + case SyntaxKind.SymbolKeyword: // If these are followed by a dot, then parse these out as a dotted type reference instead. var node = tryParse(parseKeywordAndNoDot); return node || parseTypeReference(); @@ -2539,6 +2540,7 @@ module ts { case SyntaxKind.StringKeyword: case SyntaxKind.NumberKeyword: case SyntaxKind.BooleanKeyword: + case SyntaxKind.SymbolKeyword: case SyntaxKind.VoidKeyword: case SyntaxKind.TypeOfKeyword: case SyntaxKind.OpenBraceToken: diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index fbbd69bbd69..f85df69f026 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -82,6 +82,7 @@ module ts { "string": SyntaxKind.StringKeyword, "super": SyntaxKind.SuperKeyword, "switch": SyntaxKind.SwitchKeyword, + "symbol": SyntaxKind.SymbolKeyword, "this": SyntaxKind.ThisKeyword, "throw": SyntaxKind.ThrowKeyword, "true": SyntaxKind.TrueKeyword, diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 1c79ef169e9..96689afba1d 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -140,6 +140,7 @@ module ts { NumberKeyword, SetKeyword, StringKeyword, + SymbolKeyword, TypeKeyword, // Parse tree nodes diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index abf902d5fd1..9d8f5f9b563 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -852,12 +852,6 @@ module ts { return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); } - export function isESSymbolTypeNode(node: Node): boolean { - return node.kind === SyntaxKind.TypeReference && - (node).typeArguments === undefined && - isESSymbolIdentifier((node).typeName); - } - /** * Includes the word "Symbol" with unicode escapes */ diff --git a/src/services/formatting/tokenRange.ts b/src/services/formatting/tokenRange.ts index 61fcb26dc9b..6dace543eab 100644 --- a/src/services/formatting/tokenRange.ts +++ b/src/services/formatting/tokenRange.ts @@ -134,7 +134,7 @@ module ts.formatting { static UnaryPredecrementExpressions = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]); static UnaryPostdecrementExpressions = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.CloseParenToken, SyntaxKind.CloseBracketToken, SyntaxKind.NewKeyword]); static Comments = TokenRange.FromTokens([SyntaxKind.SingleLineCommentTrivia, SyntaxKind.MultiLineCommentTrivia]); - static TypeNames = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.NumberKeyword, SyntaxKind.StringKeyword, SyntaxKind.BooleanKeyword, SyntaxKind.VoidKeyword, SyntaxKind.AnyKeyword]); + static TypeNames = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.NumberKeyword, SyntaxKind.StringKeyword, SyntaxKind.BooleanKeyword, SyntaxKind.SymbolKeyword, SyntaxKind.VoidKeyword, SyntaxKind.AnyKeyword]); } } } \ No newline at end of file diff --git a/src/services/services.ts b/src/services/services.ts index fcb5c696a38..277f574578a 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5754,7 +5754,8 @@ module ts { else if (token === SyntaxKind.AnyKeyword || token === SyntaxKind.StringKeyword || token === SyntaxKind.NumberKeyword || - token === SyntaxKind.BooleanKeyword) { + token === SyntaxKind.BooleanKeyword || + token === SyntaxKind.SymbolKeyword) { if (angleBracketStack > 0 && !classifyKeywordsInGenerics) { // If it looks like we're could be in something generic, don't classify this // as a keyword. We may just get overwritten by the syntactic classifier, From ebdd96bacf7f4b5d34cee0a8c9a262e4100a153e Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 3 Feb 2015 15:52:06 -0800 Subject: [PATCH 015/106] Update tests to use new symbol keyword --- .../baselines/reference/APISample_compile.js | 191 ++++++++-------- .../reference/APISample_compile.types | 193 ++++++++-------- tests/baselines/reference/APISample_linter.js | 209 +++++++++--------- .../reference/APISample_linter.types | 193 ++++++++-------- .../reference/APISample_transform.js | 191 ++++++++-------- .../reference/APISample_transform.types | 193 ++++++++-------- .../baselines/reference/APISample_watcher.js | 191 ++++++++-------- .../reference/APISample_watcher.types | 193 ++++++++-------- .../parserES5SymbolIndexer1.errors.txt | 7 +- .../reference/parserES5SymbolIndexer1.js | 6 + .../parserES5SymbolIndexer2.errors.txt | 7 +- .../reference/parserES5SymbolIndexer2.js | 11 + .../parserES5SymbolIndexer3.errors.txt | 7 +- .../reference/parserES5SymbolIndexer3.js | 7 + .../reference/parserES5SymbolProperty1.js | 6 + .../reference/parserES5SymbolProperty2.js | 6 + .../reference/parserES5SymbolProperty3.js | 6 + .../reference/parserES5SymbolProperty4.js | 6 + .../reference/parserES5SymbolProperty5.js | 11 + .../reference/parserES5SymbolProperty6.js | 12 + .../reference/parserES5SymbolProperty7.js | 13 ++ .../reference/parserES5SymbolProperty8.js | 7 + .../reference/parserES5SymbolProperty9.js | 7 + .../reference/parserSymbolIndexer1.js | 2 +- .../reference/parserSymbolIndexer2.js | 2 +- .../reference/parserSymbolIndexer3.errors.txt | 2 +- .../reference/parserSymbolIndexer3.js | 11 + .../reference/parserSymbolIndexer4.js | 2 +- .../reference/parserSymbolIndexer5.errors.txt | 7 +- .../reference/parserSymbolIndexer5.js | 10 + tests/baselines/reference/symbolProperty1.js | 2 +- tests/baselines/reference/symbolProperty17.js | 2 +- tests/baselines/reference/symbolProperty29.js | 2 +- tests/baselines/reference/symbolProperty30.js | 2 +- tests/baselines/reference/symbolProperty31.js | 2 +- tests/baselines/reference/symbolProperty32.js | 2 +- tests/baselines/reference/symbolProperty33.js | 2 +- tests/baselines/reference/symbolProperty34.js | 2 +- tests/baselines/reference/symbolProperty7.js | 26 +++ .../es6/Symbols/symbolProperty1.ts | 2 +- .../es6/Symbols/symbolProperty17.ts | 2 +- .../es6/Symbols/symbolProperty29.ts | 2 +- .../es6/Symbols/symbolProperty30.ts | 2 +- .../es6/Symbols/symbolProperty31.ts | 2 +- .../es6/Symbols/symbolProperty32.ts | 2 +- .../es6/Symbols/symbolProperty33.ts | 2 +- .../es6/Symbols/symbolProperty34.ts | 2 +- .../Symbols/parserES5SymbolIndexer1.ts | 2 +- .../Symbols/parserES5SymbolIndexer2.ts | 2 +- .../Symbols/parserES5SymbolIndexer3.ts | 2 +- .../Symbols/parserSymbolIndexer1.ts | 2 +- .../Symbols/parserSymbolIndexer2.ts | 2 +- .../Symbols/parserSymbolIndexer3.ts | 2 +- .../Symbols/parserSymbolIndexer4.ts | 2 +- .../Symbols/parserSymbolIndexer5.ts | 2 +- 55 files changed, 969 insertions(+), 814 deletions(-) create mode 100644 tests/baselines/reference/parserES5SymbolIndexer1.js create mode 100644 tests/baselines/reference/parserES5SymbolIndexer2.js create mode 100644 tests/baselines/reference/parserES5SymbolIndexer3.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty1.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty2.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty3.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty4.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty5.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty6.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty7.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty8.js create mode 100644 tests/baselines/reference/parserES5SymbolProperty9.js create mode 100644 tests/baselines/reference/parserSymbolIndexer3.js create mode 100644 tests/baselines/reference/parserSymbolIndexer5.js create mode 100644 tests/baselines/reference/symbolProperty7.js diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index 6840f079972..cbf5cf290eb 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -179,110 +179,111 @@ declare module "typescript" { NumberKeyword = 117, SetKeyword = 118, StringKeyword = 119, - TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + SymbolKeyword = 120, + TypeKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ContinueStatement = 180, + BreakStatement = 181, + ReturnStatement = 182, + WithStatement = 183, + SwitchStatement = 184, + LabeledStatement = 185, + ThrowStatement = 186, + TryStatement = 187, + DebuggerStatement = 188, + VariableDeclaration = 189, + VariableDeclarationList = 190, + FunctionDeclaration = 191, + ClassDeclaration = 192, + InterfaceDeclaration = 193, + TypeAliasDeclaration = 194, + EnumDeclaration = 195, + ModuleDeclaration = 196, + ModuleBlock = 197, + ImportDeclaration = 198, + ExportAssignment = 199, + ExternalModuleReference = 200, + CaseClause = 201, + DefaultClause = 202, + HeritageClause = 203, + CatchClause = 204, + PropertyAssignment = 205, + ShorthandPropertyAssignment = 206, + EnumMember = 207, + SourceFile = 208, + SyntaxList = 209, + Count = 210, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 120, + LastToken = 121, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, @@ -291,7 +292,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index d70172377ca..7eff464a746 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -553,274 +553,277 @@ declare module "typescript" { StringKeyword = 119, >StringKeyword : SyntaxKind - TypeKeyword = 120, + SymbolKeyword = 120, +>SymbolKeyword : SyntaxKind + + TypeKeyword = 121, >TypeKeyword : SyntaxKind - QualifiedName = 121, + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ContinueStatement = 180, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 181, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 182, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 183, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 184, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 185, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 186, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 187, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 188, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 189, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 190, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 191, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 192, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 193, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 194, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 195, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 196, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 197, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 198, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 199, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 200, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 201, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 202, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 203, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 204, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 205, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 206, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 207, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 208, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 209, >SyntaxList : SyntaxKind - Count = 209, + Count = 210, >Count : SyntaxKind FirstAssignment = 52, @@ -838,7 +841,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -847,10 +850,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -862,7 +865,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 120, + LastToken = 121, >LastToken : SyntaxKind FirstTriviaToken = 2, @@ -889,7 +892,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index c8bec722309..eab931162ad 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -210,110 +210,111 @@ declare module "typescript" { NumberKeyword = 117, SetKeyword = 118, StringKeyword = 119, - TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + SymbolKeyword = 120, + TypeKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ContinueStatement = 180, + BreakStatement = 181, + ReturnStatement = 182, + WithStatement = 183, + SwitchStatement = 184, + LabeledStatement = 185, + ThrowStatement = 186, + TryStatement = 187, + DebuggerStatement = 188, + VariableDeclaration = 189, + VariableDeclarationList = 190, + FunctionDeclaration = 191, + ClassDeclaration = 192, + InterfaceDeclaration = 193, + TypeAliasDeclaration = 194, + EnumDeclaration = 195, + ModuleDeclaration = 196, + ModuleBlock = 197, + ImportDeclaration = 198, + ExportAssignment = 199, + ExternalModuleReference = 200, + CaseClause = 201, + DefaultClause = 202, + HeritageClause = 203, + CatchClause = 204, + PropertyAssignment = 205, + ShorthandPropertyAssignment = 206, + EnumMember = 207, + SourceFile = 208, + SyntaxList = 209, + Count = 210, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 120, + LastToken = 121, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, @@ -322,7 +323,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, @@ -1951,24 +1952,24 @@ function delint(sourceFile) { delintNode(sourceFile); function delintNode(node) { switch (node.kind) { - case 177 /* ForStatement */: - case 178 /* ForInStatement */: - case 176 /* WhileStatement */: - case 175 /* DoStatement */: - if (node.statement.kind !== 170 /* Block */) { + case 178 /* ForStatement */: + case 179 /* ForInStatement */: + case 177 /* WhileStatement */: + case 176 /* DoStatement */: + if (node.statement.kind !== 171 /* Block */) { report(node, "A looping statement's contents should be wrapped in a block body."); } break; - case 174 /* IfStatement */: + case 175 /* IfStatement */: var ifStatement = node; - if (ifStatement.thenStatement.kind !== 170 /* Block */) { + if (ifStatement.thenStatement.kind !== 171 /* Block */) { report(ifStatement.thenStatement, "An if statement's contents should be wrapped in a block body."); } - if (ifStatement.elseStatement && ifStatement.elseStatement.kind !== 170 /* Block */ && ifStatement.elseStatement.kind !== 174 /* IfStatement */) { + if (ifStatement.elseStatement && ifStatement.elseStatement.kind !== 171 /* Block */ && ifStatement.elseStatement.kind !== 175 /* IfStatement */) { report(ifStatement.elseStatement, "An else statement's contents should be wrapped in a block body."); } break; - case 163 /* BinaryExpression */: + case 164 /* BinaryExpression */: var op = node.operator; if (op === 28 /* EqualsEqualsToken */ || op === 29 /* ExclamationEqualsToken */) { report(node, "Use '===' and '!=='."); diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 26254c69d54..fcdbb57add6 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -697,274 +697,277 @@ declare module "typescript" { StringKeyword = 119, >StringKeyword : SyntaxKind - TypeKeyword = 120, + SymbolKeyword = 120, +>SymbolKeyword : SyntaxKind + + TypeKeyword = 121, >TypeKeyword : SyntaxKind - QualifiedName = 121, + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ContinueStatement = 180, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 181, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 182, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 183, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 184, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 185, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 186, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 187, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 188, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 189, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 190, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 191, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 192, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 193, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 194, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 195, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 196, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 197, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 198, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 199, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 200, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 201, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 202, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 203, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 204, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 205, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 206, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 207, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 208, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 209, >SyntaxList : SyntaxKind - Count = 209, + Count = 210, >Count : SyntaxKind FirstAssignment = 52, @@ -982,7 +985,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -991,10 +994,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -1006,7 +1009,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 120, + LastToken = 121, >LastToken : SyntaxKind FirstTriviaToken = 2, @@ -1033,7 +1036,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index ad66d289eb7..e9c8d6fc0fd 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -211,110 +211,111 @@ declare module "typescript" { NumberKeyword = 117, SetKeyword = 118, StringKeyword = 119, - TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + SymbolKeyword = 120, + TypeKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ContinueStatement = 180, + BreakStatement = 181, + ReturnStatement = 182, + WithStatement = 183, + SwitchStatement = 184, + LabeledStatement = 185, + ThrowStatement = 186, + TryStatement = 187, + DebuggerStatement = 188, + VariableDeclaration = 189, + VariableDeclarationList = 190, + FunctionDeclaration = 191, + ClassDeclaration = 192, + InterfaceDeclaration = 193, + TypeAliasDeclaration = 194, + EnumDeclaration = 195, + ModuleDeclaration = 196, + ModuleBlock = 197, + ImportDeclaration = 198, + ExportAssignment = 199, + ExternalModuleReference = 200, + CaseClause = 201, + DefaultClause = 202, + HeritageClause = 203, + CatchClause = 204, + PropertyAssignment = 205, + ShorthandPropertyAssignment = 206, + EnumMember = 207, + SourceFile = 208, + SyntaxList = 209, + Count = 210, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 120, + LastToken = 121, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, @@ -323,7 +324,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index c6d74cc811d..2a9c7902528 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -649,274 +649,277 @@ declare module "typescript" { StringKeyword = 119, >StringKeyword : SyntaxKind - TypeKeyword = 120, + SymbolKeyword = 120, +>SymbolKeyword : SyntaxKind + + TypeKeyword = 121, >TypeKeyword : SyntaxKind - QualifiedName = 121, + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ContinueStatement = 180, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 181, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 182, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 183, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 184, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 185, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 186, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 187, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 188, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 189, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 190, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 191, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 192, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 193, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 194, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 195, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 196, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 197, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 198, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 199, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 200, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 201, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 202, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 203, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 204, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 205, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 206, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 207, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 208, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 209, >SyntaxList : SyntaxKind - Count = 209, + Count = 210, >Count : SyntaxKind FirstAssignment = 52, @@ -934,7 +937,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -943,10 +946,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -958,7 +961,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 120, + LastToken = 121, >LastToken : SyntaxKind FirstTriviaToken = 2, @@ -985,7 +988,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 2add8dfd45e..dae4936f7b0 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -248,110 +248,111 @@ declare module "typescript" { NumberKeyword = 117, SetKeyword = 118, StringKeyword = 119, - TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + SymbolKeyword = 120, + TypeKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ContinueStatement = 180, + BreakStatement = 181, + ReturnStatement = 182, + WithStatement = 183, + SwitchStatement = 184, + LabeledStatement = 185, + ThrowStatement = 186, + TryStatement = 187, + DebuggerStatement = 188, + VariableDeclaration = 189, + VariableDeclarationList = 190, + FunctionDeclaration = 191, + ClassDeclaration = 192, + InterfaceDeclaration = 193, + TypeAliasDeclaration = 194, + EnumDeclaration = 195, + ModuleDeclaration = 196, + ModuleBlock = 197, + ImportDeclaration = 198, + ExportAssignment = 199, + ExternalModuleReference = 200, + CaseClause = 201, + DefaultClause = 202, + HeritageClause = 203, + CatchClause = 204, + PropertyAssignment = 205, + ShorthandPropertyAssignment = 206, + EnumMember = 207, + SourceFile = 208, + SyntaxList = 209, + Count = 210, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 120, + LastToken = 121, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, @@ -360,7 +361,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 3af8537fdb7..a8d9197f753 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -822,274 +822,277 @@ declare module "typescript" { StringKeyword = 119, >StringKeyword : SyntaxKind - TypeKeyword = 120, + SymbolKeyword = 120, +>SymbolKeyword : SyntaxKind + + TypeKeyword = 121, >TypeKeyword : SyntaxKind - QualifiedName = 121, + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ContinueStatement = 180, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 181, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 182, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 183, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 184, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 185, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 186, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 187, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 188, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 189, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 190, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 191, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 192, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 193, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 194, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 195, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 196, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 197, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 198, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 199, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 200, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 201, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 202, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 203, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 204, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 205, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 206, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 207, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 208, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 209, >SyntaxList : SyntaxKind - Count = 209, + Count = 210, >Count : SyntaxKind FirstAssignment = 52, @@ -1107,7 +1110,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -1116,10 +1119,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -1131,7 +1134,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 120, + LastToken = 121, >LastToken : SyntaxKind FirstTriviaToken = 2, @@ -1158,7 +1161,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { diff --git a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt index 8128f95d3b6..a5ff176db61 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt @@ -1,12 +1,9 @@ tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS2304: Cannot find name 'Symbol'. -==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts (1 errors) ==== interface I { - [s: Symbol]: string; + [s: symbol]: string; ~~~~~~ !!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. - ~~~~~~ -!!! error TS2304: Cannot find name 'Symbol'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer1.js b/tests/baselines/reference/parserES5SymbolIndexer1.js new file mode 100644 index 00000000000..641d93b1170 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolIndexer1.js @@ -0,0 +1,6 @@ +//// [parserES5SymbolIndexer1.ts] +interface I { + [s: symbol]: string; +} + +//// [parserES5SymbolIndexer1.js] diff --git a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt index b1904d0fe53..de4c97aae29 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt @@ -1,12 +1,9 @@ tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS2304: Cannot find name 'Symbol'. -==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts (1 errors) ==== class C { - [s: Symbol]: string; + [s: symbol]: string; ~~~~~~ !!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. - ~~~~~~ -!!! error TS2304: Cannot find name 'Symbol'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer2.js b/tests/baselines/reference/parserES5SymbolIndexer2.js new file mode 100644 index 00000000000..c511b6acafa --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolIndexer2.js @@ -0,0 +1,11 @@ +//// [parserES5SymbolIndexer2.ts] +class C { + [s: symbol]: string; +} + +//// [parserES5SymbolIndexer2.js] +var C = (function () { + function C() { + } + return C; +})(); diff --git a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt index bc1bc64aeda..e839338e772 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt @@ -1,12 +1,9 @@ tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS2304: Cannot find name 'Symbol'. -==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts (1 errors) ==== var x: { - [s: Symbol]: string; + [s: symbol]: string; ~~~~~~ !!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. - ~~~~~~ -!!! error TS2304: Cannot find name 'Symbol'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer3.js b/tests/baselines/reference/parserES5SymbolIndexer3.js new file mode 100644 index 00000000000..daffb51a6d7 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolIndexer3.js @@ -0,0 +1,7 @@ +//// [parserES5SymbolIndexer3.ts] +var x: { + [s: symbol]: string; +} + +//// [parserES5SymbolIndexer3.js] +var x; diff --git a/tests/baselines/reference/parserES5SymbolProperty1.js b/tests/baselines/reference/parserES5SymbolProperty1.js new file mode 100644 index 00000000000..36030aec105 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty1.js @@ -0,0 +1,6 @@ +//// [parserES5SymbolProperty1.ts] +interface I { + [Symbol.iterator]: string; +} + +//// [parserES5SymbolProperty1.js] diff --git a/tests/baselines/reference/parserES5SymbolProperty2.js b/tests/baselines/reference/parserES5SymbolProperty2.js new file mode 100644 index 00000000000..d600b05ea52 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty2.js @@ -0,0 +1,6 @@ +//// [parserES5SymbolProperty2.ts] +interface I { + [Symbol.unscopables](): string; +} + +//// [parserES5SymbolProperty2.js] diff --git a/tests/baselines/reference/parserES5SymbolProperty3.js b/tests/baselines/reference/parserES5SymbolProperty3.js new file mode 100644 index 00000000000..0d0fb18313f --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty3.js @@ -0,0 +1,6 @@ +//// [parserES5SymbolProperty3.ts] +declare class C { + [Symbol.unscopables](): string; +} + +//// [parserES5SymbolProperty3.js] diff --git a/tests/baselines/reference/parserES5SymbolProperty4.js b/tests/baselines/reference/parserES5SymbolProperty4.js new file mode 100644 index 00000000000..d8f55358e73 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty4.js @@ -0,0 +1,6 @@ +//// [parserES5SymbolProperty4.ts] +declare class C { + [Symbol.isRegExp]: string; +} + +//// [parserES5SymbolProperty4.js] diff --git a/tests/baselines/reference/parserES5SymbolProperty5.js b/tests/baselines/reference/parserES5SymbolProperty5.js new file mode 100644 index 00000000000..e2448432542 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty5.js @@ -0,0 +1,11 @@ +//// [parserES5SymbolProperty5.ts] +class C { + [Symbol.isRegExp]: string; +} + +//// [parserES5SymbolProperty5.js] +var C = (function () { + function C() { + } + return C; +})(); diff --git a/tests/baselines/reference/parserES5SymbolProperty6.js b/tests/baselines/reference/parserES5SymbolProperty6.js new file mode 100644 index 00000000000..ce2050688c3 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty6.js @@ -0,0 +1,12 @@ +//// [parserES5SymbolProperty6.ts] +class C { + [Symbol.toStringTag]: string = ""; +} + +//// [parserES5SymbolProperty6.js] +var C = (function () { + function C() { + this[Symbol.toStringTag] = ""; + } + return C; +})(); diff --git a/tests/baselines/reference/parserES5SymbolProperty7.js b/tests/baselines/reference/parserES5SymbolProperty7.js new file mode 100644 index 00000000000..b6096b798df --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty7.js @@ -0,0 +1,13 @@ +//// [parserES5SymbolProperty7.ts] +class C { + [Symbol.toStringTag](): void { } +} + +//// [parserES5SymbolProperty7.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.toStringTag] = function () { + }; + return C; +})(); diff --git a/tests/baselines/reference/parserES5SymbolProperty8.js b/tests/baselines/reference/parserES5SymbolProperty8.js new file mode 100644 index 00000000000..ed3a55db0f2 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty8.js @@ -0,0 +1,7 @@ +//// [parserES5SymbolProperty8.ts] +var x: { + [Symbol.toPrimitive](): string +} + +//// [parserES5SymbolProperty8.js] +var x; diff --git a/tests/baselines/reference/parserES5SymbolProperty9.js b/tests/baselines/reference/parserES5SymbolProperty9.js new file mode 100644 index 00000000000..4728765e553 --- /dev/null +++ b/tests/baselines/reference/parserES5SymbolProperty9.js @@ -0,0 +1,7 @@ +//// [parserES5SymbolProperty9.ts] +var x: { + [Symbol.toPrimitive]: string +} + +//// [parserES5SymbolProperty9.js] +var x; diff --git a/tests/baselines/reference/parserSymbolIndexer1.js b/tests/baselines/reference/parserSymbolIndexer1.js index 4c99edda168..752391dad53 100644 --- a/tests/baselines/reference/parserSymbolIndexer1.js +++ b/tests/baselines/reference/parserSymbolIndexer1.js @@ -1,6 +1,6 @@ //// [parserSymbolIndexer1.ts] interface I { - [s: Symbol]: string; + [s: symbol]: string; } //// [parserSymbolIndexer1.js] diff --git a/tests/baselines/reference/parserSymbolIndexer2.js b/tests/baselines/reference/parserSymbolIndexer2.js index 1acae44ae2a..563614e1c8c 100644 --- a/tests/baselines/reference/parserSymbolIndexer2.js +++ b/tests/baselines/reference/parserSymbolIndexer2.js @@ -1,6 +1,6 @@ //// [parserSymbolIndexer2.ts] class C { - [s: Symbol]: string; + [s: symbol]: string; } //// [parserSymbolIndexer2.js] diff --git a/tests/baselines/reference/parserSymbolIndexer3.errors.txt b/tests/baselines/reference/parserSymbolIndexer3.errors.txt index f5066a09ee9..df3b9596f79 100644 --- a/tests/baselines/reference/parserSymbolIndexer3.errors.txt +++ b/tests/baselines/reference/parserSymbolIndexer3.errors.txt @@ -3,7 +3,7 @@ tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts(2,5): ==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts (1 errors) ==== class C { - static [s: Symbol]: string; + static [s: symbol]: string; ~~~~~~ !!! error TS1145: Modifiers not permitted on index signature members. } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer3.js b/tests/baselines/reference/parserSymbolIndexer3.js new file mode 100644 index 00000000000..917945193ae --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer3.js @@ -0,0 +1,11 @@ +//// [parserSymbolIndexer3.ts] +class C { + static [s: symbol]: string; +} + +//// [parserSymbolIndexer3.js] +var C = (function () { + function C() { + } + return C; +})(); diff --git a/tests/baselines/reference/parserSymbolIndexer4.js b/tests/baselines/reference/parserSymbolIndexer4.js index 607b1ada481..21367ca5969 100644 --- a/tests/baselines/reference/parserSymbolIndexer4.js +++ b/tests/baselines/reference/parserSymbolIndexer4.js @@ -1,6 +1,6 @@ //// [parserSymbolIndexer4.ts] var x: { - [s: Symbol]: string; + [s: symbol]: string; } //// [parserSymbolIndexer4.js] diff --git a/tests/baselines/reference/parserSymbolIndexer5.errors.txt b/tests/baselines/reference/parserSymbolIndexer5.errors.txt index 611ad109a34..a8c19338e01 100644 --- a/tests/baselines/reference/parserSymbolIndexer5.errors.txt +++ b/tests/baselines/reference/parserSymbolIndexer5.errors.txt @@ -1,17 +1,20 @@ tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,6): error TS2304: Cannot find name 's'. tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,7): error TS1005: ']' expected. +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,9): error TS2304: Cannot find name 'symbol'. tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,15): error TS1005: ',' expected. tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(2,16): error TS1136: Property assignment expected. tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts(3,1): error TS1005: ':' expected. -==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts (5 errors) ==== +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts (6 errors) ==== var x = { - [s: Symbol]: "" + [s: symbol]: "" ~ !!! error TS2304: Cannot find name 's'. ~ !!! error TS1005: ']' expected. + ~~~~~~ +!!! error TS2304: Cannot find name 'symbol'. ~ !!! error TS1005: ',' expected. ~ diff --git a/tests/baselines/reference/parserSymbolIndexer5.js b/tests/baselines/reference/parserSymbolIndexer5.js new file mode 100644 index 00000000000..43c456b64aa --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer5.js @@ -0,0 +1,10 @@ +//// [parserSymbolIndexer5.ts] +var x = { + [s: symbol]: "" +} + +//// [parserSymbolIndexer5.js] +var x = { + [s]: symbol, + "": +}; diff --git a/tests/baselines/reference/symbolProperty1.js b/tests/baselines/reference/symbolProperty1.js index e5189d0c88f..1537883f4ec 100644 --- a/tests/baselines/reference/symbolProperty1.js +++ b/tests/baselines/reference/symbolProperty1.js @@ -1,5 +1,5 @@ //// [symbolProperty1.ts] -var s: Symbol; +var s: symbol; var x = { [s]: 0, [s]() { }, diff --git a/tests/baselines/reference/symbolProperty17.js b/tests/baselines/reference/symbolProperty17.js index 9aa603910cd..549577c8d6c 100644 --- a/tests/baselines/reference/symbolProperty17.js +++ b/tests/baselines/reference/symbolProperty17.js @@ -1,7 +1,7 @@ //// [symbolProperty17.ts] interface I { [Symbol.iterator]: number; - [s: Symbol]: string; + [s: symbol]: string; "__@iterator": string; } diff --git a/tests/baselines/reference/symbolProperty29.js b/tests/baselines/reference/symbolProperty29.js index 87088daa0a4..f7fee99f6a1 100644 --- a/tests/baselines/reference/symbolProperty29.js +++ b/tests/baselines/reference/symbolProperty29.js @@ -3,7 +3,7 @@ class C1 { [Symbol.toStringTag]() { return { x: "" }; } - [s: Symbol]: () => { x: string }; + [s: symbol]: () => { x: string }; } //// [symbolProperty29.js] diff --git a/tests/baselines/reference/symbolProperty30.js b/tests/baselines/reference/symbolProperty30.js index daa08c51af1..bdb108015cf 100644 --- a/tests/baselines/reference/symbolProperty30.js +++ b/tests/baselines/reference/symbolProperty30.js @@ -3,7 +3,7 @@ class C1 { [Symbol.toStringTag]() { return { x: "" }; } - [s: Symbol]: () => { x: number }; + [s: symbol]: () => { x: number }; } //// [symbolProperty30.js] diff --git a/tests/baselines/reference/symbolProperty31.js b/tests/baselines/reference/symbolProperty31.js index 986f49ad6ff..cf532774652 100644 --- a/tests/baselines/reference/symbolProperty31.js +++ b/tests/baselines/reference/symbolProperty31.js @@ -5,7 +5,7 @@ class C1 { } } class C2 extends C1 { - [s: Symbol]: () => { x: string }; + [s: symbol]: () => { x: string }; } //// [symbolProperty31.js] diff --git a/tests/baselines/reference/symbolProperty32.js b/tests/baselines/reference/symbolProperty32.js index 260a88b41dd..73e4bffdc01 100644 --- a/tests/baselines/reference/symbolProperty32.js +++ b/tests/baselines/reference/symbolProperty32.js @@ -5,7 +5,7 @@ class C1 { } } class C2 extends C1 { - [s: Symbol]: () => { x: number }; + [s: symbol]: () => { x: number }; } //// [symbolProperty32.js] diff --git a/tests/baselines/reference/symbolProperty33.js b/tests/baselines/reference/symbolProperty33.js index f891ba271d1..f5a08010338 100644 --- a/tests/baselines/reference/symbolProperty33.js +++ b/tests/baselines/reference/symbolProperty33.js @@ -5,7 +5,7 @@ class C1 extends C2 { } } class C2 { - [s: Symbol]: () => { x: string }; + [s: symbol]: () => { x: string }; } //// [symbolProperty33.js] diff --git a/tests/baselines/reference/symbolProperty34.js b/tests/baselines/reference/symbolProperty34.js index 9a35db2c20f..5b25f487fbf 100644 --- a/tests/baselines/reference/symbolProperty34.js +++ b/tests/baselines/reference/symbolProperty34.js @@ -5,7 +5,7 @@ class C1 extends C2 { } } class C2 { - [s: Symbol]: () => { x: number }; + [s: symbol]: () => { x: number }; } //// [symbolProperty34.js] diff --git a/tests/baselines/reference/symbolProperty7.js b/tests/baselines/reference/symbolProperty7.js new file mode 100644 index 00000000000..42d19616ce3 --- /dev/null +++ b/tests/baselines/reference/symbolProperty7.js @@ -0,0 +1,26 @@ +//// [symbolProperty7.ts] +class C { + [Symbol()] = 0; + [Symbol()]: number; + [Symbol()]() { } + get [Symbol()]() { + return 0; + } +} + +//// [symbolProperty7.js] +var C = (function () { + function C() { + this[Symbol()] = 0; + } + C.prototype[Symbol()] = function () { + }; + Object.defineProperty(C.prototype, Symbol(), { + get: function () { + return 0; + }, + enumerable: true, + configurable: true + }); + return C; +})(); diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty1.ts b/tests/cases/conformance/es6/Symbols/symbolProperty1.ts index 033f1b5cbda..0e008511be3 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty1.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty1.ts @@ -1,5 +1,5 @@ //@target: ES6 -var s: Symbol; +var s: symbol; var x = { [s]: 0, [s]() { }, diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty17.ts b/tests/cases/conformance/es6/Symbols/symbolProperty17.ts index 450fbb70dd6..737059d0e3b 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty17.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty17.ts @@ -1,7 +1,7 @@ //@target: ES6 interface I { [Symbol.iterator]: number; - [s: Symbol]: string; + [s: symbol]: string; "__@iterator": string; } diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty29.ts b/tests/cases/conformance/es6/Symbols/symbolProperty29.ts index 43701b715f9..8d1b8491d37 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty29.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty29.ts @@ -3,5 +3,5 @@ class C1 { [Symbol.toStringTag]() { return { x: "" }; } - [s: Symbol]: () => { x: string }; + [s: symbol]: () => { x: string }; } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty30.ts b/tests/cases/conformance/es6/Symbols/symbolProperty30.ts index e2460604a87..a75f77d6056 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty30.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty30.ts @@ -3,5 +3,5 @@ class C1 { [Symbol.toStringTag]() { return { x: "" }; } - [s: Symbol]: () => { x: number }; + [s: symbol]: () => { x: number }; } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty31.ts b/tests/cases/conformance/es6/Symbols/symbolProperty31.ts index 6d39675bf52..d41f5d6b0fe 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty31.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty31.ts @@ -5,5 +5,5 @@ class C1 { } } class C2 extends C1 { - [s: Symbol]: () => { x: string }; + [s: symbol]: () => { x: string }; } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty32.ts b/tests/cases/conformance/es6/Symbols/symbolProperty32.ts index 873187ff614..52da68fc57c 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty32.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty32.ts @@ -5,5 +5,5 @@ class C1 { } } class C2 extends C1 { - [s: Symbol]: () => { x: number }; + [s: symbol]: () => { x: number }; } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty33.ts b/tests/cases/conformance/es6/Symbols/symbolProperty33.ts index 12669f89d6f..8c7a4d274f3 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty33.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty33.ts @@ -5,5 +5,5 @@ class C1 extends C2 { } } class C2 { - [s: Symbol]: () => { x: string }; + [s: symbol]: () => { x: string }; } \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty34.ts b/tests/cases/conformance/es6/Symbols/symbolProperty34.ts index 5d41b87002d..6e8bb521f0a 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty34.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty34.ts @@ -5,5 +5,5 @@ class C1 extends C2 { } } class C2 { - [s: Symbol]: () => { x: number }; + [s: symbol]: () => { x: number }; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts index f90f804a615..5c10e2d487b 100644 --- a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts @@ -1,4 +1,4 @@ //@target: ES5 interface I { - [s: Symbol]: string; + [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts index 1f13320f5d1..e5d29c08f7d 100644 --- a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts @@ -1,4 +1,4 @@ //@target: ES5 class C { - [s: Symbol]: string; + [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts index 1e3829f9e40..d4bd13aa1d6 100644 --- a/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts +++ b/tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts @@ -1,4 +1,4 @@ //@target: ES5 var x: { - [s: Symbol]: string; + [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts index 668ebb496f4..805584ef078 100644 --- a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts @@ -1,4 +1,4 @@ //@target: ES6 interface I { - [s: Symbol]: string; + [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts index cf4ee50974e..c593d0a4b0a 100644 --- a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts @@ -1,4 +1,4 @@ //@target: ES6 class C { - [s: Symbol]: string; + [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts index f7f7154af35..183ecea6e63 100644 --- a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts @@ -1,4 +1,4 @@ //@target: ES6 class C { - static [s: Symbol]: string; + static [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts index 99e8112ce55..c6f9077f648 100644 --- a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts @@ -1,4 +1,4 @@ //@target: ES6 var x: { - [s: Symbol]: string; + [s: symbol]: string; } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts index 8c468043a8f..a028a3b6488 100644 --- a/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts +++ b/tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer5.ts @@ -1,4 +1,4 @@ //@target: ES6 var x = { - [s: Symbol]: "" + [s: symbol]: "" } \ No newline at end of file From e346b7001303723e904888645cdb1e655d9ea879 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 3 Feb 2015 17:12:23 -0800 Subject: [PATCH 016/106] Change isTypeOfKind calls to pass symbol TypeFlag when needed --- src/compiler/checker.ts | 52 ++++++++++++++++++----------------------- src/compiler/types.ts | 5 ++-- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fde878c0533..95af0816902 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -67,6 +67,7 @@ module ts { var stringType = createIntrinsicType(TypeFlags.String, "string"); var numberType = createIntrinsicType(TypeFlags.Number, "number"); var booleanType = createIntrinsicType(TypeFlags.Boolean, "boolean"); + var esSymbolType = createIntrinsicType(TypeFlags.ESSymbol, "symbol"); var voidType = createIntrinsicType(TypeFlags.Void, "void"); var undefinedType = createIntrinsicType(TypeFlags.Undefined | TypeFlags.ContainsUndefinedOrNull, "undefined"); var nullType = createIntrinsicType(TypeFlags.Null | TypeFlags.ContainsUndefinedOrNull, "null"); @@ -123,6 +124,10 @@ module ts { "boolean": { type: booleanType, flags: TypeFlags.Boolean + }, + "symbol": { + type: esSymbolType, + flags: TypeFlags.ESSymbol } }; @@ -3191,6 +3196,8 @@ module ts { return numberType; case SyntaxKind.BooleanKeyword: return booleanType; + case SyntaxKind.SymbolKeyword: + return esSymbolType; case SyntaxKind.VoidKeyword: return voidType; case SyntaxKind.StringLiteral: @@ -5492,7 +5499,7 @@ module ts { function isNumericComputedName(name: ComputedPropertyName): boolean { // It seems odd to consider an expression of type Any to result in a numeric name, // but this behavior is consistent with checkIndexedAccess - return isTypeOfKind(checkComputedPropertyName(name), TypeFlags.Any | TypeFlags.NumberLike, /*includeESSymbols*/ false); + return isTypeOfKind(checkComputedPropertyName(name), TypeFlags.Any | TypeFlags.NumberLike); } function isNumericLiteralName(name: string) { @@ -5527,7 +5534,7 @@ module ts { // This will allow types number, string, Symbol or any. It will also allow enums, the unknown // type, and any union of these types (like string | number). - if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike, /*includeESSymbols*/ true)) { + if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_Symbol_or_any); } } @@ -5792,10 +5799,10 @@ module ts { } // Check for compatible indexer types. - if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike, /*includeESSymbols*/ true)) { + if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { // Try to use a number indexer. - if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.NumberLike, /*includeESSymbols*/ false)) { + if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.NumberLike)) { var numberIndexType = getIndexTypeOfType(objectType, IndexKind.Number); if (numberIndexType) { return numberIndexType; @@ -6733,7 +6740,7 @@ module ts { } function checkArithmeticOperandType(operand: Node, type: Type, diagnostic: DiagnosticMessage): boolean { - if (!isTypeOfKind(type, TypeFlags.Any | TypeFlags.NumberLike, /*includeESSymbols*/ false)) { + if (!isTypeOfKind(type, TypeFlags.Any | TypeFlags.NumberLike)) { error(operand, diagnostic); return false; } @@ -6884,29 +6891,20 @@ module ts { return numberType; } - // Return true if type has the given flags, or is a union type composed of types that all have those flags - // If include includeESSymbols is true, then check if the type (or union constituents) is an ESSymbol - // if it does not match the kind. This is necessary because ESSymbol has no corresponding flag. - function isTypeOfKind(type: Type, kind: TypeFlags, includeESSymbols: boolean): boolean { + // Return true if type has the given flags, or is a union type composed of types that all have those flags. + function isTypeOfKind(type: Type, kind: TypeFlags): boolean { if (type.flags & kind) { return true; } if (type.flags & TypeFlags.Union) { var types = (type).types; for (var i = 0; i < types.length; i++) { - if (types[i].flags & kind) { - continue; + if (!(types[i].flags & kind)) { + return false; } - if (includeESSymbols && types[i] === globalESSymbolType) { - continue; - } - return false; } return true; } - if (includeESSymbols) { - return type === globalESSymbolType; - } return false; } @@ -6924,11 +6922,7 @@ module ts { // and the right operand to be of type Any or a subtype of the 'Function' interface type. // The result is always of the Boolean primitive type. // NOTE: do not raise error if leftType is unknown as related error was already reported - // - // The reason for globalESSymbolType !== unknownType is that if the type is unknownType, we don't want to error. - // If the globalESSymbolType is also unknownType, then by including globalESSymbolType, we will error - // on unknownType, because transitively, type will be the same as globalESSymbolType. - if (isTypeOfKind(leftType, TypeFlags.Primitive, /*includeESSymbols*/ globalESSymbolType !== unknownType)) { + if (isTypeOfKind(leftType, TypeFlags.Primitive)) { error(node.left, Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } // NOTE: do not raise error if right is unknown as related error was already reported @@ -6943,10 +6937,10 @@ module ts { // The in operator requires the left operand to be of type Any, the String primitive type, or the Number primitive type, // and the right operand to be of type Any, an object type, or a type parameter type. // The result is always of the Boolean primitive type. - if (!isTypeOfKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike, /*includeESSymbols*/ true)) { + if (!isTypeOfKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { error(node.left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_types_any_string_or_number); } - if (!isTypeOfKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter, /*includeESSymbols*/ false)) { + if (!isTypeOfKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { error(node.right, Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } return booleanType; @@ -7107,12 +7101,12 @@ module ts { if (rightType.flags & (TypeFlags.Undefined | TypeFlags.Null)) rightType = leftType; var resultType: Type; - if (isTypeOfKind(leftType, TypeFlags.NumberLike, /*includeESSymbols*/ false) && isTypeOfKind(rightType, TypeFlags.NumberLike, /*includeESSymbols*/ false)) { + if (isTypeOfKind(leftType, TypeFlags.NumberLike) && isTypeOfKind(rightType, TypeFlags.NumberLike)) { // Operands of an enum type are treated as having the primitive type Number. // If both operands are of the Number primitive type, the result is of the Number primitive type. resultType = numberType; } - else if (isTypeOfKind(leftType, TypeFlags.StringLike, /*includeESSymbols*/ false) || isTypeOfKind(rightType, TypeFlags.StringLike, /*includeESSymbols*/ false)) { + else if (isTypeOfKind(leftType, TypeFlags.StringLike) || isTypeOfKind(rightType, TypeFlags.StringLike)) { // If one or both operands are of the String primitive type, the result is of the String primitive type. resultType = stringType; } @@ -8478,7 +8472,7 @@ module ts { // and Expr must be an expression of type Any, an object type, or a type parameter type. var varExpr = node.initializer; var exprType = checkExpression(varExpr); - if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.StringLike, /*includeESSymbols*/ true)) { + if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.StringLike)) { error(varExpr, Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any); } else { @@ -8490,7 +8484,7 @@ module ts { var exprType = checkExpression(node.expression); // unknownType is returned i.e. if node.expression is identifier whose name cannot be resolved // in this case error about missing name is already reported - do not report extra one - if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter, /*includeESSymbols*/ false)) { + if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { error(node.expression, Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 96689afba1d..570fdfbe13f 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1299,9 +1299,10 @@ module ts { ObjectLiteral = 0x00020000, // Originates in an object literal ContainsUndefinedOrNull = 0x00040000, // Type is or contains Undefined or Null type ContainsObjectLiteral = 0x00080000, // Type is or contains object literal type + ESSymbol = 0x00100000, // Type of symbol primitive introduced in ES6 - Intrinsic = Any | String | Number | Boolean | Void | Undefined | Null, - Primitive = String | Number | Boolean | Void | Undefined | Null | StringLiteral | Enum, + Intrinsic = Any | String | Number | Boolean | ESSymbol | Void | Undefined | Null, + Primitive = String | Number | Boolean | ESSymbol | Void | Undefined | Null | StringLiteral | Enum, StringLike = String | StringLiteral, NumberLike = Number | Enum, ObjectType = Class | Interface | Reference | Tuple | Anonymous, From 59a704e7c1f8a40c705bf96220eefbafd4718668 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 3 Feb 2015 17:18:50 -0800 Subject: [PATCH 017/106] Rename references in es6.d.ts from Symbol to symbol --- src/lib/es6.d.ts | 26 +++++------ .../baselines/reference/APISample_compile.js | 5 ++- .../reference/APISample_compile.types | 7 ++- tests/baselines/reference/APISample_linter.js | 5 ++- .../reference/APISample_linter.types | 7 ++- .../reference/APISample_transform.js | 5 ++- .../reference/APISample_transform.types | 7 ++- .../baselines/reference/APISample_watcher.js | 5 ++- .../reference/APISample_watcher.types | 7 ++- .../reference/parserSymbolIndexer1.types | 5 +-- .../reference/parserSymbolIndexer2.types | 5 +-- .../reference/parserSymbolIndexer4.types | 5 +-- .../reference/parserSymbolProperty1.types | 4 +- .../reference/parserSymbolProperty2.types | 4 +- .../reference/parserSymbolProperty3.types | 4 +- .../reference/parserSymbolProperty4.types | 4 +- .../reference/parserSymbolProperty5.types | 4 +- .../reference/parserSymbolProperty6.types | 4 +- .../reference/parserSymbolProperty7.types | 4 +- .../reference/parserSymbolProperty8.types | 4 +- .../reference/parserSymbolProperty9.types | 4 +- .../baselines/reference/symbolProperty1.types | 11 +++-- .../reference/symbolProperty11.types | 4 +- .../reference/symbolProperty13.types | 8 ++-- .../reference/symbolProperty14.types | 8 ++-- .../reference/symbolProperty15.types | 4 +- .../reference/symbolProperty16.types | 8 ++-- .../baselines/reference/symbolProperty2.types | 10 ++--- .../reference/symbolProperty20.types | 16 +++---- .../reference/symbolProperty21.types | 20 ++++----- .../reference/symbolProperty22.types | 8 ++-- .../reference/symbolProperty23.types | 8 ++-- .../reference/symbolProperty26.types | 8 ++-- .../reference/symbolProperty27.types | 8 ++-- .../reference/symbolProperty29.types | 9 ++-- .../reference/symbolProperty31.types | 9 ++-- .../reference/symbolProperty33.types | 9 ++-- .../baselines/reference/symbolProperty4.types | 6 +-- .../reference/symbolProperty45.types | 8 ++-- .../baselines/reference/symbolProperty5.types | 12 ++--- .../reference/symbolProperty50.types | 4 +- .../reference/symbolProperty51.types | 4 +- .../baselines/reference/symbolProperty6.types | 16 +++---- .../baselines/reference/symbolProperty8.types | 8 ++-- .../reference/symbolType9.errors.txt | 24 ++++++++++ tests/baselines/reference/symbolType9.types | 44 ------------------- 46 files changed, 194 insertions(+), 205 deletions(-) create mode 100644 tests/baselines/reference/symbolType9.errors.txt delete mode 100644 tests/baselines/reference/symbolType9.types diff --git a/src/lib/es6.d.ts b/src/lib/es6.d.ts index b666b11b969..4d4f435145c 100644 --- a/src/lib/es6.d.ts +++ b/src/lib/es6.d.ts @@ -1,4 +1,4 @@ -declare type PropertyKey = string | number | Symbol; +declare type PropertyKey = string | number | symbol; interface Symbol { /** Returns a string representation of an object. */ @@ -20,21 +20,21 @@ interface SymbolConstructor { * Returns a new unique Symbol value. * @param description Description of the new Symbol object. */ - (description?: string|number): Symbol; + (description?: string|number): symbol; /** * Returns a Symbol object from the global symbol registry matching the given key if found. * Otherwise, returns a new symbol with this key. * @param key key to search for. */ - for(key: string): Symbol; + for(key: string): symbol; /** * Returns a key from the global symbol registry matching the given Symbol if found. * Otherwise, returns a undefined. * @param sym Symbol to find the key for. */ - keyFor(sym: Symbol): string; + keyFor(sym: symbol): string; // Well-known Symbols @@ -42,42 +42,42 @@ interface SymbolConstructor { * A method that determines if a constructor object recognizes an object as one of the * constructor’s instances. Called by the semantics of the instanceof operator. */ - hasInstance: Symbol; + hasInstance: symbol; /** * A Boolean value that if true indicates that an object should flatten to its array elements * by Array.prototype.concat. */ - isConcatSpreadable: Symbol; + isConcatSpreadable: symbol; /** * A Boolean value that if true indicates that an object may be used as a regular expression. */ - isRegExp: Symbol; + isRegExp: symbol; /** * A method that returns the default iterator for an object.Called by the semantics of the * for-of statement. */ - iterator: Symbol; + iterator: symbol; /** * A method that converts an object to a corresponding primitive value.Called by the ToPrimitive * abstract operation. */ - toPrimitive: Symbol; + toPrimitive: symbol; /** * A String value that is used in the creation of the default string description of an object. * Called by the built- in method Object.prototype.toString. */ - toStringTag: Symbol; + toStringTag: symbol; /** * An Object whose own property names are property names that are excluded from the with * environment bindings of the associated objects. */ - unscopables: Symbol; + unscopables: symbol; } declare var Symbol: SymbolConstructor; @@ -108,7 +108,7 @@ interface ObjectConstructor { * Returns an array of all symbol properties found directly on object o. * @param o Object to retrieve the symbols from. */ - getOwnPropertySymbols(o: any): Symbol[]; + getOwnPropertySymbols(o: any): symbol[]; /** * Returns true if the values are the same value, false otherwise. @@ -3521,7 +3521,7 @@ declare var Reflect: { getOwnPropertyDescriptor(target: any, propertyKey: PropertyKey): PropertyDescriptor; getPrototypeOf(target: any): any; has(target: any, propertyKey: string): boolean; - has(target: any, propertyKey: Symbol): boolean; + has(target: any, propertyKey: symbol): boolean; isExtensible(target: any): boolean; ownKeys(target: any): Array; preventExtensions(target: any): boolean; diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index cbf5cf290eb..aaa7ad596e5 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -1029,8 +1029,9 @@ declare module "typescript" { ObjectLiteral = 131072, ContainsUndefinedOrNull = 262144, ContainsObjectLiteral = 524288, - Intrinsic = 127, - Primitive = 510, + ESSymbol = 1048576, + Intrinsic = 1048703, + Primitive = 1049086, StringLike = 258, NumberLike = 132, ObjectType = 48128, diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index 7eff464a746..44f42085807 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -3314,10 +3314,13 @@ declare module "typescript" { ContainsObjectLiteral = 524288, >ContainsObjectLiteral : TypeFlags - Intrinsic = 127, + ESSymbol = 1048576, +>ESSymbol : TypeFlags + + Intrinsic = 1048703, >Intrinsic : TypeFlags - Primitive = 510, + Primitive = 1049086, >Primitive : TypeFlags StringLike = 258, diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index eab931162ad..629be085c3a 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -1060,8 +1060,9 @@ declare module "typescript" { ObjectLiteral = 131072, ContainsUndefinedOrNull = 262144, ContainsObjectLiteral = 524288, - Intrinsic = 127, - Primitive = 510, + ESSymbol = 1048576, + Intrinsic = 1048703, + Primitive = 1049086, StringLike = 258, NumberLike = 132, ObjectType = 48128, diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index fcdbb57add6..8f3a90c35d1 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -3458,10 +3458,13 @@ declare module "typescript" { ContainsObjectLiteral = 524288, >ContainsObjectLiteral : TypeFlags - Intrinsic = 127, + ESSymbol = 1048576, +>ESSymbol : TypeFlags + + Intrinsic = 1048703, >Intrinsic : TypeFlags - Primitive = 510, + Primitive = 1049086, >Primitive : TypeFlags StringLike = 258, diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index e9c8d6fc0fd..66b0182728d 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -1061,8 +1061,9 @@ declare module "typescript" { ObjectLiteral = 131072, ContainsUndefinedOrNull = 262144, ContainsObjectLiteral = 524288, - Intrinsic = 127, - Primitive = 510, + ESSymbol = 1048576, + Intrinsic = 1048703, + Primitive = 1049086, StringLike = 258, NumberLike = 132, ObjectType = 48128, diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 2a9c7902528..c8d2ec5bed3 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -3410,10 +3410,13 @@ declare module "typescript" { ContainsObjectLiteral = 524288, >ContainsObjectLiteral : TypeFlags - Intrinsic = 127, + ESSymbol = 1048576, +>ESSymbol : TypeFlags + + Intrinsic = 1048703, >Intrinsic : TypeFlags - Primitive = 510, + Primitive = 1049086, >Primitive : TypeFlags StringLike = 258, diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index dae4936f7b0..93bb9b16afb 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -1098,8 +1098,9 @@ declare module "typescript" { ObjectLiteral = 131072, ContainsUndefinedOrNull = 262144, ContainsObjectLiteral = 524288, - Intrinsic = 127, - Primitive = 510, + ESSymbol = 1048576, + Intrinsic = 1048703, + Primitive = 1049086, StringLike = 258, NumberLike = 132, ObjectType = 48128, diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index a8d9197f753..27acbb0a726 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -3583,10 +3583,13 @@ declare module "typescript" { ContainsObjectLiteral = 524288, >ContainsObjectLiteral : TypeFlags - Intrinsic = 127, + ESSymbol = 1048576, +>ESSymbol : TypeFlags + + Intrinsic = 1048703, >Intrinsic : TypeFlags - Primitive = 510, + Primitive = 1049086, >Primitive : TypeFlags StringLike = 258, diff --git a/tests/baselines/reference/parserSymbolIndexer1.types b/tests/baselines/reference/parserSymbolIndexer1.types index 86020c8cbdd..6723ef12726 100644 --- a/tests/baselines/reference/parserSymbolIndexer1.types +++ b/tests/baselines/reference/parserSymbolIndexer1.types @@ -2,7 +2,6 @@ interface I { >I : I - [s: Symbol]: string; ->s : Symbol ->Symbol : Symbol + [s: symbol]: string; +>s : symbol } diff --git a/tests/baselines/reference/parserSymbolIndexer2.types b/tests/baselines/reference/parserSymbolIndexer2.types index ffa9ff96346..d8d620c7def 100644 --- a/tests/baselines/reference/parserSymbolIndexer2.types +++ b/tests/baselines/reference/parserSymbolIndexer2.types @@ -2,7 +2,6 @@ class C { >C : C - [s: Symbol]: string; ->s : Symbol ->Symbol : Symbol + [s: symbol]: string; +>s : symbol } diff --git a/tests/baselines/reference/parserSymbolIndexer4.types b/tests/baselines/reference/parserSymbolIndexer4.types index 0f632e5dc32..7509072a12c 100644 --- a/tests/baselines/reference/parserSymbolIndexer4.types +++ b/tests/baselines/reference/parserSymbolIndexer4.types @@ -2,7 +2,6 @@ var x: { >x : {} - [s: Symbol]: string; ->s : Symbol ->Symbol : Symbol + [s: symbol]: string; +>s : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty1.types b/tests/baselines/reference/parserSymbolProperty1.types index ab68b0bc7ac..6c0cd75cf59 100644 --- a/tests/baselines/reference/parserSymbolProperty1.types +++ b/tests/baselines/reference/parserSymbolProperty1.types @@ -3,7 +3,7 @@ interface I { >I : I [Symbol.iterator]: string; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty2.types b/tests/baselines/reference/parserSymbolProperty2.types index 02ba4c21a8a..bcf14b83a2a 100644 --- a/tests/baselines/reference/parserSymbolProperty2.types +++ b/tests/baselines/reference/parserSymbolProperty2.types @@ -3,7 +3,7 @@ interface I { >I : I [Symbol.unscopables](): string; ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty3.types b/tests/baselines/reference/parserSymbolProperty3.types index 4f0245cee6f..977375d7393 100644 --- a/tests/baselines/reference/parserSymbolProperty3.types +++ b/tests/baselines/reference/parserSymbolProperty3.types @@ -3,7 +3,7 @@ declare class C { >C : C [Symbol.unscopables](): string; ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty4.types b/tests/baselines/reference/parserSymbolProperty4.types index 9fcd6c4a29e..a9070897fa8 100644 --- a/tests/baselines/reference/parserSymbolProperty4.types +++ b/tests/baselines/reference/parserSymbolProperty4.types @@ -3,7 +3,7 @@ declare class C { >C : C [Symbol.isRegExp]: string; ->Symbol.isRegExp : Symbol +>Symbol.isRegExp : symbol >Symbol : SymbolConstructor ->isRegExp : Symbol +>isRegExp : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty5.types b/tests/baselines/reference/parserSymbolProperty5.types index 1cdaa6ec694..8a171598e83 100644 --- a/tests/baselines/reference/parserSymbolProperty5.types +++ b/tests/baselines/reference/parserSymbolProperty5.types @@ -3,7 +3,7 @@ class C { >C : C [Symbol.isRegExp]: string; ->Symbol.isRegExp : Symbol +>Symbol.isRegExp : symbol >Symbol : SymbolConstructor ->isRegExp : Symbol +>isRegExp : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty6.types b/tests/baselines/reference/parserSymbolProperty6.types index 7f14f36d28d..660cbf4e545 100644 --- a/tests/baselines/reference/parserSymbolProperty6.types +++ b/tests/baselines/reference/parserSymbolProperty6.types @@ -3,7 +3,7 @@ class C { >C : C [Symbol.toStringTag]: string = ""; ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty7.types b/tests/baselines/reference/parserSymbolProperty7.types index ce62cd93498..f8dc2523692 100644 --- a/tests/baselines/reference/parserSymbolProperty7.types +++ b/tests/baselines/reference/parserSymbolProperty7.types @@ -3,7 +3,7 @@ class C { >C : C [Symbol.toStringTag](): void { } ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty8.types b/tests/baselines/reference/parserSymbolProperty8.types index 048885dfd38..06387c9c231 100644 --- a/tests/baselines/reference/parserSymbolProperty8.types +++ b/tests/baselines/reference/parserSymbolProperty8.types @@ -3,7 +3,7 @@ var x: { >x : { [Symbol.toPrimitive](): string; } [Symbol.toPrimitive](): string ->Symbol.toPrimitive : Symbol +>Symbol.toPrimitive : symbol >Symbol : SymbolConstructor ->toPrimitive : Symbol +>toPrimitive : symbol } diff --git a/tests/baselines/reference/parserSymbolProperty9.types b/tests/baselines/reference/parserSymbolProperty9.types index cc3b35d3302..40fbde2acff 100644 --- a/tests/baselines/reference/parserSymbolProperty9.types +++ b/tests/baselines/reference/parserSymbolProperty9.types @@ -3,7 +3,7 @@ var x: { >x : { [Symbol.toPrimitive]: string; } [Symbol.toPrimitive]: string ->Symbol.toPrimitive : Symbol +>Symbol.toPrimitive : symbol >Symbol : SymbolConstructor ->toPrimitive : Symbol +>toPrimitive : symbol } diff --git a/tests/baselines/reference/symbolProperty1.types b/tests/baselines/reference/symbolProperty1.types index 9c24051449e..55c86c14f6e 100644 --- a/tests/baselines/reference/symbolProperty1.types +++ b/tests/baselines/reference/symbolProperty1.types @@ -1,20 +1,19 @@ === tests/cases/conformance/es6/Symbols/symbolProperty1.ts === -var s: Symbol; ->s : Symbol ->Symbol : Symbol +var s: symbol; +>s : symbol var x = { >x : {} >{ [s]: 0, [s]() { }, get [s]() { return 0; }} : {} [s]: 0, ->s : Symbol +>s : symbol [s]() { }, ->s : Symbol +>s : symbol get [s]() { ->s : Symbol +>s : symbol return 0; } diff --git a/tests/baselines/reference/symbolProperty11.types b/tests/baselines/reference/symbolProperty11.types index 9ba956293af..109bd969d55 100644 --- a/tests/baselines/reference/symbolProperty11.types +++ b/tests/baselines/reference/symbolProperty11.types @@ -6,9 +6,9 @@ interface I { >I : I [Symbol.iterator]?: { x }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any } diff --git a/tests/baselines/reference/symbolProperty13.types b/tests/baselines/reference/symbolProperty13.types index 231b7905b68..1e890a91085 100644 --- a/tests/baselines/reference/symbolProperty13.types +++ b/tests/baselines/reference/symbolProperty13.types @@ -3,9 +3,9 @@ class C { >C : C [Symbol.iterator]: { x; y }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any >y : any } @@ -13,9 +13,9 @@ interface I { >I : I [Symbol.iterator]: { x }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any } diff --git a/tests/baselines/reference/symbolProperty14.types b/tests/baselines/reference/symbolProperty14.types index 1032e83644c..5e5469ad915 100644 --- a/tests/baselines/reference/symbolProperty14.types +++ b/tests/baselines/reference/symbolProperty14.types @@ -3,9 +3,9 @@ class C { >C : C [Symbol.iterator]: { x; y }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any >y : any } @@ -13,9 +13,9 @@ interface I { >I : I [Symbol.iterator]?: { x }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any } diff --git a/tests/baselines/reference/symbolProperty15.types b/tests/baselines/reference/symbolProperty15.types index 863872c29c0..b2baa3fccee 100644 --- a/tests/baselines/reference/symbolProperty15.types +++ b/tests/baselines/reference/symbolProperty15.types @@ -6,9 +6,9 @@ interface I { >I : I [Symbol.iterator]?: { x }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any } diff --git a/tests/baselines/reference/symbolProperty16.types b/tests/baselines/reference/symbolProperty16.types index 172c5a1ea10..041770aea04 100644 --- a/tests/baselines/reference/symbolProperty16.types +++ b/tests/baselines/reference/symbolProperty16.types @@ -3,18 +3,18 @@ class C { >C : C private [Symbol.iterator]: { x }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any } interface I { >I : I [Symbol.iterator]: { x }; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >x : any } diff --git a/tests/baselines/reference/symbolProperty2.types b/tests/baselines/reference/symbolProperty2.types index d45ff4584f6..37fe9d13bdb 100644 --- a/tests/baselines/reference/symbolProperty2.types +++ b/tests/baselines/reference/symbolProperty2.types @@ -1,7 +1,7 @@ === tests/cases/conformance/es6/Symbols/symbolProperty2.ts === var s = Symbol(); ->s : Symbol ->Symbol() : Symbol +>s : symbol +>Symbol() : symbol >Symbol : SymbolConstructor var x = { @@ -9,13 +9,13 @@ var x = { >{ [s]: 0, [s]() { }, get [s]() { return 0; }} : {} [s]: 0, ->s : Symbol +>s : symbol [s]() { }, ->s : Symbol +>s : symbol get [s]() { ->s : Symbol +>s : symbol return 0; } diff --git a/tests/baselines/reference/symbolProperty20.types b/tests/baselines/reference/symbolProperty20.types index 94ef4a0f2db..745401142d8 100644 --- a/tests/baselines/reference/symbolProperty20.types +++ b/tests/baselines/reference/symbolProperty20.types @@ -3,15 +3,15 @@ interface I { >I : I [Symbol.iterator]: (s: string) => string; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >s : string [Symbol.toStringTag](s: number): number; ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol >s : number } @@ -21,17 +21,17 @@ var i: I = { >{ [Symbol.iterator]: s => s, [Symbol.toStringTag](n) { return n; }} : { [Symbol.iterator]: (s: string) => string; [Symbol.toStringTag](n: number): number; } [Symbol.iterator]: s => s, ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol >s => s : (s: string) => string >s : string >s : string [Symbol.toStringTag](n) { return n; } ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol >n : number >n : number } diff --git a/tests/baselines/reference/symbolProperty21.types b/tests/baselines/reference/symbolProperty21.types index f364b7e3599..053dae46479 100644 --- a/tests/baselines/reference/symbolProperty21.types +++ b/tests/baselines/reference/symbolProperty21.types @@ -5,15 +5,15 @@ interface I { >U : U [Symbol.unscopables]: T; ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol >T : T [Symbol.isConcatSpreadable]: U; ->Symbol.isConcatSpreadable : Symbol +>Symbol.isConcatSpreadable : symbol >Symbol : SymbolConstructor ->isConcatSpreadable : Symbol +>isConcatSpreadable : symbol >U : U } @@ -36,18 +36,18 @@ foo({ >{ [Symbol.isConcatSpreadable]: "", [Symbol.isRegExp]: 0, [Symbol.unscopables]: true} : { [Symbol.isConcatSpreadable]: string; [Symbol.isRegExp]: number; [Symbol.unscopables]: boolean; } [Symbol.isConcatSpreadable]: "", ->Symbol.isConcatSpreadable : Symbol +>Symbol.isConcatSpreadable : symbol >Symbol : SymbolConstructor ->isConcatSpreadable : Symbol +>isConcatSpreadable : symbol [Symbol.isRegExp]: 0, ->Symbol.isRegExp : Symbol +>Symbol.isRegExp : symbol >Symbol : SymbolConstructor ->isRegExp : Symbol +>isRegExp : symbol [Symbol.unscopables]: true ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol }); diff --git a/tests/baselines/reference/symbolProperty22.types b/tests/baselines/reference/symbolProperty22.types index c89af9afbd5..64fb5fc234c 100644 --- a/tests/baselines/reference/symbolProperty22.types +++ b/tests/baselines/reference/symbolProperty22.types @@ -5,9 +5,9 @@ interface I { >U : U [Symbol.unscopables](x: T): U; ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol >x : T >T : T >U : U @@ -29,9 +29,9 @@ foo("", { [Symbol.unscopables]: s => s.length }); >foo("", { [Symbol.unscopables]: s => s.length }) : number >foo : (p1: T, p2: I) => U >{ [Symbol.unscopables]: s => s.length } : { [Symbol.unscopables]: (s: string) => number; } ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol >s => s.length : (s: string) => number >s : string >s.length : number diff --git a/tests/baselines/reference/symbolProperty23.types b/tests/baselines/reference/symbolProperty23.types index 99480f03b01..b28ecb2dbe4 100644 --- a/tests/baselines/reference/symbolProperty23.types +++ b/tests/baselines/reference/symbolProperty23.types @@ -3,9 +3,9 @@ interface I { >I : I [Symbol.toPrimitive]: () => boolean; ->Symbol.toPrimitive : Symbol +>Symbol.toPrimitive : symbol >Symbol : SymbolConstructor ->toPrimitive : Symbol +>toPrimitive : symbol } class C implements I { @@ -13,9 +13,9 @@ class C implements I { >I : I [Symbol.toPrimitive]() { ->Symbol.toPrimitive : Symbol +>Symbol.toPrimitive : symbol >Symbol : SymbolConstructor ->toPrimitive : Symbol +>toPrimitive : symbol return true; } diff --git a/tests/baselines/reference/symbolProperty26.types b/tests/baselines/reference/symbolProperty26.types index 258347bd4fa..3971ccb402d 100644 --- a/tests/baselines/reference/symbolProperty26.types +++ b/tests/baselines/reference/symbolProperty26.types @@ -3,9 +3,9 @@ class C1 { >C1 : C1 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return ""; } @@ -16,9 +16,9 @@ class C2 extends C1 { >C1 : C1 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return ""; } diff --git a/tests/baselines/reference/symbolProperty27.types b/tests/baselines/reference/symbolProperty27.types index e6df5fa008f..5a5261a11b5 100644 --- a/tests/baselines/reference/symbolProperty27.types +++ b/tests/baselines/reference/symbolProperty27.types @@ -3,9 +3,9 @@ class C1 { >C1 : C1 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return {}; >{} : {} @@ -17,9 +17,9 @@ class C2 extends C1 { >C1 : C1 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return ""; } diff --git a/tests/baselines/reference/symbolProperty29.types b/tests/baselines/reference/symbolProperty29.types index 8ea46a1ac72..eb47ccae859 100644 --- a/tests/baselines/reference/symbolProperty29.types +++ b/tests/baselines/reference/symbolProperty29.types @@ -3,16 +3,15 @@ class C1 { >C1 : C1 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return { x: "" }; >{ x: "" } : { x: string; } >x : string } - [s: Symbol]: () => { x: string }; ->s : Symbol ->Symbol : Symbol + [s: symbol]: () => { x: string }; +>s : symbol >x : string } diff --git a/tests/baselines/reference/symbolProperty31.types b/tests/baselines/reference/symbolProperty31.types index 460bf4f62ec..52a6523d4ed 100644 --- a/tests/baselines/reference/symbolProperty31.types +++ b/tests/baselines/reference/symbolProperty31.types @@ -3,9 +3,9 @@ class C1 { >C1 : C1 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return { x: "" }; >{ x: "" } : { x: string; } @@ -16,8 +16,7 @@ class C2 extends C1 { >C2 : C2 >C1 : C1 - [s: Symbol]: () => { x: string }; ->s : Symbol ->Symbol : Symbol + [s: symbol]: () => { x: string }; +>s : symbol >x : string } diff --git a/tests/baselines/reference/symbolProperty33.types b/tests/baselines/reference/symbolProperty33.types index cc2c1687622..aed8a97e60b 100644 --- a/tests/baselines/reference/symbolProperty33.types +++ b/tests/baselines/reference/symbolProperty33.types @@ -4,9 +4,9 @@ class C1 extends C2 { >C2 : C2 [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return { x: "" }; >{ x: "" } : { x: string; } @@ -16,8 +16,7 @@ class C1 extends C2 { class C2 { >C2 : C2 - [s: Symbol]: () => { x: string }; ->s : Symbol ->Symbol : Symbol + [s: symbol]: () => { x: string }; +>s : symbol >x : string } diff --git a/tests/baselines/reference/symbolProperty4.types b/tests/baselines/reference/symbolProperty4.types index af3d7a85590..b8aac1f2770 100644 --- a/tests/baselines/reference/symbolProperty4.types +++ b/tests/baselines/reference/symbolProperty4.types @@ -4,15 +4,15 @@ var x = { >{ [Symbol()]: 0, [Symbol()]() { }, get [Symbol()]() { return 0; }} : {} [Symbol()]: 0, ->Symbol() : Symbol +>Symbol() : symbol >Symbol : SymbolConstructor [Symbol()]() { }, ->Symbol() : Symbol +>Symbol() : symbol >Symbol : SymbolConstructor get [Symbol()]() { ->Symbol() : Symbol +>Symbol() : symbol >Symbol : SymbolConstructor return 0; diff --git a/tests/baselines/reference/symbolProperty45.types b/tests/baselines/reference/symbolProperty45.types index 41e50387f00..24a74729aec 100644 --- a/tests/baselines/reference/symbolProperty45.types +++ b/tests/baselines/reference/symbolProperty45.types @@ -3,16 +3,16 @@ class C { >C : C get [Symbol.hasInstance]() { ->Symbol.hasInstance : Symbol +>Symbol.hasInstance : symbol >Symbol : SymbolConstructor ->hasInstance : Symbol +>hasInstance : symbol return ""; } get [Symbol.toPrimitive]() { ->Symbol.toPrimitive : Symbol +>Symbol.toPrimitive : symbol >Symbol : SymbolConstructor ->toPrimitive : Symbol +>toPrimitive : symbol return ""; } diff --git a/tests/baselines/reference/symbolProperty5.types b/tests/baselines/reference/symbolProperty5.types index d39025ae85b..7d6a9f05858 100644 --- a/tests/baselines/reference/symbolProperty5.types +++ b/tests/baselines/reference/symbolProperty5.types @@ -4,19 +4,19 @@ var x = { >{ [Symbol.iterator]: 0, [Symbol.isRegExp]() { }, get [Symbol.toStringTag]() { return 0; }} : { [Symbol.iterator]: number; [Symbol.isRegExp](): void; [Symbol.toStringTag]: number; } [Symbol.iterator]: 0, ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol [Symbol.isRegExp]() { }, ->Symbol.isRegExp : Symbol +>Symbol.isRegExp : symbol >Symbol : SymbolConstructor ->isRegExp : Symbol +>isRegExp : symbol get [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return 0; } diff --git a/tests/baselines/reference/symbolProperty50.types b/tests/baselines/reference/symbolProperty50.types index 6715f8bce2f..8258dfe1b72 100644 --- a/tests/baselines/reference/symbolProperty50.types +++ b/tests/baselines/reference/symbolProperty50.types @@ -9,8 +9,8 @@ module M { >C : C [Symbol.iterator]() { } ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol } } diff --git a/tests/baselines/reference/symbolProperty51.types b/tests/baselines/reference/symbolProperty51.types index b039e3e3b80..6677b3b2e2d 100644 --- a/tests/baselines/reference/symbolProperty51.types +++ b/tests/baselines/reference/symbolProperty51.types @@ -9,8 +9,8 @@ module M { >C : C [Symbol.iterator]() { } ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol } } diff --git a/tests/baselines/reference/symbolProperty6.types b/tests/baselines/reference/symbolProperty6.types index 703ef4506a8..e5aac6f48da 100644 --- a/tests/baselines/reference/symbolProperty6.types +++ b/tests/baselines/reference/symbolProperty6.types @@ -3,24 +3,24 @@ class C { >C : C [Symbol.iterator] = 0; ->Symbol.iterator : Symbol +>Symbol.iterator : symbol >Symbol : SymbolConstructor ->iterator : Symbol +>iterator : symbol [Symbol.unscopables]: number; ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol [Symbol.isRegExp]() { } ->Symbol.isRegExp : Symbol +>Symbol.isRegExp : symbol >Symbol : SymbolConstructor ->isRegExp : Symbol +>isRegExp : symbol get [Symbol.toStringTag]() { ->Symbol.toStringTag : Symbol +>Symbol.toStringTag : symbol >Symbol : SymbolConstructor ->toStringTag : Symbol +>toStringTag : symbol return 0; } diff --git a/tests/baselines/reference/symbolProperty8.types b/tests/baselines/reference/symbolProperty8.types index d1bab0615ed..d6c2f464b53 100644 --- a/tests/baselines/reference/symbolProperty8.types +++ b/tests/baselines/reference/symbolProperty8.types @@ -3,12 +3,12 @@ interface I { >I : I [Symbol.unscopables]: number; ->Symbol.unscopables : Symbol +>Symbol.unscopables : symbol >Symbol : SymbolConstructor ->unscopables : Symbol +>unscopables : symbol [Symbol.isRegExp](); ->Symbol.isRegExp : Symbol +>Symbol.isRegExp : symbol >Symbol : SymbolConstructor ->isRegExp : Symbol +>isRegExp : symbol } diff --git a/tests/baselines/reference/symbolType9.errors.txt b/tests/baselines/reference/symbolType9.errors.txt new file mode 100644 index 00000000000..5506fdc6f9d --- /dev/null +++ b/tests/baselines/reference/symbolType9.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/es6/Symbols/symbolType9.ts(3,1): error TS2365: Operator '==' cannot be applied to types 'symbol' and 'boolean'. +tests/cases/conformance/es6/Symbols/symbolType9.ts(5,1): error TS2365: Operator '!=' cannot be applied to types 'number' and 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType9.ts(7,1): error TS2365: Operator '===' cannot be applied to types 'symbol' and 'number'. +tests/cases/conformance/es6/Symbols/symbolType9.ts(9,1): error TS2365: Operator '!==' cannot be applied to types 'boolean' and 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolType9.ts (4 errors) ==== + var s = Symbol.for("equal"); + s == s; + s == true; + ~~~~~~~~~ +!!! error TS2365: Operator '==' cannot be applied to types 'symbol' and 'boolean'. + s != s; + 0 != s; + ~~~~~~ +!!! error TS2365: Operator '!=' cannot be applied to types 'number' and 'symbol'. + s === s; + s === 1; + ~~~~~~~ +!!! error TS2365: Operator '===' cannot be applied to types 'symbol' and 'number'. + s !== s; + false !== s; + ~~~~~~~~~~~ +!!! error TS2365: Operator '!==' cannot be applied to types 'boolean' and 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType9.types b/tests/baselines/reference/symbolType9.types deleted file mode 100644 index f2d1af709ac..00000000000 --- a/tests/baselines/reference/symbolType9.types +++ /dev/null @@ -1,44 +0,0 @@ -=== tests/cases/conformance/es6/Symbols/symbolType9.ts === -var s = Symbol.for("equal"); ->s : Symbol ->Symbol.for("equal") : Symbol ->Symbol.for : (key: string) => Symbol ->Symbol : SymbolConstructor ->for : (key: string) => Symbol - -s == s; ->s == s : boolean ->s : Symbol ->s : Symbol - -s == true; ->s == true : boolean ->s : Symbol - -s != s; ->s != s : boolean ->s : Symbol ->s : Symbol - -0 != s; ->0 != s : boolean ->s : Symbol - -s === s; ->s === s : boolean ->s : Symbol ->s : Symbol - -s === 1; ->s === 1 : boolean ->s : Symbol - -s !== s; ->s !== s : boolean ->s : Symbol ->s : Symbol - -false !== s; ->false !== s : boolean ->s : Symbol - From d793658b7ff228f023207748cbae908aca05b0c4 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 3 Feb 2015 18:02:54 -0800 Subject: [PATCH 018/106] Change Symbol to symbol in error messages --- src/compiler/checker.ts | 20 ++++----- .../diagnosticInformationMap.generated.ts | 18 ++++---- src/compiler/diagnosticMessages.json | 18 ++++---- .../reference/arraySigChecking.errors.txt | 4 +- .../computedPropertyNames12.errors.txt | 44 +++++++++---------- .../computedPropertyNames14.errors.txt | 24 +++++----- .../computedPropertyNames15.errors.txt | 8 ++-- .../computedPropertyNames17.errors.txt | 24 +++++----- .../computedPropertyNames3.errors.txt | 16 +++---- .../computedPropertyNames32.errors.txt | 4 +- .../computedPropertyNames35.errors.txt | 8 ++-- .../computedPropertyNames42.errors.txt | 4 +- .../computedPropertyNames5.errors.txt | 24 +++++----- .../computedPropertyNames6.errors.txt | 8 ++-- .../computedPropertyNames8.errors.txt | 8 ++-- .../computedPropertyNames9.errors.txt | 4 +- ...edPropertyNamesDeclarationEmit3.errors.txt | 4 +- ...edPropertyNamesDeclarationEmit4.errors.txt | 4 +- ...omputedPropertyNamesOnOverloads.errors.txt | 8 ++-- ...eReferenceWithoutTypeArgument.d.errors.txt | 4 +- ...ypeReferenceWithoutTypeArgument.errors.txt | 4 +- ...peReferenceWithoutTypeArgument2.errors.txt | 4 +- ...peReferenceWithoutTypeArgument3.errors.txt | 4 +- tests/baselines/reference/giant.errors.txt | 32 +++++++------- ...SignatureMustHaveTypeAnnotation.errors.txt | 8 ++-- .../indexSignatureWithInitializer.errors.txt | 8 ++-- .../reference/indexTypeCheck.errors.txt | 4 +- .../indexWithoutParamType2.errors.txt | 4 +- .../parserComputedPropertyName10.errors.txt | 4 +- .../parserComputedPropertyName11.errors.txt | 4 +- .../parserComputedPropertyName13.errors.txt | 4 +- .../parserComputedPropertyName14.errors.txt | 4 +- .../parserComputedPropertyName15.errors.txt | 4 +- .../parserComputedPropertyName18.errors.txt | 4 +- .../parserComputedPropertyName19.errors.txt | 4 +- .../parserComputedPropertyName20.errors.txt | 4 +- .../parserComputedPropertyName21.errors.txt | 4 +- .../parserComputedPropertyName22.errors.txt | 4 +- .../parserComputedPropertyName25.errors.txt | 4 +- .../parserComputedPropertyName28.errors.txt | 8 ++-- .../parserComputedPropertyName29.errors.txt | 8 ++-- .../parserComputedPropertyName31.errors.txt | 8 ++-- .../parserComputedPropertyName32.errors.txt | 4 +- .../parserComputedPropertyName36.errors.txt | 4 +- .../parserComputedPropertyName41.errors.txt | 4 +- .../parserComputedPropertyName7.errors.txt | 4 +- .../parserComputedPropertyName8.errors.txt | 4 +- .../parserComputedPropertyName9.errors.txt | 4 +- .../parserES5ComputedPropertyName1.errors.txt | 4 +- ...parserES5ComputedPropertyName10.errors.txt | 4 +- ...parserES5ComputedPropertyName11.errors.txt | 4 +- .../parserES5ComputedPropertyName5.errors.txt | 4 +- .../parserES5ComputedPropertyName7.errors.txt | 4 +- .../parserES5ComputedPropertyName8.errors.txt | 4 +- .../parserES5ComputedPropertyName9.errors.txt | 4 +- .../parserES5SymbolIndexer1.errors.txt | 4 +- .../parserES5SymbolIndexer2.errors.txt | 4 +- .../parserES5SymbolIndexer3.errors.txt | 4 +- .../parserIndexSignature11.errors.txt | 4 +- .../parserIndexSignature4.errors.txt | 4 +- .../parserIndexSignature5.errors.txt | 4 +- .../parserIndexSignature6.errors.txt | 4 +- .../parserIndexSignature8.errors.txt | 8 ++-- .../reference/propertyAssignment.errors.txt | 4 +- .../reference/symbolProperty3.errors.txt | 12 ++--- .../reference/symbolProperty53.errors.txt | 4 +- .../reference/symbolProperty7.errors.txt | 8 ++-- 67 files changed, 254 insertions(+), 254 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 95af0816902..4973dd37450 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5535,7 +5535,7 @@ module ts { // This will allow types number, string, Symbol or any. It will also allow enums, the unknown // type, and any union of these types (like string | number). if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { - error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_Symbol_or_any); + error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); } } @@ -10526,12 +10526,12 @@ module ts { if (parameter.type.kind !== SyntaxKind.StringKeyword && parameter.type.kind !== SyntaxKind.NumberKeyword) { if (parameter.type.kind === SyntaxKind.SymbolKeyword) { if (languageVersion < ScriptTarget.ES6) { - return grammarErrorOnNode(parameter.type, Diagnostics.Symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher); + return grammarErrorOnNode(parameter.type, Diagnostics.symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher); } // No error for parameter type } else { - return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_number_or_Symbol); + return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_number_or_symbol); } } if (!node.type) { @@ -10839,17 +10839,17 @@ module ts { // and accessors are not allowed in ambient contexts in general, // so this error only really matters for methods. if (isInAmbientContext(node)) { - return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol); } else if (!node.body) { - return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol); } } else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) { - return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol); } else if (node.parent.kind === SyntaxKind.TypeLiteral) { - return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol); + return checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol); } } @@ -11120,17 +11120,17 @@ module ts { function checkGrammarProperty(node: PropertyDeclaration) { if (node.parent.kind === SyntaxKind.ClassDeclaration) { if (checkGrammarForInvalidQuestionMark(node, node.questionToken, Diagnostics.A_class_member_cannot_be_declared_optional) || - checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_Symbol)) { + checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol)) { return true; } } else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) { - if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol)) { + if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol)) { return true; } } else if (node.parent.kind === SyntaxKind.TypeLiteral) { - if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol)) { + if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol)) { return true; } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 0955702fe02..e16130a0ecd 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -19,7 +19,7 @@ module ts { An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: DiagnosticCategory.Error, key: "An index signature parameter cannot have an initializer." }, An_index_signature_must_have_a_type_annotation: { code: 1021, category: DiagnosticCategory.Error, key: "An index signature must have a type annotation." }, An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: DiagnosticCategory.Error, key: "An index signature parameter must have a type annotation." }, - An_index_signature_parameter_type_must_be_string_number_or_Symbol: { code: 1023, category: DiagnosticCategory.Error, key: "An index signature parameter type must be 'string', 'number', or 'Symbol'." }, + An_index_signature_parameter_type_must_be_string_number_or_symbol: { code: 1023, category: DiagnosticCategory.Error, key: "An index signature parameter type must be 'string', 'number', or 'symbol'." }, A_class_or_interface_declaration_can_only_have_one_extends_clause: { code: 1024, category: DiagnosticCategory.Error, key: "A class or interface declaration can only have one 'extends' clause." }, An_extends_clause_must_precede_an_implements_clause: { code: 1025, category: DiagnosticCategory.Error, key: "An 'extends' clause must precede an 'implements' clause." }, A_class_can_only_extend_a_single_class: { code: 1026, category: DiagnosticCategory.Error, key: "A class can only extend a single class." }, @@ -123,12 +123,12 @@ module ts { An_object_member_cannot_be_declared_optional: { code: 1162, category: DiagnosticCategory.Error, key: "An object member cannot be declared optional." }, yield_expression_must_be_contained_within_a_generator_declaration: { code: 1163, category: DiagnosticCategory.Error, key: "'yield' expression must be contained_within a generator declaration." }, Computed_property_names_are_not_allowed_in_enums: { code: 1164, category: DiagnosticCategory.Error, key: "Computed property names are not allowed in enums." }, - A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_Symbol: { code: 1165, category: DiagnosticCategory.Error, key: "A computed property name in an ambient context must directly refer to a built-in Symbol." }, - A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_Symbol: { code: 1166, category: DiagnosticCategory.Error, key: "A computed property name in a class property declaration must directly refer to a built-in Symbol." }, + A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol: { code: 1165, category: DiagnosticCategory.Error, key: "A computed property name in an ambient context must directly refer to a built-in symbol." }, + A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol: { code: 1166, category: DiagnosticCategory.Error, key: "A computed property name in a class property declaration must directly refer to a built-in symbol." }, Computed_property_names_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1167, category: DiagnosticCategory.Error, key: "Computed property names are only available when targeting ECMAScript 6 and higher." }, - A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_Symbol: { code: 1168, category: DiagnosticCategory.Error, key: "A computed property name in a method overload must directly refer to a built-in Symbol." }, - A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_Symbol: { code: 1169, category: DiagnosticCategory.Error, key: "A computed property name in an interface must directly refer to a built-in Symbol." }, - A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_Symbol: { code: 1170, category: DiagnosticCategory.Error, key: "A computed property name in a type literal must directly refer to a built-in Symbol." }, + A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol: { code: 1168, category: DiagnosticCategory.Error, key: "A computed property name in a method overload must directly refer to a built-in symbol." }, + A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol: { code: 1169, category: DiagnosticCategory.Error, key: "A computed property name in an interface must directly refer to a built-in symbol." }, + A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol: { code: 1170, category: DiagnosticCategory.Error, key: "A computed property name in a type literal must directly refer to a built-in symbol." }, A_comma_expression_is_not_allowed_in_a_computed_property_name: { code: 1171, category: DiagnosticCategory.Error, key: "A comma expression is not allowed in a computed property name." }, extends_clause_already_seen: { code: 1172, category: DiagnosticCategory.Error, key: "'extends' clause already seen." }, extends_clause_must_precede_implements_clause: { code: 1173, category: DiagnosticCategory.Error, key: "'extends' clause must precede 'implements' clause." }, @@ -147,7 +147,7 @@ module ts { Merge_conflict_marker_encountered: { code: 1185, category: DiagnosticCategory.Error, key: "Merge conflict marker encountered." }, A_rest_element_cannot_have_an_initializer: { code: 1186, category: DiagnosticCategory.Error, key: "A rest element cannot have an initializer." }, A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." }, - Symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1188, category: DiagnosticCategory.Error, key: "'Symbol' indexers are only available when targeting ECMAScript 6 and higher.", isEarly: true }, + symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1188, category: DiagnosticCategory.Error, key: "'symbol' indexers are only available when targeting ECMAScript 6 and higher.", isEarly: true }, Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." }, Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." }, Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." }, @@ -300,10 +300,10 @@ module ts { Type_0_is_not_an_array_type: { code: 2461, category: DiagnosticCategory.Error, key: "Type '{0}' is not an array type." }, A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: DiagnosticCategory.Error, key: "A rest element must be last in an array destructuring pattern" }, A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: DiagnosticCategory.Error, key: "A binding pattern parameter cannot be optional in an implementation signature." }, - A_computed_property_name_must_be_of_type_string_number_Symbol_or_any: { code: 2464, category: DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', 'Symbol', or 'any'." }, + A_computed_property_name_must_be_of_type_string_number_symbol_or_any: { code: 2464, category: DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', 'symbol', or 'any'." }, this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: DiagnosticCategory.Error, key: "'this' cannot be referenced in a computed property name." }, super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." }, - A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2466, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, + A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, Cannot_find_global_value_0: { code: 2468, category: DiagnosticCategory.Error, key: "Cannot find global value '{0}'." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 581f8a5cafe..876f3184d15 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -67,7 +67,7 @@ "category": "Error", "code": 1022 }, - "An index signature parameter type must be 'string', 'number', or 'Symbol'.": { + "An index signature parameter type must be 'string', 'number', or 'symbol'.": { "category": "Error", "code": 1023 }, @@ -483,11 +483,11 @@ "category": "Error", "code": 1164 }, - "A computed property name in an ambient context must directly refer to a built-in Symbol.": { + "A computed property name in an ambient context must directly refer to a built-in symbol.": { "category": "Error", "code": 1165 }, - "A computed property name in a class property declaration must directly refer to a built-in Symbol.": { + "A computed property name in a class property declaration must directly refer to a built-in symbol.": { "category": "Error", "code": 1166 }, @@ -495,15 +495,15 @@ "category": "Error", "code": 1167 }, - "A computed property name in a method overload must directly refer to a built-in Symbol.": { + "A computed property name in a method overload must directly refer to a built-in symbol.": { "category": "Error", "code": 1168 }, - "A computed property name in an interface must directly refer to a built-in Symbol.": { + "A computed property name in an interface must directly refer to a built-in symbol.": { "category": "Error", "code": 1169 }, - "A computed property name in a type literal must directly refer to a built-in Symbol.": { + "A computed property name in a type literal must directly refer to a built-in symbol.": { "category": "Error", "code": 1170 }, @@ -579,7 +579,7 @@ "category": "Error", "code": 1187 }, - "'Symbol' indexers are only available when targeting ECMAScript 6 and higher.": { + "'symbol' indexers are only available when targeting ECMAScript 6 and higher.": { "category": "Error", "code": 1188, "isEarly": true @@ -1193,7 +1193,7 @@ "category": "Error", "code": 2463 }, - "A computed property name must be of type 'string', 'number', 'Symbol', or 'any'.": { + "A computed property name must be of type 'string', 'number', 'symbol', or 'any'.": { "category": "Error", "code": 2464 }, @@ -1207,7 +1207,7 @@ }, "A computed property name cannot reference a type parameter from its containing type.": { "category": "Error", - "code": 2466 + "code": 2467 }, "Cannot find global value '{0}'.": { "category": "Error", diff --git a/tests/baselines/reference/arraySigChecking.errors.txt b/tests/baselines/reference/arraySigChecking.errors.txt index 82a32dbda4d..85948381ff5 100644 --- a/tests/baselines/reference/arraySigChecking.errors.txt +++ b/tests/baselines/reference/arraySigChecking.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. tests/cases/compiler/arraySigChecking.ts(18,5): error TS2322: Type 'void[]' is not assignable to type 'string[]'. Type 'void' is not assignable to type 'string'. tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' is not assignable to type 'number[][][]'. @@ -20,7 +20,7 @@ tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' var foo: { [index: any]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. } interface myInt { diff --git a/tests/baselines/reference/computedPropertyNames12.errors.txt b/tests/baselines/reference/computedPropertyNames12.errors.txt index f0fd658c33a..1fdf741f893 100644 --- a/tests/baselines/reference/computedPropertyNames12.errors.txt +++ b/tests/baselines/reference/computedPropertyNames12.errors.txt @@ -1,14 +1,14 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(5,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(6,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(7,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(8,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(9,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(10,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(11,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(12,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(13,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(14,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(15,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(5,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(6,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(7,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(8,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(9,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(10,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(11,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(12,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(13,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(14,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(15,12): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts (11 errors) ==== @@ -18,35 +18,35 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames12.ts(15,12) class C { [s]: number; ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [n] = n; ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. static [s + s]: string; ~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [s + n] = 2; ~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [+s]: typeof s; ~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. static [""]: number; ~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [0]: number; ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [a]: number; ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. static [true]: number; ~~~~~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [`hello bye`] = 0; ~~~~~~~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. static [`hello ${a} bye`] = 0 ~~~~~~~~~~~~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames14.errors.txt b/tests/baselines/reference/computedPropertyNames14.errors.txt index 23d22be0780..9ab0cf6a4e9 100644 --- a/tests/baselines/reference/computedPropertyNames14.errors.txt +++ b/tests/baselines/reference/computedPropertyNames14.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(6,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(8,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(6,12): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(8,12): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts (6 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames14.ts(8,12): class C { [b]() {} ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static [true]() { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [[]]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static [{}]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [undefined]() { } ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static [null]() { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames15.errors.txt b/tests/baselines/reference/computedPropertyNames15.errors.txt index dc0ffb5fe46..64b08df3221 100644 --- a/tests/baselines/reference/computedPropertyNames15.errors.txt +++ b/tests/baselines/reference/computedPropertyNames15.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts (2 errors) ==== @@ -10,8 +10,8 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames15.ts(7,5): [p1]() { } [p2]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [p3]() { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames17.errors.txt b/tests/baselines/reference/computedPropertyNames17.errors.txt index 78ce6d5e433..df9fe01528a 100644 --- a/tests/baselines/reference/computedPropertyNames17.errors.txt +++ b/tests/baselines/reference/computedPropertyNames17.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(3,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(4,16): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(8,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(3,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(4,16): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(8,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts (6 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames17.ts(8,9): class C { get [b]() { return 0;} ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static set [true](v) { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. get [[]]() { return 0; } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. set [{}](v) { } ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static get [undefined]() { return 0; } ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. set [null](v) { } ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames3.errors.txt b/tests/baselines/reference/computedPropertyNames3.errors.txt index 23dbcf7d9b1..7136e441e72 100644 --- a/tests/baselines/reference/computedPropertyNames3.errors.txt +++ b/tests/baselines/reference/computedPropertyNames3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(4,12): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(5,9): error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. -tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts (6 errors) ==== @@ -12,19 +12,19 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames3.ts(7,16): [0 + 1]() { } static [() => { }]() { } ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. get [delete id]() { } ~~~~~~~~~~~ !!! error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. set [[0, 1]](v) { } ~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static get [""]() { } ~~~~~~~~~~~~ !!! error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. ~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. static set [id.toString()](v) { } } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames32.errors.txt b/tests/baselines/reference/computedPropertyNames32.errors.txt index e2f08c79fc9..63b13d40ab4 100644 --- a/tests/baselines/reference/computedPropertyNames32.errors.txt +++ b/tests/baselines/reference/computedPropertyNames32.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames32.ts(6,10): error TS2466: A computed property name cannot reference a type parameter from its containing type. +tests/cases/conformance/es6/computedProperties/computedPropertyNames32.ts(6,10): error TS2467: A computed property name cannot reference a type parameter from its containing type. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames32.ts (1 errors) ==== @@ -9,5 +9,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames32.ts(6,10): } [foo()]() { } ~ -!!! error TS2466: A computed property name cannot reference a type parameter from its containing type. +!!! error TS2467: A computed property name cannot reference a type parameter from its containing type. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames35.errors.txt b/tests/baselines/reference/computedPropertyNames35.errors.txt index c9986864b0e..aa9279fe9c3 100644 --- a/tests/baselines/reference/computedPropertyNames35.errors.txt +++ b/tests/baselines/reference/computedPropertyNames35.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,10): error TS2466: A computed property name cannot reference a type parameter from its containing type. +tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,10): error TS2467: A computed property name cannot reference a type parameter from its containing type. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts (2 errors) ==== @@ -8,7 +8,7 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames35.ts(4,10): bar(): string; [foo()](): void; ~~~~~~~~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ -!!! error TS2466: A computed property name cannot reference a type parameter from its containing type. +!!! error TS2467: A computed property name cannot reference a type parameter from its containing type. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames42.errors.txt b/tests/baselines/reference/computedPropertyNames42.errors.txt index 2c05e8869c0..417931c535f 100644 --- a/tests/baselines/reference/computedPropertyNames42.errors.txt +++ b/tests/baselines/reference/computedPropertyNames42.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): error TS2411: Property '[""]' of type 'Foo' is not assignable to string index type 'Foo2'. @@ -12,7 +12,7 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames42.ts(8,5): // Computed properties [""]: Foo; ~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~~~~~~~~~~ !!! error TS2411: Property '[""]' of type 'Foo' is not assignable to string index type 'Foo2'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames5.errors.txt b/tests/baselines/reference/computedPropertyNames5.errors.txt index d8fa1d30750..2b59a816e16 100644 --- a/tests/baselines/reference/computedPropertyNames5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames5.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(8,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(5,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(8,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts (6 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames5.ts(8,5): e var v = { [b]: 0, ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [true]: 1, ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [[]]: 0, ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [{}]: 0, ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [undefined]: undefined, ~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [null]: null ~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames6.errors.txt b/tests/baselines/reference/computedPropertyNames6.errors.txt index 3ee4387610b..1a651b581c3 100644 --- a/tests/baselines/reference/computedPropertyNames6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames6.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(6,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(7,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts (2 errors) ==== @@ -10,8 +10,8 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames6.ts(7,5): e [p1]: 0, [p2]: 1, ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [p3]: 2 ~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames8.errors.txt b/tests/baselines/reference/computedPropertyNames8.errors.txt index f45280c517c..44e32e0a771 100644 --- a/tests/baselines/reference/computedPropertyNames8.errors.txt +++ b/tests/baselines/reference/computedPropertyNames8.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(6,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts (2 errors) ==== @@ -9,9 +9,9 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames8.ts(6,9): e var v = { [t]: 0, ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [u]: 1 ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. }; } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames9.errors.txt b/tests/baselines/reference/computedPropertyNames9.errors.txt index ba27c193767..a71e0f5e8eb 100644 --- a/tests/baselines/reference/computedPropertyNames9.errors.txt +++ b/tests/baselines/reference/computedPropertyNames9.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts(9,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts(9,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts (1 errors) ==== @@ -12,5 +12,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames9.ts(9,5): e [f(0)]: 0, [f(true)]: 0 ~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt b/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt index ab2d1822e4c..961b64a7f32 100644 --- a/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt +++ b/tests/baselines/reference/computedPropertyNamesDeclarationEmit3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit3.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit3.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit3.ts (1 errors) ==== interface I { ["" + ""](): void; ~~~~~~~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt b/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt index f366427d525..45fa3ae521e 100644 --- a/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt +++ b/tests/baselines/reference/computedPropertyNamesDeclarationEmit4.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit4.ts(2,5): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit4.ts(2,5): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNamesDeclarationEmit4.ts (1 errors) ==== var v: { ["" + ""](): void; ~~~~~~~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt b/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt index 64b6ba87452..ee7b67ad829 100644 --- a/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt +++ b/tests/baselines/reference/computedPropertyNamesOnOverloads.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(4,5): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. -tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(5,5): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(4,5): error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. +tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts(5,5): error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads.ts (2 errors) ==== @@ -8,9 +8,9 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNamesOnOverloads. class C { [methodName](v: string); ~~~~~~~~~~~~ -!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. [methodName](); ~~~~~~~~~~~~ -!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. [methodName](v?: string) { } } \ No newline at end of file diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt index 68543a10b01..5d7da139c2b 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(10,21): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,26): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,26): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(14,23): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -36,7 +36,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). declare var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt index 9076b86ff3e..7b5116356c7 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(10,13): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,14): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,18): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,14): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,18): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(14,13): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -46,7 +46,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt index ca79c04f6ed..136682b1ca1 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(10,13): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,14): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,18): error TS2314: Generic type 'I' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,14): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,18): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(14,13): error TS2314: Generic type 'I' requires 1 type argument(s). @@ -46,7 +46,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'I' requires 1 type argument(s). var d: { [x: I]: I }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. ~ !!! error TS2314: Generic type 'I' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt index 7154a90cb8a..d755a9120a8 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(10,21): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(11,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(11,26): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,26): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(14,23): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -36,7 +36,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). declare var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/giant.errors.txt b/tests/baselines/reference/giant.errors.txt index 99a4360ac52..1d623870d63 100644 --- a/tests/baselines/reference/giant.errors.txt +++ b/tests/baselines/reference/giant.errors.txt @@ -16,7 +16,7 @@ tests/cases/compiler/giant.ts(34,16): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(35,12): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(36,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(36,16): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(61,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(61,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(61,6): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(62,5): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(63,6): error TS1096: An index signature must have exactly one parameter. @@ -39,7 +39,7 @@ tests/cases/compiler/giant.ts(98,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(99,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(100,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(100,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(125,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(125,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(125,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(126,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(127,10): error TS1096: An index signature must have exactly one parameter. @@ -63,7 +63,7 @@ tests/cases/compiler/giant.ts(177,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(178,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(179,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(179,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(204,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(204,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(204,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(205,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(206,10): error TS1096: An index signature must have exactly one parameter. @@ -119,7 +119,7 @@ tests/cases/compiler/giant.ts(292,16): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(293,12): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(294,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(294,16): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(319,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(319,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(319,6): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(320,5): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(321,6): error TS1096: An index signature must have exactly one parameter. @@ -142,7 +142,7 @@ tests/cases/compiler/giant.ts(356,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(357,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(358,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(358,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(383,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(383,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(383,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(384,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(385,10): error TS1096: An index signature must have exactly one parameter. @@ -166,7 +166,7 @@ tests/cases/compiler/giant.ts(435,20): error TS2300: Duplicate identifier 'tsF'. tests/cases/compiler/giant.ts(436,16): error TS2300: Duplicate identifier 'tgF'. tests/cases/compiler/giant.ts(437,20): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/giant.ts(437,20): error TS2300: Duplicate identifier 'tgF'. -tests/cases/compiler/giant.ts(462,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(462,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(462,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(463,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(464,10): error TS1096: An index signature must have exactly one parameter. @@ -238,7 +238,7 @@ tests/cases/compiler/giant.ts(556,21): error TS1036: Statements are not allowed tests/cases/compiler/giant.ts(558,24): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(561,21): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(563,21): error TS1184: An implementation cannot be declared in ambient contexts. -tests/cases/compiler/giant.ts(587,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(587,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(587,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(588,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(589,10): error TS1096: An index signature must have exactly one parameter. @@ -255,7 +255,7 @@ tests/cases/compiler/giant.ts(621,26): error TS1184: An implementation cannot be tests/cases/compiler/giant.ts(623,24): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(626,21): error TS1184: An implementation cannot be declared in ambient contexts. tests/cases/compiler/giant.ts(628,21): error TS1184: An implementation cannot be declared in ambient contexts. -tests/cases/compiler/giant.ts(653,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/giant.ts(653,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/giant.ts(653,10): error TS2304: Cannot find name 'p'. tests/cases/compiler/giant.ts(654,9): error TS1021: An index signature must have a type annotation. tests/cases/compiler/giant.ts(655,10): error TS1096: An index signature must have exactly one parameter. @@ -364,7 +364,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -474,7 +474,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -601,7 +601,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -828,7 +828,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -938,7 +938,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -1065,7 +1065,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -1334,7 +1334,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; @@ -1434,7 +1434,7 @@ tests/cases/compiler/giant.ts(676,30): error TS1184: An implementation cannot be //Index Signature [p]; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; diff --git a/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt b/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt index e8b8ed9d488..88e09d7746b 100644 --- a/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt +++ b/tests/baselines/reference/indexSignatureMustHaveTypeAnnotation.errors.txt @@ -1,7 +1,7 @@ -tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(3,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(3,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(3,6): error TS2304: Cannot find name 'x'. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(4,5): error TS1021: An index signature must have a type annotation. -tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(9,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(9,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(9,6): error TS2304: Cannot find name 'x'. tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(14,5): error TS1021: An index signature must have a type annotation. @@ -11,7 +11,7 @@ tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(14,5): error TS1021 // Used to be indexer, now it is a computed property [x]: string; ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'x'. [x: string]; @@ -23,7 +23,7 @@ tests/cases/compiler/indexSignatureMustHaveTypeAnnotation.ts(14,5): error TS1021 // Used to be indexer, now it is a computed property [x]: string ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'x'. diff --git a/tests/baselines/reference/indexSignatureWithInitializer.errors.txt b/tests/baselines/reference/indexSignatureWithInitializer.errors.txt index b7298e6b5e7..4a49de69393 100644 --- a/tests/baselines/reference/indexSignatureWithInitializer.errors.txt +++ b/tests/baselines/reference/indexSignatureWithInitializer.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/indexSignatureWithInitializer.ts(3,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/compiler/indexSignatureWithInitializer.ts(3,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/compiler/indexSignatureWithInitializer.ts(3,6): error TS2304: Cannot find name 'x'. -tests/cases/compiler/indexSignatureWithInitializer.ts(7,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/compiler/indexSignatureWithInitializer.ts(7,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/compiler/indexSignatureWithInitializer.ts(7,6): error TS2304: Cannot find name 'x'. @@ -9,7 +9,7 @@ tests/cases/compiler/indexSignatureWithInitializer.ts(7,6): error TS2304: Cannot interface I { [x = '']: string; ~~~~~~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'x'. } @@ -17,7 +17,7 @@ tests/cases/compiler/indexSignatureWithInitializer.ts(7,6): error TS2304: Cannot class C { [x = 0]: string ~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'x'. } \ No newline at end of file diff --git a/tests/baselines/reference/indexTypeCheck.errors.txt b/tests/baselines/reference/indexTypeCheck.errors.txt index 0914ea9ca7b..f45e56ef6df 100644 --- a/tests/baselines/reference/indexTypeCheck.errors.txt +++ b/tests/baselines/reference/indexTypeCheck.errors.txt @@ -4,7 +4,7 @@ tests/cases/compiler/indexTypeCheck.ts(17,2): error TS2413: Numeric index type ' tests/cases/compiler/indexTypeCheck.ts(22,2): error TS2413: Numeric index type 'Orange' is not assignable to string index type 'Yellow'. tests/cases/compiler/indexTypeCheck.ts(27,2): error TS2413: Numeric index type 'number' is not assignable to string index type 'string'. tests/cases/compiler/indexTypeCheck.ts(32,3): error TS1096: An index signature must have exactly one parameter. -tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. @@ -58,7 +58,7 @@ tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression interface Magenta { [p:Purple]; // error ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. } var yellow: Yellow; diff --git a/tests/baselines/reference/indexWithoutParamType2.errors.txt b/tests/baselines/reference/indexWithoutParamType2.errors.txt index 163b7b98753..7e72b7804e2 100644 --- a/tests/baselines/reference/indexWithoutParamType2.errors.txt +++ b/tests/baselines/reference/indexWithoutParamType2.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/indexWithoutParamType2.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/compiler/indexWithoutParamType2.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/compiler/indexWithoutParamType2.ts(3,6): error TS2304: Cannot find name 'x'. @@ -7,7 +7,7 @@ tests/cases/compiler/indexWithoutParamType2.ts(3,6): error TS2304: Cannot find n // Used to be indexer, now it is a computed property [x]: string ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'x'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName10.errors.txt b/tests/baselines/reference/parserComputedPropertyName10.errors.txt index 96ed65032af..a9b5396781a 100644 --- a/tests/baselines/reference/parserComputedPropertyName10.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName10.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName10.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName10.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName10.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e] = 1 ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName11.errors.txt b/tests/baselines/reference/parserComputedPropertyName11.errors.txt index 2083c5bc819..2a7a606f4bf 100644 --- a/tests/baselines/reference/parserComputedPropertyName11.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName11.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName11.ts(2,4): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName11.ts(2,4): error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName11.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e](); ~~~ -!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName13.errors.txt b/tests/baselines/reference/parserComputedPropertyName13.errors.txt index e0d06224488..a7a77cf1244 100644 --- a/tests/baselines/reference/parserComputedPropertyName13.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName13.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName13.ts (2 errors) ==== var v: { [e]: number }; ~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName14.errors.txt b/tests/baselines/reference/parserComputedPropertyName14.errors.txt index 99e36669f50..50a6d1bc689 100644 --- a/tests/baselines/reference/parserComputedPropertyName14.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName14.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName14.ts (2 errors) ==== var v: { [e](): number }; ~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName15.errors.txt b/tests/baselines/reference/parserComputedPropertyName15.errors.txt index 1985338e19f..9635178af16 100644 --- a/tests/baselines/reference/parserComputedPropertyName15.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName15.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts(1,31): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts(1,31): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts(1,32): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName15.ts (2 errors) ==== var v: { [e: number]: string; [e]: number }; ~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName18.errors.txt b/tests/baselines/reference/parserComputedPropertyName18.errors.txt index 9a78c057cc7..9e64ddd0d28 100644 --- a/tests/baselines/reference/parserComputedPropertyName18.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName18.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName18.ts (2 errors) ==== var v: { [e]?(): number }; ~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName19.errors.txt b/tests/baselines/reference/parserComputedPropertyName19.errors.txt index 412995f93e0..86bb591011e 100644 --- a/tests/baselines/reference/parserComputedPropertyName19.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName19.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName19.ts (2 errors) ==== var v: { [e]? }; ~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName20.errors.txt b/tests/baselines/reference/parserComputedPropertyName20.errors.txt index 7c93d63a7ef..035e494af33 100644 --- a/tests/baselines/reference/parserComputedPropertyName20.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName20.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName20.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName20.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName20.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP interface I { [e](): number ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName21.errors.txt b/tests/baselines/reference/parserComputedPropertyName21.errors.txt index 603940f24b2..4ebc321cc80 100644 --- a/tests/baselines/reference/parserComputedPropertyName21.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName21.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName21.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName21.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName21.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP interface I { [e]: number ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName22.errors.txt b/tests/baselines/reference/parserComputedPropertyName22.errors.txt index 2cdd5321e02..fd9e3797018 100644 --- a/tests/baselines/reference/parserComputedPropertyName22.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName22.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName22.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName22.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName22.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP declare class C { [e]: number ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName25.errors.txt b/tests/baselines/reference/parserComputedPropertyName25.errors.txt index d0b632aa2ec..0d0a2a8d833 100644 --- a/tests/baselines/reference/parserComputedPropertyName25.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName25.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(3,6): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName25.ts(4,6): error TS2304: Cannot find name 'e2'. @@ -8,7 +8,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP // No ASI [e] = 0 ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. [e2] = 1 diff --git a/tests/baselines/reference/parserComputedPropertyName28.errors.txt b/tests/baselines/reference/parserComputedPropertyName28.errors.txt index 70a010092e4..a84f3b7d16b 100644 --- a/tests/baselines/reference/parserComputedPropertyName28.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName28.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(2,6): error TS2304: Cannot find name 'e'. -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName28.ts(3,6): error TS2304: Cannot find name 'e2'. @@ -8,12 +8,12 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e]: number = 0; ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. [e2]: number ~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~~ !!! error TS2304: Cannot find name 'e2'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName29.errors.txt b/tests/baselines/reference/parserComputedPropertyName29.errors.txt index 54d3f9746ff..3d886eacc50 100644 --- a/tests/baselines/reference/parserComputedPropertyName29.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName29.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,6): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(3,11): error TS2304: Cannot find name 'id'. -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(4,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(4,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName29.ts(4,6): error TS2304: Cannot find name 'e2'. @@ -10,14 +10,14 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP // yes ASI [e] = id++ ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. ~~ !!! error TS2304: Cannot find name 'id'. [e2]: number ~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~~ !!! error TS2304: Cannot find name 'e2'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName31.errors.txt b/tests/baselines/reference/parserComputedPropertyName31.errors.txt index ef4f34bd3e3..4661b0797af 100644 --- a/tests/baselines/reference/parserComputedPropertyName31.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName31.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(3,6): error TS2304: Cannot find name 'e'. -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(4,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(4,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName31.ts(4,6): error TS2304: Cannot find name 'e2'. @@ -9,12 +9,12 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP // yes ASI [e]: number ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. [e2]: number ~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~~ !!! error TS2304: Cannot find name 'e2'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName32.errors.txt b/tests/baselines/reference/parserComputedPropertyName32.errors.txt index b70d346ce1e..4be8d70383e 100644 --- a/tests/baselines/reference/parserComputedPropertyName32.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName32.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName32.ts(2,5): error TS1165: A computed property name in an ambient context must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName32.ts(2,5): error TS1165: A computed property name in an ambient context must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName32.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP declare class C { [e](): number ~~~ -!!! error TS1165: A computed property name in an ambient context must directly refer to a built-in Symbol. +!!! error TS1165: A computed property name in an ambient context must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName36.errors.txt b/tests/baselines/reference/parserComputedPropertyName36.errors.txt index 3536ead6ebe..07e937b3b42 100644 --- a/tests/baselines/reference/parserComputedPropertyName36.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName36.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName36.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName36.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName36.ts(2,6): error TS2304: Cannot find name 'public'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [public ]: string; ~~~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~~~~~~ !!! error TS2304: Cannot find name 'public'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName41.errors.txt b/tests/baselines/reference/parserComputedPropertyName41.errors.txt index 3de11e5218a..5389b187cad 100644 --- a/tests/baselines/reference/parserComputedPropertyName41.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName41.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName41.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName41.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName41.ts (1 errors) ==== var v = { [0 in []]: true ~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName7.errors.txt b/tests/baselines/reference/parserComputedPropertyName7.errors.txt index 833383b64c9..056fa3d82fd 100644 --- a/tests/baselines/reference/parserComputedPropertyName7.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName7.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName7.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName7.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName7.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e] ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName8.errors.txt b/tests/baselines/reference/parserComputedPropertyName8.errors.txt index d8798997f59..32bb4906353 100644 --- a/tests/baselines/reference/parserComputedPropertyName8.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName8.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName8.ts(2,11): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName8.ts(2,11): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName8.ts(2,12): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { public [e] ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserComputedPropertyName9.errors.txt b/tests/baselines/reference/parserComputedPropertyName9.errors.txt index ce97d134718..9db0cbde3bd 100644 --- a/tests/baselines/reference/parserComputedPropertyName9.errors.txt +++ b/tests/baselines/reference/parserComputedPropertyName9.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,5): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName9.ts(2,9): error TS2304: Cannot find name 'Type'. @@ -7,7 +7,7 @@ tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedP class C { [e]: Type ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. ~~~~ diff --git a/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt index 7dc962d83b0..2c8f1d2ab4f 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName1.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName1.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName1.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName1.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput declare class C { [e]: number ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt index 76a2a986261..31d3f9985ab 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName10.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName10.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName10.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName10.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e] = 1 ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt index 41d146ba518..b4808607ab0 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName11.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName11.ts(2,4): error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName11.ts(2,4): error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName11.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e](); ~~~ -!!! error TS1168: A computed property name in a method overload must directly refer to a built-in Symbol. +!!! error TS1168: A computed property name in a method overload must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt index d375f202918..9125ce7b58f 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName5.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName5.ts(2,5): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName5.ts(2,6): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput interface I { [e]: number ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt index 849cdc6d2a1..277bdcd3c94 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName7.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName7.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName7.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName7.ts(2,5): error TS2304: Cannot find name 'e'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e] ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt index 84cf5e849f6..6b674a1d2c0 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName8.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts(1,10): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts(1,11): error TS2304: Cannot find name 'e'. ==== tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName8.ts (2 errors) ==== var v: { [e]: number }; ~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt b/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt index da62c00cd0f..fb087a4d82f 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt +++ b/tests/baselines/reference/parserES5ComputedPropertyName9.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,4): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,5): error TS2304: Cannot find name 'e'. tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5ComputedPropertyName9.ts(2,9): error TS2304: Cannot find name 'Type'. @@ -7,7 +7,7 @@ tests/cases/conformance/parser/ecmascript5/ComputedPropertyNames/parserES5Comput class C { [e]: Type ~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'e'. ~~~~ diff --git a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt index a5ff176db61..a3c4f22a87e 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. ==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts (1 errors) ==== interface I { [s: symbol]: string; ~~~~~~ -!!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +!!! error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt index de4c97aae29..39d8aa41d77 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. ==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts (1 errors) ==== class C { [s: symbol]: string; ~~~~~~ -!!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +!!! error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt index e839338e772..34dea325439 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. ==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts (1 errors) ==== var x: { [s: symbol]: string; ~~~~~~ -!!! error TS1188: 'Symbol' indexers are only available when targeting ECMAScript 6 and higher. +!!! error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature11.errors.txt b/tests/baselines/reference/parserIndexSignature11.errors.txt index b3c29f44d99..f1f2a4a00f4 100644 --- a/tests/baselines/reference/parserIndexSignature11.errors.txt +++ b/tests/baselines/reference/parserIndexSignature11.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(2,9): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(2,9): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(2,10): error TS2304: Cannot find name 'p'. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(3,9): error TS1021: An index signature must have a type annotation. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature11.ts(4,10): error TS1096: An index signature must have exactly one parameter. @@ -8,7 +8,7 @@ tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature1 interface I { [p]; // Used to be indexer, now it is a computed property ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'p'. [p1: string]; diff --git a/tests/baselines/reference/parserIndexSignature4.errors.txt b/tests/baselines/reference/parserIndexSignature4.errors.txt index f67ea364c46..bd73b4d2bf4 100644 --- a/tests/baselines/reference/parserIndexSignature4.errors.txt +++ b/tests/baselines/reference/parserIndexSignature4.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4.ts(2,3): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4.ts(2,3): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4.ts(2,4): error TS2304: Cannot find name 'a'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature4 interface I { [a = 0] // Used to be indexer, now it is a computed property ~~~~~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'a'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature5.errors.txt b/tests/baselines/reference/parserIndexSignature5.errors.txt index 85c9e0a21a1..54ccd05f4f9 100644 --- a/tests/baselines/reference/parserIndexSignature5.errors.txt +++ b/tests/baselines/reference/parserIndexSignature5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5.ts(2,3): error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5.ts(2,3): error TS1169: A computed property name in an interface must directly refer to a built-in symbol. tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5.ts(2,4): error TS2304: Cannot find name 'a'. @@ -6,7 +6,7 @@ tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature5 interface I { [a] // Used to be indexer, now it is a computed property ~~~ -!!! error TS1169: A computed property name in an interface must directly refer to a built-in Symbol. +!!! error TS1169: A computed property name in an interface must directly refer to a built-in symbol. ~ !!! error TS2304: Cannot find name 'a'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature6.errors.txt b/tests/baselines/reference/parserIndexSignature6.errors.txt index eae5aae90c9..52a3b28a519 100644 --- a/tests/baselines/reference/parserIndexSignature6.errors.txt +++ b/tests/baselines/reference/parserIndexSignature6.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts(2,4): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts(2,4): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. ==== tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts (1 errors) ==== interface I { [a:boolean] ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature8.errors.txt b/tests/baselines/reference/parserIndexSignature8.errors.txt index 859d373eca4..efed14e9577 100644 --- a/tests/baselines/reference/parserIndexSignature8.errors.txt +++ b/tests/baselines/reference/parserIndexSignature8.errors.txt @@ -1,12 +1,12 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(1,13): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(2,14): error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(1,13): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(2,14): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. ==== tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts (2 errors) ==== var foo: { [index: any]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. var foo2: { [index: RegExp]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'Symbol'. +!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/propertyAssignment.errors.txt b/tests/baselines/reference/propertyAssignment.errors.txt index 54a74e1b129..47359caf9c2 100644 --- a/tests/baselines/reference/propertyAssignment.errors.txt +++ b/tests/baselines/reference/propertyAssignment.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/propertyAssignment.ts(6,13): error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +tests/cases/compiler/propertyAssignment.ts(6,13): error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. tests/cases/compiler/propertyAssignment.ts(6,14): error TS2304: Cannot find name 'index'. tests/cases/compiler/propertyAssignment.ts(14,1): error TS2322: Type '{ x: number; }' is not assignable to type 'new () => any'. tests/cases/compiler/propertyAssignment.ts(16,1): error TS2322: Type '{ x: number; }' is not assignable to type '() => void'. @@ -12,7 +12,7 @@ tests/cases/compiler/propertyAssignment.ts(16,1): error TS2322: Type '{ x: numbe var foo2: { [index]; } // should be an error, used to be indexer, now it is a computed property ~~~~~~~ -!!! error TS1170: A computed property name in a type literal must directly refer to a built-in Symbol. +!!! error TS1170: A computed property name in a type literal must directly refer to a built-in symbol. ~~~~~ !!! error TS2304: Cannot find name 'index'. var bar2: { x : number; } diff --git a/tests/baselines/reference/symbolProperty3.errors.txt b/tests/baselines/reference/symbolProperty3.errors.txt index 44c75a3ef7b..ed557c85a63 100644 --- a/tests/baselines/reference/symbolProperty3.errors.txt +++ b/tests/baselines/reference/symbolProperty3.errors.txt @@ -1,6 +1,6 @@ -tests/cases/conformance/es6/Symbols/symbolProperty3.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/Symbols/symbolProperty3.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. -tests/cases/conformance/es6/Symbols/symbolProperty3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty3.ts(3,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty3.ts(4,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty3.ts(5,9): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/Symbols/symbolProperty3.ts (3 errors) ==== @@ -8,13 +8,13 @@ tests/cases/conformance/es6/Symbols/symbolProperty3.ts(5,9): error TS2464: A com var x = { [s]: 0, ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. [s]() { }, ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. get [s]() { ~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. return 0; } } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty53.errors.txt b/tests/baselines/reference/symbolProperty53.errors.txt index 87ec693263e..0d9601df68a 100644 --- a/tests/baselines/reference/symbolProperty53.errors.txt +++ b/tests/baselines/reference/symbolProperty53.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (1 errors) ==== var obj = { [Symbol.for]: 0 ~~~~~~~~~~~~ -!!! error TS2464: A computed property name must be of type 'string', 'number', 'Symbol', or 'any'. +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. }; \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty7.errors.txt b/tests/baselines/reference/symbolProperty7.errors.txt index 0fe3597a10e..652f637d852 100644 --- a/tests/baselines/reference/symbolProperty7.errors.txt +++ b/tests/baselines/reference/symbolProperty7.errors.txt @@ -1,15 +1,15 @@ -tests/cases/conformance/es6/Symbols/symbolProperty7.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. -tests/cases/conformance/es6/Symbols/symbolProperty7.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +tests/cases/conformance/es6/Symbols/symbolProperty7.ts(2,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. +tests/cases/conformance/es6/Symbols/symbolProperty7.ts(3,5): error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. ==== tests/cases/conformance/es6/Symbols/symbolProperty7.ts (2 errors) ==== class C { [Symbol()] = 0; ~~~~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [Symbol()]: number; ~~~~~~~~~~ -!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in Symbol. +!!! error TS1166: A computed property name in a class property declaration must directly refer to a built-in symbol. [Symbol()]() { } get [Symbol()]() { return 0; From 2d1647485cfb33a7ae1d84a6bc08ced6f952a552 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 4 Feb 2015 19:18:54 -0800 Subject: [PATCH 019/106] Fix expression checking for symbols --- src/compiler/checker.ts | 72 ++++++++-- .../diagnosticInformationMap.generated.ts | 3 +- src/compiler/diagnosticMessages.json | 6 +- .../inOperatorWithInvalidOperands.errors.txt | 32 ++--- .../reference/symbolProperty54.errors.txt | 9 ++ .../reference/symbolType1.errors.txt | 7 +- tests/baselines/reference/symbolType1.js | 6 +- tests/baselines/reference/symbolType11.types | 37 +++++ .../reference/symbolType12.errors.txt | 136 ++++++++++++++++++ tests/baselines/reference/symbolType12.js | 5 +- .../reference/symbolType13.errors.txt | 18 +++ .../reference/symbolType2.errors.txt | 8 ++ .../reference/symbolType3.errors.txt | 33 +++++ tests/baselines/reference/symbolType3.js | 5 +- .../reference/symbolType6.errors.txt | 57 ++++++++ tests/baselines/reference/symbolType6.js | 13 +- .../reference/symbolType8.errors.txt | 45 ++++++ tests/baselines/reference/symbolType8.js | 7 +- .../reference/widenedTypes.errors.txt | 4 +- .../conformance/es6/Symbols/symbolType1.ts | 4 +- .../conformance/es6/Symbols/symbolType12.ts | 4 +- .../conformance/es6/Symbols/symbolType3.ts | 4 +- .../conformance/es6/Symbols/symbolType6.ts | 8 +- .../conformance/es6/Symbols/symbolType8.ts | 5 +- 24 files changed, 484 insertions(+), 44 deletions(-) create mode 100644 tests/baselines/reference/symbolProperty54.errors.txt create mode 100644 tests/baselines/reference/symbolType11.types create mode 100644 tests/baselines/reference/symbolType12.errors.txt create mode 100644 tests/baselines/reference/symbolType13.errors.txt create mode 100644 tests/baselines/reference/symbolType2.errors.txt create mode 100644 tests/baselines/reference/symbolType3.errors.txt create mode 100644 tests/baselines/reference/symbolType6.errors.txt create mode 100644 tests/baselines/reference/symbolType8.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4973dd37450..d513066cc04 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6856,6 +6856,9 @@ module ts { case SyntaxKind.PlusToken: case SyntaxKind.MinusToken: case SyntaxKind.TildeToken: + if (hasSomeTypeOfKind(operandType, TypeFlags.ESSymbol)) { + error(node.operand, Diagnostics.The_0_operator_cannot_be_applied_to_a_value_of_type_symbol, tokenToString(node.operator)); + } return numberType; case SyntaxKind.ExclamationToken: return booleanType; @@ -6891,6 +6894,24 @@ module ts { return numberType; } + // Just like isTypeOfKind below, except that it returns true if *any* constituent + // has this kind. + function hasSomeTypeOfKind(type: Type, kind: TypeFlags): boolean { + if (type.flags & kind) { + return true; + } + if (type.flags & TypeFlags.Union) { + var types = (type).types; + for (var i = 0; i < types.length; i++) { + if (types[i].flags & kind) { + return true; + } + } + return false; + } + return false; + } + // Return true if type has the given flags, or is a union type composed of types that all have those flags. function isTypeOfKind(type: Type, kind: TypeFlags): boolean { if (type.flags & kind) { @@ -6938,7 +6959,7 @@ module ts { // and the right operand to be of type Any, an object type, or a type parameter type. // The result is always of the Boolean primitive type. if (!isTypeOfKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { - error(node.left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_types_any_string_or_number); + error(node.left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol); } if (!isTypeOfKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { error(node.right, Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); @@ -7106,14 +7127,21 @@ module ts { // If both operands are of the Number primitive type, the result is of the Number primitive type. resultType = numberType; } - else if (isTypeOfKind(leftType, TypeFlags.StringLike) || isTypeOfKind(rightType, TypeFlags.StringLike)) { - // If one or both operands are of the String primitive type, the result is of the String primitive type. - resultType = stringType; - } - else if (leftType.flags & TypeFlags.Any || rightType.flags & TypeFlags.Any) { - // Otherwise, the result is of type Any. - // NOTE: unknown type here denotes error type. Old compiler treated this case as any type so do we. - resultType = anyType; + else { + if (isTypeOfKind(leftType, TypeFlags.StringLike) || isTypeOfKind(rightType, TypeFlags.StringLike)) { + // If one or both operands are of the String primitive type, the result is of the String primitive type. + resultType = stringType; + } + else if (leftType.flags & TypeFlags.Any || rightType.flags & TypeFlags.Any) { + // Otherwise, the result is of type Any. + // NOTE: unknown type here denotes error type. Old compiler treated this case as any type so do we. + resultType = anyType; + } + + // Symbols are not allowed at all in arithmetic expressions + if (resultType && !checkForDisallowedESSymbolOperand(operator)) { + return resultType; + } } if (!resultType) { @@ -7125,14 +7153,18 @@ module ts { checkAssignmentOperator(resultType); } return resultType; - case SyntaxKind.EqualsEqualsToken: - case SyntaxKind.ExclamationEqualsToken: - case SyntaxKind.EqualsEqualsEqualsToken: - case SyntaxKind.ExclamationEqualsEqualsToken: case SyntaxKind.LessThanToken: case SyntaxKind.GreaterThanToken: case SyntaxKind.LessThanEqualsToken: case SyntaxKind.GreaterThanEqualsToken: + if (!checkForDisallowedESSymbolOperand(operator)) { + return booleanType; + } + // Fall through + case SyntaxKind.EqualsEqualsToken: + case SyntaxKind.ExclamationEqualsToken: + case SyntaxKind.EqualsEqualsEqualsToken: + case SyntaxKind.ExclamationEqualsEqualsToken: if (!isTypeAssignableTo(leftType, rightType) && !isTypeAssignableTo(rightType, leftType)) { reportOperatorError(); } @@ -7152,6 +7184,20 @@ module ts { return rightType; } + // Return type is true if there was no error, false if there was an error. + function checkForDisallowedESSymbolOperand(operator: SyntaxKind): boolean { + var offendingSymbolOperand = + hasSomeTypeOfKind(leftType, TypeFlags.ESSymbol) ? node.left : + hasSomeTypeOfKind(rightType, TypeFlags.ESSymbol) ? node.right : + undefined; + if (offendingSymbolOperand) { + error(offendingSymbolOperand, Diagnostics.The_0_operator_cannot_be_applied_to_a_value_of_type_symbol, tokenToString(operator)); + return false; + } + + return true; + } + function getSuggestedBooleanOperator(operator: SyntaxKind): SyntaxKind { switch (operator) { case SyntaxKind.BarToken: diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index e16130a0ecd..922044bdaf5 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -205,7 +205,7 @@ module ts { The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer: { code: 2357, category: DiagnosticCategory.Error, key: "The operand of an increment or decrement operator must be a variable, property or indexer." }, The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2358, category: DiagnosticCategory.Error, key: "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter." }, The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: { code: 2359, category: DiagnosticCategory.Error, key: "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type." }, - The_left_hand_side_of_an_in_expression_must_be_of_types_any_string_or_number: { code: 2360, category: DiagnosticCategory.Error, key: "The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'." }, + The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol: { code: 2360, category: DiagnosticCategory.Error, key: "The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'." }, The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2361, category: DiagnosticCategory.Error, key: "The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter" }, The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2362, category: DiagnosticCategory.Error, key: "The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." }, The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2363, category: DiagnosticCategory.Error, key: "The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." }, @@ -305,6 +305,7 @@ module ts { super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." }, A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, Cannot_find_global_value_0: { code: 2468, category: DiagnosticCategory.Error, key: "Cannot find global value '{0}'." }, + The_0_operator_cannot_be_applied_to_a_value_of_type_symbol: { code: 2469, category: DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to a value of type 'symbol'." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 876f3184d15..fb170548614 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -813,7 +813,7 @@ "category": "Error", "code": 2359 }, - "The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'.": { + "The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'.": { "category": "Error", "code": 2360 }, @@ -1213,6 +1213,10 @@ "category": "Error", "code": 2468 }, + "The '{0}' operator cannot be applied to a value of type 'symbol'.": { + "category": "Error", + "code": 2469 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/inOperatorWithInvalidOperands.errors.txt b/tests/baselines/reference/inOperatorWithInvalidOperands.errors.txt index 9df5357767f..0985157e0da 100644 --- a/tests/baselines/reference/inOperatorWithInvalidOperands.errors.txt +++ b/tests/baselines/reference/inOperatorWithInvalidOperands.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(12,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(13,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(14,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(16,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(17,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(19,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(20,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(12,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(13,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(14,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(16,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(17,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(19,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(20,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(30,16): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(31,16): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(32,16): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter @@ -15,7 +15,7 @@ tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInv tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(37,16): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(38,16): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(39,17): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter -tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(43,11): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(43,11): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInvalidOperands.ts(43,17): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter @@ -33,27 +33,27 @@ tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInv var ra1 = a1 in x; ~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. var ra2 = a2 in x; ~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. var ra3 = a3 in x; ~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. var ra4 = a4 in x; var ra5 = null in x; ~~~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. var ra6 = undefined in x; ~~~~~~~~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. var ra7 = E.a in x; var ra8 = false in x; ~~~~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. var ra9 = {} in x; ~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. // invalid right operands // the right operand is required to be of type Any, an object type, or a type parameter type @@ -98,6 +98,6 @@ tests/cases/conformance/expressions/binaryOperators/inOperator/inOperatorWithInv // both operands are invalid var rc1 = {} in ''; ~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. ~~ !!! error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty54.errors.txt b/tests/baselines/reference/symbolProperty54.errors.txt new file mode 100644 index 00000000000..b634b4edb0f --- /dev/null +++ b/tests/baselines/reference/symbolProperty54.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/es6/Symbols/symbolProperty54.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty54.ts (1 errors) ==== + var obj = { + [Symbol.prototype]: 0 + ~~~~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. + }; \ No newline at end of file diff --git a/tests/baselines/reference/symbolType1.errors.txt b/tests/baselines/reference/symbolType1.errors.txt index db535f57625..00873ccc871 100644 --- a/tests/baselines/reference/symbolType1.errors.txt +++ b/tests/baselines/reference/symbolType1.errors.txt @@ -1,11 +1,16 @@ tests/cases/conformance/es6/Symbols/symbolType1.ts(1,1): error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter. tests/cases/conformance/es6/Symbols/symbolType1.ts(2,19): error TS2359: The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type. +tests/cases/conformance/es6/Symbols/symbolType1.ts(4,19): error TS2359: The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type. -==== tests/cases/conformance/es6/Symbols/symbolType1.ts (2 errors) ==== +==== tests/cases/conformance/es6/Symbols/symbolType1.ts (3 errors) ==== Symbol() instanceof Symbol; ~~~~~~~~ !!! error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter. Symbol instanceof Symbol(); ~~~~~~~~ +!!! error TS2359: The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type. + (Symbol() || {}) instanceof Object; // This one should be okay, it's a valid way of distinguishing types + Symbol instanceof (Symbol() || {}); + ~~~~~~~~~~~~~~~~ !!! error TS2359: The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType1.js b/tests/baselines/reference/symbolType1.js index a3b00871c4e..90fb5405162 100644 --- a/tests/baselines/reference/symbolType1.js +++ b/tests/baselines/reference/symbolType1.js @@ -1,7 +1,11 @@ //// [symbolType1.ts] Symbol() instanceof Symbol; -Symbol instanceof Symbol(); +Symbol instanceof Symbol(); +(Symbol() || {}) instanceof Object; // This one should be okay, it's a valid way of distinguishing types +Symbol instanceof (Symbol() || {}); //// [symbolType1.js] Symbol() instanceof Symbol; Symbol instanceof Symbol(); +(Symbol() || {}) instanceof Object; // This one should be okay, it's a valid way of distinguishing types +Symbol instanceof (Symbol() || {}); diff --git a/tests/baselines/reference/symbolType11.types b/tests/baselines/reference/symbolType11.types new file mode 100644 index 00000000000..ba3a2fec364 --- /dev/null +++ b/tests/baselines/reference/symbolType11.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/es6/Symbols/symbolType11.ts === +var s = Symbol.for("logical"); +>s : symbol +>Symbol.for("logical") : symbol +>Symbol.for : (key: string) => symbol +>Symbol : SymbolConstructor +>for : (key: string) => symbol + +s && s; +>s && s : symbol +>s : symbol +>s : symbol + +s && []; +>s && [] : undefined[] +>s : symbol +>[] : undefined[] + +0 && s; +>0 && s : symbol +>s : symbol + +s || s; +>s || s : symbol +>s : symbol +>s : symbol + +s || 1; +>s || 1 : number | symbol +>s : symbol + +({}) || s; +>({}) || s : symbol | {} +>({}) : {} +>{} : {} +>s : symbol + diff --git a/tests/baselines/reference/symbolType12.errors.txt b/tests/baselines/reference/symbolType12.errors.txt new file mode 100644 index 00000000000..85db01ff5d2 --- /dev/null +++ b/tests/baselines/reference/symbolType12.errors.txt @@ -0,0 +1,136 @@ +tests/cases/conformance/es6/Symbols/symbolType12.ts(3,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(3,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(4,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(5,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(5,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(6,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(7,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(7,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(8,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(9,1): error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(10,1): error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'number'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(11,1): error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(12,8): error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(13,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(13,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(14,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(15,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(15,7): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(16,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(17,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(17,7): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(18,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(19,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(19,8): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(20,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(21,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(21,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(22,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(23,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(23,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(24,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(25,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(25,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(26,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType12.ts(28,8): error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolType12.ts (35 errors) ==== + var s = Symbol.for("assign"); + var str = ""; + s *= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s *= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s /= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s /= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s %= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s %= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s += s; + ~~~~~~ +!!! error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'symbol'. + s += 0; + ~~~~~~ +!!! error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'number'. + s += ""; + ~ +!!! error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. + str += s; + ~ +!!! error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. + s -= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s -= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s <<= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s <<= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >>= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >>= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >>>= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s >>>= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s &= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s &= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s ^= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s ^= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s |= s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s |= 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + str += (s || str); + ~~~~~~~~~~ +!!! error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType12.js b/tests/baselines/reference/symbolType12.js index 05d7fa03eb6..069846e136f 100644 --- a/tests/baselines/reference/symbolType12.js +++ b/tests/baselines/reference/symbolType12.js @@ -24,7 +24,9 @@ s &= 0; s ^= s; s ^= 0; s |= s; -s |= 0; +s |= 0; + +str += (s || str); //// [symbolType12.js] var s = Symbol.for("assign"); @@ -53,3 +55,4 @@ s ^= s; s ^= 0; s |= s; s |= 0; +str += (s || str); diff --git a/tests/baselines/reference/symbolType13.errors.txt b/tests/baselines/reference/symbolType13.errors.txt new file mode 100644 index 00000000000..68981d0072b --- /dev/null +++ b/tests/baselines/reference/symbolType13.errors.txt @@ -0,0 +1,18 @@ +tests/cases/conformance/es6/Symbols/symbolType13.ts(4,6): error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. +tests/cases/conformance/es6/Symbols/symbolType13.ts(5,11): error TS2407: The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter. +tests/cases/conformance/es6/Symbols/symbolType13.ts(6,15): error TS2407: The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter. + + +==== tests/cases/conformance/es6/Symbols/symbolType13.ts (3 errors) ==== + var s = Symbol(); + var x: any; + + for (s in {}) { } + ~ +!!! error TS2405: The left-hand side of a 'for...in' statement must be of type 'string' or 'any'. + for (x in s) { } + ~ +!!! error TS2407: The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter. + for (var y in s) { } + ~ +!!! error TS2407: The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType2.errors.txt b/tests/baselines/reference/symbolType2.errors.txt new file mode 100644 index 00000000000..441db917718 --- /dev/null +++ b/tests/baselines/reference/symbolType2.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/es6/Symbols/symbolType2.ts(2,7): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter + + +==== tests/cases/conformance/es6/Symbols/symbolType2.ts (1 errors) ==== + Symbol.isConcatSpreadable in {}; + "" in Symbol.toPrimitive; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter \ No newline at end of file diff --git a/tests/baselines/reference/symbolType3.errors.txt b/tests/baselines/reference/symbolType3.errors.txt new file mode 100644 index 00000000000..384ccb06c05 --- /dev/null +++ b/tests/baselines/reference/symbolType3.errors.txt @@ -0,0 +1,33 @@ +tests/cases/conformance/es6/Symbols/symbolType3.ts(5,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType3.ts(6,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType3.ts(7,3): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(8,3): error TS2469: The '-' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(9,3): error TS2469: The '~' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(12,2): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolType3.ts (6 errors) ==== + var s = Symbol(); + delete Symbol.iterator; + void Symbol.toPrimitive; + typeof Symbol.toStringTag; + ++s; + ~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + --s; + ~ +!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + + Symbol(); + ~~~~~~~~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + - Symbol(); + ~~~~~~~~ +!!! error TS2469: The '-' operator cannot be applied to a value of type 'symbol'. + ~ Symbol(); + ~~~~~~~~ +!!! error TS2469: The '~' operator cannot be applied to a value of type 'symbol'. + ! Symbol(); + + +(Symbol() || 0); + ~~~~~~~~~~~~~~~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType3.js b/tests/baselines/reference/symbolType3.js index 088449a3a89..4f599dacbe0 100644 --- a/tests/baselines/reference/symbolType3.js +++ b/tests/baselines/reference/symbolType3.js @@ -8,7 +8,9 @@ typeof Symbol.toStringTag; + Symbol(); - Symbol(); ~ Symbol(); -! Symbol(); +! Symbol(); + ++(Symbol() || 0); //// [symbolType3.js] var s = Symbol(); @@ -21,3 +23,4 @@ typeof Symbol.toStringTag; -Symbol(); ~Symbol(); !Symbol(); ++(Symbol() || 0); diff --git a/tests/baselines/reference/symbolType6.errors.txt b/tests/baselines/reference/symbolType6.errors.txt new file mode 100644 index 00000000000..9ad7321063f --- /dev/null +++ b/tests/baselines/reference/symbolType6.errors.txt @@ -0,0 +1,57 @@ +tests/cases/conformance/es6/Symbols/symbolType6.ts(3,1): error TS2365: Operator '+' cannot be applied to types 'symbol' and 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(4,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType6.ts(4,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType6.ts(5,1): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(6,1): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(7,1): error TS2365: Operator '+' cannot be applied to types 'symbol' and 'number'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(8,6): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(9,5): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(10,1): error TS2365: Operator '+' cannot be applied to types 'number' and 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(11,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType6.ts(12,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. +tests/cases/conformance/es6/Symbols/symbolType6.ts(14,1): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(15,6): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolType6.ts (13 errors) ==== + var s = Symbol.for("add"); + var a: any; + s + s; + ~~~~~ +!!! error TS2365: Operator '+' cannot be applied to types 'symbol' and 'symbol'. + s - s; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + s + ""; + ~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + s + a; + ~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + s + 0; + ~~~~~ +!!! error TS2365: Operator '+' cannot be applied to types 'symbol' and 'number'. + "" + s; + ~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + a + s; + ~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + 0 + s; + ~~~~~ +!!! error TS2365: Operator '+' cannot be applied to types 'number' and 'symbol'. + s - 0; + ~ +!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + 0 - s; + ~ +!!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. + + (s || "") + ""; + ~~~~~~~~~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. + "" + (s || ""); + ~~~~~~~~~ +!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType6.js b/tests/baselines/reference/symbolType6.js index ad16baa28b4..b316f48cf03 100644 --- a/tests/baselines/reference/symbolType6.js +++ b/tests/baselines/reference/symbolType6.js @@ -1,21 +1,32 @@ //// [symbolType6.ts] var s = Symbol.for("add"); +var a: any; s + s; s - s; s + ""; +s + a; s + 0; "" + s; +a + s; 0 + s; s - 0; -0 - s; +0 - s; + +(s || "") + ""; +"" + (s || ""); //// [symbolType6.js] var s = Symbol.for("add"); +var a; s + s; s - s; s + ""; +s + a; s + 0; "" + s; +a + s; 0 + s; s - 0; 0 - s; +(s || "") + ""; +"" + (s || ""); diff --git a/tests/baselines/reference/symbolType8.errors.txt b/tests/baselines/reference/symbolType8.errors.txt new file mode 100644 index 00000000000..e72d0d619e4 --- /dev/null +++ b/tests/baselines/reference/symbolType8.errors.txt @@ -0,0 +1,45 @@ +tests/cases/conformance/es6/Symbols/symbolType8.ts(2,1): error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(3,1): error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(4,1): error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(5,1): error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(6,1): error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(7,1): error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(8,1): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(9,1): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(11,6): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(12,1): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolType8.ts (10 errors) ==== + var s = Symbol.for("compare"); + s < s; + ~ +!!! error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. + s < 0; + ~ +!!! error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. + s > s; + ~ +!!! error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. + s > 0; + ~ +!!! error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. + s <= s; + ~ +!!! error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. + s <= 0; + ~ +!!! error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. + s >= s; + ~ +!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. + s >= 0; + ~ +!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. + + 0 >= (s || 0); + ~~~~~~~~ +!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. + (s || 0) >= s; + ~~~~~~~~ +!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType8.js b/tests/baselines/reference/symbolType8.js index e80dea220b9..7e56416ca84 100644 --- a/tests/baselines/reference/symbolType8.js +++ b/tests/baselines/reference/symbolType8.js @@ -7,7 +7,10 @@ s > 0; s <= s; s <= 0; s >= s; -s >= 0; +s >= 0; + +0 >= (s || 0); +(s || 0) >= s; //// [symbolType8.js] var s = Symbol.for("compare"); @@ -19,3 +22,5 @@ s <= s; s <= 0; s >= s; s >= 0; +0 >= (s || 0); +(s || 0) >= s; diff --git a/tests/baselines/reference/widenedTypes.errors.txt b/tests/baselines/reference/widenedTypes.errors.txt index 7374bd23b77..2277ef6eea7 100644 --- a/tests/baselines/reference/widenedTypes.errors.txt +++ b/tests/baselines/reference/widenedTypes.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/widenedTypes.ts(2,1): error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter. -tests/cases/compiler/widenedTypes.ts(5,1): error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +tests/cases/compiler/widenedTypes.ts(5,1): error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. tests/cases/compiler/widenedTypes.ts(6,7): error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter tests/cases/compiler/widenedTypes.ts(8,15): error TS2407: The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter. tests/cases/compiler/widenedTypes.ts(11,1): error TS2322: Type 'string' is not assignable to type 'number'. @@ -20,7 +20,7 @@ tests/cases/compiler/widenedTypes.ts(24,5): error TS2322: Type '{ [x: string]: n null in {}; ~~~~ -!!! error TS2360: The left-hand side of an 'in' expression must be of types 'any', 'string' or 'number'. +!!! error TS2360: The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'. "" in null; ~~~~ !!! error TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter diff --git a/tests/cases/conformance/es6/Symbols/symbolType1.ts b/tests/cases/conformance/es6/Symbols/symbolType1.ts index 3945ecc76e8..3a7339fbeb7 100644 --- a/tests/cases/conformance/es6/Symbols/symbolType1.ts +++ b/tests/cases/conformance/es6/Symbols/symbolType1.ts @@ -1,3 +1,5 @@ //@target: ES6 Symbol() instanceof Symbol; -Symbol instanceof Symbol(); \ No newline at end of file +Symbol instanceof Symbol(); +(Symbol() || {}) instanceof Object; // This one should be okay, it's a valid way of distinguishing types +Symbol instanceof (Symbol() || {}); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType12.ts b/tests/cases/conformance/es6/Symbols/symbolType12.ts index 7197c13497d..44852bc10e6 100644 --- a/tests/cases/conformance/es6/Symbols/symbolType12.ts +++ b/tests/cases/conformance/es6/Symbols/symbolType12.ts @@ -24,4 +24,6 @@ s &= 0; s ^= s; s ^= 0; s |= s; -s |= 0; \ No newline at end of file +s |= 0; + +str += (s || str); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType3.ts b/tests/cases/conformance/es6/Symbols/symbolType3.ts index ca098fe0695..b5855ecab41 100644 --- a/tests/cases/conformance/es6/Symbols/symbolType3.ts +++ b/tests/cases/conformance/es6/Symbols/symbolType3.ts @@ -8,4 +8,6 @@ typeof Symbol.toStringTag; + Symbol(); - Symbol(); ~ Symbol(); -! Symbol(); \ No newline at end of file +! Symbol(); + ++(Symbol() || 0); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType6.ts b/tests/cases/conformance/es6/Symbols/symbolType6.ts index b6f58ac5b29..2efa682b98f 100644 --- a/tests/cases/conformance/es6/Symbols/symbolType6.ts +++ b/tests/cases/conformance/es6/Symbols/symbolType6.ts @@ -1,10 +1,16 @@ //@target: ES6 var s = Symbol.for("add"); +var a: any; s + s; s - s; s + ""; +s + a; s + 0; "" + s; +a + s; 0 + s; s - 0; -0 - s; \ No newline at end of file +0 - s; + +(s || "") + ""; +"" + (s || ""); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType8.ts b/tests/cases/conformance/es6/Symbols/symbolType8.ts index 4970ae0a9ca..b3bc68094c7 100644 --- a/tests/cases/conformance/es6/Symbols/symbolType8.ts +++ b/tests/cases/conformance/es6/Symbols/symbolType8.ts @@ -7,4 +7,7 @@ s > 0; s <= s; s <= 0; s >= s; -s >= 0; \ No newline at end of file +s >= 0; + +0 >= (s || 0); +(s || 0) >= s; \ No newline at end of file From 6a6c03b9b79bbd158eab7acc01a740de6b1b5df2 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 4 Feb 2015 19:32:13 -0800 Subject: [PATCH 020/106] Fix error message wording --- src/compiler/checker.ts | 2 +- src/compiler/diagnosticInformationMap.generated.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- .../reference/baseTypePrivateMemberClash.errors.txt | 4 ++-- .../callSignaturesThatDifferOnlyByReturnType2.errors.txt | 4 ++-- .../reference/conflictingMemberTypesInBases.errors.txt | 4 ++-- .../genericAndNonGenericInheritedSignature1.errors.txt | 4 ++-- .../genericAndNonGenericInheritedSignature2.errors.txt | 4 ++-- ...meNamePrivatePropertiesFromDifferentOrigins.errors.txt | 4 ++-- ...tSameNamePropertiesWithDifferentOptionality.errors.txt | 4 ++-- ...itSameNamePropertiesWithDifferentVisibility.errors.txt | 4 ++-- .../baselines/reference/interfaceDeclaration1.errors.txt | 4 ++-- .../interfaceExtendingClassWithPrivates2.errors.txt | 4 ++-- .../interfaceExtendingClassWithProtecteds2.errors.txt | 4 ++-- .../reference/interfaceImplementation7.errors.txt | 4 ++-- .../reference/interfacePropertiesWithSameName2.errors.txt | 8 ++++---- .../reference/interfacePropertiesWithSameName3.errors.txt | 8 ++++---- .../reference/interfaceWithMultipleBaseTypes.errors.txt | 4 ++-- .../mergedInterfacesWithInheritedPrivates3.errors.txt | 8 ++++---- .../mergedInterfacesWithMultipleBases4.errors.txt | 4 ++-- ...ipleBaseInterfaesWithIncompatibleProperties.errors.txt | 4 ++-- 21 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d513066cc04..af36448cbfe 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8999,7 +8999,7 @@ module ts { var typeName1 = typeToString(existing.containingType); var typeName2 = typeToString(base); - var errorInfo = chainDiagnosticMessages(undefined, Diagnostics.Named_properties_0_of_types_1_and_2_are_not_identical, prop.name, typeName1, typeName2); + var errorInfo = chainDiagnosticMessages(undefined, Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, prop.name, typeName1, typeName2); errorInfo = chainDiagnosticMessages(errorInfo, Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2); diagnostics.add(createDiagnosticForNodeFromMessageChain(typeNode, errorInfo)); } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 922044bdaf5..34f9c50eaad 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -167,7 +167,7 @@ module ts { Global_type_0_must_be_a_class_or_interface_type: { code: 2316, category: DiagnosticCategory.Error, key: "Global type '{0}' must be a class or interface type." }, Global_type_0_must_have_1_type_parameter_s: { code: 2317, category: DiagnosticCategory.Error, key: "Global type '{0}' must have {1} type parameter(s)." }, Cannot_find_global_type_0: { code: 2318, category: DiagnosticCategory.Error, key: "Cannot find global type '{0}'." }, - Named_properties_0_of_types_1_and_2_are_not_identical: { code: 2319, category: DiagnosticCategory.Error, key: "Named properties '{0}' of types '{1}' and '{2}' are not identical." }, + Named_property_0_of_types_1_and_2_are_not_identical: { code: 2319, category: DiagnosticCategory.Error, key: "Named property '{0}' of types '{1}' and '{2}' are not identical." }, Interface_0_cannot_simultaneously_extend_types_1_and_2: { code: 2320, category: DiagnosticCategory.Error, key: "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'." }, Excessive_stack_depth_comparing_types_0_and_1: { code: 2321, category: DiagnosticCategory.Error, key: "Excessive stack depth comparing types '{0}' and '{1}'." }, Type_0_is_not_assignable_to_type_1: { code: 2322, category: DiagnosticCategory.Error, key: "Type '{0}' is not assignable to type '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index fb170548614..1fd7cb7356b 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -661,7 +661,7 @@ "category": "Error", "code": 2318 }, - "Named properties '{0}' of types '{1}' and '{2}' are not identical.": { + "Named property '{0}' of types '{1}' and '{2}' are not identical.": { "category": "Error", "code": 2319 }, diff --git a/tests/baselines/reference/baseTypePrivateMemberClash.errors.txt b/tests/baselines/reference/baseTypePrivateMemberClash.errors.txt index eca303ff72c..28e66844696 100644 --- a/tests/baselines/reference/baseTypePrivateMemberClash.errors.txt +++ b/tests/baselines/reference/baseTypePrivateMemberClash.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/baseTypePrivateMemberClash.ts(8,11): error TS2320: Interface 'Z' cannot simultaneously extend types 'X' and 'Y'. - Named properties 'm' of types 'X' and 'Y' are not identical. + Named property 'm' of types 'X' and 'Y' are not identical. ==== tests/cases/compiler/baseTypePrivateMemberClash.ts (1 errors) ==== @@ -13,4 +13,4 @@ tests/cases/compiler/baseTypePrivateMemberClash.ts(8,11): error TS2320: Interfac interface Z extends X, Y { } ~ !!! error TS2320: Interface 'Z' cannot simultaneously extend types 'X' and 'Y'. -!!! error TS2320: Named properties 'm' of types 'X' and 'Y' are not identical. \ No newline at end of file +!!! error TS2320: Named property 'm' of types 'X' and 'Y' are not identical. \ No newline at end of file diff --git a/tests/baselines/reference/callSignaturesThatDifferOnlyByReturnType2.errors.txt b/tests/baselines/reference/callSignaturesThatDifferOnlyByReturnType2.errors.txt index 5fabfd0b7ad..4ff65843eba 100644 --- a/tests/baselines/reference/callSignaturesThatDifferOnlyByReturnType2.errors.txt +++ b/tests/baselines/reference/callSignaturesThatDifferOnlyByReturnType2.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesThatDifferOnlyByReturnType2.ts(8,11): error TS2320: Interface 'A' cannot simultaneously extend types 'I' and 'I'. - Named properties 'foo' of types 'I' and 'I' are not identical. + Named property 'foo' of types 'I' and 'I' are not identical. tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesThatDifferOnlyByReturnType2.ts(13,16): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. @@ -14,7 +14,7 @@ tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesTha interface A extends I, I { } ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'I' and 'I'. -!!! error TS2320: Named properties 'foo' of types 'I' and 'I' are not identical. +!!! error TS2320: Named property 'foo' of types 'I' and 'I' are not identical. var x: A; // BUG 822524 diff --git a/tests/baselines/reference/conflictingMemberTypesInBases.errors.txt b/tests/baselines/reference/conflictingMemberTypesInBases.errors.txt index 58fdcb4c7ae..07e7a64ec1f 100644 --- a/tests/baselines/reference/conflictingMemberTypesInBases.errors.txt +++ b/tests/baselines/reference/conflictingMemberTypesInBases.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/conflictingMemberTypesInBases.ts(12,11): error TS2320: Interface 'E' cannot simultaneously extend types 'B' and 'D'. - Named properties 'm' of types 'B' and 'D' are not identical. + Named property 'm' of types 'B' and 'D' are not identical. ==== tests/cases/compiler/conflictingMemberTypesInBases.ts (1 errors) ==== @@ -17,6 +17,6 @@ tests/cases/compiler/conflictingMemberTypesInBases.ts(12,11): error TS2320: Inte interface E extends B { } // Error here for extending B and D ~ !!! error TS2320: Interface 'E' cannot simultaneously extend types 'B' and 'D'. -!!! error TS2320: Named properties 'm' of types 'B' and 'D' are not identical. +!!! error TS2320: Named property 'm' of types 'B' and 'D' are not identical. interface E extends D { } // No duplicate error here \ No newline at end of file diff --git a/tests/baselines/reference/genericAndNonGenericInheritedSignature1.errors.txt b/tests/baselines/reference/genericAndNonGenericInheritedSignature1.errors.txt index 63ff9d9313e..7180dc7c25b 100644 --- a/tests/baselines/reference/genericAndNonGenericInheritedSignature1.errors.txt +++ b/tests/baselines/reference/genericAndNonGenericInheritedSignature1.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/genericAndNonGenericInheritedSignature1.ts(7,11): error TS2320: Interface 'Hello' cannot simultaneously extend types 'Foo' and 'Bar'. - Named properties 'f' of types 'Foo' and 'Bar' are not identical. + Named property 'f' of types 'Foo' and 'Bar' are not identical. ==== tests/cases/compiler/genericAndNonGenericInheritedSignature1.ts (1 errors) ==== @@ -12,6 +12,6 @@ tests/cases/compiler/genericAndNonGenericInheritedSignature1.ts(7,11): error TS2 interface Hello extends Foo, Bar { ~~~~~ !!! error TS2320: Interface 'Hello' cannot simultaneously extend types 'Foo' and 'Bar'. -!!! error TS2320: Named properties 'f' of types 'Foo' and 'Bar' are not identical. +!!! error TS2320: Named property 'f' of types 'Foo' and 'Bar' are not identical. } \ No newline at end of file diff --git a/tests/baselines/reference/genericAndNonGenericInheritedSignature2.errors.txt b/tests/baselines/reference/genericAndNonGenericInheritedSignature2.errors.txt index 05fdd68319e..158fd447923 100644 --- a/tests/baselines/reference/genericAndNonGenericInheritedSignature2.errors.txt +++ b/tests/baselines/reference/genericAndNonGenericInheritedSignature2.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/genericAndNonGenericInheritedSignature2.ts(7,11): error TS2320: Interface 'Hello' cannot simultaneously extend types 'Bar' and 'Foo'. - Named properties 'f' of types 'Bar' and 'Foo' are not identical. + Named property 'f' of types 'Bar' and 'Foo' are not identical. ==== tests/cases/compiler/genericAndNonGenericInheritedSignature2.ts (1 errors) ==== @@ -12,6 +12,6 @@ tests/cases/compiler/genericAndNonGenericInheritedSignature2.ts(7,11): error TS2 interface Hello extends Bar, Foo { ~~~~~ !!! error TS2320: Interface 'Hello' cannot simultaneously extend types 'Bar' and 'Foo'. -!!! error TS2320: Named properties 'f' of types 'Bar' and 'Foo' are not identical. +!!! error TS2320: Named property 'f' of types 'Bar' and 'Foo' are not identical. } \ No newline at end of file diff --git a/tests/baselines/reference/inheritSameNamePrivatePropertiesFromDifferentOrigins.errors.txt b/tests/baselines/reference/inheritSameNamePrivatePropertiesFromDifferentOrigins.errors.txt index 555349cc251..e8c47e95fe9 100644 --- a/tests/baselines/reference/inheritSameNamePrivatePropertiesFromDifferentOrigins.errors.txt +++ b/tests/baselines/reference/inheritSameNamePrivatePropertiesFromDifferentOrigins.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/inheritSameNamePrivatePropertiesFromDifferentOrigins.ts(9,11): error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. - Named properties 'x' of types 'C' and 'C2' are not identical. + Named property 'x' of types 'C' and 'C2' are not identical. ==== tests/cases/compiler/inheritSameNamePrivatePropertiesFromDifferentOrigins.ts (1 errors) ==== @@ -14,6 +14,6 @@ tests/cases/compiler/inheritSameNamePrivatePropertiesFromDifferentOrigins.ts(9,1 interface A extends C, C2 { // error ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. -!!! error TS2320: Named properties 'x' of types 'C' and 'C2' are not identical. +!!! error TS2320: Named property 'x' of types 'C' and 'C2' are not identical. y: string; } \ No newline at end of file diff --git a/tests/baselines/reference/inheritSameNamePropertiesWithDifferentOptionality.errors.txt b/tests/baselines/reference/inheritSameNamePropertiesWithDifferentOptionality.errors.txt index 3f9c4a3bae0..f6debbde7ec 100644 --- a/tests/baselines/reference/inheritSameNamePropertiesWithDifferentOptionality.errors.txt +++ b/tests/baselines/reference/inheritSameNamePropertiesWithDifferentOptionality.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/inheritSameNamePropertiesWithDifferentOptionality.ts(9,11): error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. - Named properties 'x' of types 'C' and 'C2' are not identical. + Named property 'x' of types 'C' and 'C2' are not identical. ==== tests/cases/compiler/inheritSameNamePropertiesWithDifferentOptionality.ts (1 errors) ==== @@ -14,6 +14,6 @@ tests/cases/compiler/inheritSameNamePropertiesWithDifferentOptionality.ts(9,11): interface A extends C, C2 { // error ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. -!!! error TS2320: Named properties 'x' of types 'C' and 'C2' are not identical. +!!! error TS2320: Named property 'x' of types 'C' and 'C2' are not identical. y: string; } \ No newline at end of file diff --git a/tests/baselines/reference/inheritSameNamePropertiesWithDifferentVisibility.errors.txt b/tests/baselines/reference/inheritSameNamePropertiesWithDifferentVisibility.errors.txt index 9864b4a4792..1865e9f6b78 100644 --- a/tests/baselines/reference/inheritSameNamePropertiesWithDifferentVisibility.errors.txt +++ b/tests/baselines/reference/inheritSameNamePropertiesWithDifferentVisibility.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/inheritSameNamePropertiesWithDifferentVisibility.ts(9,11): error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. - Named properties 'x' of types 'C' and 'C2' are not identical. + Named property 'x' of types 'C' and 'C2' are not identical. ==== tests/cases/compiler/inheritSameNamePropertiesWithDifferentVisibility.ts (1 errors) ==== @@ -14,6 +14,6 @@ tests/cases/compiler/inheritSameNamePropertiesWithDifferentVisibility.ts(9,11): interface A extends C, C2 { // error ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. -!!! error TS2320: Named properties 'x' of types 'C' and 'C2' are not identical. +!!! error TS2320: Named property 'x' of types 'C' and 'C2' are not identical. y: string; } \ No newline at end of file diff --git a/tests/baselines/reference/interfaceDeclaration1.errors.txt b/tests/baselines/reference/interfaceDeclaration1.errors.txt index 1e8cc0c1e68..b73cfef75df 100644 --- a/tests/baselines/reference/interfaceDeclaration1.errors.txt +++ b/tests/baselines/reference/interfaceDeclaration1.errors.txt @@ -7,7 +7,7 @@ tests/cases/compiler/interfaceDeclaration1.ts(35,7): error TS2420: Class 'C1' in Property 'prototype' is missing in type 'C1'. tests/cases/compiler/interfaceDeclaration1.ts(41,11): error TS2310: Type 'i8' recursively references itself as a base type. tests/cases/compiler/interfaceDeclaration1.ts(52,11): error TS2320: Interface 'i12' cannot simultaneously extend types 'i10' and 'i11'. - Named properties 'foo' of types 'i10' and 'i11' are not identical. + Named property 'foo' of types 'i10' and 'i11' are not identical. ==== tests/cases/compiler/interfaceDeclaration1.ts (8 errors) ==== @@ -80,5 +80,5 @@ tests/cases/compiler/interfaceDeclaration1.ts(52,11): error TS2320: Interface 'i interface i12 extends i10, i11 { } ~~~ !!! error TS2320: Interface 'i12' cannot simultaneously extend types 'i10' and 'i11'. -!!! error TS2320: Named properties 'foo' of types 'i10' and 'i11' are not identical. +!!! error TS2320: Named property 'foo' of types 'i10' and 'i11' are not identical. \ No newline at end of file diff --git a/tests/baselines/reference/interfaceExtendingClassWithPrivates2.errors.txt b/tests/baselines/reference/interfaceExtendingClassWithPrivates2.errors.txt index c9be8471e8c..7850c10fe26 100644 --- a/tests/baselines/reference/interfaceExtendingClassWithPrivates2.errors.txt +++ b/tests/baselines/reference/interfaceExtendingClassWithPrivates2.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtendingClassWithPrivates2.ts(9,11): error TS2320: Interface 'I3' cannot simultaneously extend types 'Foo' and 'Bar'. - Named properties 'x' of types 'Foo' and 'Bar' are not identical. + Named property 'x' of types 'Foo' and 'Bar' are not identical. tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtendingClassWithPrivates2.ts(12,11): error TS2430: Interface 'I4' incorrectly extends interface 'Bar'. Property 'x' is private in type 'Bar' but not in type 'I4'. tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtendingClassWithPrivates2.ts(12,11): error TS2430: Interface 'I4' incorrectly extends interface 'Foo'. @@ -20,7 +20,7 @@ tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtending interface I3 extends Foo, Bar { // error ~~ !!! error TS2320: Interface 'I3' cannot simultaneously extend types 'Foo' and 'Bar'. -!!! error TS2320: Named properties 'x' of types 'Foo' and 'Bar' are not identical. +!!! error TS2320: Named property 'x' of types 'Foo' and 'Bar' are not identical. } interface I4 extends Foo, Bar { // error diff --git a/tests/baselines/reference/interfaceExtendingClassWithProtecteds2.errors.txt b/tests/baselines/reference/interfaceExtendingClassWithProtecteds2.errors.txt index a63dfd6efca..48e3b7d7e6c 100644 --- a/tests/baselines/reference/interfaceExtendingClassWithProtecteds2.errors.txt +++ b/tests/baselines/reference/interfaceExtendingClassWithProtecteds2.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtendingClassWithProtecteds2.ts(9,11): error TS2320: Interface 'I3' cannot simultaneously extend types 'Foo' and 'Bar'. - Named properties 'x' of types 'Foo' and 'Bar' are not identical. + Named property 'x' of types 'Foo' and 'Bar' are not identical. tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtendingClassWithProtecteds2.ts(12,11): error TS2430: Interface 'I4' incorrectly extends interface 'Bar'. Property 'x' is protected but type 'I4' is not a class derived from 'Bar'. tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtendingClassWithProtecteds2.ts(12,11): error TS2430: Interface 'I4' incorrectly extends interface 'Foo'. @@ -20,7 +20,7 @@ tests/cases/conformance/interfaces/interfacesExtendingClasses/interfaceExtending interface I3 extends Foo, Bar { // error ~~ !!! error TS2320: Interface 'I3' cannot simultaneously extend types 'Foo' and 'Bar'. -!!! error TS2320: Named properties 'x' of types 'Foo' and 'Bar' are not identical. +!!! error TS2320: Named property 'x' of types 'Foo' and 'Bar' are not identical. } interface I4 extends Foo, Bar { // error diff --git a/tests/baselines/reference/interfaceImplementation7.errors.txt b/tests/baselines/reference/interfaceImplementation7.errors.txt index ff1118e5c69..b297015dfbe 100644 --- a/tests/baselines/reference/interfaceImplementation7.errors.txt +++ b/tests/baselines/reference/interfaceImplementation7.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/interfaceImplementation7.ts(4,11): error TS2320: Interface 'i3' cannot simultaneously extend types 'i1' and 'i2'. - Named properties 'name' of types 'i1' and 'i2' are not identical. + Named property 'name' of types 'i1' and 'i2' are not identical. tests/cases/compiler/interfaceImplementation7.ts(7,7): error TS2420: Class 'C1' incorrectly implements interface 'i4'. Types of property 'name' are incompatible. Type '() => string' is not assignable to type '() => { s: string; n: number; }'. @@ -14,7 +14,7 @@ tests/cases/compiler/interfaceImplementation7.ts(7,7): error TS2420: Class 'C1' interface i3 extends i1, i2 { } ~~ !!! error TS2320: Interface 'i3' cannot simultaneously extend types 'i1' and 'i2'. -!!! error TS2320: Named properties 'name' of types 'i1' and 'i2' are not identical. +!!! error TS2320: Named property 'name' of types 'i1' and 'i2' are not identical. interface i4 extends i1, i2 { name(): { s: string; n: number; }; } class C1 implements i4 { diff --git a/tests/baselines/reference/interfacePropertiesWithSameName2.errors.txt b/tests/baselines/reference/interfacePropertiesWithSameName2.errors.txt index a7df9c15e59..82301d9ae16 100644 --- a/tests/baselines/reference/interfacePropertiesWithSameName2.errors.txt +++ b/tests/baselines/reference/interfacePropertiesWithSameName2.errors.txt @@ -1,7 +1,7 @@ tests/cases/compiler/interfacePropertiesWithSameName2.ts(10,11): error TS2320: Interface 'MoverShaker' cannot simultaneously extend types 'Mover' and 'Shaker'. - Named properties 'getStatus' of types 'Mover' and 'Shaker' are not identical. + Named property 'getStatus' of types 'Mover' and 'Shaker' are not identical. tests/cases/compiler/interfacePropertiesWithSameName2.ts(26,11): error TS2320: Interface 'MoverShaker2' cannot simultaneously extend types 'Mover' and 'Shaker'. - Named properties 'getStatus' of types 'Mover' and 'Shaker' are not identical. + Named property 'getStatus' of types 'Mover' and 'Shaker' are not identical. ==== tests/cases/compiler/interfacePropertiesWithSameName2.ts (2 errors) ==== @@ -17,7 +17,7 @@ tests/cases/compiler/interfacePropertiesWithSameName2.ts(26,11): error TS2320: I interface MoverShaker extends Mover, Shaker { ~~~~~~~~~~~ !!! error TS2320: Interface 'MoverShaker' cannot simultaneously extend types 'Mover' and 'Shaker'. -!!! error TS2320: Named properties 'getStatus' of types 'Mover' and 'Shaker' are not identical. +!!! error TS2320: Named property 'getStatus' of types 'Mover' and 'Shaker' are not identical. } @@ -36,7 +36,7 @@ tests/cases/compiler/interfacePropertiesWithSameName2.ts(26,11): error TS2320: I interface MoverShaker2 extends MoversAndShakers.Mover, MoversAndShakers.Shaker { } // error ~~~~~~~~~~~~ !!! error TS2320: Interface 'MoverShaker2' cannot simultaneously extend types 'Mover' and 'Shaker'. -!!! error TS2320: Named properties 'getStatus' of types 'Mover' and 'Shaker' are not identical. +!!! error TS2320: Named property 'getStatus' of types 'Mover' and 'Shaker' are not identical. interface MoverShaker3 extends MoversAndShakers.Mover, MoversAndShakers.Shaker { getStatus(): { speed: number; frequency: number; }; // ok because this getStatus overrides the conflicting ones above diff --git a/tests/baselines/reference/interfacePropertiesWithSameName3.errors.txt b/tests/baselines/reference/interfacePropertiesWithSameName3.errors.txt index b7dfdffc79e..cc333e0e054 100644 --- a/tests/baselines/reference/interfacePropertiesWithSameName3.errors.txt +++ b/tests/baselines/reference/interfacePropertiesWithSameName3.errors.txt @@ -1,7 +1,7 @@ tests/cases/compiler/interfacePropertiesWithSameName3.ts(3,11): error TS2320: Interface 'F' cannot simultaneously extend types 'E' and 'D'. - Named properties 'a' of types 'E' and 'D' are not identical. + Named property 'a' of types 'E' and 'D' are not identical. tests/cases/compiler/interfacePropertiesWithSameName3.ts(7,11): error TS2320: Interface 'F2' cannot simultaneously extend types 'E2' and 'D2'. - Named properties 'a' of types 'E2' and 'D2' are not identical. + Named property 'a' of types 'E2' and 'D2' are not identical. ==== tests/cases/compiler/interfacePropertiesWithSameName3.ts (2 errors) ==== @@ -10,12 +10,12 @@ tests/cases/compiler/interfacePropertiesWithSameName3.ts(7,11): error TS2320: In interface F extends E, D { } // error ~ !!! error TS2320: Interface 'F' cannot simultaneously extend types 'E' and 'D'. -!!! error TS2320: Named properties 'a' of types 'E' and 'D' are not identical. +!!! error TS2320: Named property 'a' of types 'E' and 'D' are not identical. class D2 { a: number; } class E2 { a: string; } interface F2 extends E2, D2 { } // error ~~ !!! error TS2320: Interface 'F2' cannot simultaneously extend types 'E2' and 'D2'. -!!! error TS2320: Named properties 'a' of types 'E2' and 'D2' are not identical. +!!! error TS2320: Named property 'a' of types 'E2' and 'D2' are not identical. \ No newline at end of file diff --git a/tests/baselines/reference/interfaceWithMultipleBaseTypes.errors.txt b/tests/baselines/reference/interfaceWithMultipleBaseTypes.errors.txt index 1562e16df4d..95adbbf6717 100644 --- a/tests/baselines/reference/interfaceWithMultipleBaseTypes.errors.txt +++ b/tests/baselines/reference/interfaceWithMultipleBaseTypes.errors.txt @@ -4,7 +4,7 @@ tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithMultipleBa Types of property 'b' are incompatible. Type 'number' is not assignable to type 'string'. tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithMultipleBaseTypes.ts(52,15): error TS2320: Interface 'Derived3' cannot simultaneously extend types 'Base1' and 'Base2'. - Named properties 'x' of types 'Base1' and 'Base2' are not identical. + Named property 'x' of types 'Base1' and 'Base2' are not identical. tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithMultipleBaseTypes.ts(54,15): error TS2430: Interface 'Derived4' incorrectly extends interface 'Base1'. Types of property 'x' are incompatible. Type '{ a: T; b: T; }' is not assignable to type '{ a: number; }'. @@ -86,7 +86,7 @@ tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithMultipleBa interface Derived3 extends Base1, Base2 { } // error ~~~~~~~~ !!! error TS2320: Interface 'Derived3' cannot simultaneously extend types 'Base1' and 'Base2'. -!!! error TS2320: Named properties 'x' of types 'Base1' and 'Base2' are not identical. +!!! error TS2320: Named property 'x' of types 'Base1' and 'Base2' are not identical. interface Derived4 extends Base1, Base2 { // error ~~~~~~~~ diff --git a/tests/baselines/reference/mergedInterfacesWithInheritedPrivates3.errors.txt b/tests/baselines/reference/mergedInterfacesWithInheritedPrivates3.errors.txt index 4c49e6beb0c..584edc24bb5 100644 --- a/tests/baselines/reference/mergedInterfacesWithInheritedPrivates3.errors.txt +++ b/tests/baselines/reference/mergedInterfacesWithInheritedPrivates3.errors.txt @@ -1,7 +1,7 @@ tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithInheritedPrivates3.ts(9,11): error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. - Named properties 'x' of types 'C' and 'C2' are not identical. + Named property 'x' of types 'C' and 'C2' are not identical. tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithInheritedPrivates3.ts(31,15): error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. - Named properties 'x' of types 'C' and 'C2' are not identical. + Named property 'x' of types 'C' and 'C2' are not identical. ==== tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithInheritedPrivates3.ts (2 errors) ==== @@ -16,7 +16,7 @@ tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithInheri interface A extends C { // error ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. -!!! error TS2320: Named properties 'x' of types 'C' and 'C2' are not identical. +!!! error TS2320: Named property 'x' of types 'C' and 'C2' are not identical. y: string; } @@ -41,7 +41,7 @@ tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithInheri interface A extends C { // error, privates conflict ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C2'. -!!! error TS2320: Named properties 'x' of types 'C' and 'C2' are not identical. +!!! error TS2320: Named property 'x' of types 'C' and 'C2' are not identical. y: string; } diff --git a/tests/baselines/reference/mergedInterfacesWithMultipleBases4.errors.txt b/tests/baselines/reference/mergedInterfacesWithMultipleBases4.errors.txt index 1e11dc792f1..f7ea6fbc2a0 100644 --- a/tests/baselines/reference/mergedInterfacesWithMultipleBases4.errors.txt +++ b/tests/baselines/reference/mergedInterfacesWithMultipleBases4.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases4.ts(19,11): error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C'. - Named properties 'a' of types 'C' and 'C' are not identical. + Named property 'a' of types 'C' and 'C' are not identical. ==== tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases4.ts (1 errors) ==== @@ -24,7 +24,7 @@ tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultip interface A extends C, C3 { // error ~ !!! error TS2320: Interface 'A' cannot simultaneously extend types 'C' and 'C'. -!!! error TS2320: Named properties 'a' of types 'C' and 'C' are not identical. +!!! error TS2320: Named property 'a' of types 'C' and 'C' are not identical. y: T; } diff --git a/tests/baselines/reference/multipleBaseInterfaesWithIncompatibleProperties.errors.txt b/tests/baselines/reference/multipleBaseInterfaesWithIncompatibleProperties.errors.txt index 633f544a67b..70db70de97b 100644 --- a/tests/baselines/reference/multipleBaseInterfaesWithIncompatibleProperties.errors.txt +++ b/tests/baselines/reference/multipleBaseInterfaesWithIncompatibleProperties.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/multipleBaseInterfaesWithIncompatibleProperties.ts(6,11): error TS2320: Interface 'C' cannot simultaneously extend types 'A' and 'A'. - Named properties 'x' of types 'A' and 'A' are not identical. + Named property 'x' of types 'A' and 'A' are not identical. ==== tests/cases/compiler/multipleBaseInterfaesWithIncompatibleProperties.ts (1 errors) ==== @@ -11,5 +11,5 @@ tests/cases/compiler/multipleBaseInterfaesWithIncompatibleProperties.ts(6,11): e interface C extends A, A { } ~ !!! error TS2320: Interface 'C' cannot simultaneously extend types 'A' and 'A'. -!!! error TS2320: Named properties 'x' of types 'A' and 'A' are not identical. +!!! error TS2320: Named property 'x' of types 'A' and 'A' are not identical. \ No newline at end of file From 92617f5978a9ef2da4b39f578e6b1d376108b593 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 4 Feb 2015 19:43:36 -0800 Subject: [PATCH 021/106] Don't pass prop.name directly for error reporting --- src/compiler/checker.ts | 2 +- .../reference/symbolProperty35.errors.txt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/symbolProperty35.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index af36448cbfe..2e900f3b6ce 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8999,7 +8999,7 @@ module ts { var typeName1 = typeToString(existing.containingType); var typeName2 = typeToString(base); - var errorInfo = chainDiagnosticMessages(undefined, Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, prop.name, typeName1, typeName2); + var errorInfo = chainDiagnosticMessages(undefined, Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, symbolToString(prop), typeName1, typeName2); errorInfo = chainDiagnosticMessages(errorInfo, Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2); diagnostics.add(createDiagnosticForNodeFromMessageChain(typeNode, errorInfo)); } diff --git a/tests/baselines/reference/symbolProperty35.errors.txt b/tests/baselines/reference/symbolProperty35.errors.txt new file mode 100644 index 00000000000..1558f5a3409 --- /dev/null +++ b/tests/baselines/reference/symbolProperty35.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/es6/Symbols/symbolProperty35.ts(8,11): error TS2320: Interface 'I3' cannot simultaneously extend types 'I1' and 'I2'. + Named property '[Symbol.toStringTag]' of types 'I1' and 'I2' are not identical. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty35.ts (1 errors) ==== + interface I1 { + [Symbol.toStringTag](): { x: string } + } + interface I2 { + [Symbol.toStringTag](): { x: number } + } + + interface I3 extends I1, I2 { } + ~~ +!!! error TS2320: Interface 'I3' cannot simultaneously extend types 'I1' and 'I2'. +!!! error TS2320: Named property '[Symbol.toStringTag]' of types 'I1' and 'I2' are not identical. \ No newline at end of file From fbeadbcbd3dfa42f970f66386375e0f21549c670 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 5 Feb 2015 12:19:58 -0800 Subject: [PATCH 022/106] Add test for new Symbol() --- tests/baselines/reference/symbolType14.errors.txt | 7 +++++++ tests/baselines/reference/symbolType14.js | 5 +++++ tests/cases/conformance/es6/Symbols/symbolType14.ts | 2 ++ 3 files changed, 14 insertions(+) create mode 100644 tests/baselines/reference/symbolType14.errors.txt create mode 100644 tests/baselines/reference/symbolType14.js create mode 100644 tests/cases/conformance/es6/Symbols/symbolType14.ts diff --git a/tests/baselines/reference/symbolType14.errors.txt b/tests/baselines/reference/symbolType14.errors.txt new file mode 100644 index 00000000000..a31230efe23 --- /dev/null +++ b/tests/baselines/reference/symbolType14.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/Symbols/symbolType14.ts(1,1): error TS2350: Only a void function can be called with the 'new' keyword. + + +==== tests/cases/conformance/es6/Symbols/symbolType14.ts (1 errors) ==== + new Symbol(); + ~~~~~~~~~~~~ +!!! error TS2350: Only a void function can be called with the 'new' keyword. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType14.js b/tests/baselines/reference/symbolType14.js new file mode 100644 index 00000000000..4bbd24f30d9 --- /dev/null +++ b/tests/baselines/reference/symbolType14.js @@ -0,0 +1,5 @@ +//// [symbolType14.ts] +new Symbol(); + +//// [symbolType14.js] +new Symbol(); diff --git a/tests/cases/conformance/es6/Symbols/symbolType14.ts b/tests/cases/conformance/es6/Symbols/symbolType14.ts new file mode 100644 index 00000000000..c20a8be874b --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType14.ts @@ -0,0 +1,2 @@ +//@target: ES6 +new Symbol(); \ No newline at end of file From 9f39a5388ab6cd4a3393938fef16fb7219182b20 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 5 Feb 2015 12:21:25 -0800 Subject: [PATCH 023/106] Make Symbol the apparent type of symbol --- src/compiler/checker.ts | 3 +++ tests/baselines/reference/symbolType11.types | 2 +- .../baselines/reference/symbolType15.errors.txt | 11 +++++++++++ tests/baselines/reference/symbolType15.js | 12 ++++++++++++ tests/baselines/reference/symbolType16.js | 11 +++++++++++ tests/baselines/reference/symbolType16.types | 16 ++++++++++++++++ .../conformance/es6/Symbols/symbolType15.ts | 6 ++++++ .../conformance/es6/Symbols/symbolType16.ts | 7 +++++++ 8 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/symbolType15.errors.txt create mode 100644 tests/baselines/reference/symbolType15.js create mode 100644 tests/baselines/reference/symbolType16.js create mode 100644 tests/baselines/reference/symbolType16.types create mode 100644 tests/cases/conformance/es6/Symbols/symbolType15.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType16.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2e900f3b6ce..b40acf0ea06 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2524,6 +2524,9 @@ module ts { else if (type.flags & TypeFlags.Boolean) { type = globalBooleanType; } + else if (type.flags & TypeFlags.ESSymbol) { + type = globalESSymbolType; + } return type; } diff --git a/tests/baselines/reference/symbolType11.types b/tests/baselines/reference/symbolType11.types index ba3a2fec364..21de110854c 100644 --- a/tests/baselines/reference/symbolType11.types +++ b/tests/baselines/reference/symbolType11.types @@ -30,7 +30,7 @@ s || 1; >s : symbol ({}) || s; ->({}) || s : symbol | {} +>({}) || s : {} >({}) : {} >{} : {} >s : symbol diff --git a/tests/baselines/reference/symbolType15.errors.txt b/tests/baselines/reference/symbolType15.errors.txt new file mode 100644 index 00000000000..eb63e5798d5 --- /dev/null +++ b/tests/baselines/reference/symbolType15.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/es6/Symbols/symbolType15.ts(5,1): error TS2322: Type 'Symbol' is not assignable to type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolType15.ts (1 errors) ==== + var sym: symbol; + var symObj: Symbol; + + symObj = sym; + sym = symObj; + ~~~ +!!! error TS2322: Type 'Symbol' is not assignable to type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType15.js b/tests/baselines/reference/symbolType15.js new file mode 100644 index 00000000000..1c3519d603e --- /dev/null +++ b/tests/baselines/reference/symbolType15.js @@ -0,0 +1,12 @@ +//// [symbolType15.ts] +var sym: symbol; +var symObj: Symbol; + +symObj = sym; +sym = symObj; + +//// [symbolType15.js] +var sym; +var symObj; +symObj = sym; +sym = symObj; diff --git a/tests/baselines/reference/symbolType16.js b/tests/baselines/reference/symbolType16.js new file mode 100644 index 00000000000..65a95dd8365 --- /dev/null +++ b/tests/baselines/reference/symbolType16.js @@ -0,0 +1,11 @@ +//// [symbolType16.ts] +interface Symbol { + newSymbolProp: number; +} + +var sym: symbol; +sym.newSymbolProp; + +//// [symbolType16.js] +var sym; +sym.newSymbolProp; diff --git a/tests/baselines/reference/symbolType16.types b/tests/baselines/reference/symbolType16.types new file mode 100644 index 00000000000..91fdc9978da --- /dev/null +++ b/tests/baselines/reference/symbolType16.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/es6/Symbols/symbolType16.ts === +interface Symbol { +>Symbol : Symbol + + newSymbolProp: number; +>newSymbolProp : number +} + +var sym: symbol; +>sym : symbol + +sym.newSymbolProp; +>sym.newSymbolProp : number +>sym : symbol +>newSymbolProp : number + diff --git a/tests/cases/conformance/es6/Symbols/symbolType15.ts b/tests/cases/conformance/es6/Symbols/symbolType15.ts new file mode 100644 index 00000000000..22f1f9662c0 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType15.ts @@ -0,0 +1,6 @@ +//@target: ES6 +var sym: symbol; +var symObj: Symbol; + +symObj = sym; +sym = symObj; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType16.ts b/tests/cases/conformance/es6/Symbols/symbolType16.ts new file mode 100644 index 00000000000..0421e0ccc02 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType16.ts @@ -0,0 +1,7 @@ +//@target: ES6 +interface Symbol { + newSymbolProp: number; +} + +var sym: symbol; +sym.newSymbolProp; \ No newline at end of file From df826de042f6e18102e44d625bfcba6df111e60a Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 5 Feb 2015 12:30:22 -0800 Subject: [PATCH 024/106] symbols in type guards --- src/compiler/checker.ts | 2 +- tests/baselines/reference/symbolType17.js | 21 ++++++++++++++++ tests/baselines/reference/symbolType17.types | 24 +++++++++++++++++++ tests/baselines/reference/symbolType18.js | 21 ++++++++++++++++ tests/baselines/reference/symbolType18.types | 24 +++++++++++++++++++ tests/baselines/reference/symbolType19.js | 24 +++++++++++++++++++ tests/baselines/reference/symbolType19.types | 23 ++++++++++++++++++ .../conformance/es6/Symbols/symbolType17.ts | 11 +++++++++ .../conformance/es6/Symbols/symbolType18.ts | 11 +++++++++ .../conformance/es6/Symbols/symbolType19.ts | 11 +++++++++ 10 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/symbolType17.js create mode 100644 tests/baselines/reference/symbolType17.types create mode 100644 tests/baselines/reference/symbolType18.js create mode 100644 tests/baselines/reference/symbolType18.types create mode 100644 tests/baselines/reference/symbolType19.js create mode 100644 tests/baselines/reference/symbolType19.types create mode 100644 tests/cases/conformance/es6/Symbols/symbolType17.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType18.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolType19.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b40acf0ea06..17d79081974 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4767,7 +4767,7 @@ module ts { if (assumeTrue) { // Assumed result is true. If check was not for a primitive type, remove all primitive types if (!typeInfo) { - return removeTypesFromUnionType(type, /*typeKind*/ TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.Boolean, /*isOfTypeKind*/ true); + return removeTypesFromUnionType(type, /*typeKind*/ TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.Boolean | TypeFlags.ESSymbol, /*isOfTypeKind*/ true); } // Check was for a primitive type, return that primitive type if it is a subtype if (isTypeSubtypeOf(typeInfo.type, type)) { diff --git a/tests/baselines/reference/symbolType17.js b/tests/baselines/reference/symbolType17.js new file mode 100644 index 00000000000..a00d2cb36f7 --- /dev/null +++ b/tests/baselines/reference/symbolType17.js @@ -0,0 +1,21 @@ +//// [symbolType17.ts] +interface Foo { prop } +var x: symbol | Foo; + +x; +if (typeof x === "symbol") { + x; +} +else { + x; +} + +//// [symbolType17.js] +var x; +x; +if (typeof x === "symbol") { + x; +} +else { + x; +} diff --git a/tests/baselines/reference/symbolType17.types b/tests/baselines/reference/symbolType17.types new file mode 100644 index 00000000000..b86d5a70ff7 --- /dev/null +++ b/tests/baselines/reference/symbolType17.types @@ -0,0 +1,24 @@ +=== tests/cases/conformance/es6/Symbols/symbolType17.ts === +interface Foo { prop } +>Foo : Foo +>prop : any + +var x: symbol | Foo; +>x : symbol | Foo +>Foo : Foo + +x; +>x : symbol | Foo + +if (typeof x === "symbol") { +>typeof x === "symbol" : boolean +>typeof x : string +>x : symbol | Foo + + x; +>x : symbol +} +else { + x; +>x : Foo +} diff --git a/tests/baselines/reference/symbolType18.js b/tests/baselines/reference/symbolType18.js new file mode 100644 index 00000000000..f8a784d2500 --- /dev/null +++ b/tests/baselines/reference/symbolType18.js @@ -0,0 +1,21 @@ +//// [symbolType18.ts] +interface Foo { prop } +var x: symbol | Foo; + +x; +if (typeof x === "object") { + x; +} +else { + x; +} + +//// [symbolType18.js] +var x; +x; +if (typeof x === "object") { + x; +} +else { + x; +} diff --git a/tests/baselines/reference/symbolType18.types b/tests/baselines/reference/symbolType18.types new file mode 100644 index 00000000000..1693c6e2499 --- /dev/null +++ b/tests/baselines/reference/symbolType18.types @@ -0,0 +1,24 @@ +=== tests/cases/conformance/es6/Symbols/symbolType18.ts === +interface Foo { prop } +>Foo : Foo +>prop : any + +var x: symbol | Foo; +>x : symbol | Foo +>Foo : Foo + +x; +>x : symbol | Foo + +if (typeof x === "object") { +>typeof x === "object" : boolean +>typeof x : string +>x : symbol | Foo + + x; +>x : Foo +} +else { + x; +>x : symbol | Foo +} diff --git a/tests/baselines/reference/symbolType19.js b/tests/baselines/reference/symbolType19.js new file mode 100644 index 00000000000..f3ba0e12472 --- /dev/null +++ b/tests/baselines/reference/symbolType19.js @@ -0,0 +1,24 @@ +//// [symbolType19.ts] +enum E { } +var x: symbol | E; + +x; +if (typeof x === "number") { + x; +} +else { + x; +} + +//// [symbolType19.js] +var E; +(function (E) { +})(E || (E = {})); +var x; +x; +if (typeof x === "number") { + x; +} +else { + x; +} diff --git a/tests/baselines/reference/symbolType19.types b/tests/baselines/reference/symbolType19.types new file mode 100644 index 00000000000..d01fbfa87fe --- /dev/null +++ b/tests/baselines/reference/symbolType19.types @@ -0,0 +1,23 @@ +=== tests/cases/conformance/es6/Symbols/symbolType19.ts === +enum E { } +>E : E + +var x: symbol | E; +>x : symbol | E +>E : E + +x; +>x : symbol | E + +if (typeof x === "number") { +>typeof x === "number" : boolean +>typeof x : string +>x : symbol | E + + x; +>x : E +} +else { + x; +>x : symbol +} diff --git a/tests/cases/conformance/es6/Symbols/symbolType17.ts b/tests/cases/conformance/es6/Symbols/symbolType17.ts new file mode 100644 index 00000000000..95824f1794b --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType17.ts @@ -0,0 +1,11 @@ +//@target: ES6 +interface Foo { prop } +var x: symbol | Foo; + +x; +if (typeof x === "symbol") { + x; +} +else { + x; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType18.ts b/tests/cases/conformance/es6/Symbols/symbolType18.ts new file mode 100644 index 00000000000..caa84171737 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType18.ts @@ -0,0 +1,11 @@ +//@target: ES6 +interface Foo { prop } +var x: symbol | Foo; + +x; +if (typeof x === "object") { + x; +} +else { + x; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolType19.ts b/tests/cases/conformance/es6/Symbols/symbolType19.ts new file mode 100644 index 00000000000..85d13b2cbdd --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType19.ts @@ -0,0 +1,11 @@ +//@target: ES6 +enum E { } +var x: symbol | E; + +x; +if (typeof x === "number") { + x; +} +else { + x; +} \ No newline at end of file From d07ed679a01a75b1fd7735da366be3cf5eee796f Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 5 Feb 2015 17:18:32 -0800 Subject: [PATCH 025/106] Support indexing with known symbols --- src/compiler/binder.ts | 2 +- src/compiler/checker.ts | 36 +++++++++++-- src/compiler/utilities.ts | 4 ++ .../reference/symbolProperty17.types | 27 ++++++++++ .../reference/symbolProperty18.types | 47 +++++++++++++++++ .../reference/symbolProperty19.types | 38 ++++++++++++++ .../reference/symbolProperty28.types | 34 +++++++++++++ .../reference/symbolProperty40.types | 48 +++++++++++++++++ .../reference/symbolProperty41.types | 51 +++++++++++++++++++ .../reference/symbolProperty46.errors.txt | 17 +++++++ .../reference/symbolProperty47.errors.txt | 7 ++- .../reference/symbolProperty52.errors.txt | 9 +++- tests/baselines/reference/symbolProperty52.js | 5 +- .../reference/symbolProperty53.errors.txt | 9 +++- tests/baselines/reference/symbolProperty53.js | 5 +- tests/baselines/reference/symbolProperty55.js | 23 +++++++++ .../reference/symbolProperty55.types | 28 ++++++++++ tests/baselines/reference/symbolProperty56.js | 23 +++++++++ .../reference/symbolProperty56.types | 26 ++++++++++ tests/baselines/reference/symbolProperty57.js | 14 +++++ .../reference/symbolProperty57.types | 19 +++++++ .../es6/Symbols/symbolProperty52.ts | 4 +- .../es6/Symbols/symbolProperty53.ts | 4 +- .../es6/Symbols/symbolProperty55.ts | 11 ++++ .../es6/Symbols/symbolProperty56.ts | 11 ++++ .../es6/Symbols/symbolProperty57.ts | 7 +++ 26 files changed, 495 insertions(+), 14 deletions(-) create mode 100644 tests/baselines/reference/symbolProperty17.types create mode 100644 tests/baselines/reference/symbolProperty18.types create mode 100644 tests/baselines/reference/symbolProperty19.types create mode 100644 tests/baselines/reference/symbolProperty28.types create mode 100644 tests/baselines/reference/symbolProperty40.types create mode 100644 tests/baselines/reference/symbolProperty41.types create mode 100644 tests/baselines/reference/symbolProperty46.errors.txt create mode 100644 tests/baselines/reference/symbolProperty55.js create mode 100644 tests/baselines/reference/symbolProperty55.types create mode 100644 tests/baselines/reference/symbolProperty56.js create mode 100644 tests/baselines/reference/symbolProperty56.types create mode 100644 tests/baselines/reference/symbolProperty57.js create mode 100644 tests/baselines/reference/symbolProperty57.types create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty55.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty56.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty57.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 3f17d26d2b2..cca2ca29e45 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -97,7 +97,7 @@ module ts { if (node.name.kind === SyntaxKind.ComputedPropertyName) { var nameExpression = (node.name).expression; Debug.assert(isWellKnownSymbolSyntactically(nameExpression)); - return "__@" + (nameExpression).name.text; + return getPropertyNameForKnownSymbolName((nameExpression).name.text); } return (node.name).text; } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 17d79081974..d47fd2085d0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5787,8 +5787,8 @@ module ts { // See if we can index as a property. if (node.argumentExpression) { - if (node.argumentExpression.kind === SyntaxKind.StringLiteral || node.argumentExpression.kind === SyntaxKind.NumericLiteral) { - var name = (node.argumentExpression).text; + var name = getPropertyNameForIndexedAccess(node.argumentExpression); + if (name !== undefined) { var prop = getPropertyOfType(objectType, name); if (prop) { getNodeLinks(node).resolvedSymbol = prop; @@ -5832,6 +5832,36 @@ module ts { return unknownType; } + /** + * If indexArgumentExpression is a string literal or number literal, returns its text. + * If indexArgumentExpression is a well known symbol, returns the property name corresponding + * to this symbol. + * Otherwise, returns undefined. + */ + function getPropertyNameForIndexedAccess(indexArgumentExpression: Expression) { + if (indexArgumentExpression.kind === SyntaxKind.StringLiteral || indexArgumentExpression.kind === SyntaxKind.NumericLiteral) { + return (indexArgumentExpression).text; + } + if (isWellKnownSymbolSyntactically(indexArgumentExpression)) { + var leftHandSide = (indexArgumentExpression).expression; + Debug.assert((leftHandSide).text === "Symbol"); + // The name is Symbol., so make sure Symbol actually resolves to the + // global Symbol object + var leftHandSideSymbol = resolveName(indexArgumentExpression, (leftHandSide).text, + SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined); + if (leftHandSideSymbol === globalESSymbolConstructorSymbol) { + // Make sure the property type is the primitive symbol type + var rightHandSideName = ((indexArgumentExpression).name).text; + var esSymbolConstructorPropertyType = getTypeOfPropertyOfType(globalESSymbolConstructorType, rightHandSideName); + if (esSymbolConstructorPropertyType && esSymbolConstructorPropertyType.flags & TypeFlags.ESSymbol) { + return getPropertyNameForKnownSymbolName(rightHandSideName); + } + } + } + + return undefined; + } + function resolveUntypedCall(node: CallLikeExpression): Signature { if (node.kind === SyntaxKind.TaggedTemplateExpression) { checkExpression((node).template); @@ -10334,7 +10364,7 @@ module ts { globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray"); globalESSymbolType = getGlobalType("Symbol"); globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"); - globalESSymbolConstructorType = getTypeOfGlobalSymbol(globalESSymbolConstructorSymbol, /*arity*/ 0); + globalESSymbolConstructorType = getTypeOfSymbol(globalESSymbolConstructorSymbol); } else { globalTemplateStringsArrayType = unknownType; diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 9d8f5f9b563..8830dacc374 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -852,6 +852,10 @@ module ts { return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); } + export function getPropertyNameForKnownSymbolName(symbolName: string): string { + return "__@" + symbolName; + } + /** * Includes the word "Symbol" with unicode escapes */ diff --git a/tests/baselines/reference/symbolProperty17.types b/tests/baselines/reference/symbolProperty17.types new file mode 100644 index 00000000000..f804943c212 --- /dev/null +++ b/tests/baselines/reference/symbolProperty17.types @@ -0,0 +1,27 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty17.ts === +interface I { +>I : I + + [Symbol.iterator]: number; +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + [s: symbol]: string; +>s : symbol + + "__@iterator": string; +} + +var i: I; +>i : I +>I : I + +var it = i[Symbol.iterator]; +>it : number +>i[Symbol.iterator] : number +>i : I +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + diff --git a/tests/baselines/reference/symbolProperty18.types b/tests/baselines/reference/symbolProperty18.types new file mode 100644 index 00000000000..8dd74112a8d --- /dev/null +++ b/tests/baselines/reference/symbolProperty18.types @@ -0,0 +1,47 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty18.ts === +var i = { +>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; } +>{ [Symbol.iterator]: 0, [Symbol.toStringTag]() { return "" }, set [Symbol.toPrimitive](p: boolean) { }} : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; } + + [Symbol.iterator]: 0, +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + [Symbol.toStringTag]() { return "" }, +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol + + set [Symbol.toPrimitive](p: boolean) { } +>Symbol.toPrimitive : symbol +>Symbol : SymbolConstructor +>toPrimitive : symbol +>p : boolean +} + +var it = i[Symbol.iterator]; +>it : number +>i[Symbol.iterator] : number +>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; } +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +var str = i[Symbol.toStringTag](); +>str : string +>i[Symbol.toStringTag]() : string +>i[Symbol.toStringTag] : () => string +>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; } +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol + +i[Symbol.toPrimitive] = false; +>i[Symbol.toPrimitive] = false : boolean +>i[Symbol.toPrimitive] : boolean +>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; } +>Symbol.toPrimitive : symbol +>Symbol : SymbolConstructor +>toPrimitive : symbol + diff --git a/tests/baselines/reference/symbolProperty19.types b/tests/baselines/reference/symbolProperty19.types new file mode 100644 index 00000000000..705c2b8bdf7 --- /dev/null +++ b/tests/baselines/reference/symbolProperty19.types @@ -0,0 +1,38 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty19.ts === +var i = { +>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; } +>{ [Symbol.iterator]: { p: null }, [Symbol.toStringTag]() { return { p: undefined }; }} : { [Symbol.iterator]: { p: null; }; [Symbol.toStringTag](): { p: any; }; } + + [Symbol.iterator]: { p: null }, +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>{ p: null } : { p: null; } +>p : null + + [Symbol.toStringTag]() { return { p: undefined }; } +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>{ p: undefined } : { p: undefined; } +>p : undefined +>undefined : undefined +} + +var it = i[Symbol.iterator]; +>it : { p: any; } +>i[Symbol.iterator] : { p: any; } +>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; } +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +var str = i[Symbol.toStringTag](); +>str : { p: any; } +>i[Symbol.toStringTag]() : { p: any; } +>i[Symbol.toStringTag] : () => { p: any; } +>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; } +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol + diff --git a/tests/baselines/reference/symbolProperty28.types b/tests/baselines/reference/symbolProperty28.types new file mode 100644 index 00000000000..ef5aa0f3003 --- /dev/null +++ b/tests/baselines/reference/symbolProperty28.types @@ -0,0 +1,34 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty28.ts === +class C1 { +>C1 : C1 + + [Symbol.toStringTag]() { +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol + + return { x: "" }; +>{ x: "" } : { x: string; } +>x : string + } +} + +class C2 extends C1 { } +>C2 : C2 +>C1 : C1 + +var c: C2; +>c : C2 +>C2 : C2 + +var obj = c[Symbol.toStringTag]().x; +>obj : string +>c[Symbol.toStringTag]().x : string +>c[Symbol.toStringTag]() : { x: string; } +>c[Symbol.toStringTag] : () => { x: string; } +>c : C2 +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>x : string + diff --git a/tests/baselines/reference/symbolProperty40.types b/tests/baselines/reference/symbolProperty40.types new file mode 100644 index 00000000000..a87a6ea28a8 --- /dev/null +++ b/tests/baselines/reference/symbolProperty40.types @@ -0,0 +1,48 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty40.ts === +class C { +>C : C + + [Symbol.iterator](x: string): string; +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>x : string + + [Symbol.iterator](x: number): number; +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>x : number + + [Symbol.iterator](x: any) { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>x : any + + return undefined; +>undefined : undefined + } +} + +var c = new C; +>c : C +>new C : C +>C : typeof C + +c[Symbol.iterator](""); +>c[Symbol.iterator]("") : string +>c[Symbol.iterator] : { (x: string): string; (x: number): number; } +>c : C +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +c[Symbol.iterator](0); +>c[Symbol.iterator](0) : number +>c[Symbol.iterator] : { (x: string): string; (x: number): number; } +>c : C +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + diff --git a/tests/baselines/reference/symbolProperty41.types b/tests/baselines/reference/symbolProperty41.types new file mode 100644 index 00000000000..94032c194d6 --- /dev/null +++ b/tests/baselines/reference/symbolProperty41.types @@ -0,0 +1,51 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty41.ts === +class C { +>C : C + + [Symbol.iterator](x: string): { x: string }; +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>x : string +>x : string + + [Symbol.iterator](x: "hello"): { x: string; hello: string }; +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>x : "hello" +>x : string +>hello : string + + [Symbol.iterator](x: any) { +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +>x : any + + return undefined; +>undefined : undefined + } +} + +var c = new C; +>c : C +>new C : C +>C : typeof C + +c[Symbol.iterator](""); +>c[Symbol.iterator]("") : { x: string; } +>c[Symbol.iterator] : { (x: string): { x: string; }; (x: "hello"): { x: string; hello: string; }; } +>c : C +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +c[Symbol.iterator]("hello"); +>c[Symbol.iterator]("hello") : { x: string; hello: string; } +>c[Symbol.iterator] : { (x: string): { x: string; }; (x: "hello"): { x: string; hello: string; }; } +>c : C +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + diff --git a/tests/baselines/reference/symbolProperty46.errors.txt b/tests/baselines/reference/symbolProperty46.errors.txt new file mode 100644 index 00000000000..68f86afc315 --- /dev/null +++ b/tests/baselines/reference/symbolProperty46.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/es6/Symbols/symbolProperty46.ts(10,1): error TS2322: Type 'number' is not assignable to type 'string'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty46.ts (1 errors) ==== + class C { + get [Symbol.hasInstance]() { + return ""; + } + // Should take a string + set [Symbol.hasInstance](x) { + } + } + + (new C)[Symbol.hasInstance] = 0; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + (new C)[Symbol.hasInstance] = ""; \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty47.errors.txt b/tests/baselines/reference/symbolProperty47.errors.txt index 8d16be2fd57..b35650f94bb 100644 --- a/tests/baselines/reference/symbolProperty47.errors.txt +++ b/tests/baselines/reference/symbolProperty47.errors.txt @@ -1,7 +1,8 @@ tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/es6/Symbols/symbolProperty47.ts(11,1): error TS2322: Type 'string' is not assignable to type 'number'. -==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (1 errors) ==== +==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (2 errors) ==== class C { get [Symbol.hasInstance]() { return ""; @@ -14,4 +15,6 @@ tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Typ } (new C)[Symbol.hasInstance] = 0; - (new C)[Symbol.hasInstance] = ""; \ No newline at end of file + (new C)[Symbol.hasInstance] = ""; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty52.errors.txt b/tests/baselines/reference/symbolProperty52.errors.txt index 484dffbea96..5a44918d564 100644 --- a/tests/baselines/reference/symbolProperty52.errors.txt +++ b/tests/baselines/reference/symbolProperty52.errors.txt @@ -1,9 +1,10 @@ tests/cases/conformance/es6/Symbols/symbolProperty52.ts(2,13): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'. tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'. Property '[Symbol.nonsense]' is missing in type '{}'. +tests/cases/conformance/es6/Symbols/symbolProperty52.ts(7,12): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'. -==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (2 errors) ==== +==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (3 errors) ==== var obj = { [Symbol.nonsense]: 0 ~~~~~~~~ @@ -13,4 +14,8 @@ tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type obj = {}; ~~~ !!! error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'. -!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'. \ No newline at end of file +!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'. + + obj[Symbol.nonsense]; + ~~~~~~~~ +!!! error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty52.js b/tests/baselines/reference/symbolProperty52.js index e3542b5a85f..1bf4a47de7f 100644 --- a/tests/baselines/reference/symbolProperty52.js +++ b/tests/baselines/reference/symbolProperty52.js @@ -3,10 +3,13 @@ var obj = { [Symbol.nonsense]: 0 }; -obj = {}; +obj = {}; + +obj[Symbol.nonsense]; //// [symbolProperty52.js] var obj = { [Symbol.nonsense]: 0 }; obj = {}; +obj[Symbol.nonsense]; diff --git a/tests/baselines/reference/symbolProperty53.errors.txt b/tests/baselines/reference/symbolProperty53.errors.txt index 0d9601df68a..523feed3e8e 100644 --- a/tests/baselines/reference/symbolProperty53.errors.txt +++ b/tests/baselines/reference/symbolProperty53.errors.txt @@ -1,9 +1,14 @@ tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty53.ts(5,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. -==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (1 errors) ==== +==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (2 errors) ==== var obj = { [Symbol.for]: 0 ~~~~~~~~~~~~ !!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. - }; \ No newline at end of file + }; + + obj[Symbol.for]; + ~~~~~~~~~~~~~~~ +!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty53.js b/tests/baselines/reference/symbolProperty53.js index f302dff8924..71c82d14917 100644 --- a/tests/baselines/reference/symbolProperty53.js +++ b/tests/baselines/reference/symbolProperty53.js @@ -1,9 +1,12 @@ //// [symbolProperty53.ts] var obj = { [Symbol.for]: 0 -}; +}; + +obj[Symbol.for]; //// [symbolProperty53.js] var obj = { [Symbol.for]: 0 }; +obj[Symbol.for]; diff --git a/tests/baselines/reference/symbolProperty55.js b/tests/baselines/reference/symbolProperty55.js new file mode 100644 index 00000000000..e19e2d8e2f6 --- /dev/null +++ b/tests/baselines/reference/symbolProperty55.js @@ -0,0 +1,23 @@ +//// [symbolProperty55.ts] +var obj = { + [Symbol.iterator]: 0 +}; + +module M { + var Symbol: SymbolConstructor; + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol.iterator]; +} + +//// [symbolProperty55.js] +var obj = { + [Symbol.iterator]: 0 +}; +var M; +(function (M) { + var Symbol; + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol.iterator]; +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty55.types b/tests/baselines/reference/symbolProperty55.types new file mode 100644 index 00000000000..34b32e27eae --- /dev/null +++ b/tests/baselines/reference/symbolProperty55.types @@ -0,0 +1,28 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty55.ts === +var obj = { +>obj : { [Symbol.iterator]: number; } +>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; } + + [Symbol.iterator]: 0 +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +}; + +module M { +>M : typeof M + + var Symbol: SymbolConstructor; +>Symbol : SymbolConstructor +>SymbolConstructor : SymbolConstructor + + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol.iterator]; +>obj[Symbol.iterator] : any +>obj : { [Symbol.iterator]: number; } +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol +} diff --git a/tests/baselines/reference/symbolProperty56.js b/tests/baselines/reference/symbolProperty56.js new file mode 100644 index 00000000000..fea4520c2f8 --- /dev/null +++ b/tests/baselines/reference/symbolProperty56.js @@ -0,0 +1,23 @@ +//// [symbolProperty56.ts] +var obj = { + [Symbol.iterator]: 0 +}; + +module M { + var Symbol: {}; + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol["iterator"]]; +} + +//// [symbolProperty56.js] +var obj = { + [Symbol.iterator]: 0 +}; +var M; +(function (M) { + var Symbol; + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol["iterator"]]; +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty56.types b/tests/baselines/reference/symbolProperty56.types new file mode 100644 index 00000000000..8fc2e97b751 --- /dev/null +++ b/tests/baselines/reference/symbolProperty56.types @@ -0,0 +1,26 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty56.ts === +var obj = { +>obj : { [Symbol.iterator]: number; } +>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; } + + [Symbol.iterator]: 0 +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +}; + +module M { +>M : typeof M + + var Symbol: {}; +>Symbol : {} + + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol["iterator"]]; +>obj[Symbol["iterator"]] : any +>obj : { [Symbol.iterator]: number; } +>Symbol["iterator"] : any +>Symbol : {} +} diff --git a/tests/baselines/reference/symbolProperty57.js b/tests/baselines/reference/symbolProperty57.js new file mode 100644 index 00000000000..8fffcba3e27 --- /dev/null +++ b/tests/baselines/reference/symbolProperty57.js @@ -0,0 +1,14 @@ +//// [symbolProperty57.ts] +var obj = { + [Symbol.iterator]: 0 +}; + +// Should give type 'any'. +obj[Symbol["nonsense"]]; + +//// [symbolProperty57.js] +var obj = { + [Symbol.iterator]: 0 +}; +// Should give type 'any'. +obj[Symbol["nonsense"]]; diff --git a/tests/baselines/reference/symbolProperty57.types b/tests/baselines/reference/symbolProperty57.types new file mode 100644 index 00000000000..013c008ce12 --- /dev/null +++ b/tests/baselines/reference/symbolProperty57.types @@ -0,0 +1,19 @@ +=== tests/cases/conformance/es6/Symbols/symbolProperty57.ts === +var obj = { +>obj : { [Symbol.iterator]: number; } +>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; } + + [Symbol.iterator]: 0 +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + +}; + +// Should give type 'any'. +obj[Symbol["nonsense"]]; +>obj[Symbol["nonsense"]] : any +>obj : { [Symbol.iterator]: number; } +>Symbol["nonsense"] : any +>Symbol : SymbolConstructor + diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty52.ts b/tests/cases/conformance/es6/Symbols/symbolProperty52.ts index 324278ea804..b14838a6914 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty52.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty52.ts @@ -3,4 +3,6 @@ var obj = { [Symbol.nonsense]: 0 }; -obj = {}; \ No newline at end of file +obj = {}; + +obj[Symbol.nonsense]; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty53.ts b/tests/cases/conformance/es6/Symbols/symbolProperty53.ts index 04cdf21a67e..c58b6e885af 100644 --- a/tests/cases/conformance/es6/Symbols/symbolProperty53.ts +++ b/tests/cases/conformance/es6/Symbols/symbolProperty53.ts @@ -1,4 +1,6 @@ //@target: ES6 var obj = { [Symbol.for]: 0 -}; \ No newline at end of file +}; + +obj[Symbol.for]; \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty55.ts b/tests/cases/conformance/es6/Symbols/symbolProperty55.ts new file mode 100644 index 00000000000..3c6ceb69b0e --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty55.ts @@ -0,0 +1,11 @@ +//@target: ES6 +var obj = { + [Symbol.iterator]: 0 +}; + +module M { + var Symbol: SymbolConstructor; + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol.iterator]; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty56.ts b/tests/cases/conformance/es6/Symbols/symbolProperty56.ts new file mode 100644 index 00000000000..ae9e5232b9b --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty56.ts @@ -0,0 +1,11 @@ +//@target: ES6 +var obj = { + [Symbol.iterator]: 0 +}; + +module M { + var Symbol: {}; + // The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator, + // the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol. + obj[Symbol["iterator"]]; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty57.ts b/tests/cases/conformance/es6/Symbols/symbolProperty57.ts new file mode 100644 index 00000000000..b60c18a05ee --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty57.ts @@ -0,0 +1,7 @@ +//@target: ES6 +var obj = { + [Symbol.iterator]: 0 +}; + +// Should give type 'any'. +obj[Symbol["nonsense"]]; \ No newline at end of file From 83258629ea361820078caf7726d69cd09a89e3e0 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 5 Feb 2015 18:11:17 -0800 Subject: [PATCH 026/106] Fix error message --- src/compiler/checker.ts | 2 +- src/compiler/diagnosticInformationMap.generated.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- tests/baselines/reference/indexTypeCheck.errors.txt | 4 ++-- ...bjectCreationOfElementAccessExpression.errors.txt | 8 ++++---- tests/baselines/reference/propertyAccess.errors.txt | 12 ++++++------ .../baselines/reference/symbolProperty53.errors.txt | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d47fd2085d0..b626db71cdc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5827,7 +5827,7 @@ module ts { } // REVIEW: Users should know the type that was actually used. - error(node, Diagnostics.An_index_expression_argument_must_be_of_type_string_number_or_any); + error(node, Diagnostics.An_index_expression_argument_must_be_of_type_string_number_symbol_or_any); return unknownType; } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 34f9c50eaad..9e3f7a20d9f 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -189,7 +189,7 @@ module ts { Property_0_does_not_exist_on_type_1: { code: 2339, category: DiagnosticCategory.Error, key: "Property '{0}' does not exist on type '{1}'." }, Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: { code: 2340, category: DiagnosticCategory.Error, key: "Only public and protected methods of the base class are accessible via the 'super' keyword" }, Property_0_is_private_and_only_accessible_within_class_1: { code: 2341, category: DiagnosticCategory.Error, key: "Property '{0}' is private and only accessible within class '{1}'." }, - An_index_expression_argument_must_be_of_type_string_number_or_any: { code: 2342, category: DiagnosticCategory.Error, key: "An index expression argument must be of type 'string', 'number', or 'any'." }, + An_index_expression_argument_must_be_of_type_string_number_symbol_or_any: { code: 2342, category: DiagnosticCategory.Error, key: "An index expression argument must be of type 'string', 'number', 'symbol, or 'any'." }, Type_0_does_not_satisfy_the_constraint_1: { code: 2344, category: DiagnosticCategory.Error, key: "Type '{0}' does not satisfy the constraint '{1}'." }, Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: { code: 2345, category: DiagnosticCategory.Error, key: "Argument of type '{0}' is not assignable to parameter of type '{1}'." }, Supplied_parameters_do_not_match_any_signature_of_call_target: { code: 2346, category: DiagnosticCategory.Error, key: "Supplied parameters do not match any signature of call target." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 1fd7cb7356b..1288ea748e2 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -749,7 +749,7 @@ "category": "Error", "code": 2341 }, - "An index expression argument must be of type 'string', 'number', or 'any'.": { + "An index expression argument must be of type 'string', 'number', 'symbol, or 'any'.": { "category": "Error", "code": 2342 }, diff --git a/tests/baselines/reference/indexTypeCheck.errors.txt b/tests/baselines/reference/indexTypeCheck.errors.txt index f45e56ef6df..5d3e6dc9268 100644 --- a/tests/baselines/reference/indexTypeCheck.errors.txt +++ b/tests/baselines/reference/indexTypeCheck.errors.txt @@ -5,7 +5,7 @@ tests/cases/compiler/indexTypeCheck.ts(22,2): error TS2413: Numeric index type ' tests/cases/compiler/indexTypeCheck.ts(27,2): error TS2413: Numeric index type 'number' is not assignable to string index type 'string'. tests/cases/compiler/indexTypeCheck.ts(32,3): error TS1096: An index signature must have exactly one parameter. tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. -tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. ==== tests/cases/compiler/indexTypeCheck.ts (8 errors) ==== @@ -75,7 +75,7 @@ tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression yellow[blue]; // error ~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. var x:number[]; x[0]; diff --git a/tests/baselines/reference/objectCreationOfElementAccessExpression.errors.txt b/tests/baselines/reference/objectCreationOfElementAccessExpression.errors.txt index 73332ff8926..b2f3bd9d824 100644 --- a/tests/baselines/reference/objectCreationOfElementAccessExpression.errors.txt +++ b/tests/baselines/reference/objectCreationOfElementAccessExpression.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/objectCreationOfElementAccessExpression.ts(53,17): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +tests/cases/compiler/objectCreationOfElementAccessExpression.ts(53,17): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. tests/cases/compiler/objectCreationOfElementAccessExpression.ts(53,63): error TS2348: Value of type 'typeof Cookie' is not callable. Did you mean to include 'new'? -tests/cases/compiler/objectCreationOfElementAccessExpression.ts(54,33): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +tests/cases/compiler/objectCreationOfElementAccessExpression.ts(54,33): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. tests/cases/compiler/objectCreationOfElementAccessExpression.ts(54,79): error TS2348: Value of type 'typeof Cookie' is not callable. Did you mean to include 'new'? @@ -59,12 +59,12 @@ tests/cases/compiler/objectCreationOfElementAccessExpression.ts(54,79): error TS // ElementAccessExpressions can only contain one expression. There should be a parse error here. var foods = new PetFood[new IceCream('Mint chocolate chip') , Cookie('Chocolate chip', false) , new Cookie('Peanut butter', true)]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2348: Value of type 'typeof Cookie' is not callable. Did you mean to include 'new'? var foods2: MonsterFood[] = new PetFood[new IceCream('Mint chocolate chip') , Cookie('Chocolate chip', false) , new Cookie('Peanut butter', true)]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2348: Value of type 'typeof Cookie' is not callable. Did you mean to include 'new'? \ No newline at end of file diff --git a/tests/baselines/reference/propertyAccess.errors.txt b/tests/baselines/reference/propertyAccess.errors.txt index 5cffcbec64c..d9cd90a48fc 100644 --- a/tests/baselines/reference/propertyAccess.errors.txt +++ b/tests/baselines/reference/propertyAccess.errors.txt @@ -1,7 +1,7 @@ tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(45,14): error TS2339: Property 'qqq' does not exist on type '{ 10: string; x: string; y: number; z: { n: string; m: number; o: () => boolean; }; 'literal property': number; }'. -tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(80,10): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. -tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(117,10): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. -tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(140,12): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(80,10): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. +tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(117,10): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. +tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(140,12): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. ==== tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts (4 errors) ==== @@ -88,7 +88,7 @@ tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(140,12): er // Bracket notation property access using value of other type on type with numeric index signature and no string index signature var ll = numIndex[someObject]; // Error ~~~~~~~~~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. // Bracket notation property access using string value on type with string index signature and no numeric index signature var mm = strIndex['N']; @@ -127,7 +127,7 @@ tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(140,12): er // Bracket notation property access using values of other types on type with no index signatures var uu = noIndex[someObject]; // Error ~~~~~~~~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. // Bracket notation property access using numeric value on type with numeric index signature and string index signature var vv = noIndex[32]; @@ -152,7 +152,7 @@ tests/cases/conformance/expressions/propertyAccess/propertyAccess.ts(140,12): er // Bracket notation property access using value of other type on type with numeric index signature and no string index signature and string index signature var zzzz = bothIndex[someObject]; // Error ~~~~~~~~~~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. var x1 = numIndex[stringOrNumber]; var x1: any; diff --git a/tests/baselines/reference/symbolProperty53.errors.txt b/tests/baselines/reference/symbolProperty53.errors.txt index 523feed3e8e..7658744eb55 100644 --- a/tests/baselines/reference/symbolProperty53.errors.txt +++ b/tests/baselines/reference/symbolProperty53.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. -tests/cases/conformance/es6/Symbols/symbolProperty53.ts(5,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. +tests/cases/conformance/es6/Symbols/symbolProperty53.ts(5,1): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. ==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (2 errors) ==== @@ -11,4 +11,4 @@ tests/cases/conformance/es6/Symbols/symbolProperty53.ts(5,1): error TS2342: An i obj[Symbol.for]; ~~~~~~~~~~~~~~~ -!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'. \ No newline at end of file +!!! error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. \ No newline at end of file From 3834edd747fc9ffab50299e5286183eb8e900feb Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 13:06:28 -0800 Subject: [PATCH 027/106] Refactor part of getPropertyNameForIndexedAccess into checkSymbolNameIsProperSymbolReference --- src/compiler/checker.ts | 57 ++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b626db71cdc..72a05f619ab 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5540,6 +5540,14 @@ module ts { if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); } + else if (isWellKnownSymbolSyntactically(node.expression)) { + // If it's not ES6, error + // Check that Symbol corresponds to global symbol, and that property exists, and that it's a symbol + } + else { + // Some syntactic forms require that the property name be a well known symbol. + // Will move the grammar checks here. + } } return links.resolvedType; @@ -5835,33 +5843,52 @@ module ts { /** * If indexArgumentExpression is a string literal or number literal, returns its text. * If indexArgumentExpression is a well known symbol, returns the property name corresponding - * to this symbol. + * to this symbol, as long as it is a proper symbol reference. * Otherwise, returns undefined. */ - function getPropertyNameForIndexedAccess(indexArgumentExpression: Expression) { + function getPropertyNameForIndexedAccess(indexArgumentExpression: Expression): string { if (indexArgumentExpression.kind === SyntaxKind.StringLiteral || indexArgumentExpression.kind === SyntaxKind.NumericLiteral) { return (indexArgumentExpression).text; } - if (isWellKnownSymbolSyntactically(indexArgumentExpression)) { - var leftHandSide = (indexArgumentExpression).expression; - Debug.assert((leftHandSide).text === "Symbol"); - // The name is Symbol., so make sure Symbol actually resolves to the - // global Symbol object - var leftHandSideSymbol = resolveName(indexArgumentExpression, (leftHandSide).text, - SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined); - if (leftHandSideSymbol === globalESSymbolConstructorSymbol) { - // Make sure the property type is the primitive symbol type + if (languageVersion >= ScriptTarget.ES6 && isWellKnownSymbolSyntactically(indexArgumentExpression)) { + if (checkSymbolNameIsProperSymbolReference(indexArgumentExpression, /*reportError*/ false)) { var rightHandSideName = ((indexArgumentExpression).name).text; - var esSymbolConstructorPropertyType = getTypeOfPropertyOfType(globalESSymbolConstructorType, rightHandSideName); - if (esSymbolConstructorPropertyType && esSymbolConstructorPropertyType.flags & TypeFlags.ESSymbol) { - return getPropertyNameForKnownSymbolName(rightHandSideName); - } + return getPropertyNameForKnownSymbolName(rightHandSideName); } } return undefined; } + /** + * A proper symbol reference requires the following: + * 1. The language version is at least ES6 + * 2. The expression is of the form Symbol. + * 3. Symbol in this context resolves to the global Symbol object + * 4. The property access denotes a property that is present on the global Symbol object + * 5. The property on the global Symbol object is of the primitive type symbol. + */ + function checkSymbolNameIsProperSymbolReference(wellKnownSymbolName: PropertyAccessExpression, reportError: boolean): boolean { + if (languageVersion < ScriptTarget.ES6) { + return false; + } + + Debug.assert(isWellKnownSymbolSyntactically(wellKnownSymbolName)); + // The name is Symbol., so make sure Symbol actually resolves to the + // global Symbol object + var leftHandSide = (wellKnownSymbolName).expression; + var leftHandSideSymbol = resolveName(wellKnownSymbolName, (leftHandSide).text, + SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined); + if (leftHandSideSymbol !== globalESSymbolConstructorSymbol) { + return false; + } + + // Make sure the property type is the primitive symbol type + var rightHandSideName = ((wellKnownSymbolName).name).text; + var esSymbolConstructorPropertyType = getTypeOfPropertyOfType(globalESSymbolConstructorType, rightHandSideName); + return !!(esSymbolConstructorPropertyType && esSymbolConstructorPropertyType.flags & TypeFlags.ESSymbol); + } + function resolveUntypedCall(node: CallLikeExpression): Signature { if (node.kind === SyntaxKind.TaggedTemplateExpression) { checkExpression((node).template); From 4c09ccd60ecd8a6a7ffd04ea413b8dbe8e8468f3 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 19:32:19 -0800 Subject: [PATCH 028/106] Check that Symbol properties are proper, and support downlevel type checking --- src/compiler/checker.ts | 75 ++++++++++++------- .../diagnosticInformationMap.generated.ts | 2 + src/compiler/diagnosticMessages.json | 8 ++ .../reference/ES5SymbolProperty1.errors.txt | 19 +++++ .../baselines/reference/ES5SymbolProperty1.js | 18 +++++ .../reference/ES5SymbolProperty2.errors.txt | 22 ++++++ .../baselines/reference/ES5SymbolProperty2.js | 27 +++++++ .../reference/ES5SymbolProperty3.errors.txt | 16 ++++ .../baselines/reference/ES5SymbolProperty3.js | 19 +++++ .../reference/ES5SymbolProperty4.errors.txt | 16 ++++ .../baselines/reference/ES5SymbolProperty4.js | 19 +++++ .../reference/ES5SymbolProperty5.errors.txt | 16 ++++ .../baselines/reference/ES5SymbolProperty5.js | 19 +++++ .../reference/ES5SymbolProperty6.errors.txt | 17 +++++ .../baselines/reference/ES5SymbolProperty6.js | 16 ++++ .../reference/ES5SymbolProperty7.errors.txt | 16 ++++ .../baselines/reference/ES5SymbolProperty7.js | 19 +++++ tests/baselines/reference/ES5SymbolType1.js | 7 ++ .../baselines/reference/ES5SymbolType1.types | 10 +++ .../reference/symbolProperty48.errors.txt | 13 ++++ .../reference/symbolProperty49.errors.txt | 13 ++++ .../reference/symbolProperty58.errors.txt | 13 ++++ tests/baselines/reference/symbolProperty58.js | 13 ++++ .../conformance/Symbols/ES5SymbolProperty1.ts | 11 +++ .../conformance/Symbols/ES5SymbolProperty2.ts | 11 +++ .../conformance/Symbols/ES5SymbolProperty3.ts | 8 ++ .../conformance/Symbols/ES5SymbolProperty4.ts | 8 ++ .../conformance/Symbols/ES5SymbolProperty5.ts | 8 ++ .../conformance/Symbols/ES5SymbolProperty6.ts | 6 ++ .../conformance/Symbols/ES5SymbolProperty7.ts | 8 ++ .../conformance/Symbols/ES5SymbolType1.ts | 3 + .../es6/Symbols/symbolProperty58.ts | 8 ++ 32 files changed, 457 insertions(+), 27 deletions(-) create mode 100644 tests/baselines/reference/ES5SymbolProperty1.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty1.js create mode 100644 tests/baselines/reference/ES5SymbolProperty2.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty2.js create mode 100644 tests/baselines/reference/ES5SymbolProperty3.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty3.js create mode 100644 tests/baselines/reference/ES5SymbolProperty4.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty4.js create mode 100644 tests/baselines/reference/ES5SymbolProperty5.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty5.js create mode 100644 tests/baselines/reference/ES5SymbolProperty6.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty6.js create mode 100644 tests/baselines/reference/ES5SymbolProperty7.errors.txt create mode 100644 tests/baselines/reference/ES5SymbolProperty7.js create mode 100644 tests/baselines/reference/ES5SymbolType1.js create mode 100644 tests/baselines/reference/ES5SymbolType1.types create mode 100644 tests/baselines/reference/symbolProperty48.errors.txt create mode 100644 tests/baselines/reference/symbolProperty49.errors.txt create mode 100644 tests/baselines/reference/symbolProperty58.errors.txt create mode 100644 tests/baselines/reference/symbolProperty58.js create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty1.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty2.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty3.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty4.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty5.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty6.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolProperty7.ts create mode 100644 tests/cases/conformance/Symbols/ES5SymbolType1.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty58.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 72a05f619ab..b2f933e1194 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -96,7 +96,6 @@ module ts { var globalRegExpType: ObjectType; var globalTemplateStringsArrayType: ObjectType; var globalESSymbolType: ObjectType; - var globalESSymbolConstructorType: ObjectType; var anyArrayType: Type; @@ -3032,6 +3031,10 @@ module ts { return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), 0); } + function getGlobalESSymbolConstructorSymbol() { + return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol")); + } + function createArrayType(elementType: Type): Type { // globalArrayType will be undefined if we get here during creation of the Array type. This for example happens if // user code augments the Array type with call or construct signatures that have an array type as the return type. @@ -5541,12 +5544,7 @@ module ts { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); } else if (isWellKnownSymbolSyntactically(node.expression)) { - // If it's not ES6, error - // Check that Symbol corresponds to global symbol, and that property exists, and that it's a symbol - } - else { - // Some syntactic forms require that the property name be a well known symbol. - // Will move the grammar checks here. + checkSymbolNameIsProperSymbolReference(node.expression, links.resolvedType, /*reportError*/ true); } } @@ -5795,7 +5793,7 @@ module ts { // See if we can index as a property. if (node.argumentExpression) { - var name = getPropertyNameForIndexedAccess(node.argumentExpression); + var name = getPropertyNameForIndexedAccess(node.argumentExpression, indexType); if (name !== undefined) { var prop = getPropertyOfType(objectType, name); if (prop) { @@ -5846,12 +5844,12 @@ module ts { * to this symbol, as long as it is a proper symbol reference. * Otherwise, returns undefined. */ - function getPropertyNameForIndexedAccess(indexArgumentExpression: Expression): string { + function getPropertyNameForIndexedAccess(indexArgumentExpression: Expression, indexArgumentType: Type): string { if (indexArgumentExpression.kind === SyntaxKind.StringLiteral || indexArgumentExpression.kind === SyntaxKind.NumericLiteral) { return (indexArgumentExpression).text; } - if (languageVersion >= ScriptTarget.ES6 && isWellKnownSymbolSyntactically(indexArgumentExpression)) { - if (checkSymbolNameIsProperSymbolReference(indexArgumentExpression, /*reportError*/ false)) { + if (isWellKnownSymbolSyntactically(indexArgumentExpression)) { + if (checkSymbolNameIsProperSymbolReference(indexArgumentExpression, indexArgumentType, /*reportError*/ false)) { var rightHandSideName = ((indexArgumentExpression).name).text; return getPropertyNameForKnownSymbolName(rightHandSideName); } @@ -5862,31 +5860,52 @@ module ts { /** * A proper symbol reference requires the following: - * 1. The language version is at least ES6 - * 2. The expression is of the form Symbol. - * 3. Symbol in this context resolves to the global Symbol object - * 4. The property access denotes a property that is present on the global Symbol object - * 5. The property on the global Symbol object is of the primitive type symbol. + * 1. The expression is of the form Symbol. + * 2. Symbol in this context resolves to the global Symbol object + * 3. The property access denotes a property that is present on the global Symbol object + * 4. The property on the global Symbol object is of the primitive type symbol. */ - function checkSymbolNameIsProperSymbolReference(wellKnownSymbolName: PropertyAccessExpression, reportError: boolean): boolean { - if (languageVersion < ScriptTarget.ES6) { + function checkSymbolNameIsProperSymbolReference(wellKnownSymbolName: PropertyAccessExpression, propertyNameType: Type, reportError: boolean): boolean { + if (propertyNameType === unknownType) { + // There is already an error, so no need to report one. return false; } Debug.assert(isWellKnownSymbolSyntactically(wellKnownSymbolName)); + + // Make sure the property type is the primitive symbol type + if ((propertyNameType.flags & TypeFlags.ESSymbol) === 0) { + if (reportError) { + error(wellKnownSymbolName, Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, getTextOfNode(wellKnownSymbolName)); + } + return false; + } + // The name is Symbol., so make sure Symbol actually resolves to the // global Symbol object var leftHandSide = (wellKnownSymbolName).expression; + // Look up the global symbol, but don't report an error, since checking the actual expression + // would have reported an error. var leftHandSideSymbol = resolveName(wellKnownSymbolName, (leftHandSide).text, SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined); - if (leftHandSideSymbol !== globalESSymbolConstructorSymbol) { + if (!leftHandSideSymbol) { return false; } - // Make sure the property type is the primitive symbol type - var rightHandSideName = ((wellKnownSymbolName).name).text; - var esSymbolConstructorPropertyType = getTypeOfPropertyOfType(globalESSymbolConstructorType, rightHandSideName); - return !!(esSymbolConstructorPropertyType && esSymbolConstructorPropertyType.flags & TypeFlags.ESSymbol); + var globalESSymbol = getGlobalESSymbolConstructorSymbol(); + if (!globalESSymbol) { + // Already errored when we tried to look up the symbol + return false; + } + + if (leftHandSideSymbol !== globalESSymbol) { + if (reportError) { + error(leftHandSide, Diagnostics.Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object); + } + return false; + } + + return true; } function resolveUntypedCall(node: CallLikeExpression): Signature { @@ -10391,13 +10410,15 @@ module ts { globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray"); globalESSymbolType = getGlobalType("Symbol"); globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"); - globalESSymbolConstructorType = getTypeOfSymbol(globalESSymbolConstructorSymbol); } else { globalTemplateStringsArrayType = unknownType; - globalESSymbolType = unknownType; - globalESSymbolConstructorSymbol = unknownSymbol; - globalESSymbolConstructorType = unknownType; + + // Consider putting Symbol interface in lib.d.ts. On the plus side, putting it in lib.d.ts would make it + // extensible for Polyfilling Symbols. But putting it into lib.d.ts could also break users that have + // a global Symbol already, particularly if it is a class. + globalESSymbolType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined); + globalESSymbolConstructorSymbol = undefined; } anyArrayType = createArrayType(anyType); diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 9e3f7a20d9f..c491acdf2ef 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -306,6 +306,8 @@ module ts { A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, Cannot_find_global_value_0: { code: 2468, category: DiagnosticCategory.Error, key: "Cannot find global value '{0}'." }, The_0_operator_cannot_be_applied_to_a_value_of_type_symbol: { code: 2469, category: DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to a value of type 'symbol'." }, + Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object: { code: 2470, category: DiagnosticCategory.Error, key: "'Symbol' reference does not refer to the global Symbol constructor object." }, + A_computed_property_name_of_the_form_0_must_be_of_type_symbol: { code: 2471, category: DiagnosticCategory.Error, key: "A computed property name of the form '{0}' must be of type 'symbol'." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 1288ea748e2..e3f8a880111 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1217,6 +1217,14 @@ "category": "Error", "code": 2469 }, + "'Symbol' reference does not refer to the global Symbol constructor object.": { + "category": "Error", + "code": 2470 + }, + "A computed property name of the form '{0}' must be of type 'symbol'.": { + "category": "Error", + "code": 2471 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/ES5SymbolProperty1.errors.txt b/tests/baselines/reference/ES5SymbolProperty1.errors.txt new file mode 100644 index 00000000000..1c0c5a55ad2 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty1.errors.txt @@ -0,0 +1,19 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty1.ts(7,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty1.ts(7,6): error TS2471: A computed property name of the form 'Symbol.foo' must be of type 'symbol'. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty1.ts (2 errors) ==== + interface SymbolConstructor { + foo: string; + } + var Symbol: SymbolConstructor; + + var obj = { + [Symbol.foo]: 0 + ~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.foo' must be of type 'symbol'. + } + + obj[Symbol.foo]; \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty1.js b/tests/baselines/reference/ES5SymbolProperty1.js new file mode 100644 index 00000000000..3f761d3073f --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty1.js @@ -0,0 +1,18 @@ +//// [ES5SymbolProperty1.ts] +interface SymbolConstructor { + foo: string; +} +var Symbol: SymbolConstructor; + +var obj = { + [Symbol.foo]: 0 +} + +obj[Symbol.foo]; + +//// [ES5SymbolProperty1.js] +var Symbol; +var obj = { + [Symbol.foo]: 0 +}; +obj[Symbol.foo]; diff --git a/tests/baselines/reference/ES5SymbolProperty2.errors.txt b/tests/baselines/reference/ES5SymbolProperty2.errors.txt new file mode 100644 index 00000000000..397e8f51511 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty2.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty2.ts(5,9): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty2.ts(5,10): error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. +tests/cases/conformance/Symbols/ES5SymbolProperty2.ts(10,11): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty2.ts (3 errors) ==== + module M { + var Symbol; + + export class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + } + (new C)[Symbol.iterator]; + } + + (new M.C)[Symbol.iterator]; + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty2.js b/tests/baselines/reference/ES5SymbolProperty2.js new file mode 100644 index 00000000000..a1efd6ae7ba --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty2.js @@ -0,0 +1,27 @@ +//// [ES5SymbolProperty2.ts] +module M { + var Symbol; + + export class C { + [Symbol.iterator]() { } + } + (new C)[Symbol.iterator]; +} + +(new M.C)[Symbol.iterator]; + +//// [ES5SymbolProperty2.js] +var M; +(function (M) { + var Symbol; + var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; + })(); + M.C = C; + (new C)[Symbol.iterator]; +})(M || (M = {})); +(new M.C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty3.errors.txt b/tests/baselines/reference/ES5SymbolProperty3.errors.txt new file mode 100644 index 00000000000..3ec09f889f5 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty3.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty3.ts(4,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty3.ts(4,6): error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty3.ts (2 errors) ==== + var Symbol; + + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + } + + (new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty3.js b/tests/baselines/reference/ES5SymbolProperty3.js new file mode 100644 index 00000000000..7ef892cb3c4 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty3.js @@ -0,0 +1,19 @@ +//// [ES5SymbolProperty3.ts] +var Symbol; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] + +//// [ES5SymbolProperty3.js] +var Symbol; +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; +})(); +(new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty4.errors.txt b/tests/baselines/reference/ES5SymbolProperty4.errors.txt new file mode 100644 index 00000000000..045647e0313 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty4.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty4.ts(4,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty4.ts(4,6): error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty4.ts (2 errors) ==== + var Symbol: { iterator: string }; + + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + } + + (new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty4.js b/tests/baselines/reference/ES5SymbolProperty4.js new file mode 100644 index 00000000000..d4022066bb8 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty4.js @@ -0,0 +1,19 @@ +//// [ES5SymbolProperty4.ts] +var Symbol: { iterator: string }; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] + +//// [ES5SymbolProperty4.js] +var Symbol; +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; +})(); +(new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty5.errors.txt b/tests/baselines/reference/ES5SymbolProperty5.errors.txt new file mode 100644 index 00000000000..7a94d1c4cda --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty5.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty5.ts(4,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty5.ts(7,1): error TS2346: Supplied parameters do not match any signature of call target. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty5.ts (2 errors) ==== + var Symbol: { iterator: symbol }; + + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + } + + (new C)[Symbol.iterator](0) // Should error + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2346: Supplied parameters do not match any signature of call target. \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty5.js b/tests/baselines/reference/ES5SymbolProperty5.js new file mode 100644 index 00000000000..c433b0ab443 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty5.js @@ -0,0 +1,19 @@ +//// [ES5SymbolProperty5.ts] +var Symbol: { iterator: symbol }; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator](0) // Should error + +//// [ES5SymbolProperty5.js] +var Symbol; +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; +})(); +(new C)[Symbol.iterator](0); // Should error diff --git a/tests/baselines/reference/ES5SymbolProperty6.errors.txt b/tests/baselines/reference/ES5SymbolProperty6.errors.txt new file mode 100644 index 00000000000..c86c13da05b --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty6.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty6.ts(2,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty6.ts(2,6): error TS2304: Cannot find name 'Symbol'. +tests/cases/conformance/Symbols/ES5SymbolProperty6.ts(5,9): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty6.ts (3 errors) ==== + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + } + + (new C)[Symbol.iterator] + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty6.js b/tests/baselines/reference/ES5SymbolProperty6.js new file mode 100644 index 00000000000..949ce722aa7 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty6.js @@ -0,0 +1,16 @@ +//// [ES5SymbolProperty6.ts] +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] + +//// [ES5SymbolProperty6.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; +})(); +(new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty7.errors.txt b/tests/baselines/reference/ES5SymbolProperty7.errors.txt new file mode 100644 index 00000000000..4b35618ad52 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty7.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/Symbols/ES5SymbolProperty7.ts(4,5): error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/Symbols/ES5SymbolProperty7.ts(4,6): error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + + +==== tests/cases/conformance/Symbols/ES5SymbolProperty7.ts (2 errors) ==== + var Symbol: { iterator: any }; + + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~~~ +!!! error TS1167: Computed property names are only available when targeting ECMAScript 6 and higher. + ~~~~~~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + } + + (new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/baselines/reference/ES5SymbolProperty7.js b/tests/baselines/reference/ES5SymbolProperty7.js new file mode 100644 index 00000000000..f98e792e8cd --- /dev/null +++ b/tests/baselines/reference/ES5SymbolProperty7.js @@ -0,0 +1,19 @@ +//// [ES5SymbolProperty7.ts] +var Symbol: { iterator: any }; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] + +//// [ES5SymbolProperty7.js] +var Symbol; +var C = (function () { + function C() { + } + C.prototype[Symbol.iterator] = function () { + }; + return C; +})(); +(new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolType1.js b/tests/baselines/reference/ES5SymbolType1.js new file mode 100644 index 00000000000..5b555c19e7c --- /dev/null +++ b/tests/baselines/reference/ES5SymbolType1.js @@ -0,0 +1,7 @@ +//// [ES5SymbolType1.ts] +var s: symbol; +s.toString(); + +//// [ES5SymbolType1.js] +var s; +s.toString(); diff --git a/tests/baselines/reference/ES5SymbolType1.types b/tests/baselines/reference/ES5SymbolType1.types new file mode 100644 index 00000000000..79d93902fd6 --- /dev/null +++ b/tests/baselines/reference/ES5SymbolType1.types @@ -0,0 +1,10 @@ +=== tests/cases/conformance/Symbols/ES5SymbolType1.ts === +var s: symbol; +>s : symbol + +s.toString(); +>s.toString() : string +>s.toString : () => string +>s : symbol +>toString : () => string + diff --git a/tests/baselines/reference/symbolProperty48.errors.txt b/tests/baselines/reference/symbolProperty48.errors.txt new file mode 100644 index 00000000000..8d52fa48a07 --- /dev/null +++ b/tests/baselines/reference/symbolProperty48.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/Symbols/symbolProperty48.ts(5,10): error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty48.ts (1 errors) ==== + module M { + var Symbol; + + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty49.errors.txt b/tests/baselines/reference/symbolProperty49.errors.txt new file mode 100644 index 00000000000..8a15b359ee7 --- /dev/null +++ b/tests/baselines/reference/symbolProperty49.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/Symbols/symbolProperty49.ts(5,10): error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty49.ts (1 errors) ==== + module M { + export var Symbol; + + class C { + [Symbol.iterator]() { } + ~~~~~~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.iterator' must be of type 'symbol'. + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty58.errors.txt b/tests/baselines/reference/symbolProperty58.errors.txt new file mode 100644 index 00000000000..5f8b117a74c --- /dev/null +++ b/tests/baselines/reference/symbolProperty58.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/Symbols/symbolProperty58.ts(6,6): error TS2471: A computed property name of the form 'Symbol.foo' must be of type 'symbol'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty58.ts (1 errors) ==== + interface SymbolConstructor { + foo: string; + } + + var obj = { + [Symbol.foo]: 0 + ~~~~~~~~~~ +!!! error TS2471: A computed property name of the form 'Symbol.foo' must be of type 'symbol'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty58.js b/tests/baselines/reference/symbolProperty58.js new file mode 100644 index 00000000000..94b22156b1a --- /dev/null +++ b/tests/baselines/reference/symbolProperty58.js @@ -0,0 +1,13 @@ +//// [symbolProperty58.ts] +interface SymbolConstructor { + foo: string; +} + +var obj = { + [Symbol.foo]: 0 +} + +//// [symbolProperty58.js] +var obj = { + [Symbol.foo]: 0 +}; diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty1.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty1.ts new file mode 100644 index 00000000000..8a9276416c5 --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty1.ts @@ -0,0 +1,11 @@ +//@target: ES5 +interface SymbolConstructor { + foo: string; +} +var Symbol: SymbolConstructor; + +var obj = { + [Symbol.foo]: 0 +} + +obj[Symbol.foo]; \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty2.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty2.ts new file mode 100644 index 00000000000..07c95eb27d9 --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty2.ts @@ -0,0 +1,11 @@ +//@target: ES5 +module M { + var Symbol; + + export class C { + [Symbol.iterator]() { } + } + (new C)[Symbol.iterator]; +} + +(new M.C)[Symbol.iterator]; \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty3.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty3.ts new file mode 100644 index 00000000000..262e47557f8 --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty3.ts @@ -0,0 +1,8 @@ +//@target: ES5 +var Symbol; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty4.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty4.ts new file mode 100644 index 00000000000..2b14e64a33c --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty4.ts @@ -0,0 +1,8 @@ +//@target: ES5 +var Symbol: { iterator: string }; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty5.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty5.ts new file mode 100644 index 00000000000..ec46ddad21d --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty5.ts @@ -0,0 +1,8 @@ +//@target: ES5 +var Symbol: { iterator: symbol }; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator](0) // Should error \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty6.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty6.ts new file mode 100644 index 00000000000..59b7d2291aa --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty6.ts @@ -0,0 +1,6 @@ +//@target: ES5 +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolProperty7.ts b/tests/cases/conformance/Symbols/ES5SymbolProperty7.ts new file mode 100644 index 00000000000..766b86f9b5d --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolProperty7.ts @@ -0,0 +1,8 @@ +//@target: ES5 +var Symbol: { iterator: any }; + +class C { + [Symbol.iterator]() { } +} + +(new C)[Symbol.iterator] \ No newline at end of file diff --git a/tests/cases/conformance/Symbols/ES5SymbolType1.ts b/tests/cases/conformance/Symbols/ES5SymbolType1.ts new file mode 100644 index 00000000000..bfd5592f8e4 --- /dev/null +++ b/tests/cases/conformance/Symbols/ES5SymbolType1.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var s: symbol; +s.toString(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty58.ts b/tests/cases/conformance/es6/Symbols/symbolProperty58.ts new file mode 100644 index 00000000000..48cc6eb90f3 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty58.ts @@ -0,0 +1,8 @@ +//@target: ES6 +interface SymbolConstructor { + foo: string; +} + +var obj = { + [Symbol.foo]: 0 +} \ No newline at end of file From 35604426c885f3884ddee31bc198557bc93e4413 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 20:49:58 -0800 Subject: [PATCH 029/106] Declaration emit for symbol properties --- src/compiler/emitter.ts | 27 +++++++------ src/compiler/utilities.ts | 15 ++++++++ .../reference/symbolDeclarationEmit1.js | 17 +++++++++ .../reference/symbolDeclarationEmit1.types | 9 +++++ .../reference/symbolDeclarationEmit10.js | 20 ++++++++++ .../reference/symbolDeclarationEmit10.types | 16 ++++++++ .../reference/symbolDeclarationEmit11.js | 34 +++++++++++++++++ .../reference/symbolDeclarationEmit11.types | 25 ++++++++++++ .../symbolDeclarationEmit12.errors.txt | 27 +++++++++++++ .../reference/symbolDeclarationEmit12.js | 38 +++++++++++++++++++ .../reference/symbolDeclarationEmit13.js | 32 ++++++++++++++++ .../reference/symbolDeclarationEmit13.types | 15 ++++++++ .../reference/symbolDeclarationEmit14.js | 33 ++++++++++++++++ .../reference/symbolDeclarationEmit14.types | 14 +++++++ .../reference/symbolDeclarationEmit2.js | 18 +++++++++ .../reference/symbolDeclarationEmit2.types | 9 +++++ .../reference/symbolDeclarationEmit3.js | 22 +++++++++++ .../reference/symbolDeclarationEmit3.types | 22 +++++++++++ .../reference/symbolDeclarationEmit4.js | 27 +++++++++++++ .../reference/symbolDeclarationEmit4.types | 15 ++++++++ .../reference/symbolDeclarationEmit5.js | 12 ++++++ .../reference/symbolDeclarationEmit5.types | 9 +++++ .../reference/symbolDeclarationEmit6.js | 12 ++++++ .../reference/symbolDeclarationEmit6.types | 9 +++++ .../reference/symbolDeclarationEmit7.js | 13 +++++++ .../reference/symbolDeclarationEmit7.types | 9 +++++ .../reference/symbolDeclarationEmit8.js | 15 ++++++++ .../reference/symbolDeclarationEmit8.types | 10 +++++ .../reference/symbolDeclarationEmit9.js | 16 ++++++++ .../reference/symbolDeclarationEmit9.types | 10 +++++ tests/baselines/reference/symbolProperty44.js | 7 ---- tests/baselines/reference/symbolProperty46.js | 4 -- tests/baselines/reference/symbolProperty47.js | 4 -- .../es6/Symbols/symbolDeclarationEmit1.ts | 5 +++ .../es6/Symbols/symbolDeclarationEmit10.ts | 6 +++ .../es6/Symbols/symbolDeclarationEmit11.ts | 8 ++++ .../es6/Symbols/symbolDeclarationEmit12.ts | 14 +++++++ .../es6/Symbols/symbolDeclarationEmit13.ts | 6 +++ .../es6/Symbols/symbolDeclarationEmit14.ts | 6 +++ .../es6/Symbols/symbolDeclarationEmit2.ts | 5 +++ .../es6/Symbols/symbolDeclarationEmit3.ts | 7 ++++ .../es6/Symbols/symbolDeclarationEmit4.ts | 6 +++ .../es6/Symbols/symbolDeclarationEmit5.ts | 5 +++ .../es6/Symbols/symbolDeclarationEmit6.ts | 5 +++ .../es6/Symbols/symbolDeclarationEmit7.ts | 5 +++ .../es6/Symbols/symbolDeclarationEmit8.ts | 5 +++ .../es6/Symbols/symbolDeclarationEmit9.ts | 5 +++ 47 files changed, 626 insertions(+), 27 deletions(-) create mode 100644 tests/baselines/reference/symbolDeclarationEmit1.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit1.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit10.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit10.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit11.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit11.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit12.errors.txt create mode 100644 tests/baselines/reference/symbolDeclarationEmit12.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit13.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit13.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit14.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit14.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit2.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit2.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit3.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit3.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit4.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit4.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit5.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit5.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit6.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit6.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit7.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit7.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit8.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit8.types create mode 100644 tests/baselines/reference/symbolDeclarationEmit9.js create mode 100644 tests/baselines/reference/symbolDeclarationEmit9.types create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit1.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit10.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit11.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit13.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit14.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit2.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit3.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit4.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit5.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit6.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit7.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit8.ts create mode 100644 tests/cases/conformance/es6/Symbols/symbolDeclarationEmit9.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 4d7c7f9d3b0..63099bf2c60 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -275,7 +275,7 @@ module ts { var firstAccessor: AccessorDeclaration; var getAccessor: AccessorDeclaration; var setAccessor: AccessorDeclaration; - if (accessor.name.kind === SyntaxKind.ComputedPropertyName) { + if (hasDynamicName(accessor)) { firstAccessor = accessor; if (accessor.kind === SyntaxKind.GetAccessor) { getAccessor = accessor; @@ -289,19 +289,22 @@ module ts { } else { forEach(node.members,(member: Declaration) => { - if ((member.kind === SyntaxKind.GetAccessor || member.kind === SyntaxKind.SetAccessor) && - (member.name).text === (accessor.name).text && - (member.flags & NodeFlags.Static) === (accessor.flags & NodeFlags.Static)) { - if (!firstAccessor) { - firstAccessor = member; - } + if ((member.kind === SyntaxKind.GetAccessor || member.kind === SyntaxKind.SetAccessor) + && (member.flags & NodeFlags.Static) === (accessor.flags & NodeFlags.Static)) { + var memberName = getPropertyNameForPropertyNameNode(member.name); + var accessorName = getPropertyNameForPropertyNameNode(accessor.name); + if (memberName === accessorName) { + if (!firstAccessor) { + firstAccessor = member; + } - if (member.kind === SyntaxKind.GetAccessor && !getAccessor) { - getAccessor = member; - } + if (member.kind === SyntaxKind.GetAccessor && !getAccessor) { + getAccessor = member; + } - if (member.kind === SyntaxKind.SetAccessor && !setAccessor) { - setAccessor = member; + if (member.kind === SyntaxKind.SetAccessor && !setAccessor) { + setAccessor = member; + } } } }); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 8830dacc374..16d2303a16e 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -852,6 +852,21 @@ module ts { return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); } + export function getPropertyNameForPropertyNameNode(name: DeclarationName): string { + if (name.kind === SyntaxKind.Identifier || name.kind === SyntaxKind.StringLiteral || name.kind === SyntaxKind.NumericLiteral) { + return (name).text; + } + if (name.kind === SyntaxKind.ComputedPropertyName) { + var nameExpression = (name).expression; + if (isWellKnownSymbolSyntactically(nameExpression)) { + var rightHandSideName = (nameExpression).name.text; + return getPropertyNameForKnownSymbolName(rightHandSideName); + } + } + + return undefined; + } + export function getPropertyNameForKnownSymbolName(symbolName: string): string { return "__@" + symbolName; } diff --git a/tests/baselines/reference/symbolDeclarationEmit1.js b/tests/baselines/reference/symbolDeclarationEmit1.js new file mode 100644 index 00000000000..16d208db5eb --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit1.js @@ -0,0 +1,17 @@ +//// [symbolDeclarationEmit1.ts] +class C { + [Symbol.isRegExp]: number; +} + +//// [symbolDeclarationEmit1.js] +var C = (function () { + function C() { + } + return C; +})(); + + +//// [symbolDeclarationEmit1.d.ts] +declare class C { + [Symbol.isRegExp]: number; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit1.types b/tests/baselines/reference/symbolDeclarationEmit1.types new file mode 100644 index 00000000000..e35bbfe8861 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit1.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit1.ts === +class C { +>C : C + + [Symbol.isRegExp]: number; +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit10.js b/tests/baselines/reference/symbolDeclarationEmit10.js new file mode 100644 index 00000000000..7ace6617db5 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit10.js @@ -0,0 +1,20 @@ +//// [symbolDeclarationEmit10.ts] +var obj = { + get [Symbol.isConcatSpreadable]() { return '' }, + set [Symbol.isConcatSpreadable](x) { } +} + +//// [symbolDeclarationEmit10.js] +var obj = { + get [Symbol.isConcatSpreadable]() { + return ''; + }, + set [Symbol.isConcatSpreadable](x) { + } +}; + + +//// [symbolDeclarationEmit10.d.ts] +declare var obj: { + [Symbol.isConcatSpreadable]: string; +}; diff --git a/tests/baselines/reference/symbolDeclarationEmit10.types b/tests/baselines/reference/symbolDeclarationEmit10.types new file mode 100644 index 00000000000..194893ef00f --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit10.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit10.ts === +var obj = { +>obj : { [Symbol.isConcatSpreadable]: string; } +>{ get [Symbol.isConcatSpreadable]() { return '' }, set [Symbol.isConcatSpreadable](x) { }} : { [Symbol.isConcatSpreadable]: string; } + + get [Symbol.isConcatSpreadable]() { return '' }, +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol + + set [Symbol.isConcatSpreadable](x) { } +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol +>x : string +} diff --git a/tests/baselines/reference/symbolDeclarationEmit11.js b/tests/baselines/reference/symbolDeclarationEmit11.js new file mode 100644 index 00000000000..c9c819eefa2 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit11.js @@ -0,0 +1,34 @@ +//// [symbolDeclarationEmit11.ts] +class C { + static [Symbol.iterator] = 0; + static [Symbol.toPrimitive]() { } + static get [Symbol.isRegExp]() { return ""; } + static set [Symbol.isRegExp](x) { } +} + +//// [symbolDeclarationEmit11.js] +var C = (function () { + function C() { + } + C[Symbol.toPrimitive] = function () { + }; + Object.defineProperty(C, Symbol.isRegExp, { + get: function () { + return ""; + }, + set: function (x) { + }, + enumerable: true, + configurable: true + }); + C[Symbol.iterator] = 0; + return C; +})(); + + +//// [symbolDeclarationEmit11.d.ts] +declare class C { + static [Symbol.iterator]: number; + static [Symbol.toPrimitive](): void; + static [Symbol.isRegExp]: string; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit11.types b/tests/baselines/reference/symbolDeclarationEmit11.types new file mode 100644 index 00000000000..1bf58f205d1 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit11.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit11.ts === +class C { +>C : C + + static [Symbol.iterator] = 0; +>Symbol.iterator : symbol +>Symbol : SymbolConstructor +>iterator : symbol + + static [Symbol.toPrimitive]() { } +>Symbol.toPrimitive : symbol +>Symbol : SymbolConstructor +>toPrimitive : symbol + + static get [Symbol.isRegExp]() { return ""; } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol + + static set [Symbol.isRegExp](x) { } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +>x : string +} diff --git a/tests/baselines/reference/symbolDeclarationEmit12.errors.txt b/tests/baselines/reference/symbolDeclarationEmit12.errors.txt new file mode 100644 index 00000000000..0e2f6b828f6 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit12.errors.txt @@ -0,0 +1,27 @@ +tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts(4,28): error TS4031: Public property '[Symbol.iterator]' of exported class has or is using private name 'I'. +tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts(5,33): error TS4073: Parameter 'x' of public method from exported class has or is using private name 'I'. +tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts(6,40): error TS4055: Return type of public method from exported class has or is using private name 'I'. +tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts(10,34): error TS4037: Parameter '[Symbol.isRegExp]' of public property setter from exported class has or is using private name 'I'. + + +==== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts (4 errors) ==== + module M { + interface I { } + export class C { + [Symbol.iterator]: I; + ~ +!!! error TS4031: Public property '[Symbol.iterator]' of exported class has or is using private name 'I'. + [Symbol.toPrimitive](x: I) { } + ~ +!!! error TS4073: Parameter 'x' of public method from exported class has or is using private name 'I'. + [Symbol.isConcatSpreadable](): I { + ~ +!!! error TS4055: Return type of public method from exported class has or is using private name 'I'. + return undefined + } + get [Symbol.isRegExp]() { return undefined; } + set [Symbol.isRegExp](x: I) { } + ~ +!!! error TS4037: Parameter '[Symbol.isRegExp]' of public property setter from exported class has or is using private name 'I'. + } + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolDeclarationEmit12.js b/tests/baselines/reference/symbolDeclarationEmit12.js new file mode 100644 index 00000000000..49ff8b35976 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit12.js @@ -0,0 +1,38 @@ +//// [symbolDeclarationEmit12.ts] +module M { + interface I { } + export class C { + [Symbol.iterator]: I; + [Symbol.toPrimitive](x: I) { } + [Symbol.isConcatSpreadable](): I { + return undefined + } + get [Symbol.isRegExp]() { return undefined; } + set [Symbol.isRegExp](x: I) { } + } +} + +//// [symbolDeclarationEmit12.js] +var M; +(function (M) { + var C = (function () { + function C() { + } + C.prototype[Symbol.toPrimitive] = function (x) { + }; + C.prototype[Symbol.isConcatSpreadable] = function () { + return undefined; + }; + Object.defineProperty(C.prototype, Symbol.isRegExp, { + get: function () { + return undefined; + }, + set: function (x) { + }, + enumerable: true, + configurable: true + }); + return C; + })(); + M.C = C; +})(M || (M = {})); diff --git a/tests/baselines/reference/symbolDeclarationEmit13.js b/tests/baselines/reference/symbolDeclarationEmit13.js new file mode 100644 index 00000000000..51b6edcece5 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit13.js @@ -0,0 +1,32 @@ +//// [symbolDeclarationEmit13.ts] +class C { + get [Symbol.isRegExp]() { return ""; } + set [Symbol.toStringTag](x) { } +} + +//// [symbolDeclarationEmit13.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.isRegExp, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, Symbol.toStringTag, { + set: function (x) { + }, + enumerable: true, + configurable: true + }); + return C; +})(); + + +//// [symbolDeclarationEmit13.d.ts] +declare class C { + [Symbol.isRegExp]: string; + [Symbol.toStringTag]: any; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit13.types b/tests/baselines/reference/symbolDeclarationEmit13.types new file mode 100644 index 00000000000..6579e49c426 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit13.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit13.ts === +class C { +>C : C + + get [Symbol.isRegExp]() { return ""; } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol + + set [Symbol.toStringTag](x) { } +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +>x : any +} diff --git a/tests/baselines/reference/symbolDeclarationEmit14.js b/tests/baselines/reference/symbolDeclarationEmit14.js new file mode 100644 index 00000000000..d81bc329927 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit14.js @@ -0,0 +1,33 @@ +//// [symbolDeclarationEmit14.ts] +class C { + get [Symbol.isRegExp]() { return ""; } + get [Symbol.toStringTag]() { return ""; } +} + +//// [symbolDeclarationEmit14.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.isRegExp, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, Symbol.toStringTag, { + get: function () { + return ""; + }, + enumerable: true, + configurable: true + }); + return C; +})(); + + +//// [symbolDeclarationEmit14.d.ts] +declare class C { + [Symbol.isRegExp]: string; + [Symbol.toStringTag]: string; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit14.types b/tests/baselines/reference/symbolDeclarationEmit14.types new file mode 100644 index 00000000000..f3e7c32047c --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit14.types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit14.ts === +class C { +>C : C + + get [Symbol.isRegExp]() { return ""; } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol + + get [Symbol.toStringTag]() { return ""; } +>Symbol.toStringTag : symbol +>Symbol : SymbolConstructor +>toStringTag : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit2.js b/tests/baselines/reference/symbolDeclarationEmit2.js new file mode 100644 index 00000000000..2112f9e7748 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit2.js @@ -0,0 +1,18 @@ +//// [symbolDeclarationEmit2.ts] +class C { + [Symbol.isRegExp] = ""; +} + +//// [symbolDeclarationEmit2.js] +var C = (function () { + function C() { + this[Symbol.isRegExp] = ""; + } + return C; +})(); + + +//// [symbolDeclarationEmit2.d.ts] +declare class C { + [Symbol.isRegExp]: string; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit2.types b/tests/baselines/reference/symbolDeclarationEmit2.types new file mode 100644 index 00000000000..4844b2b8f84 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit2.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit2.ts === +class C { +>C : C + + [Symbol.isRegExp] = ""; +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit3.js b/tests/baselines/reference/symbolDeclarationEmit3.js new file mode 100644 index 00000000000..6d06c09bd69 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit3.js @@ -0,0 +1,22 @@ +//// [symbolDeclarationEmit3.ts] +class C { + [Symbol.isRegExp](x: number); + [Symbol.isRegExp](x: string); + [Symbol.isRegExp](x: any) { } +} + +//// [symbolDeclarationEmit3.js] +var C = (function () { + function C() { + } + C.prototype[Symbol.isRegExp] = function (x) { + }; + return C; +})(); + + +//// [symbolDeclarationEmit3.d.ts] +declare class C { + [Symbol.isRegExp](x: number): any; + [Symbol.isRegExp](x: string): any; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit3.types b/tests/baselines/reference/symbolDeclarationEmit3.types new file mode 100644 index 00000000000..0ea55d876b3 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit3.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit3.ts === +class C { +>C : C + + [Symbol.isRegExp](x: number); +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +>x : number + + [Symbol.isRegExp](x: string); +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +>x : string + + [Symbol.isRegExp](x: any) { } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +>x : any +} diff --git a/tests/baselines/reference/symbolDeclarationEmit4.js b/tests/baselines/reference/symbolDeclarationEmit4.js new file mode 100644 index 00000000000..cd3fc53a5bb --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit4.js @@ -0,0 +1,27 @@ +//// [symbolDeclarationEmit4.ts] +class C { + get [Symbol.isRegExp]() { return ""; } + set [Symbol.isRegExp](x) { } +} + +//// [symbolDeclarationEmit4.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, Symbol.isRegExp, { + get: function () { + return ""; + }, + set: function (x) { + }, + enumerable: true, + configurable: true + }); + return C; +})(); + + +//// [symbolDeclarationEmit4.d.ts] +declare class C { + [Symbol.isRegExp]: string; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit4.types b/tests/baselines/reference/symbolDeclarationEmit4.types new file mode 100644 index 00000000000..aeb24fc146c --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit4.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit4.ts === +class C { +>C : C + + get [Symbol.isRegExp]() { return ""; } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol + + set [Symbol.isRegExp](x) { } +>Symbol.isRegExp : symbol +>Symbol : SymbolConstructor +>isRegExp : symbol +>x : string +} diff --git a/tests/baselines/reference/symbolDeclarationEmit5.js b/tests/baselines/reference/symbolDeclarationEmit5.js new file mode 100644 index 00000000000..ba1ef9a137c --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit5.js @@ -0,0 +1,12 @@ +//// [symbolDeclarationEmit5.ts] +interface I { + [Symbol.isConcatSpreadable](): string; +} + +//// [symbolDeclarationEmit5.js] + + +//// [symbolDeclarationEmit5.d.ts] +interface I { + [Symbol.isConcatSpreadable](): string; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit5.types b/tests/baselines/reference/symbolDeclarationEmit5.types new file mode 100644 index 00000000000..557483cf636 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit5.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit5.ts === +interface I { +>I : I + + [Symbol.isConcatSpreadable](): string; +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit6.js b/tests/baselines/reference/symbolDeclarationEmit6.js new file mode 100644 index 00000000000..2aac05bb6ea --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit6.js @@ -0,0 +1,12 @@ +//// [symbolDeclarationEmit6.ts] +interface I { + [Symbol.isConcatSpreadable]: string; +} + +//// [symbolDeclarationEmit6.js] + + +//// [symbolDeclarationEmit6.d.ts] +interface I { + [Symbol.isConcatSpreadable]: string; +} diff --git a/tests/baselines/reference/symbolDeclarationEmit6.types b/tests/baselines/reference/symbolDeclarationEmit6.types new file mode 100644 index 00000000000..714467aba12 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit6.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit6.ts === +interface I { +>I : I + + [Symbol.isConcatSpreadable]: string; +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit7.js b/tests/baselines/reference/symbolDeclarationEmit7.js new file mode 100644 index 00000000000..c53c2110d11 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit7.js @@ -0,0 +1,13 @@ +//// [symbolDeclarationEmit7.ts] +var obj: { + [Symbol.isConcatSpreadable]: string; +} + +//// [symbolDeclarationEmit7.js] +var obj; + + +//// [symbolDeclarationEmit7.d.ts] +declare var obj: { + [Symbol.isConcatSpreadable]: string; +}; diff --git a/tests/baselines/reference/symbolDeclarationEmit7.types b/tests/baselines/reference/symbolDeclarationEmit7.types new file mode 100644 index 00000000000..dff109e8127 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit7.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit7.ts === +var obj: { +>obj : { [Symbol.isConcatSpreadable]: string; } + + [Symbol.isConcatSpreadable]: string; +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit8.js b/tests/baselines/reference/symbolDeclarationEmit8.js new file mode 100644 index 00000000000..428d0a0d60c --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit8.js @@ -0,0 +1,15 @@ +//// [symbolDeclarationEmit8.ts] +var obj = { + [Symbol.isConcatSpreadable]: 0 +} + +//// [symbolDeclarationEmit8.js] +var obj = { + [Symbol.isConcatSpreadable]: 0 +}; + + +//// [symbolDeclarationEmit8.d.ts] +declare var obj: { + [Symbol.isConcatSpreadable]: number; +}; diff --git a/tests/baselines/reference/symbolDeclarationEmit8.types b/tests/baselines/reference/symbolDeclarationEmit8.types new file mode 100644 index 00000000000..75d39748e22 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit8.types @@ -0,0 +1,10 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit8.ts === +var obj = { +>obj : { [Symbol.isConcatSpreadable]: number; } +>{ [Symbol.isConcatSpreadable]: 0} : { [Symbol.isConcatSpreadable]: number; } + + [Symbol.isConcatSpreadable]: 0 +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol +} diff --git a/tests/baselines/reference/symbolDeclarationEmit9.js b/tests/baselines/reference/symbolDeclarationEmit9.js new file mode 100644 index 00000000000..8cdb7173144 --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit9.js @@ -0,0 +1,16 @@ +//// [symbolDeclarationEmit9.ts] +var obj = { + [Symbol.isConcatSpreadable]() { } +} + +//// [symbolDeclarationEmit9.js] +var obj = { + [Symbol.isConcatSpreadable]() { + } +}; + + +//// [symbolDeclarationEmit9.d.ts] +declare var obj: { + [Symbol.isConcatSpreadable](): void; +}; diff --git a/tests/baselines/reference/symbolDeclarationEmit9.types b/tests/baselines/reference/symbolDeclarationEmit9.types new file mode 100644 index 00000000000..a7a6b459fcc --- /dev/null +++ b/tests/baselines/reference/symbolDeclarationEmit9.types @@ -0,0 +1,10 @@ +=== tests/cases/conformance/es6/Symbols/symbolDeclarationEmit9.ts === +var obj = { +>obj : { [Symbol.isConcatSpreadable](): void; } +>{ [Symbol.isConcatSpreadable]() { }} : { [Symbol.isConcatSpreadable](): void; } + + [Symbol.isConcatSpreadable]() { } +>Symbol.isConcatSpreadable : symbol +>Symbol : SymbolConstructor +>isConcatSpreadable : symbol +} diff --git a/tests/baselines/reference/symbolProperty44.js b/tests/baselines/reference/symbolProperty44.js index ff3dc81a6fa..d4824e79318 100644 --- a/tests/baselines/reference/symbolProperty44.js +++ b/tests/baselines/reference/symbolProperty44.js @@ -19,12 +19,5 @@ var C = (function () { enumerable: true, configurable: true }); - Object.defineProperty(C.prototype, Symbol.hasInstance, { - get: function () { - return ""; - }, - enumerable: true, - configurable: true - }); return C; })(); diff --git a/tests/baselines/reference/symbolProperty46.js b/tests/baselines/reference/symbolProperty46.js index eb21e584941..255fbac0809 100644 --- a/tests/baselines/reference/symbolProperty46.js +++ b/tests/baselines/reference/symbolProperty46.js @@ -19,10 +19,6 @@ var C = (function () { get: function () { return ""; }, - enumerable: true, - configurable: true - }); - Object.defineProperty(C.prototype, Symbol.hasInstance, { // Should take a string set: function (x) { }, diff --git a/tests/baselines/reference/symbolProperty47.js b/tests/baselines/reference/symbolProperty47.js index 9dbd03e90a1..92429c720c1 100644 --- a/tests/baselines/reference/symbolProperty47.js +++ b/tests/baselines/reference/symbolProperty47.js @@ -19,10 +19,6 @@ var C = (function () { get: function () { return ""; }, - enumerable: true, - configurable: true - }); - Object.defineProperty(C.prototype, Symbol.hasInstance, { // Should take a string set: function (x) { }, diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit1.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit1.ts new file mode 100644 index 00000000000..b99806a1eee --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit1.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +class C { + [Symbol.isRegExp]: number; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit10.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit10.ts new file mode 100644 index 00000000000..cf3496c2553 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit10.ts @@ -0,0 +1,6 @@ +//@target: ES6 +//@declaration: true +var obj = { + get [Symbol.isConcatSpreadable]() { return '' }, + set [Symbol.isConcatSpreadable](x) { } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit11.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit11.ts new file mode 100644 index 00000000000..4b88ab55980 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit11.ts @@ -0,0 +1,8 @@ +//@target: ES6 +//@declaration: true +class C { + static [Symbol.iterator] = 0; + static [Symbol.toPrimitive]() { } + static get [Symbol.isRegExp]() { return ""; } + static set [Symbol.isRegExp](x) { } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts new file mode 100644 index 00000000000..c18b470d35d --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit12.ts @@ -0,0 +1,14 @@ +//@target: ES6 +//@declaration: true +module M { + interface I { } + export class C { + [Symbol.iterator]: I; + [Symbol.toPrimitive](x: I) { } + [Symbol.isConcatSpreadable](): I { + return undefined + } + get [Symbol.isRegExp]() { return undefined; } + set [Symbol.isRegExp](x: I) { } + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit13.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit13.ts new file mode 100644 index 00000000000..18568e853e8 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit13.ts @@ -0,0 +1,6 @@ +//@target: ES6 +//@declaration: true +class C { + get [Symbol.isRegExp]() { return ""; } + set [Symbol.toStringTag](x) { } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit14.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit14.ts new file mode 100644 index 00000000000..312476628b8 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit14.ts @@ -0,0 +1,6 @@ +//@target: ES6 +//@declaration: true +class C { + get [Symbol.isRegExp]() { return ""; } + get [Symbol.toStringTag]() { return ""; } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit2.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit2.ts new file mode 100644 index 00000000000..420e1c84906 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit2.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +class C { + [Symbol.isRegExp] = ""; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit3.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit3.ts new file mode 100644 index 00000000000..b70ee3c15ac --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit3.ts @@ -0,0 +1,7 @@ +//@target: ES6 +//@declaration: true +class C { + [Symbol.isRegExp](x: number); + [Symbol.isRegExp](x: string); + [Symbol.isRegExp](x: any) { } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit4.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit4.ts new file mode 100644 index 00000000000..dde80577fa4 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit4.ts @@ -0,0 +1,6 @@ +//@target: ES6 +//@declaration: true +class C { + get [Symbol.isRegExp]() { return ""; } + set [Symbol.isRegExp](x) { } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit5.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit5.ts new file mode 100644 index 00000000000..e5acf9c9f7c --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit5.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +interface I { + [Symbol.isConcatSpreadable](): string; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit6.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit6.ts new file mode 100644 index 00000000000..1d0059f954f --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit6.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +interface I { + [Symbol.isConcatSpreadable]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit7.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit7.ts new file mode 100644 index 00000000000..01f91681b15 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit7.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +var obj: { + [Symbol.isConcatSpreadable]: string; +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit8.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit8.ts new file mode 100644 index 00000000000..2682a4940f9 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit8.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +var obj = { + [Symbol.isConcatSpreadable]: 0 +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit9.ts b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit9.ts new file mode 100644 index 00000000000..2c35a553600 --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolDeclarationEmit9.ts @@ -0,0 +1,5 @@ +//@target: ES6 +//@declaration: true +var obj = { + [Symbol.isConcatSpreadable]() { } +} \ No newline at end of file From 2f3c32afd659b3edda1b24599f1abc1b1b125d18 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 21:22:44 -0800 Subject: [PATCH 030/106] Navigation bar support for symbols --- src/services/navigationBar.ts | 16 +++++++++++----- .../fourslash/scriptLexicalStructureSymbols1.ts | 17 +++++++++++++++++ .../fourslash/scriptLexicalStructureSymbols2.ts | 15 +++++++++++++++ .../fourslash/scriptLexicalStructureSymbols3.ts | 13 +++++++++++++ 4 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/scriptLexicalStructureSymbols1.ts create mode 100644 tests/cases/fourslash/scriptLexicalStructureSymbols2.ts create mode 100644 tests/cases/fourslash/scriptLexicalStructureSymbols3.ts diff --git a/src/services/navigationBar.ts b/src/services/navigationBar.ts index 771fe48219f..b254397f8b0 100644 --- a/src/services/navigationBar.ts +++ b/src/services/navigationBar.ts @@ -97,8 +97,7 @@ module ts.NavigationBar { function sortNodes(nodes: Node[]): Node[] { return nodes.slice(0).sort((n1: Declaration, n2: Declaration) => { if (n1.name && n2.name) { - // TODO(jfreeman): How do we sort declarations with computed names? - return (n1.name).text.localeCompare((n2.name).text); + return getPropertyNameForPropertyNameNode(n1.name).localeCompare(getPropertyNameForPropertyNameNode(n2.name)); } else if (n1.name) { return 1; @@ -426,7 +425,7 @@ module ts.NavigationBar { // Add the constructor parameters in as children of the class (for property parameters). // Note that *all* parameters will be added to the nodes array, but parameters that // are not properties will be filtered out later by createChildItem. - var nodes: Node[] = removeComputedProperties(node); + var nodes: Node[] = removeDynamicallyNamedProperties(node); if (constructor) { nodes.push.apply(nodes, constructor.parameters); } @@ -455,7 +454,7 @@ module ts.NavigationBar { } function createIterfaceItem(node: InterfaceDeclaration): ts.NavigationBarItem { - var childItems = getItemsWorker(sortNodes(removeComputedProperties(node)), createChildItem); + var childItems = getItemsWorker(sortNodes(removeDynamicallyNamedProperties(node)), createChildItem); return getNavigationBarItem( node.name.text, ts.ScriptElementKind.interfaceElement, @@ -466,10 +465,17 @@ module ts.NavigationBar { } } - function removeComputedProperties(node: ClassDeclaration | InterfaceDeclaration | EnumDeclaration): Declaration[] { + function removeComputedProperties(node: EnumDeclaration): Declaration[] { return filter(node.members, member => member.name === undefined || member.name.kind !== SyntaxKind.ComputedPropertyName); } + /** + * Like removeComputedProperties, but retains the properties with well known symbol names + */ + function removeDynamicallyNamedProperties(node: ClassDeclaration | InterfaceDeclaration): Declaration[]{ + return filter(node.members, member => !hasDynamicName(member)); + } + function getInnermostModule(node: ModuleDeclaration): ModuleDeclaration { while (node.body.kind === SyntaxKind.ModuleDeclaration) { node = node.body; diff --git a/tests/cases/fourslash/scriptLexicalStructureSymbols1.ts b/tests/cases/fourslash/scriptLexicalStructureSymbols1.ts new file mode 100644 index 00000000000..e3dde6738e9 --- /dev/null +++ b/tests/cases/fourslash/scriptLexicalStructureSymbols1.ts @@ -0,0 +1,17 @@ +/// + +////{| "itemName": "C", "kind": "class", "parentName": "" |} +////class C { +//// {| "itemName": "[Symbol.isRegExp]", "kind": "property", "parentName": "C" |} +//// [Symbol.isRegExp] = 0; +//// {| "itemName": "[Symbol.iterator]", "kind": "method", "parentName": "C" |} +//// [Symbol.iterator]() { } +//// {| "itemName": "[Symbol.isConcatSpreadable]", "kind": "getter", "parentName": "C" |} +//// get [Symbol.isConcatSpreadable]() { } +////} + +test.markers().forEach(marker => { + verify.getScriptLexicalStructureListContains(marker.data.itemName, marker.data.kind, marker.fileName, marker.data.parentName); +}); + +verify.getScriptLexicalStructureListCount(test.markers().length); \ No newline at end of file diff --git a/tests/cases/fourslash/scriptLexicalStructureSymbols2.ts b/tests/cases/fourslash/scriptLexicalStructureSymbols2.ts new file mode 100644 index 00000000000..d048de895ec --- /dev/null +++ b/tests/cases/fourslash/scriptLexicalStructureSymbols2.ts @@ -0,0 +1,15 @@ +/// + +////{| "itemName": "I", "kind": "interface", "parentName": "" |} +////interface I { +//// {| "itemName": "[Symbol.isRegExp]", "kind": "property", "parentName": "I" |} +//// [Symbol.isRegExp]: string; +//// {| "itemName": "[Symbol.iterator]", "kind": "method", "parentName": "I" |} +//// [Symbol.iterator](): string; +////} + +test.markers().forEach(marker => { + verify.getScriptLexicalStructureListContains(marker.data.itemName, marker.data.kind, marker.fileName, marker.data.parentName); +}); + +verify.getScriptLexicalStructureListCount(test.markers().length); \ No newline at end of file diff --git a/tests/cases/fourslash/scriptLexicalStructureSymbols3.ts b/tests/cases/fourslash/scriptLexicalStructureSymbols3.ts new file mode 100644 index 00000000000..19f81037559 --- /dev/null +++ b/tests/cases/fourslash/scriptLexicalStructureSymbols3.ts @@ -0,0 +1,13 @@ +/// + +////{| "itemName": "E", "kind": "enum", "parentName": "" |} +////enum E { +//// // No nav bar entry for this +//// [Symbol.isRegExp] = 0 +////} + +test.markers().forEach(marker => { + verify.getScriptLexicalStructureListContains(marker.data.itemName, marker.data.kind, marker.fileName, marker.data.parentName); +}); + +verify.getScriptLexicalStructureListCount(test.markers().length); \ No newline at end of file From eb5061971df26526a25633f2ba40677406489cf2 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 21:30:51 -0800 Subject: [PATCH 031/106] Disable symbol indexer --- src/compiler/checker.ts | 10 +------ .../diagnosticInformationMap.generated.ts | 3 +-- src/compiler/diagnosticMessages.json | 7 +---- .../reference/arraySigChecking.errors.txt | 4 +-- ...eReferenceWithoutTypeArgument.d.errors.txt | 4 +-- ...ypeReferenceWithoutTypeArgument.errors.txt | 4 +-- ...peReferenceWithoutTypeArgument2.errors.txt | 4 +-- ...peReferenceWithoutTypeArgument3.errors.txt | 4 +-- .../reference/indexTypeCheck.errors.txt | 4 +-- .../parserES5SymbolIndexer1.errors.txt | 6 ++--- .../parserES5SymbolIndexer2.errors.txt | 6 ++--- .../parserES5SymbolIndexer3.errors.txt | 6 ++--- .../parserIndexSignature6.errors.txt | 4 +-- .../parserIndexSignature8.errors.txt | 8 +++--- .../reference/parserSymbolIndexer1.errors.txt | 9 +++++++ .../reference/parserSymbolIndexer1.types | 7 ----- .../reference/parserSymbolIndexer2.errors.txt | 9 +++++++ .../reference/parserSymbolIndexer2.types | 7 ----- .../reference/parserSymbolIndexer3.errors.txt | 6 ++--- .../reference/parserSymbolIndexer4.errors.txt | 9 +++++++ .../reference/parserSymbolIndexer4.types | 7 ----- .../reference/symbolProperty17.errors.txt | 14 ++++++++++ .../reference/symbolProperty17.types | 27 ------------------- .../reference/symbolProperty29.errors.txt | 12 +++++++++ .../reference/symbolProperty29.types | 17 ------------ .../reference/symbolProperty30.errors.txt | 12 +++++++++ .../reference/symbolProperty31.errors.txt | 14 ++++++++++ .../reference/symbolProperty31.types | 22 --------------- .../reference/symbolProperty32.errors.txt | 14 ++++++++++ .../reference/symbolProperty33.errors.txt | 14 ++++++++++ .../reference/symbolProperty33.types | 22 --------------- .../reference/symbolProperty34.errors.txt | 14 ++++++++++ 32 files changed, 154 insertions(+), 156 deletions(-) create mode 100644 tests/baselines/reference/parserSymbolIndexer1.errors.txt delete mode 100644 tests/baselines/reference/parserSymbolIndexer1.types create mode 100644 tests/baselines/reference/parserSymbolIndexer2.errors.txt delete mode 100644 tests/baselines/reference/parserSymbolIndexer2.types create mode 100644 tests/baselines/reference/parserSymbolIndexer4.errors.txt delete mode 100644 tests/baselines/reference/parserSymbolIndexer4.types create mode 100644 tests/baselines/reference/symbolProperty17.errors.txt delete mode 100644 tests/baselines/reference/symbolProperty17.types create mode 100644 tests/baselines/reference/symbolProperty29.errors.txt delete mode 100644 tests/baselines/reference/symbolProperty29.types create mode 100644 tests/baselines/reference/symbolProperty30.errors.txt create mode 100644 tests/baselines/reference/symbolProperty31.errors.txt delete mode 100644 tests/baselines/reference/symbolProperty31.types create mode 100644 tests/baselines/reference/symbolProperty32.errors.txt create mode 100644 tests/baselines/reference/symbolProperty33.errors.txt delete mode 100644 tests/baselines/reference/symbolProperty33.types create mode 100644 tests/baselines/reference/symbolProperty34.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b2f933e1194..349edf4b609 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10651,15 +10651,7 @@ module ts { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_must_have_a_type_annotation); } if (parameter.type.kind !== SyntaxKind.StringKeyword && parameter.type.kind !== SyntaxKind.NumberKeyword) { - if (parameter.type.kind === SyntaxKind.SymbolKeyword) { - if (languageVersion < ScriptTarget.ES6) { - return grammarErrorOnNode(parameter.type, Diagnostics.symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher); - } - // No error for parameter type - } - else { - return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_number_or_symbol); - } + return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_or_number); } if (!node.type) { return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_a_type_annotation); diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index c491acdf2ef..9745f251e66 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -19,7 +19,7 @@ module ts { An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: DiagnosticCategory.Error, key: "An index signature parameter cannot have an initializer." }, An_index_signature_must_have_a_type_annotation: { code: 1021, category: DiagnosticCategory.Error, key: "An index signature must have a type annotation." }, An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: DiagnosticCategory.Error, key: "An index signature parameter must have a type annotation." }, - An_index_signature_parameter_type_must_be_string_number_or_symbol: { code: 1023, category: DiagnosticCategory.Error, key: "An index signature parameter type must be 'string', 'number', or 'symbol'." }, + An_index_signature_parameter_type_must_be_string_or_number: { code: 1023, category: DiagnosticCategory.Error, key: "An index signature parameter type must be 'string' or 'number'." }, A_class_or_interface_declaration_can_only_have_one_extends_clause: { code: 1024, category: DiagnosticCategory.Error, key: "A class or interface declaration can only have one 'extends' clause." }, An_extends_clause_must_precede_an_implements_clause: { code: 1025, category: DiagnosticCategory.Error, key: "An 'extends' clause must precede an 'implements' clause." }, A_class_can_only_extend_a_single_class: { code: 1026, category: DiagnosticCategory.Error, key: "A class can only extend a single class." }, @@ -147,7 +147,6 @@ module ts { Merge_conflict_marker_encountered: { code: 1185, category: DiagnosticCategory.Error, key: "Merge conflict marker encountered." }, A_rest_element_cannot_have_an_initializer: { code: 1186, category: DiagnosticCategory.Error, key: "A rest element cannot have an initializer." }, A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." }, - symbol_indexers_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1188, category: DiagnosticCategory.Error, key: "'symbol' indexers are only available when targeting ECMAScript 6 and higher.", isEarly: true }, Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." }, Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." }, Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e3f8a880111..fd09a49d3fb 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -67,7 +67,7 @@ "category": "Error", "code": 1022 }, - "An index signature parameter type must be 'string', 'number', or 'symbol'.": { + "An index signature parameter type must be 'string' or 'number'.": { "category": "Error", "code": 1023 }, @@ -579,11 +579,6 @@ "category": "Error", "code": 1187 }, - "'symbol' indexers are only available when targeting ECMAScript 6 and higher.": { - "category": "Error", - "code": 1188, - "isEarly": true - }, "Duplicate identifier '{0}'.": { "category": "Error", diff --git a/tests/baselines/reference/arraySigChecking.errors.txt b/tests/baselines/reference/arraySigChecking.errors.txt index 85948381ff5..b70b659773c 100644 --- a/tests/baselines/reference/arraySigChecking.errors.txt +++ b/tests/baselines/reference/arraySigChecking.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string' or 'number'. tests/cases/compiler/arraySigChecking.ts(18,5): error TS2322: Type 'void[]' is not assignable to type 'string[]'. Type 'void' is not assignable to type 'string'. tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' is not assignable to type 'number[][][]'. @@ -20,7 +20,7 @@ tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' var foo: { [index: any]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } interface myInt { diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt index 5d7da139c2b..6c98d419dec 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(10,21): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,26): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string' or 'number'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,26): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(14,23): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -36,7 +36,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). declare var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt index 7b5116356c7..d57f3c2fc0d 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(10,13): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,14): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,18): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string' or 'number'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,14): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,18): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(14,13): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -46,7 +46,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt index 136682b1ca1..745da9aa106 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(10,13): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,14): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,18): error TS2314: Generic type 'I' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string' or 'number'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,14): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,18): error TS2314: Generic type 'I' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(14,13): error TS2314: Generic type 'I' requires 1 type argument(s). @@ -46,7 +46,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'I' requires 1 type argument(s). var d: { [x: I]: I }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. ~ !!! error TS2314: Generic type 'I' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt index d755a9120a8..1fec52356a2 100644 --- a/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt +++ b/tests/baselines/reference/genericTypeReferenceWithoutTypeArgument3.errors.txt @@ -2,7 +2,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(10,21): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(11,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(11,26): error TS2314: Generic type 'C' requires 1 type argument(s). -tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,19): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,19): error TS1023: An index signature parameter type must be 'string' or 'number'. tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,22): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(12,26): error TS2314: Generic type 'C' requires 1 type argument(s). tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument3.ts(14,23): error TS2314: Generic type 'C' requires 1 type argument(s). @@ -36,7 +36,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc !!! error TS2314: Generic type 'C' requires 1 type argument(s). declare var d: { [x: C]: C }; ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. ~ !!! error TS2314: Generic type 'C' requires 1 type argument(s). ~ diff --git a/tests/baselines/reference/indexTypeCheck.errors.txt b/tests/baselines/reference/indexTypeCheck.errors.txt index 5d3e6dc9268..9f4b403ca2e 100644 --- a/tests/baselines/reference/indexTypeCheck.errors.txt +++ b/tests/baselines/reference/indexTypeCheck.errors.txt @@ -4,7 +4,7 @@ tests/cases/compiler/indexTypeCheck.ts(17,2): error TS2413: Numeric index type ' tests/cases/compiler/indexTypeCheck.ts(22,2): error TS2413: Numeric index type 'Orange' is not assignable to string index type 'Yellow'. tests/cases/compiler/indexTypeCheck.ts(27,2): error TS2413: Numeric index type 'number' is not assignable to string index type 'string'. tests/cases/compiler/indexTypeCheck.ts(32,3): error TS1096: An index signature must have exactly one parameter. -tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/compiler/indexTypeCheck.ts(36,3): error TS1023: An index signature parameter type must be 'string' or 'number'. tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression argument must be of type 'string', 'number', 'symbol, or 'any'. @@ -58,7 +58,7 @@ tests/cases/compiler/indexTypeCheck.ts(51,1): error TS2342: An index expression interface Magenta { [p:Purple]; // error ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } var yellow: Yellow; diff --git a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt index a3c4f22a87e..adfac8f700f 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer1.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,9): error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'. ==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer1.ts (1 errors) ==== interface I { [s: symbol]: string; - ~~~~~~ -!!! error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt index 39d8aa41d77..12eef8ec049 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer2.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,9): error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'. ==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer2.ts (1 errors) ==== class C { [s: symbol]: string; - ~~~~~~ -!!! error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt index 34dea325439..c9cd9db4fab 100644 --- a/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt +++ b/tests/baselines/reference/parserES5SymbolIndexer3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,9): error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'. ==== tests/cases/conformance/parser/ecmascript5/Symbols/parserES5SymbolIndexer3.ts (1 errors) ==== var x: { [s: symbol]: string; - ~~~~~~ -!!! error TS1188: 'symbol' indexers are only available when targeting ECMAScript 6 and higher. + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature6.errors.txt b/tests/baselines/reference/parserIndexSignature6.errors.txt index 52a3b28a519..db53f219832 100644 --- a/tests/baselines/reference/parserIndexSignature6.errors.txt +++ b/tests/baselines/reference/parserIndexSignature6.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts(2,4): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts(2,4): error TS1023: An index signature parameter type must be 'string' or 'number'. ==== tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature6.ts (1 errors) ==== interface I { [a:boolean] ~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserIndexSignature8.errors.txt b/tests/baselines/reference/parserIndexSignature8.errors.txt index efed14e9577..87369df1b76 100644 --- a/tests/baselines/reference/parserIndexSignature8.errors.txt +++ b/tests/baselines/reference/parserIndexSignature8.errors.txt @@ -1,12 +1,12 @@ -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(1,13): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. -tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(2,14): error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(1,13): error TS1023: An index signature parameter type must be 'string' or 'number'. +tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts(2,14): error TS1023: An index signature parameter type must be 'string' or 'number'. ==== tests/cases/conformance/parser/ecmascript5/IndexSignatures/parserIndexSignature8.ts (2 errors) ==== var foo: { [index: any]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. var foo2: { [index: RegExp]; }; // expect an error here ~~~~~ -!!! error TS1023: An index signature parameter type must be 'string', 'number', or 'symbol'. +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer1.errors.txt b/tests/baselines/reference/parserSymbolIndexer1.errors.txt new file mode 100644 index 00000000000..5c6c38d52b1 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer1.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts (1 errors) ==== + interface I { + [s: symbol]: string; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer1.types b/tests/baselines/reference/parserSymbolIndexer1.types deleted file mode 100644 index 6723ef12726..00000000000 --- a/tests/baselines/reference/parserSymbolIndexer1.types +++ /dev/null @@ -1,7 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer1.ts === -interface I { ->I : I - - [s: symbol]: string; ->s : symbol -} diff --git a/tests/baselines/reference/parserSymbolIndexer2.errors.txt b/tests/baselines/reference/parserSymbolIndexer2.errors.txt new file mode 100644 index 00000000000..3961f4942de --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer2.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts (1 errors) ==== + class C { + [s: symbol]: string; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer2.types b/tests/baselines/reference/parserSymbolIndexer2.types deleted file mode 100644 index d8d620c7def..00000000000 --- a/tests/baselines/reference/parserSymbolIndexer2.types +++ /dev/null @@ -1,7 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer2.ts === -class C { ->C : C - - [s: symbol]: string; ->s : symbol -} diff --git a/tests/baselines/reference/parserSymbolIndexer3.errors.txt b/tests/baselines/reference/parserSymbolIndexer3.errors.txt index df3b9596f79..5484a096d4c 100644 --- a/tests/baselines/reference/parserSymbolIndexer3.errors.txt +++ b/tests/baselines/reference/parserSymbolIndexer3.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts(2,5): error TS1145: Modifiers not permitted on index signature members. +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts(2,13): error TS1023: An index signature parameter type must be 'string' or 'number'. ==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer3.ts (1 errors) ==== class C { static [s: symbol]: string; - ~~~~~~ -!!! error TS1145: Modifiers not permitted on index signature members. + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer4.errors.txt b/tests/baselines/reference/parserSymbolIndexer4.errors.txt new file mode 100644 index 00000000000..1cf184a4847 --- /dev/null +++ b/tests/baselines/reference/parserSymbolIndexer4.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts (1 errors) ==== + var x: { + [s: symbol]: string; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserSymbolIndexer4.types b/tests/baselines/reference/parserSymbolIndexer4.types deleted file mode 100644 index 7509072a12c..00000000000 --- a/tests/baselines/reference/parserSymbolIndexer4.types +++ /dev/null @@ -1,7 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Symbols/parserSymbolIndexer4.ts === -var x: { ->x : {} - - [s: symbol]: string; ->s : symbol -} diff --git a/tests/baselines/reference/symbolProperty17.errors.txt b/tests/baselines/reference/symbolProperty17.errors.txt new file mode 100644 index 00000000000..51f77646f0d --- /dev/null +++ b/tests/baselines/reference/symbolProperty17.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/es6/Symbols/symbolProperty17.ts(3,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty17.ts (1 errors) ==== + interface I { + [Symbol.iterator]: number; + [s: symbol]: string; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + "__@iterator": string; + } + + var i: I; + var it = i[Symbol.iterator]; \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty17.types b/tests/baselines/reference/symbolProperty17.types deleted file mode 100644 index f804943c212..00000000000 --- a/tests/baselines/reference/symbolProperty17.types +++ /dev/null @@ -1,27 +0,0 @@ -=== tests/cases/conformance/es6/Symbols/symbolProperty17.ts === -interface I { ->I : I - - [Symbol.iterator]: number; ->Symbol.iterator : symbol ->Symbol : SymbolConstructor ->iterator : symbol - - [s: symbol]: string; ->s : symbol - - "__@iterator": string; -} - -var i: I; ->i : I ->I : I - -var it = i[Symbol.iterator]; ->it : number ->i[Symbol.iterator] : number ->i : I ->Symbol.iterator : symbol ->Symbol : SymbolConstructor ->iterator : symbol - diff --git a/tests/baselines/reference/symbolProperty29.errors.txt b/tests/baselines/reference/symbolProperty29.errors.txt new file mode 100644 index 00000000000..1efaeb2b3bf --- /dev/null +++ b/tests/baselines/reference/symbolProperty29.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/es6/Symbols/symbolProperty29.ts(5,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty29.ts (1 errors) ==== + class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + [s: symbol]: () => { x: string }; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty29.types b/tests/baselines/reference/symbolProperty29.types deleted file mode 100644 index eb47ccae859..00000000000 --- a/tests/baselines/reference/symbolProperty29.types +++ /dev/null @@ -1,17 +0,0 @@ -=== tests/cases/conformance/es6/Symbols/symbolProperty29.ts === -class C1 { ->C1 : C1 - - [Symbol.toStringTag]() { ->Symbol.toStringTag : symbol ->Symbol : SymbolConstructor ->toStringTag : symbol - - return { x: "" }; ->{ x: "" } : { x: string; } ->x : string - } - [s: symbol]: () => { x: string }; ->s : symbol ->x : string -} diff --git a/tests/baselines/reference/symbolProperty30.errors.txt b/tests/baselines/reference/symbolProperty30.errors.txt new file mode 100644 index 00000000000..b839d11d1b8 --- /dev/null +++ b/tests/baselines/reference/symbolProperty30.errors.txt @@ -0,0 +1,12 @@ +tests/cases/conformance/es6/Symbols/symbolProperty30.ts(5,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty30.ts (1 errors) ==== + class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + [s: symbol]: () => { x: number }; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty31.errors.txt b/tests/baselines/reference/symbolProperty31.errors.txt new file mode 100644 index 00000000000..39735c017b2 --- /dev/null +++ b/tests/baselines/reference/symbolProperty31.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/es6/Symbols/symbolProperty31.ts(7,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty31.ts (1 errors) ==== + class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + } + class C2 extends C1 { + [s: symbol]: () => { x: string }; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty31.types b/tests/baselines/reference/symbolProperty31.types deleted file mode 100644 index 52a6523d4ed..00000000000 --- a/tests/baselines/reference/symbolProperty31.types +++ /dev/null @@ -1,22 +0,0 @@ -=== tests/cases/conformance/es6/Symbols/symbolProperty31.ts === -class C1 { ->C1 : C1 - - [Symbol.toStringTag]() { ->Symbol.toStringTag : symbol ->Symbol : SymbolConstructor ->toStringTag : symbol - - return { x: "" }; ->{ x: "" } : { x: string; } ->x : string - } -} -class C2 extends C1 { ->C2 : C2 ->C1 : C1 - - [s: symbol]: () => { x: string }; ->s : symbol ->x : string -} diff --git a/tests/baselines/reference/symbolProperty32.errors.txt b/tests/baselines/reference/symbolProperty32.errors.txt new file mode 100644 index 00000000000..4051f8f91c8 --- /dev/null +++ b/tests/baselines/reference/symbolProperty32.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/es6/Symbols/symbolProperty32.ts(7,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty32.ts (1 errors) ==== + class C1 { + [Symbol.toStringTag]() { + return { x: "" }; + } + } + class C2 extends C1 { + [s: symbol]: () => { x: number }; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty33.errors.txt b/tests/baselines/reference/symbolProperty33.errors.txt new file mode 100644 index 00000000000..25a16b045ab --- /dev/null +++ b/tests/baselines/reference/symbolProperty33.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/es6/Symbols/symbolProperty33.ts(7,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty33.ts (1 errors) ==== + class C1 extends C2 { + [Symbol.toStringTag]() { + return { x: "" }; + } + } + class C2 { + [s: symbol]: () => { x: string }; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty33.types b/tests/baselines/reference/symbolProperty33.types deleted file mode 100644 index aed8a97e60b..00000000000 --- a/tests/baselines/reference/symbolProperty33.types +++ /dev/null @@ -1,22 +0,0 @@ -=== tests/cases/conformance/es6/Symbols/symbolProperty33.ts === -class C1 extends C2 { ->C1 : C1 ->C2 : C2 - - [Symbol.toStringTag]() { ->Symbol.toStringTag : symbol ->Symbol : SymbolConstructor ->toStringTag : symbol - - return { x: "" }; ->{ x: "" } : { x: string; } ->x : string - } -} -class C2 { ->C2 : C2 - - [s: symbol]: () => { x: string }; ->s : symbol ->x : string -} diff --git a/tests/baselines/reference/symbolProperty34.errors.txt b/tests/baselines/reference/symbolProperty34.errors.txt new file mode 100644 index 00000000000..4339af94788 --- /dev/null +++ b/tests/baselines/reference/symbolProperty34.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/es6/Symbols/symbolProperty34.ts(7,6): error TS1023: An index signature parameter type must be 'string' or 'number'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty34.ts (1 errors) ==== + class C1 extends C2 { + [Symbol.toStringTag]() { + return { x: "" }; + } + } + class C2 { + [s: symbol]: () => { x: number }; + ~ +!!! error TS1023: An index signature parameter type must be 'string' or 'number'. + } \ No newline at end of file From 52cb13e9d6265417a960b43e32ffce6a53b48d2a Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 21:38:32 -0800 Subject: [PATCH 032/106] Uncomment symbol properties in es6.d.ts --- src/lib/es6.d.ts | 52 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/lib/es6.d.ts b/src/lib/es6.d.ts index 4d4f435145c..50238e94bb4 100644 --- a/src/lib/es6.d.ts +++ b/src/lib/es6.d.ts @@ -7,7 +7,7 @@ interface Symbol { /** Returns the primitive value of the specified object. */ valueOf(): Object; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface SymbolConstructor { @@ -230,7 +230,7 @@ interface ArrayLike { interface Array { /** Iterator */ - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; /** * Returns an array of key, value pairs for every entry in the array @@ -329,7 +329,7 @@ interface ArrayConstructor { interface String { /** Iterator */ - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; /** * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point @@ -447,12 +447,12 @@ interface IteratorResult { } interface Iterator { - //[Symbol.iterator](): Iterator; + [Symbol.iterator](): Iterator; next(): IteratorResult; } interface Iterable { - //[Symbol.iterator](): Iterator; + [Symbol.iterator](): Iterator; } interface GeneratorFunction extends Function { @@ -474,7 +474,7 @@ interface Generator extends Iterator { next(value?: any): IteratorResult; throw (exception: any): IteratorResult; return (value: T): IteratorResult; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface Math { @@ -588,11 +588,11 @@ interface Math { */ cbrt(x: number): number; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface RegExp { - // [Symbol.isRegExp]: boolean; + [Symbol.isRegExp]: boolean; /** * Matches a string with a regular expression, and returns an array containing the results of @@ -649,8 +649,8 @@ interface Map { set(key: K, value?: V): Map; size: number; values(): Iterator; - // [Symbol.iterator]():Iterator<[K,V]>; - // [Symbol.toStringTag]: string; + [Symbol.iterator]():Iterator<[K,V]>; + [Symbol.toStringTag]: string; } interface MapConstructor { @@ -666,7 +666,7 @@ interface WeakMap { get(key: K): V; has(key: K): boolean; set(key: K, value?: V): WeakMap; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface WeakMapConstructor { @@ -686,8 +686,8 @@ interface Set { keys(): Iterator; size: number; values(): Iterator; - // [Symbol.iterator]():Iterator; - // [Symbol.toStringTag]: string; + [Symbol.iterator]():Iterator; + [Symbol.toStringTag]: string; } interface SetConstructor { @@ -702,7 +702,7 @@ interface WeakSet { clear(): void; delete(value: T): boolean; has(value: T): boolean; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface WeakSetConstructor { @@ -713,7 +713,7 @@ interface WeakSetConstructor { declare var WeakSet: WeakSetConstructor; interface JSON { - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } /** @@ -733,7 +733,7 @@ interface ArrayBuffer { */ slice(begin: number, end?: number): ArrayBuffer; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface ArrayBufferConstructor { @@ -870,7 +870,7 @@ interface DataView { */ setUint32(byteOffset: number, value: number, littleEndian: boolean): void; - // [Symbol.toStringTag]: string; + [Symbol.toStringTag]: string; } interface DataViewConstructor { @@ -1137,7 +1137,7 @@ interface Int8Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Int8ArrayConstructor { @@ -1427,7 +1427,7 @@ interface Uint8Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Uint8ArrayConstructor { @@ -1717,7 +1717,7 @@ interface Uint8ClampedArray { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Uint8ClampedArrayConstructor { @@ -2007,7 +2007,7 @@ interface Int16Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Int16ArrayConstructor { @@ -2297,7 +2297,7 @@ interface Uint16Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Uint16ArrayConstructor { @@ -2587,7 +2587,7 @@ interface Int32Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Int32ArrayConstructor { @@ -2877,7 +2877,7 @@ interface Uint32Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Uint32ArrayConstructor { @@ -3167,7 +3167,7 @@ interface Float32Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Float32ArrayConstructor { @@ -3457,7 +3457,7 @@ interface Float64Array { values(): Iterator; [index: number]: number; - // [Symbol.iterator] (): Iterator; + [Symbol.iterator] (): Iterator; } interface Float64ArrayConstructor { From 75382c14f9aabc4f1e120d21df757a1d4e70cc25 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 6 Feb 2015 21:38:53 -0800 Subject: [PATCH 033/106] Accept baselines after rebase --- tests/baselines/reference/ES5SymbolProperty2.js | 3 +-- tests/baselines/reference/ES5SymbolProperty3.js | 3 +-- tests/baselines/reference/ES5SymbolProperty4.js | 3 +-- tests/baselines/reference/ES5SymbolProperty5.js | 3 +-- tests/baselines/reference/ES5SymbolProperty6.js | 3 +-- tests/baselines/reference/ES5SymbolProperty7.js | 3 +-- tests/baselines/reference/parserES5SymbolProperty7.js | 3 +-- tests/baselines/reference/parserSymbolProperty7.js | 3 +-- tests/baselines/reference/symbolDeclarationEmit10.js | 3 +-- tests/baselines/reference/symbolDeclarationEmit11.js | 6 ++---- tests/baselines/reference/symbolDeclarationEmit12.js | 6 ++---- tests/baselines/reference/symbolDeclarationEmit13.js | 3 +-- tests/baselines/reference/symbolDeclarationEmit3.js | 3 +-- tests/baselines/reference/symbolDeclarationEmit4.js | 3 +-- tests/baselines/reference/symbolDeclarationEmit9.js | 3 +-- tests/baselines/reference/symbolProperty1.js | 3 +-- tests/baselines/reference/symbolProperty18.js | 3 +-- tests/baselines/reference/symbolProperty2.js | 3 +-- tests/baselines/reference/symbolProperty3.js | 3 +-- tests/baselines/reference/symbolProperty4.js | 3 +-- tests/baselines/reference/symbolProperty48.js | 3 +-- tests/baselines/reference/symbolProperty49.js | 3 +-- tests/baselines/reference/symbolProperty5.js | 3 +-- tests/baselines/reference/symbolProperty50.js | 3 +-- tests/baselines/reference/symbolProperty51.js | 3 +-- tests/baselines/reference/symbolProperty6.js | 3 +-- tests/baselines/reference/symbolProperty7.js | 3 +-- tests/baselines/reference/symbolType13.js | 9 +++------ 28 files changed, 32 insertions(+), 64 deletions(-) diff --git a/tests/baselines/reference/ES5SymbolProperty2.js b/tests/baselines/reference/ES5SymbolProperty2.js index a1efd6ae7ba..effd1e610f4 100644 --- a/tests/baselines/reference/ES5SymbolProperty2.js +++ b/tests/baselines/reference/ES5SymbolProperty2.js @@ -17,8 +17,7 @@ var M; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); M.C = C; diff --git a/tests/baselines/reference/ES5SymbolProperty3.js b/tests/baselines/reference/ES5SymbolProperty3.js index 7ef892cb3c4..52ea7e091ee 100644 --- a/tests/baselines/reference/ES5SymbolProperty3.js +++ b/tests/baselines/reference/ES5SymbolProperty3.js @@ -12,8 +12,7 @@ var Symbol; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); (new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty4.js b/tests/baselines/reference/ES5SymbolProperty4.js index d4022066bb8..ae8a539f351 100644 --- a/tests/baselines/reference/ES5SymbolProperty4.js +++ b/tests/baselines/reference/ES5SymbolProperty4.js @@ -12,8 +12,7 @@ var Symbol; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); (new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty5.js b/tests/baselines/reference/ES5SymbolProperty5.js index c433b0ab443..63b12667d0f 100644 --- a/tests/baselines/reference/ES5SymbolProperty5.js +++ b/tests/baselines/reference/ES5SymbolProperty5.js @@ -12,8 +12,7 @@ var Symbol; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); (new C)[Symbol.iterator](0); // Should error diff --git a/tests/baselines/reference/ES5SymbolProperty6.js b/tests/baselines/reference/ES5SymbolProperty6.js index 949ce722aa7..10eda091e5e 100644 --- a/tests/baselines/reference/ES5SymbolProperty6.js +++ b/tests/baselines/reference/ES5SymbolProperty6.js @@ -9,8 +9,7 @@ class C { var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); (new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/ES5SymbolProperty7.js b/tests/baselines/reference/ES5SymbolProperty7.js index f98e792e8cd..d3f796ce758 100644 --- a/tests/baselines/reference/ES5SymbolProperty7.js +++ b/tests/baselines/reference/ES5SymbolProperty7.js @@ -12,8 +12,7 @@ var Symbol; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); (new C)[Symbol.iterator]; diff --git a/tests/baselines/reference/parserES5SymbolProperty7.js b/tests/baselines/reference/parserES5SymbolProperty7.js index b6096b798df..102d10af417 100644 --- a/tests/baselines/reference/parserES5SymbolProperty7.js +++ b/tests/baselines/reference/parserES5SymbolProperty7.js @@ -7,7 +7,6 @@ class C { var C = (function () { function C() { } - C.prototype[Symbol.toStringTag] = function () { - }; + C.prototype[Symbol.toStringTag] = function () { }; return C; })(); diff --git a/tests/baselines/reference/parserSymbolProperty7.js b/tests/baselines/reference/parserSymbolProperty7.js index 9d34b9e3bce..9368fd12855 100644 --- a/tests/baselines/reference/parserSymbolProperty7.js +++ b/tests/baselines/reference/parserSymbolProperty7.js @@ -7,7 +7,6 @@ class C { var C = (function () { function C() { } - C.prototype[Symbol.toStringTag] = function () { - }; + C.prototype[Symbol.toStringTag] = function () { }; return C; })(); diff --git a/tests/baselines/reference/symbolDeclarationEmit10.js b/tests/baselines/reference/symbolDeclarationEmit10.js index 7ace6617db5..090adc03a1c 100644 --- a/tests/baselines/reference/symbolDeclarationEmit10.js +++ b/tests/baselines/reference/symbolDeclarationEmit10.js @@ -9,8 +9,7 @@ var obj = { get [Symbol.isConcatSpreadable]() { return ''; }, - set [Symbol.isConcatSpreadable](x) { - } + set [Symbol.isConcatSpreadable](x) { } }; diff --git a/tests/baselines/reference/symbolDeclarationEmit11.js b/tests/baselines/reference/symbolDeclarationEmit11.js index c9c819eefa2..eeaf66db3e0 100644 --- a/tests/baselines/reference/symbolDeclarationEmit11.js +++ b/tests/baselines/reference/symbolDeclarationEmit11.js @@ -10,14 +10,12 @@ class C { var C = (function () { function C() { } - C[Symbol.toPrimitive] = function () { - }; + C[Symbol.toPrimitive] = function () { }; Object.defineProperty(C, Symbol.isRegExp, { get: function () { return ""; }, - set: function (x) { - }, + set: function (x) { }, enumerable: true, configurable: true }); diff --git a/tests/baselines/reference/symbolDeclarationEmit12.js b/tests/baselines/reference/symbolDeclarationEmit12.js index 49ff8b35976..e39e62f62ed 100644 --- a/tests/baselines/reference/symbolDeclarationEmit12.js +++ b/tests/baselines/reference/symbolDeclarationEmit12.js @@ -18,8 +18,7 @@ var M; var C = (function () { function C() { } - C.prototype[Symbol.toPrimitive] = function (x) { - }; + C.prototype[Symbol.toPrimitive] = function (x) { }; C.prototype[Symbol.isConcatSpreadable] = function () { return undefined; }; @@ -27,8 +26,7 @@ var M; get: function () { return undefined; }, - set: function (x) { - }, + set: function (x) { }, enumerable: true, configurable: true }); diff --git a/tests/baselines/reference/symbolDeclarationEmit13.js b/tests/baselines/reference/symbolDeclarationEmit13.js index 51b6edcece5..83e2a2501e4 100644 --- a/tests/baselines/reference/symbolDeclarationEmit13.js +++ b/tests/baselines/reference/symbolDeclarationEmit13.js @@ -16,8 +16,7 @@ var C = (function () { configurable: true }); Object.defineProperty(C.prototype, Symbol.toStringTag, { - set: function (x) { - }, + set: function (x) { }, enumerable: true, configurable: true }); diff --git a/tests/baselines/reference/symbolDeclarationEmit3.js b/tests/baselines/reference/symbolDeclarationEmit3.js index 6d06c09bd69..e3b22d883c8 100644 --- a/tests/baselines/reference/symbolDeclarationEmit3.js +++ b/tests/baselines/reference/symbolDeclarationEmit3.js @@ -9,8 +9,7 @@ class C { var C = (function () { function C() { } - C.prototype[Symbol.isRegExp] = function (x) { - }; + C.prototype[Symbol.isRegExp] = function (x) { }; return C; })(); diff --git a/tests/baselines/reference/symbolDeclarationEmit4.js b/tests/baselines/reference/symbolDeclarationEmit4.js index cd3fc53a5bb..85906167b11 100644 --- a/tests/baselines/reference/symbolDeclarationEmit4.js +++ b/tests/baselines/reference/symbolDeclarationEmit4.js @@ -12,8 +12,7 @@ var C = (function () { get: function () { return ""; }, - set: function (x) { - }, + set: function (x) { }, enumerable: true, configurable: true }); diff --git a/tests/baselines/reference/symbolDeclarationEmit9.js b/tests/baselines/reference/symbolDeclarationEmit9.js index 8cdb7173144..d38171767a5 100644 --- a/tests/baselines/reference/symbolDeclarationEmit9.js +++ b/tests/baselines/reference/symbolDeclarationEmit9.js @@ -5,8 +5,7 @@ var obj = { //// [symbolDeclarationEmit9.js] var obj = { - [Symbol.isConcatSpreadable]() { - } + [Symbol.isConcatSpreadable]() { } }; diff --git a/tests/baselines/reference/symbolProperty1.js b/tests/baselines/reference/symbolProperty1.js index 1537883f4ec..0117dd3b1c2 100644 --- a/tests/baselines/reference/symbolProperty1.js +++ b/tests/baselines/reference/symbolProperty1.js @@ -12,8 +12,7 @@ var x = { var s; var x = { [s]: 0, - [s]() { - }, + [s]() { }, get [s]() { return 0; } diff --git a/tests/baselines/reference/symbolProperty18.js b/tests/baselines/reference/symbolProperty18.js index ff69588be31..17570e2f007 100644 --- a/tests/baselines/reference/symbolProperty18.js +++ b/tests/baselines/reference/symbolProperty18.js @@ -15,8 +15,7 @@ var i = { [Symbol.toStringTag]() { return ""; }, - set [Symbol.toPrimitive](p) { - } + set [Symbol.toPrimitive](p) { } }; var it = i[Symbol.iterator]; var str = i[Symbol.toStringTag](); diff --git a/tests/baselines/reference/symbolProperty2.js b/tests/baselines/reference/symbolProperty2.js index 5c0f89b0257..0158366f9d5 100644 --- a/tests/baselines/reference/symbolProperty2.js +++ b/tests/baselines/reference/symbolProperty2.js @@ -12,8 +12,7 @@ var x = { var s = Symbol(); var x = { [s]: 0, - [s]() { - }, + [s]() { }, get [s]() { return 0; } diff --git a/tests/baselines/reference/symbolProperty3.js b/tests/baselines/reference/symbolProperty3.js index 6159b10f9f3..dda9ca23d32 100644 --- a/tests/baselines/reference/symbolProperty3.js +++ b/tests/baselines/reference/symbolProperty3.js @@ -12,8 +12,7 @@ var x = { var s = Symbol; var x = { [s]: 0, - [s]() { - }, + [s]() { }, get [s]() { return 0; } diff --git a/tests/baselines/reference/symbolProperty4.js b/tests/baselines/reference/symbolProperty4.js index be7cdab5f85..6072d6bbf72 100644 --- a/tests/baselines/reference/symbolProperty4.js +++ b/tests/baselines/reference/symbolProperty4.js @@ -10,8 +10,7 @@ var x = { //// [symbolProperty4.js] var x = { [Symbol()]: 0, - [Symbol()]() { - }, + [Symbol()]() { }, get [Symbol()]() { return 0; } diff --git a/tests/baselines/reference/symbolProperty48.js b/tests/baselines/reference/symbolProperty48.js index b0dc2b46dba..48717470f2f 100644 --- a/tests/baselines/reference/symbolProperty48.js +++ b/tests/baselines/reference/symbolProperty48.js @@ -14,8 +14,7 @@ var M; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); })(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty49.js b/tests/baselines/reference/symbolProperty49.js index ea6e6f2c523..6c115a89ae4 100644 --- a/tests/baselines/reference/symbolProperty49.js +++ b/tests/baselines/reference/symbolProperty49.js @@ -14,8 +14,7 @@ var M; var C = (function () { function C() { } - C.prototype[M.Symbol.iterator] = function () { - }; + C.prototype[M.Symbol.iterator] = function () { }; return C; })(); })(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty5.js b/tests/baselines/reference/symbolProperty5.js index 9f0ff3d688f..c7c88681f8a 100644 --- a/tests/baselines/reference/symbolProperty5.js +++ b/tests/baselines/reference/symbolProperty5.js @@ -10,8 +10,7 @@ var x = { //// [symbolProperty5.js] var x = { [Symbol.iterator]: 0, - [Symbol.isRegExp]() { - }, + [Symbol.isRegExp]() { }, get [Symbol.toStringTag]() { return 0; } diff --git a/tests/baselines/reference/symbolProperty50.js b/tests/baselines/reference/symbolProperty50.js index 0a668e95509..61ded053938 100644 --- a/tests/baselines/reference/symbolProperty50.js +++ b/tests/baselines/reference/symbolProperty50.js @@ -13,8 +13,7 @@ var M; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); })(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty51.js b/tests/baselines/reference/symbolProperty51.js index b3b9902fcd6..246dbaaa173 100644 --- a/tests/baselines/reference/symbolProperty51.js +++ b/tests/baselines/reference/symbolProperty51.js @@ -13,8 +13,7 @@ var M; var C = (function () { function C() { } - C.prototype[Symbol.iterator] = function () { - }; + C.prototype[Symbol.iterator] = function () { }; return C; })(); })(M || (M = {})); diff --git a/tests/baselines/reference/symbolProperty6.js b/tests/baselines/reference/symbolProperty6.js index 114999dc873..aee61b97435 100644 --- a/tests/baselines/reference/symbolProperty6.js +++ b/tests/baselines/reference/symbolProperty6.js @@ -13,8 +13,7 @@ var C = (function () { function C() { this[Symbol.iterator] = 0; } - C.prototype[Symbol.isRegExp] = function () { - }; + C.prototype[Symbol.isRegExp] = function () { }; Object.defineProperty(C.prototype, Symbol.toStringTag, { get: function () { return 0; diff --git a/tests/baselines/reference/symbolProperty7.js b/tests/baselines/reference/symbolProperty7.js index 42d19616ce3..781113572a1 100644 --- a/tests/baselines/reference/symbolProperty7.js +++ b/tests/baselines/reference/symbolProperty7.js @@ -13,8 +13,7 @@ var C = (function () { function C() { this[Symbol()] = 0; } - C.prototype[Symbol()] = function () { - }; + C.prototype[Symbol()] = function () { }; Object.defineProperty(C.prototype, Symbol(), { get: function () { return 0; diff --git a/tests/baselines/reference/symbolType13.js b/tests/baselines/reference/symbolType13.js index 56aef2cc8e6..afd62079bb5 100644 --- a/tests/baselines/reference/symbolType13.js +++ b/tests/baselines/reference/symbolType13.js @@ -9,9 +9,6 @@ for (var y in s) { } //// [symbolType13.js] var s = Symbol(); var x; -for (s in {}) { -} -for (x in s) { -} -for (var y in s) { -} +for (s in {}) { } +for (x in s) { } +for (var y in s) { } From bf7bb517e08b9e10003905c6cb8f2c6d39d087bb Mon Sep 17 00:00:00 2001 From: Jason Ramsay Date: Mon, 9 Feb 2015 12:56:54 -0800 Subject: [PATCH 034/106] Replace endsWith() with isDefaultLib() There are a couple of issues with using the current endsWith() function to determine if we should allow a rename for default lib files: 1. XXXX-lib.d.ts would not allow renames even though it should as the preceding characters are not being verified for directory separators 2. There is the potential for false matches as there is currently no check to verify indexOf was successful (index >= 0) --- src/services/services.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 56e68b2f5a1..ad6643faf3c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5520,7 +5520,7 @@ module ts { var defaultLibFile = getDefaultLibFileName(host.getCompilationSettings()); for (var i = 0; i < declarations.length; i++) { var sourceFile = declarations[i].getSourceFile(); - if (sourceFile && endsWith(sourceFile.fileName, defaultLibFile)) { + if (sourceFile && isDefaultLibFile(sourceFile.fileName, defaultLibFile)) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library.key)); } } @@ -5543,8 +5543,14 @@ module ts { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_this_element.key)); - function endsWith(string: string, value: string): boolean { - return string.lastIndexOf(value) + value.length === string.length; + function isDefaultLibFile(fileName: string, defaultLibFile: string): boolean { + var hasValidPrefix = true; + var index = fileName.lastIndexOf(defaultLibFile); + if (index - 1 >= 0) { + var prefix = fileName[index - 1]; + hasValidPrefix = (prefix === "\\" || prefix === "/"); + } + return index >= 0 && hasValidPrefix && (index + defaultLibFile.length === fileName.length); } function getRenameInfoError(localizedErrorMessage: string): RenameInfo { From 18276e526754b14d1f0f30ef794f19a64d193767 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 10 Feb 2015 16:13:28 -0800 Subject: [PATCH 035/106] Address feedback from @yuit --- src/compiler/checker.ts | 64 +++++++++++-------- .../diagnosticInformationMap.generated.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- src/compiler/utilities.ts | 5 ++ .../reference/symbolProperty59.errors.txt | 9 +++ tests/baselines/reference/symbolProperty59.js | 6 ++ .../reference/symbolType12.errors.txt | 12 ++-- .../reference/symbolType3.errors.txt | 16 ++--- .../reference/symbolType6.errors.txt | 24 +++---- .../reference/symbolType8.errors.txt | 40 ++++++------ .../es6/Symbols/symbolProperty59.ts | 4 ++ 11 files changed, 110 insertions(+), 74 deletions(-) create mode 100644 tests/baselines/reference/symbolProperty59.errors.txt create mode 100644 tests/baselines/reference/symbolProperty59.js create mode 100644 tests/cases/conformance/es6/Symbols/symbolProperty59.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 349edf4b609..ad417c4c8d8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2502,9 +2502,9 @@ module ts { return getPropertiesOfObjectType(getApparentType(type)); } - // For a type parameter, return the base constraint of the type parameter. For the string, number, and - // boolean primitive types, return the corresponding object types.Otherwise return the type itself. - // Note that the apparent type of a union type is the union type itself. + // For a type parameter, return the base constraint of the type parameter. For the string, number, + // boolean, and symbol primitive types, return the corresponding object types.Otherwise return the + // type itself. Note that the apparent type of a union type is the union type itself. function getApparentType(type: Type): Type { if (type.flags & TypeFlags.TypeParameter) { do { @@ -5543,8 +5543,8 @@ module ts { if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); } - else if (isWellKnownSymbolSyntactically(node.expression)) { - checkSymbolNameIsProperSymbolReference(node.expression, links.resolvedType, /*reportError*/ true); + else { + checkThatExpressionIsProperSymbolReference(node.expression, links.resolvedType, /*reportError*/ true); } } @@ -5848,11 +5848,9 @@ module ts { if (indexArgumentExpression.kind === SyntaxKind.StringLiteral || indexArgumentExpression.kind === SyntaxKind.NumericLiteral) { return (indexArgumentExpression).text; } - if (isWellKnownSymbolSyntactically(indexArgumentExpression)) { - if (checkSymbolNameIsProperSymbolReference(indexArgumentExpression, indexArgumentType, /*reportError*/ false)) { - var rightHandSideName = ((indexArgumentExpression).name).text; - return getPropertyNameForKnownSymbolName(rightHandSideName); - } + if (checkThatExpressionIsProperSymbolReference(indexArgumentExpression, indexArgumentType, /*reportError*/ false)) { + var rightHandSideName = ((indexArgumentExpression).name).text; + return getPropertyNameForKnownSymbolName(rightHandSideName); } return undefined; @@ -5860,34 +5858,33 @@ module ts { /** * A proper symbol reference requires the following: - * 1. The expression is of the form Symbol. - * 2. Symbol in this context resolves to the global Symbol object - * 3. The property access denotes a property that is present on the global Symbol object - * 4. The property on the global Symbol object is of the primitive type symbol. + * 1. The property access denotes a property that exists + * 2. The expression is of the form Symbol. + * 3. The property access is of the primitive type symbol. + * 4. Symbol in this context resolves to the global Symbol object */ - function checkSymbolNameIsProperSymbolReference(wellKnownSymbolName: PropertyAccessExpression, propertyNameType: Type, reportError: boolean): boolean { - if (propertyNameType === unknownType) { + function checkThatExpressionIsProperSymbolReference(expression: Expression, expressionType: Type, reportError: boolean): boolean { + if (expressionType === unknownType) { // There is already an error, so no need to report one. return false; } - Debug.assert(isWellKnownSymbolSyntactically(wellKnownSymbolName)); + if (!isWellKnownSymbolSyntactically(expression)) { + return false; + } // Make sure the property type is the primitive symbol type - if ((propertyNameType.flags & TypeFlags.ESSymbol) === 0) { + if ((expressionType.flags & TypeFlags.ESSymbol) === 0) { if (reportError) { - error(wellKnownSymbolName, Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, getTextOfNode(wellKnownSymbolName)); + error(expression, Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, getTextOfNode(expression)); } return false; } // The name is Symbol., so make sure Symbol actually resolves to the // global Symbol object - var leftHandSide = (wellKnownSymbolName).expression; - // Look up the global symbol, but don't report an error, since checking the actual expression - // would have reported an error. - var leftHandSideSymbol = resolveName(wellKnownSymbolName, (leftHandSide).text, - SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined); + var leftHandSide = (expression).expression; + var leftHandSideSymbol = getResolvedSymbol(leftHandSide); if (!leftHandSideSymbol) { return false; } @@ -6936,7 +6933,7 @@ module ts { case SyntaxKind.MinusToken: case SyntaxKind.TildeToken: if (hasSomeTypeOfKind(operandType, TypeFlags.ESSymbol)) { - error(node.operand, Diagnostics.The_0_operator_cannot_be_applied_to_a_value_of_type_symbol, tokenToString(node.operator)); + error(node.operand, Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, tokenToString(node.operator)); } return numberType; case SyntaxKind.ExclamationToken: @@ -7270,7 +7267,7 @@ module ts { hasSomeTypeOfKind(rightType, TypeFlags.ESSymbol) ? node.right : undefined; if (offendingSymbolOperand) { - error(offendingSymbolOperand, Diagnostics.The_0_operator_cannot_be_applied_to_a_value_of_type_symbol, tokenToString(operator)); + error(offendingSymbolOperand, Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, tokenToString(operator)); return false; } @@ -7362,6 +7359,9 @@ module ts { } function checkPropertyAssignment(node: PropertyAssignment, contextualMapper?: TypeMapper): Type { + // Do not use hasDynamicName here, because that returns false for well known symbols. + // We want to perform checkComputedPropertyName for all computed properties, including + // well known symbols. if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); } @@ -7373,6 +7373,9 @@ module ts { // Grammar checking checkGrammarMethod(node); + // Do not use hasDynamicName here, because that returns false for well known symbols. + // We want to perform checkComputedPropertyName for all computed properties, including + // well known symbols. if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); } @@ -8185,6 +8188,9 @@ module ts { function checkFunctionLikeDeclaration(node: FunctionLikeDeclaration): void { checkSignatureDeclaration(node); + // Do not use hasDynamicName here, because that returns false for well known symbols. + // We want to perform checkComputedPropertyName for all computed properties, including + // well known symbols. if (node.name.kind === SyntaxKind.ComputedPropertyName) { // This check will account for methods in class/interface declarations, // as well as accessors in classes/object literals @@ -8420,6 +8426,9 @@ module ts { function checkVariableLikeDeclaration(node: VariableLikeDeclaration) { checkSourceElement(node.type); // For a computed property, just check the initializer and exit + // Do not use hasDynamicName here, because that returns false for well known symbols. + // We want to perform checkComputedPropertyName for all computed properties, including + // well known symbols. if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); if (node.initializer) { @@ -11159,6 +11168,9 @@ module ts { var inAmbientContext = isInAmbientContext(enumDecl); for (var i = 0, n = enumDecl.members.length; i < n; i++) { var node = enumDecl.members[i]; + // Do not use hasDynamicName here, because that returns false for well known symbols. + // We want to perform checkComputedPropertyName for all computed properties, including + // well known symbols. if (node.name.kind === SyntaxKind.ComputedPropertyName) { hasError = grammarErrorOnNode(node.name, Diagnostics.Computed_property_names_are_not_allowed_in_enums); } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 9745f251e66..7d5681c706a 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -304,7 +304,7 @@ module ts { super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." }, A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." }, Cannot_find_global_value_0: { code: 2468, category: DiagnosticCategory.Error, key: "Cannot find global value '{0}'." }, - The_0_operator_cannot_be_applied_to_a_value_of_type_symbol: { code: 2469, category: DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to a value of type 'symbol'." }, + The_0_operator_cannot_be_applied_to_type_symbol: { code: 2469, category: DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to type 'symbol'." }, Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object: { code: 2470, category: DiagnosticCategory.Error, key: "'Symbol' reference does not refer to the global Symbol constructor object." }, A_computed_property_name_of_the_form_0_must_be_of_type_symbol: { code: 2471, category: DiagnosticCategory.Error, key: "A computed property name of the form '{0}' must be of type 'symbol'." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index fd09a49d3fb..e3c3be59a01 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1208,7 +1208,7 @@ "category": "Error", "code": 2468 }, - "The '{0}' operator cannot be applied to a value of type 'symbol'.": { + "The '{0}' operator cannot be applied to type 'symbol'.": { "category": "Error", "code": 2469 }, diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 16d2303a16e..0656bed7d5f 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -848,6 +848,11 @@ module ts { !isWellKnownSymbolSyntactically((declaration.name).expression); } + /** + * Checks if the expression is of the form: + * Symbol.name + * where Symbol is literally the word "Symbol", and name is any identifierName + */ export function isWellKnownSymbolSyntactically(node: Expression): boolean { return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((node).expression); } diff --git a/tests/baselines/reference/symbolProperty59.errors.txt b/tests/baselines/reference/symbolProperty59.errors.txt new file mode 100644 index 00000000000..dfb2ece3d21 --- /dev/null +++ b/tests/baselines/reference/symbolProperty59.errors.txt @@ -0,0 +1,9 @@ +tests/cases/conformance/es6/Symbols/symbolProperty59.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. + + +==== tests/cases/conformance/es6/Symbols/symbolProperty59.ts (1 errors) ==== + interface I { + [Symbol.keyFor]: string; + ~~~~~~~~~~~~~~~ +!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'. + } \ No newline at end of file diff --git a/tests/baselines/reference/symbolProperty59.js b/tests/baselines/reference/symbolProperty59.js new file mode 100644 index 00000000000..78d1d212f28 --- /dev/null +++ b/tests/baselines/reference/symbolProperty59.js @@ -0,0 +1,6 @@ +//// [symbolProperty59.ts] +interface I { + [Symbol.keyFor]: string; +} + +//// [symbolProperty59.js] diff --git a/tests/baselines/reference/symbolType12.errors.txt b/tests/baselines/reference/symbolType12.errors.txt index 85db01ff5d2..adceb58ae56 100644 --- a/tests/baselines/reference/symbolType12.errors.txt +++ b/tests/baselines/reference/symbolType12.errors.txt @@ -9,8 +9,8 @@ tests/cases/conformance/es6/Symbols/symbolType12.ts(7,6): error TS2363: The righ tests/cases/conformance/es6/Symbols/symbolType12.ts(8,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType12.ts(9,1): error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'symbol'. tests/cases/conformance/es6/Symbols/symbolType12.ts(10,1): error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'number'. -tests/cases/conformance/es6/Symbols/symbolType12.ts(11,1): error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType12.ts(12,8): error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(11,1): error TS2469: The '+=' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(12,8): error TS2469: The '+=' operator cannot be applied to type 'symbol'. tests/cases/conformance/es6/Symbols/symbolType12.ts(13,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType12.ts(13,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType12.ts(14,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. @@ -32,7 +32,7 @@ tests/cases/conformance/es6/Symbols/symbolType12.ts(24,1): error TS2362: The lef tests/cases/conformance/es6/Symbols/symbolType12.ts(25,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType12.ts(25,6): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType12.ts(26,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. -tests/cases/conformance/es6/Symbols/symbolType12.ts(28,8): error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType12.ts(28,8): error TS2469: The '+=' operator cannot be applied to type 'symbol'. ==== tests/cases/conformance/es6/Symbols/symbolType12.ts (35 errors) ==== @@ -70,10 +70,10 @@ tests/cases/conformance/es6/Symbols/symbolType12.ts(28,8): error TS2469: The '+= !!! error TS2365: Operator '+=' cannot be applied to types 'symbol' and 'number'. s += ""; ~ -!!! error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+=' operator cannot be applied to type 'symbol'. str += s; ~ -!!! error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+=' operator cannot be applied to type 'symbol'. s -= s; ~ !!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. @@ -133,4 +133,4 @@ tests/cases/conformance/es6/Symbols/symbolType12.ts(28,8): error TS2469: The '+= str += (s || str); ~~~~~~~~~~ -!!! error TS2469: The '+=' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file +!!! error TS2469: The '+=' operator cannot be applied to type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType3.errors.txt b/tests/baselines/reference/symbolType3.errors.txt index 384ccb06c05..7cc9e82b3b3 100644 --- a/tests/baselines/reference/symbolType3.errors.txt +++ b/tests/baselines/reference/symbolType3.errors.txt @@ -1,9 +1,9 @@ tests/cases/conformance/es6/Symbols/symbolType3.ts(5,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType3.ts(6,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. -tests/cases/conformance/es6/Symbols/symbolType3.ts(7,3): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType3.ts(8,3): error TS2469: The '-' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType3.ts(9,3): error TS2469: The '~' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType3.ts(12,2): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(7,3): error TS2469: The '+' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(8,3): error TS2469: The '-' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(9,3): error TS2469: The '~' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType3.ts(12,2): error TS2469: The '+' operator cannot be applied to type 'symbol'. ==== tests/cases/conformance/es6/Symbols/symbolType3.ts (6 errors) ==== @@ -19,15 +19,15 @@ tests/cases/conformance/es6/Symbols/symbolType3.ts(12,2): error TS2469: The '+' !!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type. + Symbol(); ~~~~~~~~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. - Symbol(); ~~~~~~~~ -!!! error TS2469: The '-' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '-' operator cannot be applied to type 'symbol'. ~ Symbol(); ~~~~~~~~ -!!! error TS2469: The '~' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '~' operator cannot be applied to type 'symbol'. ! Symbol(); +(Symbol() || 0); ~~~~~~~~~~~~~~~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType6.errors.txt b/tests/baselines/reference/symbolType6.errors.txt index 9ad7321063f..29d894c2afb 100644 --- a/tests/baselines/reference/symbolType6.errors.txt +++ b/tests/baselines/reference/symbolType6.errors.txt @@ -1,16 +1,16 @@ tests/cases/conformance/es6/Symbols/symbolType6.ts(3,1): error TS2365: Operator '+' cannot be applied to types 'symbol' and 'symbol'. tests/cases/conformance/es6/Symbols/symbolType6.ts(4,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType6.ts(4,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. -tests/cases/conformance/es6/Symbols/symbolType6.ts(5,1): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType6.ts(6,1): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(5,1): error TS2469: The '+' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(6,1): error TS2469: The '+' operator cannot be applied to type 'symbol'. tests/cases/conformance/es6/Symbols/symbolType6.ts(7,1): error TS2365: Operator '+' cannot be applied to types 'symbol' and 'number'. -tests/cases/conformance/es6/Symbols/symbolType6.ts(8,6): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType6.ts(9,5): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(8,6): error TS2469: The '+' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(9,5): error TS2469: The '+' operator cannot be applied to type 'symbol'. tests/cases/conformance/es6/Symbols/symbolType6.ts(10,1): error TS2365: Operator '+' cannot be applied to types 'number' and 'symbol'. tests/cases/conformance/es6/Symbols/symbolType6.ts(11,1): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. tests/cases/conformance/es6/Symbols/symbolType6.ts(12,5): error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. -tests/cases/conformance/es6/Symbols/symbolType6.ts(14,1): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType6.ts(15,6): error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(14,1): error TS2469: The '+' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType6.ts(15,6): error TS2469: The '+' operator cannot be applied to type 'symbol'. ==== tests/cases/conformance/es6/Symbols/symbolType6.ts (13 errors) ==== @@ -26,19 +26,19 @@ tests/cases/conformance/es6/Symbols/symbolType6.ts(15,6): error TS2469: The '+' !!! error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. s + ""; ~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. s + a; ~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. s + 0; ~~~~~ !!! error TS2365: Operator '+' cannot be applied to types 'symbol' and 'number'. "" + s; ~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. a + s; ~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. 0 + s; ~~~~~ !!! error TS2365: Operator '+' cannot be applied to types 'number' and 'symbol'. @@ -51,7 +51,7 @@ tests/cases/conformance/es6/Symbols/symbolType6.ts(15,6): error TS2469: The '+' (s || "") + ""; ~~~~~~~~~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. "" + (s || ""); ~~~~~~~~~ -!!! error TS2469: The '+' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/symbolType8.errors.txt b/tests/baselines/reference/symbolType8.errors.txt index e72d0d619e4..8df7db61feb 100644 --- a/tests/baselines/reference/symbolType8.errors.txt +++ b/tests/baselines/reference/symbolType8.errors.txt @@ -1,45 +1,45 @@ -tests/cases/conformance/es6/Symbols/symbolType8.ts(2,1): error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(3,1): error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(4,1): error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(5,1): error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(6,1): error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(7,1): error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(8,1): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(9,1): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(11,6): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. -tests/cases/conformance/es6/Symbols/symbolType8.ts(12,1): error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(2,1): error TS2469: The '<' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(3,1): error TS2469: The '<' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(4,1): error TS2469: The '>' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(5,1): error TS2469: The '>' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(6,1): error TS2469: The '<=' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(7,1): error TS2469: The '<=' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(8,1): error TS2469: The '>=' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(9,1): error TS2469: The '>=' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(11,6): error TS2469: The '>=' operator cannot be applied to type 'symbol'. +tests/cases/conformance/es6/Symbols/symbolType8.ts(12,1): error TS2469: The '>=' operator cannot be applied to type 'symbol'. ==== tests/cases/conformance/es6/Symbols/symbolType8.ts (10 errors) ==== var s = Symbol.for("compare"); s < s; ~ -!!! error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '<' operator cannot be applied to type 'symbol'. s < 0; ~ -!!! error TS2469: The '<' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '<' operator cannot be applied to type 'symbol'. s > s; ~ -!!! error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '>' operator cannot be applied to type 'symbol'. s > 0; ~ -!!! error TS2469: The '>' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '>' operator cannot be applied to type 'symbol'. s <= s; ~ -!!! error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '<=' operator cannot be applied to type 'symbol'. s <= 0; ~ -!!! error TS2469: The '<=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '<=' operator cannot be applied to type 'symbol'. s >= s; ~ -!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '>=' operator cannot be applied to type 'symbol'. s >= 0; ~ -!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '>=' operator cannot be applied to type 'symbol'. 0 >= (s || 0); ~~~~~~~~ -!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. +!!! error TS2469: The '>=' operator cannot be applied to type 'symbol'. (s || 0) >= s; ~~~~~~~~ -!!! error TS2469: The '>=' operator cannot be applied to a value of type 'symbol'. \ No newline at end of file +!!! error TS2469: The '>=' operator cannot be applied to type 'symbol'. \ No newline at end of file diff --git a/tests/cases/conformance/es6/Symbols/symbolProperty59.ts b/tests/cases/conformance/es6/Symbols/symbolProperty59.ts new file mode 100644 index 00000000000..bdea9dab62c --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolProperty59.ts @@ -0,0 +1,4 @@ +//@target: ES6 +interface I { + [Symbol.keyFor]: string; +} \ No newline at end of file From 9735b74def6e1f6e35788bc9a09ca8323ad7eb41 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 16:12:33 -0800 Subject: [PATCH 036/106] Add support for stat and modified time on sys --- src/compiler/sys.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 5f10a747d42..c666ca991cf 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -18,6 +18,8 @@ module ts { readDirectory(path: string, extension?: string): string[]; getMemoryUsage? (): number; exit(exitCode?: number): void; + getModififedTime? (fileName: string): Date; + stat? (fileName: string, callback?: (err: any, stats: any) => any): void; } export interface FileWatcher { @@ -303,6 +305,13 @@ module ts { }, exit(exitCode?: number): void { process.exit(exitCode); + }, + getModififedTime(fileName: string): Date { + var stats = _fs.statSync(fileName); + return stats.mtime; + }, + stat(fileName: string, callback?: (err: any, stats: any) => any) { + _fs.stat(fileName, callback); } }; } From 27a908478570c4a36d0a80f7f94d043b34238969 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 16:13:04 -0800 Subject: [PATCH 037/106] Add indexer on the Formatting options interface --- src/services/services.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/services.ts b/src/services/services.ts index 56e68b2f5a1..05884b9bb98 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -991,6 +991,7 @@ module ts { InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; + [s: string]: boolean | number| string; } export interface DefinitionInfo { From 17f19b26a03a2f7fc1c5c35214c27d174e05f375 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 19:42:44 -0800 Subject: [PATCH 038/106] Initial checkin for server code --- src/server/client.ts | 392 +++++++ src/server/editorServices.ts | 1850 ++++++++++++++++++++++++++++++++++ src/server/node.d.ts | 677 +++++++++++++ src/server/protocol.ts | 1309 ++++++++++++++++++++++++ src/server/protodef.d.ts | 591 +++++++++++ src/server/server.ts | 134 +++ 6 files changed, 4953 insertions(+) create mode 100644 src/server/client.ts create mode 100644 src/server/editorServices.ts create mode 100644 src/server/node.d.ts create mode 100644 src/server/protocol.ts create mode 100644 src/server/protodef.d.ts create mode 100644 src/server/server.ts diff --git a/src/server/client.ts b/src/server/client.ts new file mode 100644 index 00000000000..1fb93329e03 --- /dev/null +++ b/src/server/client.ts @@ -0,0 +1,392 @@ +/// + +module ts.server { + + export interface SessionClientHost extends LanguageServiceHost { + lineColToPosition(fileName: string, line: number, col: number): number; + positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter; + } + + export class SessionClient implements LanguageService { + private session: Session; + private sequence: number; + private lastReply: string; + + constructor(private host: SessionClientHost) { + this.sequence = 0; + + this.session = new Session({ + args: [], + newLine: host.getNewLine(), + useCaseSensitiveFileNames: true, + write: (s) => this.lastReply = s, + readFile: (fileName): string => { + var snapshot = host.getScriptSnapshot(fileName); + return snapshot && snapshot.getText(0, snapshot.getLength()); + }, + writeFile: (name, text, writeByteOrderMark) => { + }, + resolvePath: (path) => path, + fileExists: (path) => !!host.getScriptSnapshot(path), + directoryExists: (path) => false, + getExecutingFilePath: () => "", + exit: (exitCode) => { }, + createDirectory: (directoryName: string) => { }, + + getCurrentDirectory: () => host.getCurrentDirectory(), + readDirectory: (path: string, extension?: string) => [], + getModififedTime: (fileName) => new Date(), + stat: (path, callback) => { throw new Error("Not implemented Yet."); }, + }, { + close: () => { }, + info: (m) => this.host.log(m), + msg: (m) => this.host.log(m), + endGroup: () => { }, + perftrc: (m) => this.host.log(m), + startGroup: () => { } + }, /* useProtocol */ true, /*prettyJSON*/ true); + } + + private lineColToPosition(fileName: string, lineCol: ServerProtocol.LineCol): number { + return this.host.lineColToPosition(fileName, lineCol.line, lineCol.col); + } + + private getFileLength(fileName: string): number { + return this.host.getScriptSnapshot(fileName).getLength(); + } + + private positionToOneBasedLineCol(fileName: string, position: number): ServerProtocol.LineCol { + var lineCol = this.host.positionToZeroBasedLineCol(fileName, position); + return { + line: lineCol.line + 1, + col: lineCol.character + 1 + }; + } + + private convertCodeEditsToTextChange(fileName: string, codeEdit: ServerProtocol.CodeEdit): ts.TextChange { + var start = this.lineColToPosition(fileName, codeEdit.start); + var end = this.lineColToPosition(fileName, codeEdit.end); + + return { + span: ts.createTextSpanFromBounds(start, end), + newText: codeEdit.newText + }; + } + + private processRequest(command: "open", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.OpenRequest; + private processRequest(command: "close", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.CloseRequest; + private processRequest(command: "change", arguments: ServerProtocol.ChangeRequestArgs): ServerProtocol.ChangeRequest; + private processRequest(command: "quickinfo", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.QuickInfoRequest; + private processRequest(command: "format", arguments: ServerProtocol.FormatRequestArgs): ServerProtocol.FormatRequest; + private processRequest(command: "formatonkey", arguments: ServerProtocol.FormatOnKeyRequestArgs): ServerProtocol.FormatRequest; + private processRequest(command: "definition", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.DefinitionRequest; + private processRequest(command: "references", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.ReferencesRequest; + private processRequest(command: "completions", arguments: ServerProtocol.CompletionsRequestArgs): ServerProtocol.CompletionsRequest; + private processRequest(command: "navto", arguments: ServerProtocol.NavtoRequestArgs): ServerProtocol.NavtoRequest; + private processRequest(command: "saveto", arguments: ServerProtocol.SavetoRequestArgs): ServerProtocol.SavetoRequest; + private processRequest(command: string, arguments: any): ServerProtocol.Request; + private processRequest(command: string, arguments: any): ServerProtocol.Request { + var request: ServerProtocol.Request = { + seq: this.sequence++, + type: "request", + command: command, + arguments: arguments + }; + + this.session.executeJSONcmd(JSON.stringify(request)); + + return request; + } + + private processResponse(request: ServerProtocol.Request): T { + debugger; + + // Read the content length + var contentLengthPrefix = "Content-Length: "; + var lines = this.lastReply.split("\r\n"); + Debug.assert(lines.length >= 2, "Malformed response: Expected 3 lines in the response."); + + var contentLengthText = lines[0]; + Debug.assert(contentLengthText.indexOf(contentLengthPrefix) === 0, "Malformed response: Response text did not contain content-length header."); + var contentLength = parseInt(contentLengthText.substring(contentLengthPrefix.length)); + + // Read the body + var responseBody = lines[2]; + + // Verify content length + Debug.assert(responseBody.length + 1 === contentLength, "Malformed response: Content length did not match the response's body length."); + + try { + var response: T = JSON.parse(responseBody); + } + catch (e) { + throw new Error("Malformed response: Failed to parse server response: " + this.lastReply + ". \r\n Error detailes: " + e.message); + } + + // verify the sequence numbers + Debug.assert(response.request_seq === request.seq, "Malformed response: response sequance number did not match request sequence number."); + + // unmarshal errors + if (!response.success) { + throw new Error("Error " + response.message); + } + + Debug.assert(!!response.body, "Malformed response: Unexpected empty response body."); + + return response; + } + + openFile(fileName: string): void { + this.processRequest("open", { + file: fileName + }); + } + + closeFile(fileName: string): void { + this.processRequest("close", { + file: fileName + }); + } + + changeFile(fileName: string, start: number, end: number, newText: string): void { + var lineCol = this.positionToOneBasedLineCol(fileName, start); + + this.processRequest("change", { + file: fileName, + line: lineCol.line, + col: lineCol.col, + insertLen: end - start, + deleteLen: end - start, + insertString: newText + }); + } + + getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { + var request = this.processRequest("quickinfo", { + file: fileName, + line: 0, + col: 1 + }); + + var response = this.processResponse(request); + + var start = this.lineColToPosition(fileName, response.body.start); + var end = this.lineColToPosition(fileName, response.body.end); + + return { + kind: response.body.kind, + kindModifiers: response.body.kindModifiers, + textSpan: ts.createTextSpanFromBounds(start, end), + displayParts: undefined, + documentation: undefined, + documentationString: response.body.documentation, + displayString: response.body.displayString + }; + } + + getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var request = this.processRequest("completions", { + file: fileName, + line: lineCol.line, + col: lineCol.col, + }); + + var response = this.processResponse(request); + + return { + isMemberCompletion: false, + isNewIdentifierLocation: false, + entries: response.body.map(entry => ({ kind: entry.kind, kindModifiers: entry.kindModifiers, name: entry.name })) + }; + } + + getNavigateToItems(seatchTerm: string): NavigateToItem[] { + var request = this.processRequest("navto", { seatchTerm }); + + var response = this.processResponse(request); + return response.body.map(entry => { + var start = this.lineColToPosition(entry.file.toString(), entry.start); + var end = this.lineColToPosition(entry.file.toString(), entry.end); + return { + name: entry.name, + containerName: entry.containerName, + containerKind: entry.containerKind, + kind: entry.kind, + kindModifiers: entry.kindModifiers, + matchKind: entry.matchKind, + fileName: entry.file.toString(), + textSpan: ts.createTextSpanFromBounds(start, end) + }; + }); + } + + getFormattingEditsForRange(fileName: string, start: number, end: number, options: ts.FormatCodeOptions): ts.TextChange[] { + var startLineCol = this.positionToOneBasedLineCol(fileName, start); + var endLineCol = this.positionToOneBasedLineCol(fileName, end); + // TODO: handle FormatCodeOptions + var request = this.processRequest("format", { + file: fileName, + line: startLineCol.line, + col: startLineCol.col, + endLine: endLineCol.line, + endCol: endLineCol.col, + }); + + var response = this.processResponse(request); + + return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); + } + + getFormattingEditsForDocument(fileName: string, options: ts.FormatCodeOptions): ts.TextChange[] { + return this.getFormattingEditsForRange(fileName, 0, this.getFileLength(fileName), options); + } + + getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): ts.TextChange[] { + var lineCol = this.positionToOneBasedLineCol(fileName, position); + // TODO: handle FormatCodeOptions + var request = this.processRequest("formatonkey", { + file: fileName, + line: lineCol.line, + col: lineCol.col, + key: key + }); + + var response = this.processResponse(request); + return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); + } + + getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var request = this.processRequest("definition", { + file: fileName, + line: lineCol.line, + col: lineCol.col, + }); + + var response = this.processResponse(request); + return response.body.map(entry => { + var start = this.lineColToPosition(fileName, entry.start); + var end = this.lineColToPosition(fileName, entry.end); + return { + containerKind: "", + containerName: "", + fileName: entry.file, + textSpan: ts.createTextSpanFromBounds(start, end), + kind: "", + name: "" + }; + }); + } + + getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var request = this.processRequest("references", { + file: fileName, + line: lineCol.line, + col: lineCol.col, + }); + + var response = this.processResponse(request); + + return response.body.refs.map(entry => { + var start = this.lineColToPosition(fileName, entry.start); + var end = this.lineColToPosition(fileName, entry.end); + return { + fileName: entry.file, + textSpan: ts.createTextSpanFromBounds(start, end), + isWriteAccess: false, + }; + }); + } + + getEmitOutput(fileName: string): EmitOutput { + throw new Error("Not Implemented Yet."); + } + + getSyntacticDiagnostics(fileName: string): Diagnostic[] { + throw new Error("Not Implemented Yet."); + } + + getSemanticDiagnostics(fileName: string): Diagnostic[] { + throw new Error("Not Implemented Yet."); + } + + getCompilerOptionsDiagnostics(): Diagnostic[] { + throw new Error("Not Implemented Yet."); + } + + getRenameInfo(fileName: string, position: number): RenameInfo { + throw new Error("Not Implemented Yet."); + } + + findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { + throw new Error("Not Implemented Yet."); + } + + getNavigationBarItems(fileName: string): NavigationBarItem[] { + throw new Error("Not Implemented Yet."); + } + + getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan { + throw new Error("Not Implemented Yet."); + } + + getBreakpointStatementAtPosition(fileName: string, position: number): TextSpan { + throw new Error("Not Implemented Yet."); + } + + getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems { + throw new Error("Not Implemented Yet."); + } + + getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[] { + throw new Error("Not Implemented Yet."); + } + + getOutliningSpans(fileName: string): OutliningSpan[] { + throw new Error("Not Implemented Yet."); + } + + getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[] { + throw new Error("Not Implemented Yet."); + } + + getBraceMatchingAtPosition(fileName: string, position: number): TextSpan[] { + throw new Error("Not Implemented Yet."); + } + + getIndentationAtPosition(fileName: string, position: number, options: EditorOptions): number { + throw new Error("Not Implemented Yet."); + } + + getSyntacticClassifications(fileName: string, span: TextSpan): ClassifiedSpan[] { + throw new Error("Not Implemented Yet."); + } + + getSemanticClassifications(fileName: string, span: TextSpan): ClassifiedSpan[] { + throw new Error("Not Implemented Yet."); + } + + getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails { + throw new Error("Not Implemented Yet."); + } + + + getProgram(): Program { + throw new Error("SourceFile objects are not serializable through the server protocol."); + } + + getSourceFile(fileName: string): SourceFile { + throw new Error("SourceFile objects are not serializable through the server protocol."); + } + + cleanupSemanticCache(): void { + throw new Error("cleanupSemanticCache is not available through the server layer."); + } + + dispose(): void { + throw new Error("dispose is not available through the server layer."); + } + } +} diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts new file mode 100644 index 00000000000..933435f93a1 --- /dev/null +++ b/src/server/editorServices.ts @@ -0,0 +1,1850 @@ +/// +/// +/// + +module ts.server { + export interface Logger { + close(): void; + perftrc(s: string): void; + info(s: string): void; + startGroup(): void; + endGroup(): void; + msg(s: string, type?: string): void; + } + + var measurePerf = false; + var lineCollectionCapacity = 4; + var indentStrings: string[] = []; + var indentBase = " "; + function getIndent(indentAmt: number) { + if (!indentStrings[indentAmt]) { + indentStrings[indentAmt] = ""; + for (var i = 0; i < indentAmt; i++) { + indentStrings[indentAmt] += indentBase; + } + } + return indentStrings[indentAmt]; + } + + export function printLine(s: string) { + ts.sys.write(s + '\n'); + } + + function showLines(s: string) { + var strBuilder = ""; + for (var i = 0, len = s.length; i < len; i++) { + if (s.charCodeAt(i) == 10) { + strBuilder += '\\n'; + } + else if (s.charCodeAt(i) == 13) { + strBuilder += '\\r'; + } + else { + strBuilder += s.charAt(i); + } + } + return strBuilder; + } + + function calibrateTimer() { + var count = 20; + var total = 0; + for (var i = 0; i < count; i++) { + var start = process.hrtime(); + var elapsed = process.hrtime(start); + var elapsedNano = 1e9 * elapsed[0] + elapsed[1]; + total += elapsedNano; + } + } + + export class ScriptInfo { + svc: ScriptVersionCache; + children: ScriptInfo[] = []; // files referenced by this file + + defaultProject: Project; // project to use by default for file + mtime: Date; + + constructor(private host: ServerHost, public filename: string, public content: string, public isOpen = false) { + this.svc = ScriptVersionCache.fromString(content); + if (!isOpen) { + this.mtime = this.host.getModififedTime(filename); + } + } + + close() { + this.isOpen = false; + this.mtime = this.host.getModififedTime(this.filename); + } + + addChild(childInfo: ScriptInfo) { + this.children.push(childInfo); + } + + snap() { + return this.svc.getSnapshot(); + } + + getText() { + var snap = this.snap(); + return snap.getText(0, snap.getLength()); + } + + getLineInfo(line: number) { + var snap = this.snap(); + return snap.index.lineNumberToInfo(line); + } + + editContent(start: number, end: number, newText: string): void { + this.svc.edit(start, end - start, newText); + } + + getTextChangeRangeBetweenVersions(startVersion: number, endVersion: number): ts.TextChangeRange { + return this.svc.getTextChangesBetweenVersions(startVersion, endVersion); + } + + getChangeRange(oldSnapshot: ts.IScriptSnapshot): ts.TextChangeRange { + return this.snap().getChangeRange(oldSnapshot); + } + } + + export class CancellationToken { + public static None = new CancellationToken(); + + requestPending = false; + + constructor() { + } + + cancel() { + this.requestPending = true; + } + + reset() { + this.requestPending = false; + } + + public isCancellationRequested() { + var temp = this.requestPending; + return temp; + } + } + + export class LSHost implements ts.LanguageServiceHost { + ls: ts.LanguageService = null; + compilationSettings: ts.CompilerOptions; + filenameToScript: ts.Map = {}; + + constructor(public host: ServerHost, public project: Project, private cancellationToken: CancellationToken = CancellationToken.None) { + } + + getDefaultLibFileName() { + var nodeModuleBinDir = ts.getDirectoryPath(ts.normalizePath(this.host.getExecutingFilePath())); + + if (this.compilationSettings && this.compilationSettings.target == ts.ScriptTarget.ES6) { + return nodeModuleBinDir + "/lib.es6.d.ts"; + } + else { + return nodeModuleBinDir + "/lib.d.ts"; + } + } + + cancel() { + this.cancellationToken.cancel(); + } + + reset() { + this.cancellationToken.reset(); + } + + getScriptSnapshot(filename: string): ts.IScriptSnapshot { + var scriptInfo = this.getScriptInfo(filename); + if (scriptInfo) { + return scriptInfo.snap(); + } + } + + setCompilationSettings(opt: ts.CompilerOptions) { + this.compilationSettings = opt; + } + + lineAffectsRefs(filename: string, line: number) { + var info = this.getScriptInfo(filename); + var lineInfo = info.getLineInfo(line); + if (lineInfo && lineInfo.text) { + var regex = /reference|import|\/\*|\*\//; + return regex.test(lineInfo.text); + } + } + + getCompilationSettings() { + // change this to return active project settings for file + return this.compilationSettings; + } + + getScriptFileNames() { + var filenames: string[] = []; + for (var filename in this.filenameToScript) { + if (this.filenameToScript[filename] && this.filenameToScript[filename].isOpen) { + filenames.push(filename); + } + } + return filenames; + } + + getScriptVersion(filename: string) { + return this.getScriptInfo(filename).svc.latestVersion().toString(); + } + + getCancellationToken(): ts.CancellationToken { + return this.cancellationToken; + } + + getCurrentDirectory(): string { + return ""; + } + + getScriptIsOpen(filename: string) { + return this.getScriptInfo(filename).isOpen; + } + + removeReferencedFile(info: ScriptInfo) { + if (!info.isOpen) { + this.filenameToScript[info.filename] = undefined; + } + } + + getScriptInfo(filename: string): ScriptInfo { + var scriptInfo = ts.lookUp(this.filenameToScript, filename); + if (!scriptInfo) { + scriptInfo = this.project.openReferencedFile(filename); + if (scriptInfo) { + this.filenameToScript[scriptInfo.filename] = scriptInfo; + } + } + else { + } + return scriptInfo; + } + + addRoot(info: ScriptInfo) { + var scriptInfo = ts.lookUp(this.filenameToScript, info.filename); + if (!scriptInfo) { + this.filenameToScript[info.filename] = info; + return info; + } + } + + saveTo(filename: string, tmpfilename: string) { + var script = this.getScriptInfo(filename); + if (script) { + var snap = script.snap(); + this.host.writeFile(tmpfilename, snap.getText(0, snap.getLength())); + } + } + + reloadScript(filename: string, tmpfilename: string, cb: () => any) { + var script = this.getScriptInfo(filename); + if (script) { + script.svc.reloadFromFile(tmpfilename, cb); + } + } + + editScript(filename: string, start: number, end: number, newText: string) { + var script = this.getScriptInfo(filename); + if (script) { + script.editContent(start, end, newText); + return; + } + + throw new Error("No script with name '" + filename + "'"); + } + + resolvePath(path: string): string { + var start = new Date().getTime(); + var result = this.host.resolvePath(path); + return result; + } + + fileExists(path: string): boolean { + var start = new Date().getTime(); + var result = this.host.fileExists(path); + return result; + } + + directoryExists(path: string): boolean { + return this.host.directoryExists(path); + } + + /** + * @param line 1 based index + */ + lineToTextSpan(filename: string, line: number): ts.TextSpan { + var script: ScriptInfo = this.filenameToScript[filename]; + var index = script.snap().index; + + var lineInfo = index.lineNumberToInfo(line + 1); + var len: number; + if (lineInfo.leaf) { + len = lineInfo.leaf.text.length; + } + else { + var nextLineInfo = index.lineNumberToInfo(line + 2); + len = nextLineInfo.col - lineInfo.col; + } + return ts.createTextSpan(lineInfo.col, len); + } + + /** + * @param line 1 based index + * @param col 1 based index + */ + lineColToPosition(filename: string, line: number, col: number): number { + var script: ScriptInfo = this.filenameToScript[filename]; + var index = script.snap().index; + + var lineInfo = index.lineNumberToInfo(line); + // TODO: assert this column is actually on the line + return (lineInfo.col + col - 1); + } + + /** + * @param line 1-based index + * @param col 1-based index + */ + positionToLineCol(filename: string, position: number): ILineInfo { + var script: ScriptInfo = this.filenameToScript[filename]; + var index = script.snap().index; + var lineCol = index.charOffsetToLineNumberAndPos(position); + return { line: lineCol.line, col: lineCol.col + 1 }; + } + } + + // assumes normalized paths + function getAbsolutePath(filename: string, directory: string) { + var rootLength = ts.getRootLength(filename); + if (rootLength > 0) { + return filename; + } + else { + var splitFilename = filename.split('/'); + var splitDir = directory.split('/'); + var i = 0; + var dirTail = 0; + var sflen = splitFilename.length; + while ((i < sflen) && (splitFilename[i].charAt(0) == '.')) { + var dots = splitFilename[i]; + if (dots == '..') { + dirTail++; + } + else if (dots != '.') { + return undefined; + } + i++; + } + return splitDir.slice(0, splitDir.length - dirTail).concat(splitFilename.slice(i)).join('/'); + } + } + + export interface ProjectOptions { + // these fields can be present in the project file + files?: string[]; + formatCodeOptions?: ts.FormatCodeOptions; + compilerOptions?: ts.CompilerOptions; + } + + export class Project { + compilerService: CompilerService; + projectOptions: ProjectOptions; + projectFilename: string; + program: ts.Program; + filenameToSourceFile: ts.Map = {}; + updateGraphSeq = 0; + + constructor(public projectService: ProjectService) { + this.compilerService = new CompilerService(this); + } + + openReferencedFile(filename: string) { + return this.projectService.openFile(filename, false); + } + + getSourceFile(info: ScriptInfo) { + return this.filenameToSourceFile[info.filename]; + } + + getSourceFileFromName(filename: string) { + var info = this.projectService.getScriptInfo(filename); + if (info) { + return this.getSourceFile(info); + } + } + + removeReferencedFile(info: ScriptInfo) { + this.compilerService.host.removeReferencedFile(info); + this.updateGraph(); + } + + updateFileMap() { + this.filenameToSourceFile = {}; + var sourceFiles = this.program.getSourceFiles(); + for (var i = 0, len = sourceFiles.length; i < len; i++) { + var normFilename = ts.normalizePath(sourceFiles[i].fileName); + this.filenameToSourceFile[normFilename] = sourceFiles[i]; + } + } + + finishGraph() { + this.updateGraph(); + this.compilerService.languageService.getNavigateToItems(".*"); + } + + updateGraph() { + this.program = this.compilerService.languageService.getProgram(); + this.updateFileMap(); + } + + isConfiguredProject() { + return this.projectFilename; + } + + // add a root file to project + addRoot(info: ScriptInfo) { + info.defaultProject = this; + return this.compilerService.host.addRoot(info); + } + + filesToString() { + var strBuilder = ""; + ts.forEachValue(this.filenameToSourceFile, + sourceFile => { strBuilder += sourceFile.fileName + "\n"; }); + return strBuilder; + } + + setProjectOptions(projectOptions: ProjectOptions) { + this.projectOptions = projectOptions; + if (projectOptions.compilerOptions) { + this.compilerService.setCompilerOptions(projectOptions.compilerOptions); + } + // TODO: format code options } + } + + export interface ProjectOpenResult { + success?: boolean; + errorMsg?: string; + project?: Project; + } + + function copyListRemovingItem(item: T, list: T[]) { + var copiedList: T[] = []; + for (var i = 0, len = list.length; i < len; i++) { + if (list[i] != item) { + copiedList.push(list[i]); + } + } + return copiedList; + } + + // REVIEW: for now this implementation uses polling. + // The advantage of polling is that it works reliably + // on all os and with network mounted files. + // For 90 referenced files, the average time to detect + // changes is 2*msInterval (by default 5 seconds). + // The overhead of this is .04 percent (1/2500) with + // average pause of < 1 millisecond (and max + // pause less than 1.5 milliseconds); question is + // do we anticipate reference sets in the 100s and + // do we care about waiting 10-20 seconds to detect + // changes for large reference sets? If so, do we want + // to increase the chunk size or decrease the interval + // time dynamically to match the large reference set? + export class WatchedFileSet { + watchedFiles: ScriptInfo[] = []; + nextFileToCheck = 0; + watchTimer: NodeJS.Timer; + + // average async stat takes about 30 microseconds + // set chunk size to do 30 files in < 1 millisecond + constructor(private host: ServerHost, public fileEvent: (info: ScriptInfo, eventName: string) => void, + public msInterval = 2500, public chunkSize = 30) { + } + + checkWatchedFileChanged(checkedIndex: number, stats: NodeJS.fs.Stats) { + var info = this.watchedFiles[checkedIndex]; + if (info && (!info.isOpen)) { + if (info.mtime.getTime() != stats.mtime.getTime()) { + info.svc.reloadFromFile(info.filename); + } + } + } + + fileDeleted(info: ScriptInfo) { + if (this.fileEvent) { + this.fileEvent(info, "deleted"); + } + } + + static fileDeleted = 34; + + poll(checkedIndex: number) { + var watchedFile = this.watchedFiles[checkedIndex]; + if (!watchedFile) { + return; + } + if (measurePerf) { + var start = process.hrtime(); + } + this.host.stat(watchedFile.filename,(err, stats) => { + if (err) { + var msg = err.message; + if (err.errno) { + msg += " errno: " + err.errno.toString(); + } + if (err.errno == WatchedFileSet.fileDeleted) { + this.fileDeleted(watchedFile); + } + } + else { + this.checkWatchedFileChanged(checkedIndex, stats); + } + }); + if (measurePerf) { + var elapsed = process.hrtime(start); + var elapsedNano = 1e9 * elapsed[0] + elapsed[1]; + } + } + + // this implementation uses polling and + // stat due to inconsistencies of fs.watch + // and efficiency of stat on modern filesystems + startWatchTimer() { + this.watchTimer = setInterval(() => { + var count = 0; + var nextToCheck = this.nextFileToCheck; + var firstCheck = -1; + while ((count < this.chunkSize) && (nextToCheck != firstCheck)) { + this.poll(nextToCheck); + if (firstCheck < 0) { + firstCheck = nextToCheck; + } + nextToCheck++; + if (nextToCheck == this.watchedFiles.length) { + nextToCheck = 0; + } + count++; + } + this.nextFileToCheck = nextToCheck; + }, this.msInterval); + } + + // TODO: remove watch file if opened by editor or no longer referenced + // assume normalized and absolute pathname + addFile(info: ScriptInfo) { + this.watchedFiles.push(info); + if (this.watchedFiles.length == 1) { + this.startWatchTimer(); + } + } + + removeFile(info: ScriptInfo) { + this.watchedFiles = copyListRemovingItem(info, this.watchedFiles); + } + } + + interface ProjectServiceEventHandler { + (eventName: string, project: Project): void; + } + + export class ProjectService { + filenameToScriptInfo: ts.Map = {}; + // open, non-configured files in two lists + openFileRoots: ScriptInfo[] = []; + openFilesReferenced: ScriptInfo[] = []; + // projects covering open files + inferredProjects: Project[] = []; + watchedFileSet: WatchedFileSet; + + constructor(public host: ServerHost, public psLogger: Logger, public eventHandler?: ProjectServiceEventHandler) { + if (measurePerf) { + calibrateTimer(); + } + ts.disableIncrementalParsing = true; + this.watchedFileSet = new WatchedFileSet(this.host,(info, eventName) => { + if (eventName == "deleted") { + this.fileDeletedInFilesystem(info); + } + }); + } + + log(msg: string, type = "Err") { + this.psLogger.msg(msg, type); + } + + closeLog() { + this.psLogger.close(); + } + + createInferredProject(root: ScriptInfo) { + var iproj = new Project(this); + iproj.addRoot(root); + iproj.finishGraph(); + this.inferredProjects.push(iproj); + return iproj; + } + + fileDeletedInFilesystem(info: ScriptInfo) { + this.psLogger.info(info.filename + " deleted"); + this.watchedFileSet.removeFile(info); + + if (!info.isOpen) { + this.filenameToScriptInfo[info.filename] = undefined; + var referencingProjects = this.findReferencingProjects(info); + for (var i = 0, len = referencingProjects.length; i < len; i++) { + referencingProjects[i].removeReferencedFile(info); + } + } + this.printProjects(); + } + + addOpenFile(info: ScriptInfo) { + this.findReferencingProjects(info); + if (info.defaultProject) { + this.openFilesReferenced.push(info); + } + else { + // create new inferred project p with the newly opened file as root + info.defaultProject = this.createInferredProject(info); + var openFileRoots: ScriptInfo[] = []; + // for each inferred project root r + for (var i = 0, len = this.openFileRoots.length; i < len; i++) { + var r = this.openFileRoots[i]; + // if r referenced by the new project + if (info.defaultProject.getSourceFile(r)) { + // remove project rooted at r + this.inferredProjects = + copyListRemovingItem(r.defaultProject, this.inferredProjects); + // put r in referenced open file list + this.openFilesReferenced.push(r); + // set default project of r to the new project + r.defaultProject = info.defaultProject; + } + else { + // otherwise, keep r as root of inferred project + openFileRoots.push(r); + } + } + this.openFileRoots = openFileRoots; + this.openFileRoots.push(info); + } + } + + closeOpenFile(info: ScriptInfo) { + var openFileRoots: ScriptInfo[] = []; + var removedProject: Project; + for (var i = 0, len = this.openFileRoots.length; i < len; i++) { + // if closed file is root of project + if (info == this.openFileRoots[i]) { + // remove that project and remember it + removedProject = info.defaultProject; + } + else { + openFileRoots.push(this.openFileRoots[i]); + } + } + this.openFileRoots = openFileRoots; + if (removedProject) { + // remove project from inferred projects list + this.inferredProjects = copyListRemovingItem(removedProject, this.inferredProjects); + var openFilesReferenced: ScriptInfo[] = []; + var orphanFiles: ScriptInfo[] = []; + // for all open, referenced files f + for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { + var f = this.openFilesReferenced[i]; + // if f was referenced by the removed project, remember it + if (f.defaultProject == removedProject) { + f.defaultProject = undefined; + orphanFiles.push(f); + } + else { + // otherwise add it back to the list of referenced files + openFilesReferenced.push(f); + } + } + this.openFilesReferenced = openFilesReferenced; + // treat orphaned files as newly opened + for (var i = 0, len = orphanFiles.length; i < len; i++) { + this.addOpenFile(orphanFiles[i]); + } + } + else { + this.openFilesReferenced = copyListRemovingItem(info, this.openFilesReferenced); + } + info.close(); + } + + findReferencingProjects(info: ScriptInfo) { + var referencingProjects: Project[] = []; + info.defaultProject = undefined; + for (var i = 0, len = this.inferredProjects.length; i < len; i++) { + this.inferredProjects[i].updateGraph(); + if (this.inferredProjects[i].getSourceFile(info)) { + info.defaultProject = this.inferredProjects[i]; + referencingProjects.push(this.inferredProjects[i]); + } + } + return referencingProjects; + } + + getScriptInfo(filename: string) { + filename = ts.normalizePath(filename); + return ts.lookUp(this.filenameToScriptInfo, filename); + } + + /** + * @param filename is absolute pathname + */ + openFile(filename: string, openedByClient = false) { + filename = ts.normalizePath(filename); + var info = ts.lookUp(this.filenameToScriptInfo, filename); + if (!info) { + var content: string; + if (this.host.fileExists(filename)) { + content = this.host.readFile(filename); + } + if (!content) { + if (openedByClient) { + content = ""; + } + } + if (content !== undefined) { + info = new ScriptInfo(this.host, filename, content, openedByClient); + this.filenameToScriptInfo[filename] = info; + if (!info.isOpen) { + this.watchedFileSet.addFile(info); + } + } + } + if (info) { + if (openedByClient) { + info.isOpen = true; + } + } + return info; + } + + /** + * Open file whose contents is managed by the client + * @param filename is absolute pathname + */ + + openClientFile(filename: string) { + // TODO: tsconfig check + var info = this.openFile(filename, true); + this.addOpenFile(info); + this.printProjects(); + return info; + } + + /** + * Close file whose contents is managed by the client + * @param filename is absolute pathname + */ + + closeClientFile(filename: string) { + // TODO: tsconfig check + var info = ts.lookUp(this.filenameToScriptInfo, filename); + if (info) { + this.closeOpenFile(info); + info.isOpen = false; + } + this.printProjects(); + } + + getProjectsReferencingFile(filename: string) { + var scriptInfo = ts.lookUp(this.filenameToScriptInfo, filename); + if (scriptInfo) { + var projects: Project[] = []; + for (var i = 0, len = this.inferredProjects.length; i < len; i++) { + if (this.inferredProjects[i].getSourceFile(scriptInfo)) { + projects.push(this.inferredProjects[i]); + } + } + return projects; + } + } + + getProjectForFile(filename: string) { + var scriptInfo = ts.lookUp(this.filenameToScriptInfo, filename); + if (scriptInfo) { + return scriptInfo.defaultProject; + } + } + + printProjectsForFile(filename: string) { + var scriptInfo = ts.lookUp(this.filenameToScriptInfo, filename); + if (scriptInfo) { + this.psLogger.startGroup(); + this.psLogger.info("Projects for " + filename) + var projects = this.getProjectsReferencingFile(filename); + for (var i = 0, len = projects.length; i < len; i++) { + this.psLogger.info("Inferred Project " + i.toString()); + } + this.psLogger.endGroup(); + } + else { + this.psLogger.info(filename + " not in any project"); + } + } + + printProjects() { + this.psLogger.startGroup(); + for (var i = 0, len = this.inferredProjects.length; i < len; i++) { + var project = this.inferredProjects[i]; + this.psLogger.info("Project " + i.toString()); + this.psLogger.info(project.filesToString()); + this.psLogger.info("-----------------------------------------------"); + } + this.psLogger.info("Open file roots: ") + for (var i = 0, len = this.openFileRoots.length; i < len; i++) { + this.psLogger.info(this.openFileRoots[i].filename); + } + this.psLogger.info("Open files referenced: ") + for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { + this.psLogger.info(this.openFilesReferenced[i].filename); + } + this.psLogger.endGroup(); + } + + openConfigFile(configFilename: string): ProjectOpenResult { + configFilename = ts.normalizePath(configFilename); + // file references will be relative to dirPath (or absolute) + var dirPath = ts.getDirectoryPath(configFilename); + var rawConfig = ts.readConfigFile(configFilename); + if (!rawConfig) { + return { errorMsg: "tsconfig syntax error" }; + } + else { + // REVIEW: specify no base path so can get absolute path below + var parsedCommandLine = ts.parseConfigFile(rawConfig); + + if (parsedCommandLine.errors) { + // TODO: gather diagnostics and transmit + return { errorMsg: "tsconfig option errors" }; + } + else if (parsedCommandLine.fileNames) { + var proj = this.createProject(configFilename); + for (var i = 0, len = parsedCommandLine.fileNames.length; i < len; i++) { + var rootFilename = parsedCommandLine.fileNames[i]; + var normRootFilename = ts.normalizePath(rootFilename); + normRootFilename = getAbsolutePath(normRootFilename, dirPath); + if (this.host.fileExists(normRootFilename)) { + var info = this.openFile(normRootFilename); + proj.addRoot(info); + } + else { + return { errorMsg: "specified file " + rootFilename + " not found" }; + } + } + var projectOptions: ProjectOptions = { + files: parsedCommandLine.fileNames, + compilerOptions: parsedCommandLine.options + }; + if (rawConfig.formatCodeOptions) { + projectOptions.formatCodeOptions = rawConfig.formatCodeOptions; + } + proj.setProjectOptions(projectOptions); + return { success: true, project: proj }; + } + else { + return { errorMsg: "no files found" }; + } + } + } + + createProject(projectFilename: string) { + var eproj = new Project(this); + eproj.projectFilename = projectFilename; + return eproj; + } + + } + + export class CompilerService { + cancellationToken = new CancellationToken(); + host: LSHost; + languageService: ts.LanguageService; + classifier: ts.Classifier; + settings = ts.getDefaultCompilerOptions(); + documentRegistry = ts.createDocumentRegistry(); + formatCodeOptions: ts.FormatCodeOptions = CompilerService.defaultFormatCodeOptions; + + constructor(public project: Project) { + this.host = new LSHost(project.projectService.host, project, this.cancellationToken); + // override default ES6 (remove when compiler default back at ES5) + this.settings.target = ts.ScriptTarget.ES5; + this.host.setCompilationSettings(this.settings); + this.languageService = ts.createLanguageService(this.host, this.documentRegistry); + this.classifier = ts.createClassifier(); + } + + setCompilerOptions(opt: ts.CompilerOptions) { + this.settings = opt; + this.host.setCompilationSettings(opt); + } + + isExternalModule(filename: string): boolean { + var sourceFile = this.languageService.getSourceFile(filename); + return ts.isExternalModule(sourceFile); + } + + static defaultFormatCodeOptions: ts.FormatCodeOptions = { + IndentSize: 4, + TabSize: 4, + NewLineCharacter: ts.sys.newLine, + ConvertTabsToSpaces: true, + InsertSpaceAfterCommaDelimiter: true, + InsertSpaceAfterSemicolonInForStatements: true, + InsertSpaceBeforeAndAfterBinaryOperators: true, + InsertSpaceAfterKeywordsInControlFlowStatements: true, + InsertSpaceAfterFunctionKeywordForAnonymousFunctions: false, + InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: false, + PlaceOpenBraceOnNewLineForFunctions: false, + PlaceOpenBraceOnNewLineForControlBlocks: false, + } + + } + + export interface LineCollection { + charCount(): number; + lineCount(): number; + isLeaf(): boolean; + walk(rangeStart: number, rangeLength: number, walkFns: ILineIndexWalker): void; + print(indentAmt: number): void; + } + + export interface ILineInfo { + line: number; + col: number; + text?: string; + leaf?: LineLeaf; + } + + export enum CharRangeSection { + PreStart, + Start, + Entire, + Mid, + End, + PostEnd + } + + export interface ILineIndexWalker { + goSubtree: boolean; + done: boolean; + leaf(relativeStart: number, relativeLength: number, lineCollection: LineLeaf): void; + pre? (relativeStart: number, relativeLength: number, lineCollection: LineCollection, + parent: LineNode, nodeType: CharRangeSection): LineCollection; + post? (relativeStart: number, relativeLength: number, lineCollection: LineCollection, + parent: LineNode, nodeType: CharRangeSection): LineCollection; + } + + class BaseLineIndexWalker implements ILineIndexWalker { + goSubtree = true; + done = false; + leaf(rangeStart: number, rangeLength: number, ll: LineLeaf) { + } + } + + class EditWalker extends BaseLineIndexWalker { + lineIndex = new LineIndex(); + // path to start of range + startPath: LineCollection[]; + endBranch: LineCollection[] = []; + branchNode: LineNode; + // path to current node + stack: LineNode[]; + state = CharRangeSection.Entire; + lineCollectionAtBranch: LineCollection; + initialText = ""; + trailingText = ""; + suppressTrailingText = false; + + constructor() { + super(); + this.lineIndex.root = new LineNode(); + this.startPath = [this.lineIndex.root]; + this.stack = [this.lineIndex.root]; + } + + insertLines(insertedText: string) { + if (this.suppressTrailingText) { + this.trailingText = ""; + } + if (insertedText) { + insertedText = this.initialText + insertedText + this.trailingText; + } + else { + insertedText = this.initialText + this.trailingText; + } + var lm = LineIndex.linesFromText(insertedText); + var lines = lm.lines; + if (lines.length > 1) { + if (lines[lines.length - 1] == "") { + lines.length--; + } + } + var branchParent: LineNode; + var lastZeroCount: LineCollection; + + for (var k = this.endBranch.length - 1; k >= 0; k--) { + (this.endBranch[k]).updateCounts(); + if (this.endBranch[k].charCount() == 0) { + lastZeroCount = this.endBranch[k]; + if (k > 0) { + branchParent = this.endBranch[k - 1]; + } + else { + branchParent = this.branchNode; + } + } + } + if (lastZeroCount) { + branchParent.remove(lastZeroCount); + } + + // path at least length two (root and leaf) + var insertionNode = this.startPath[this.startPath.length - 2]; + var leafNode = this.startPath[this.startPath.length - 1]; + var len = lines.length; + + if (len > 0) { + leafNode.text = lines[0]; + + if (len > 1) { + var insertedNodes = new Array(len - 1); + var startNode = leafNode; + for (var i = 1, len = lines.length; i < len; i++) { + insertedNodes[i - 1] = new LineLeaf(lines[i]); + } + var pathIndex = this.startPath.length - 2; + while (pathIndex >= 0) { + insertionNode = this.startPath[pathIndex]; + insertedNodes = insertionNode.insertAt(startNode, insertedNodes); + pathIndex--; + startNode = insertionNode; + } + var insertedNodesLen = insertedNodes.length; + while (insertedNodesLen > 0) { + var newRoot = new LineNode(); + newRoot.add(this.lineIndex.root); + insertedNodes = newRoot.insertAt(this.lineIndex.root, insertedNodes); + insertedNodesLen = insertedNodes.length; + this.lineIndex.root = newRoot; + } + this.lineIndex.root.updateCounts(); + } + else { + for (var j = this.startPath.length - 2; j >= 0; j--) { + (this.startPath[j]).updateCounts(); + } + } + } + else { + // no content for leaf node, so delete it + insertionNode.remove(leafNode); + for (var j = this.startPath.length - 2; j >= 0; j--) { + (this.startPath[j]).updateCounts(); + } + } + + return this.lineIndex; + } + + post(relativeStart: number, relativeLength: number, lineCollection: LineCollection, parent: LineCollection, nodeType: CharRangeSection): LineCollection { + // have visited the path for start of range, now looking for end + // if range is on single line, we will never make this state transition + if (lineCollection == this.lineCollectionAtBranch) { + this.state = CharRangeSection.End; + } + // always pop stack because post only called when child has been visited + this.stack.length--; + return undefined; + } + + pre(relativeStart: number, relativeLength: number, lineCollection: LineCollection, parent: LineCollection, nodeType: CharRangeSection) { + // currentNode corresponds to parent, but in the new tree + var currentNode = this.stack[this.stack.length - 1]; + + if ((this.state == CharRangeSection.Entire) && (nodeType == CharRangeSection.Start)) { + // if range is on single line, we will never make this state transition + this.state = CharRangeSection.Start; + this.branchNode = currentNode; + this.lineCollectionAtBranch = lineCollection; + } + + var child: LineCollection; + function fresh(node: LineCollection): LineCollection { + if (node.isLeaf()) { + return new LineLeaf(""); + } + else return new LineNode(); + } + switch (nodeType) { + case CharRangeSection.PreStart: + this.goSubtree = false; + if (this.state != CharRangeSection.End) { + currentNode.add(lineCollection); + } + break; + case CharRangeSection.Start: + if (this.state == CharRangeSection.End) { + this.goSubtree = false; + } + else { + child = fresh(lineCollection); + currentNode.add(child); + this.startPath[this.startPath.length] = child; + } + break; + case CharRangeSection.Entire: + if (this.state != CharRangeSection.End) { + child = fresh(lineCollection); + currentNode.add(child); + this.startPath[this.startPath.length] = child; + } + else { + if (!lineCollection.isLeaf()) { + child = fresh(lineCollection); + currentNode.add(child); + this.endBranch[this.endBranch.length] = child; + } + } + break; + case CharRangeSection.Mid: + this.goSubtree = false; + break; + case CharRangeSection.End: + if (this.state != CharRangeSection.End) { + this.goSubtree = false; + } + else { + if (!lineCollection.isLeaf()) { + child = fresh(lineCollection); + currentNode.add(child); + this.endBranch[this.endBranch.length] = child; + } + } + break; + case CharRangeSection.PostEnd: + this.goSubtree = false; + if (this.state != CharRangeSection.Start) { + currentNode.add(lineCollection); + } + break; + } + if (this.goSubtree) { + this.stack[this.stack.length] = child; + } + return lineCollection; + } + // just gather text from the leaves + leaf(relativeStart: number, relativeLength: number, ll: LineLeaf) { + if (this.state == CharRangeSection.Start) { + this.initialText = ll.text.substring(0, relativeStart); + } + else if (this.state == CharRangeSection.Entire) { + this.initialText = ll.text.substring(0, relativeStart); + this.trailingText = ll.text.substring(relativeStart + relativeLength); + } + else { + // state is CharRangeSection.End + this.trailingText = ll.text.substring(relativeStart + relativeLength); + } + } + } + + // text change information + export class TextChange { + constructor(public pos: number, public deleteLen: number, public insertedText?: string) { + } + + getTextChangeRange() { + return ts.createTextChangeRange(ts.createTextSpan(this.pos, this.deleteLen), + this.insertedText ? this.insertedText.length : 0); + } + } + + export class ScriptVersionCache { + changes: TextChange[] = []; + versions: LineIndexSnapshot[] = []; + minVersion = 0; // no versions earlier than min version will maintain change history + private currentVersion = 0; + + static changeNumberThreshold = 8; + static changeLengthThreshold = 256; + + // REVIEW: can optimize by coalescing simple edits + edit(pos: number, deleteLen: number, insertedText?: string) { + this.changes[this.changes.length] = new TextChange(pos, deleteLen, insertedText); + if ((this.changes.length > ScriptVersionCache.changeNumberThreshold) || + (deleteLen > ScriptVersionCache.changeLengthThreshold) || + (insertedText && (insertedText.length > ScriptVersionCache.changeLengthThreshold))) { + this.getSnapshot(); + } + } + + latest() { + return this.versions[this.currentVersion]; + } + + latestVersion() { + if (this.changes.length > 0) { + this.getSnapshot(); + } + return this.currentVersion; + } + + reloadFromFile(filename: string, cb?: () => any) { + var content = ts.sys.readFile(filename); + this.reload(content); + if (cb) + cb(); + } + + // reload whole script, leaving no change history behind reload + reload(script: string) { + this.currentVersion++; + this.changes = []; // history wiped out by reload + var snap = new LineIndexSnapshot(this.currentVersion, this); + this.versions[this.currentVersion] = snap; + snap.index = new LineIndex(); + var lm = LineIndex.linesFromText(script); + snap.index.load(lm.lines); + // REVIEW: could use linked list + for (var i = this.minVersion; i < this.currentVersion; i++) { + this.versions[i] = undefined; + } + this.minVersion = this.currentVersion; + + } + + getSnapshot() { + var snap = this.versions[this.currentVersion]; + if (this.changes.length > 0) { + var snapIndex = this.latest().index; + for (var i = 0, len = this.changes.length; i < len; i++) { + var change = this.changes[i]; + snapIndex = snapIndex.edit(change.pos, change.deleteLen, change.insertedText); + } + snap = new LineIndexSnapshot(this.currentVersion + 1, this); + snap.index = snapIndex; + snap.changesSincePreviousVersion = this.changes; + this.currentVersion = snap.version; + this.versions[snap.version] = snap; + this.changes = []; + } + return snap; + } + + getTextChangesBetweenVersions(oldVersion: number, newVersion: number) { + if (oldVersion < newVersion) { + if (oldVersion >= this.minVersion) { + var textChangeRanges: ts.TextChangeRange[] = []; + for (var i = oldVersion + 1; i <= newVersion; i++) { + var snap = this.versions[i]; + for (var j = 0, len = snap.changesSincePreviousVersion.length; j < len; j++) { + var textChange = snap.changesSincePreviousVersion[j]; + textChangeRanges[textChangeRanges.length] = textChange.getTextChangeRange(); + } + } + return ts.collapseTextChangeRangesAcrossMultipleVersions(textChangeRanges); + } + else { + return undefined; + } + } + else { + return ts.unchangedTextChangeRange; + } + } + + static fromString(script: string) { + var svc = new ScriptVersionCache(); + var snap = new LineIndexSnapshot(0, svc); + svc.versions[svc.currentVersion] = snap; + snap.index = new LineIndex(); + var lm = LineIndex.linesFromText(script); + snap.index.load(lm.lines); + return svc; + } + } + + export class LineIndexSnapshot implements ts.IScriptSnapshot { + index: LineIndex; + changesSincePreviousVersion: TextChange[] = []; + + constructor(public version: number, public cache: ScriptVersionCache) { + } + + getText(rangeStart: number, rangeEnd: number) { + return this.index.getText(rangeStart, rangeEnd - rangeStart); + } + + getLength() { + return this.index.root.charCount(); + } + + // this requires linear space so don't hold on to these + getLineStartPositions(): number[] { + var starts: number[] = [-1]; + var count = 1; + var pos = 0; + this.index.every((ll, s, len) => { + starts[count++] = pos; + pos += ll.text.length; + return true; + }, 0); + return starts; + } + + getLineMapper() { + return ((line: number) => { + return this.index.lineNumberToInfo(line).col; + }); + } + + getTextChangeRangeSinceVersion(scriptVersion: number) { + if (this.version <= scriptVersion) { + return ts.unchangedTextChangeRange; + } + else { + return this.cache.getTextChangesBetweenVersions(scriptVersion, this.version); + } + } + getChangeRange(oldSnapshot: ts.IScriptSnapshot): ts.TextChangeRange { + var oldSnap = oldSnapshot; + return this.getTextChangeRangeSinceVersion(oldSnap.version); + } + } + + + export class LineIndex { + root: LineNode; + // set this to true to check each edit for accuracy + checkEdits = false; + + charOffsetToLineNumberAndPos(charOffset: number) { + return this.root.charOffsetToLineNumberAndPos(1, charOffset); + } + + lineNumberToInfo(lineNumber: number): ILineInfo { + var lineCount = this.root.lineCount(); + if (lineNumber <= lineCount) { + var lineInfo = this.root.lineNumberToInfo(lineNumber, 0); + lineInfo.line = lineNumber; + return lineInfo; + } + else { + return { + line: lineNumber, + col: this.root.charCount() + } + } + } + + print() { + printLine("index TC " + this.root.charCount() + " TL " + this.root.lineCount()); + this.root.print(0); + printLine(""); + } + + load(lines: string[]) { + if (lines.length > 0) { + var leaves: LineLeaf[] = []; + for (var i = 0, len = lines.length; i < len; i++) { + leaves[i] = new LineLeaf(lines[i]); + } + this.root = LineIndex.buildTreeFromBottom(leaves); + } + else { + this.root = new LineNode(); + } + } + + walk(rangeStart: number, rangeLength: number, walkFns: ILineIndexWalker) { + this.root.walk(rangeStart, rangeLength, walkFns); + } + + getText(rangeStart: number, rangeLength: number) { + var accum = ""; + if (rangeLength > 0) { + this.walk(rangeStart, rangeLength, { + goSubtree: true, + done: false, + leaf: (relativeStart: number, relativeLength: number, ll: LineLeaf) => { + accum = accum.concat(ll.text.substring(relativeStart, relativeStart + relativeLength)); + } + }); + } + return accum; + } + + every(f: (ll: LineLeaf, s: number, len: number) => boolean, rangeStart: number, rangeEnd?: number) { + if (!rangeEnd) { + rangeEnd = this.root.charCount(); + } + var walkFns = { + goSubtree: true, + done: false, + leaf: function (relativeStart: number, relativeLength: number, ll: LineLeaf) { + if (!f(ll, relativeStart, relativeLength)) { + this.done = true; + } + } + } + this.walk(rangeStart, rangeEnd - rangeStart, walkFns); + return !walkFns.done; + } + + edit(pos: number, deleteLength: number, newText?: string) { + function editFlat(source: string, s: number, dl: number, nt = "") { + return source.substring(0, s) + nt + source.substring(s + dl, source.length); + } + if (this.root.charCount() == 0) { + // TODO: assert deleteLength == 0 + if (newText) { + this.load(LineIndex.linesFromText(newText).lines); + return this; + } + } + else { + if (this.checkEdits) { + var checkText = editFlat(this.getText(0, this.root.charCount()), pos, deleteLength, newText); + } + var walker = new EditWalker(); + if (deleteLength > 0) { + // check whether last characters deleted are line break + var e = pos + deleteLength; + var lineInfo = this.charOffsetToLineNumberAndPos(e); + if ((lineInfo && (lineInfo.col == 0))) { + // move range end just past line that will merge with previous line + deleteLength += lineInfo.text.length; + // store text by appending to end of insertedText + if (newText) { + newText = newText + lineInfo.text; + } + else { + newText = lineInfo.text; + } + } + } + else if (pos >= this.root.charCount()) { + // insert at end + var endString = this.getText(pos - 1, 1); + if (newText) { + newText = endString + newText; + } + else { + newText = endString; + } + pos = pos - 1; + deleteLength = 0; + walker.suppressTrailingText = true; + } + this.root.walk(pos, deleteLength, walker); + walker.insertLines(newText); + if (this.checkEdits) { + var updatedText = this.getText(0, this.root.charCount()); + Debug.assert(checkText == updatedText, "buffer edit mismatch"); + } + return walker.lineIndex; + } + } + + static buildTreeFromBottom(nodes: LineCollection[]): LineNode { + var nodeCount = Math.ceil(nodes.length / lineCollectionCapacity); + var interiorNodes: LineNode[] = []; + var nodeIndex = 0; + for (var i = 0; i < nodeCount; i++) { + interiorNodes[i] = new LineNode(); + var charCount = 0; + var lineCount = 0; + for (var j = 0; j < lineCollectionCapacity; j++) { + if (nodeIndex < nodes.length) { + interiorNodes[i].add(nodes[nodeIndex]); + charCount += nodes[nodeIndex].charCount(); + lineCount += nodes[nodeIndex].lineCount(); + } + else { + break; + } + nodeIndex++; + } + interiorNodes[i].totalChars = charCount; + interiorNodes[i].totalLines = lineCount; + } + if (interiorNodes.length == 1) { + return interiorNodes[0]; + } + else { + return this.buildTreeFromBottom(interiorNodes); + } + } + + static linesFromText(text: string) { + var lineStarts = ts.computeLineStarts(text); + + if (lineStarts.length == 0) { + return { lines: [], lineMap: lineStarts }; + } + var lines = new Array(lineStarts.length); + var lc = lineStarts.length - 1; + for (var lmi = 0; lmi < lc; lmi++) { + lines[lmi] = text.substring(lineStarts[lmi], lineStarts[lmi + 1]); + } + + var endText = text.substring(lineStarts[lc]); + if (endText.length > 0) { + lines[lc] = endText; + } + else { + lines.length--; + } + return { lines: lines, lineMap: lineStarts }; + } + } + + export class LineNode implements LineCollection { + totalChars = 0; + totalLines = 0; + children: LineCollection[] = []; + + isLeaf() { + return false; + } + + print(indentAmt: number) { + var strBuilder = getIndent(indentAmt); + strBuilder += ("node ch " + this.children.length + " TC " + this.totalChars + " TL " + this.totalLines + " :"); + printLine(strBuilder); + for (var ch = 0, clen = this.children.length; ch < clen; ch++) { + this.children[ch].print(indentAmt + 1); + } + } + + updateCounts() { + this.totalChars = 0; + this.totalLines = 0; + for (var i = 0, len = this.children.length; i < len; i++) { + var child = this.children[i]; + this.totalChars += child.charCount(); + this.totalLines += child.lineCount(); + } + } + + execWalk(rangeStart: number, rangeLength: number, walkFns: ILineIndexWalker, childIndex: number, nodeType: CharRangeSection) { + if (walkFns.pre) { + walkFns.pre(rangeStart, rangeLength, this.children[childIndex], this, nodeType); + } + if (walkFns.goSubtree) { + this.children[childIndex].walk(rangeStart, rangeLength, walkFns); + if (walkFns.post) { + walkFns.post(rangeStart, rangeLength, this.children[childIndex], this, nodeType); + } + } + else { + walkFns.goSubtree = true; + } + return walkFns.done; + } + + skipChild(relativeStart: number, relativeLength: number, childIndex: number, walkFns: ILineIndexWalker, nodeType: CharRangeSection) { + if (walkFns.pre && (!walkFns.done)) { + walkFns.pre(relativeStart, relativeLength, this.children[childIndex], this, nodeType); + walkFns.goSubtree = true; + } + } + + walk(rangeStart: number, rangeLength: number, walkFns: ILineIndexWalker) { + // assume (rangeStart < this.totalChars) && (rangeLength <= this.totalChars) + var childIndex = 0; + var child = this.children[0]; + var childCharCount = child.charCount(); + // find sub-tree containing start + var adjustedStart = rangeStart; + while (adjustedStart >= childCharCount) { + this.skipChild(adjustedStart, rangeLength, childIndex, walkFns, CharRangeSection.PreStart); + adjustedStart -= childCharCount; + child = this.children[++childIndex]; + childCharCount = child.charCount(); + } + // Case I: both start and end of range in same subtree + if ((adjustedStart + rangeLength) <= childCharCount) { + if (this.execWalk(adjustedStart, rangeLength, walkFns, childIndex, CharRangeSection.Entire)) { + return; + } + } + else { + // Case II: start and end of range in different subtrees (possibly with subtrees in the middle) + if (this.execWalk(adjustedStart, childCharCount - adjustedStart, walkFns, childIndex, CharRangeSection.Start)) { + return; + } + var adjustedLength = rangeLength - (childCharCount - adjustedStart); + child = this.children[++childIndex]; + if (!child) { + this.print(2); + } + childCharCount = child.charCount(); + while (adjustedLength > childCharCount) { + if (this.execWalk(0, childCharCount, walkFns, childIndex, CharRangeSection.Mid)) { + return; + } + adjustedLength -= childCharCount; + child = this.children[++childIndex]; + childCharCount = child.charCount(); + } + if (adjustedLength > 0) { + if (this.execWalk(0, adjustedLength, walkFns, childIndex, CharRangeSection.End)) { + return; + } + } + } + // Process any subtrees after the one containing range end + if (walkFns.pre) { + var clen = this.children.length; + if (childIndex < (clen - 1)) { + for (var ej = childIndex + 1; ej < clen; ej++) { + this.skipChild(0, 0, ej, walkFns, CharRangeSection.PostEnd); + } + } + } + } + + charOffsetToLineNumberAndPos(lineNumber: number, charOffset: number): ILineInfo { + var childInfo = this.childFromCharOffset(lineNumber, charOffset); + if (!childInfo.child) { + return { + line: lineNumber, + col: charOffset, + } + } + else if (childInfo.childIndex < this.children.length) { + if (childInfo.child.isLeaf()) { + return { + line: childInfo.lineNumber, + col: childInfo.charOffset, + text: ((childInfo.child)).text, + leaf: ((childInfo.child)) + }; + } + else { + var lineNode = (childInfo.child); + return lineNode.charOffsetToLineNumberAndPos(childInfo.lineNumber, childInfo.charOffset); + } + } + else { + var lineInfo = this.lineNumberToInfo(this.lineCount(), 0); + return { line: this.lineCount(), col: lineInfo.leaf.charCount() }; + } + } + + lineNumberToInfo(lineNumber: number, charOffset: number): ILineInfo { + var childInfo = this.childFromLineNumber(lineNumber, charOffset); + if (!childInfo.child) { + return { + line: lineNumber, + col: charOffset + } + } + else if (childInfo.child.isLeaf()) { + return { + line: lineNumber, + col: childInfo.charOffset, + text: ((childInfo.child)).text, + leaf: ((childInfo.child)) + } + } + else { + var lineNode = (childInfo.child); + return lineNode.lineNumberToInfo(childInfo.relativeLineNumber, childInfo.charOffset); + } + } + + childFromLineNumber(lineNumber: number, charOffset: number) { + var child: LineCollection; + var relativeLineNumber = lineNumber; + for (var i = 0, len = this.children.length; i < len; i++) { + child = this.children[i]; + var childLineCount = child.lineCount(); + if (childLineCount >= relativeLineNumber) { + break; + } + else { + relativeLineNumber -= childLineCount; + charOffset += child.charCount(); + } + } + return { + child: child, + childIndex: i, + relativeLineNumber: relativeLineNumber, + charOffset: charOffset + }; + } + + childFromCharOffset(lineNumber: number, charOffset: number) { + var child: LineCollection; + for (var i = 0, len = this.children.length; i < len; i++) { + child = this.children[i]; + if (child.charCount() > charOffset) { + break; + } + else { + charOffset -= child.charCount(); + lineNumber += child.lineCount(); + } + } + return { + child: child, + childIndex: i, + charOffset: charOffset, + lineNumber: lineNumber + } + } + + splitAfter(childIndex: number) { + var splitNode: LineNode; + var clen = this.children.length; + childIndex++; + var endLength = childIndex; + if (childIndex < clen) { + splitNode = new LineNode(); + while (childIndex < clen) { + splitNode.add(this.children[childIndex++]); + } + splitNode.updateCounts(); + } + this.children.length = endLength; + return splitNode; + } + + remove(child: LineCollection) { + var childIndex = this.findChildIndex(child); + var clen = this.children.length; + if (childIndex < (clen - 1)) { + for (var i = childIndex; i < (clen - 1); i++) { + this.children[i] = this.children[i + 1]; + } + } + this.children.length--; + } + + findChildIndex(child: LineCollection) { + var childIndex = 0; + var clen = this.children.length; + while ((this.children[childIndex] != child) && (childIndex < clen)) childIndex++; + return childIndex; + } + + insertAt(child: LineCollection, nodes: LineCollection[]) { + var childIndex = this.findChildIndex(child); + var clen = this.children.length; + var nodeCount = nodes.length; + // if child is last and there is more room and only one node to place, place it + if ((clen < lineCollectionCapacity) && (childIndex == (clen - 1)) && (nodeCount == 1)) { + this.add(nodes[0]); + this.updateCounts(); + return []; + } + else { + var shiftNode = this.splitAfter(childIndex); + var nodeIndex = 0; + childIndex++; + while ((childIndex < lineCollectionCapacity) && (nodeIndex < nodeCount)) { + this.children[childIndex++] = nodes[nodeIndex++]; + } + var splitNodes: LineNode[] = []; + var splitNodeCount = 0; + if (nodeIndex < nodeCount) { + splitNodeCount = Math.ceil((nodeCount - nodeIndex) / lineCollectionCapacity); + splitNodes = new Array(splitNodeCount); + var splitNodeIndex = 0; + for (var i = 0; i < splitNodeCount; i++) { + splitNodes[i] = new LineNode(); + } + var splitNode = splitNodes[0]; + while (nodeIndex < nodeCount) { + splitNode.add(nodes[nodeIndex++]); + if (splitNode.children.length == lineCollectionCapacity) { + splitNodeIndex++; + splitNode = splitNodes[splitNodeIndex]; + } + } + for (i = splitNodes.length - 1; i >= 0; i--) { + if (splitNodes[i].children.length == 0) { + splitNodes.length--; + } + } + } + if (shiftNode) { + splitNodes[splitNodes.length] = shiftNode; + } + this.updateCounts(); + for (i = 0; i < splitNodeCount; i++) { + (splitNodes[i]).updateCounts(); + } + return splitNodes; + } + } + + // assume there is room for the item; return true if more room + add(collection: LineCollection) { + this.children[this.children.length] = collection; + return (this.children.length < lineCollectionCapacity); + } + + charCount() { + return this.totalChars; + } + + lineCount() { + return this.totalLines; + } + } + + export class LineLeaf implements LineCollection { + udata: any; + + constructor(public text: string) { + + } + + setUdata(data: any) { + this.udata = data; + } + + getUdata() { + return this.udata; + } + + isLeaf() { + return true; + } + + walk(rangeStart: number, rangeLength: number, walkFns: ILineIndexWalker) { + walkFns.leaf(rangeStart, rangeLength, this); + } + + charCount() { + return this.text.length; + } + + lineCount() { + return 1; + } + + print(indentAmt: number) { + var strBuilder = getIndent(indentAmt); + printLine(strBuilder + showLines(this.text)); + } + } +} \ No newline at end of file diff --git a/src/server/node.d.ts b/src/server/node.d.ts new file mode 100644 index 00000000000..2002f973a37 --- /dev/null +++ b/src/server/node.d.ts @@ -0,0 +1,677 @@ +// Type definitions for Node.js v0.10.1 +// Project: http://nodejs.org/ +// Definitions by: Microsoft TypeScript , DefinitelyTyped +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/************************************************ +* * +* Node.js v0.10.1 API * +* * +************************************************/ + +/************************************************ +* * +* GLOBAL * +* * +************************************************/ +declare var process: NodeJS.Process; +declare var global: any; + +declare var __filename: string; +declare var __dirname: string; + +declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; +declare function clearTimeout(timeoutId: NodeJS.Timer): void; +declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; +declare function clearInterval(intervalId: NodeJS.Timer): void; +declare function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; +declare function clearImmediate(immediateId: any): void; + +declare var require: { + (id: string): any; + resolve(id: string): string; + cache: any; + extensions: any; + main: any; +}; + +declare var module: { + exports: any; + require(id: string): any; + id: string; + filename: string; + loaded: boolean; + parent: any; + children: any[]; +}; + +// Same as module.exports +declare var exports: any; +declare var SlowBuffer: { + new (str: string, encoding?: string): Buffer; + new (size: number): Buffer; + new (size: Uint8Array): Buffer; + new (array: any[]): Buffer; + prototype: Buffer; + isBuffer(obj: any): boolean; + byteLength(string: string, encoding?: string): number; + concat(list: Buffer[], totalLength?: number): Buffer; +}; + + +// Buffer class +interface Buffer extends NodeBuffer { } +interface BufferConstructor { + new (str: string, encoding ?: string): Buffer; + new (size: number): Buffer; + new (size: Uint8Array): Buffer; + new (array: any[]): Buffer; + prototype: Buffer; + isBuffer(obj: any): boolean; + byteLength(string: string, encoding ?: string): number; + concat(list: Buffer[], totalLength ?: number): Buffer; +} +declare var Buffer: BufferConstructor; + +/************************************************ +* * +* GLOBAL INTERFACES * +* * +************************************************/ +declare module NodeJS { + export interface ErrnoException extends Error { + errno?: any; + code?: string; + path?: string; + syscall?: string; + } + + export interface EventEmitter { + addListener(event: string, listener: Function): EventEmitter; + on(event: string, listener: Function): EventEmitter; + once(event: string, listener: Function): EventEmitter; + removeListener(event: string, listener: Function): EventEmitter; + removeAllListeners(event?: string): EventEmitter; + setMaxListeners(n: number): void; + listeners(event: string): Function[]; + emit(event: string, ...args: any[]): boolean; + } + + export interface ReadableStream extends EventEmitter { + readable: boolean; + read(size?: number): any; + setEncoding(encoding: string): void; + pause(): void; + resume(): void; + pipe(destination: T, options?: { end?: boolean; }): T; + unpipe(destination?: T): void; + unshift(chunk: string): void; + unshift(chunk: Buffer): void; + wrap(oldStream: ReadableStream): ReadableStream; + } + + export interface WritableStream extends EventEmitter { + writable: boolean; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + } + + export interface ReadWriteStream extends ReadableStream, WritableStream { } + + export interface Process extends EventEmitter { + stdout: WritableStream; + stderr: WritableStream; + stdin: ReadableStream; + argv: string[]; + execPath: string; + abort(): void; + chdir(directory: string): void; + cwd(): string; + env: any; + exit(code?: number): void; + getgid(): number; + setgid(id: number): void; + setgid(id: string): void; + getuid(): number; + setuid(id: number): void; + setuid(id: string): void; + version: string; + versions: { + http_parser: string; + node: string; + v8: string; + ares: string; + uv: string; + zlib: string; + openssl: string; + }; + config: { + target_defaults: { + cflags: any[]; + default_configuration: string; + defines: string[]; + include_dirs: string[]; + libraries: string[]; + }; + variables: { + clang: number; + host_arch: string; + node_install_npm: boolean; + node_install_waf: boolean; + node_prefix: string; + node_shared_openssl: boolean; + node_shared_v8: boolean; + node_shared_zlib: boolean; + node_use_dtrace: boolean; + node_use_etw: boolean; + node_use_openssl: boolean; + target_arch: string; + v8_no_strict_aliasing: number; + v8_use_snapshot: boolean; + visibility: string; + }; + }; + kill(pid: number, signal?: string): void; + pid: number; + title: string; + arch: string; + platform: string; + memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; }; + nextTick(callback: Function): void; + umask(mask?: number): number; + uptime(): number; + hrtime(time?: number[]): number[]; + + // Worker + send? (message: any, sendHandle?: any): void; + } + + export interface Timer { + ref(): void; + unref(): void; + } +} + + +/** + * @deprecated + */ +interface NodeBuffer { + [index: number]: number; + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): any; + length: number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + readUInt8(offset: number, noAsset?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + writeUInt8(value: number, offset: number, noAssert?: boolean): void; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): void; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): void; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): void; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): void; + writeInt8(value: number, offset: number, noAssert?: boolean): void; + writeInt16LE(value: number, offset: number, noAssert?: boolean): void; + writeInt16BE(value: number, offset: number, noAssert?: boolean): void; + writeInt32LE(value: number, offset: number, noAssert?: boolean): void; + writeInt32BE(value: number, offset: number, noAssert?: boolean): void; + writeFloatLE(value: number, offset: number, noAssert?: boolean): void; + writeFloatBE(value: number, offset: number, noAssert?: boolean): void; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): void; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): void; + fill(value: any, offset?: number, end?: number): void; +} + +declare module NodeJS { + export interface Path { + normalize(p: string): string; + join(...paths: any[]): string; + resolve(...pathSegments: any[]): string; + relative(from: string, to: string): string; + dirname(p: string): string; + basename(p: string, ext?: string): string; + extname(p: string): string; + sep: string; + } +} + +declare module NodeJS { + export interface ReadLineInstance extends EventEmitter { + setPrompt(prompt: string, length: number): void; + prompt(preserveCursor?: boolean): void; + question(query: string, callback: Function): void; + pause(): void; + resume(): void; + close(): void; + write(data: any, key?: any): void; + } + export interface ReadLineOptions { + input: NodeJS.ReadableStream; + output: NodeJS.WritableStream; + completer?: Function; + terminal?: boolean; + } + + export interface ReadLine { + createInterface(options: ReadLineOptions): ReadLineInstance; + } +} + +declare module NodeJS { + module events { + export class EventEmitter implements NodeJS.EventEmitter { + static listenerCount(emitter: EventEmitter, event: string): number; + + addListener(event: string, listener: Function): EventEmitter; + on(event: string, listener: Function): EventEmitter; + once(event: string, listener: Function): EventEmitter; + removeListener(event: string, listener: Function): EventEmitter; + removeAllListeners(event?: string): EventEmitter; + setMaxListeners(n: number): void; + listeners(event: string): Function[]; + emit(event: string, ...args: any[]): boolean; + } + } +} + +declare module NodeJS { + module stream { + + export interface Stream extends events.EventEmitter { + pipe(destination: T, options?: { end?: boolean; }): T; + } + + export interface ReadableOptions { + highWaterMark?: number; + encoding?: string; + objectMode?: boolean; + } + + export class Readable extends events.EventEmitter implements NodeJS.ReadableStream { + readable: boolean; + constructor(opts?: ReadableOptions); + _read(size: number): void; + read(size?: number): any; + setEncoding(encoding: string): void; + pause(): void; + resume(): void; + pipe(destination: T, options?: { end?: boolean; }): T; + unpipe(destination?: T): void; + unshift(chunk: string): void; + unshift(chunk: Buffer): void; + wrap(oldStream: NodeJS.ReadableStream): NodeJS.ReadableStream; + push(chunk: any, encoding?: string): boolean; + } + + export interface WritableOptions { + highWaterMark?: number; + decodeStrings?: boolean; + } + + export class Writable extends events.EventEmitter implements NodeJS.WritableStream { + writable: boolean; + constructor(opts?: WritableOptions); + _write(data: Buffer, encoding: string, callback: Function): void; + _write(data: string, encoding: string, callback: Function): void; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + } + + export interface DuplexOptions extends ReadableOptions, WritableOptions { + allowHalfOpen?: boolean; + } + + // Note: Duplex extends both Readable and Writable. + export class Duplex extends Readable implements NodeJS.ReadWriteStream { + writable: boolean; + constructor(opts?: DuplexOptions); + _write(data: Buffer, encoding: string, callback: Function): void; + _write(data: string, encoding: string, callback: Function): void; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + } + + export interface TransformOptions extends ReadableOptions, WritableOptions { } + + // Note: Transform lacks the _read and _write methods of Readable/Writable. + export class Transform extends events.EventEmitter implements NodeJS.ReadWriteStream { + readable: boolean; + writable: boolean; + constructor(opts?: TransformOptions); + _transform(chunk: Buffer, encoding: string, callback: Function): void; + _transform(chunk: string, encoding: string, callback: Function): void; + _flush(callback: Function): void; + read(size?: number): any; + setEncoding(encoding: string): void; + pause(): void; + resume(): void; + pipe(destination: T, options?: { end?: boolean; }): T; + unpipe(destination?: T): void; + unshift(chunk: string): void; + unshift(chunk: Buffer): void; + wrap(oldStream: NodeJS.ReadableStream): NodeJS.ReadableStream; + push(chunk: any, encoding?: string): boolean; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + } + + export class PassThrough extends Transform { } + } +} + +declare module NodeJS { + module fs { + interface Stats { + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atime: Date; + mtime: Date; + ctime: Date; + } + interface FSWatcher extends events.EventEmitter { + close(): void; + } + + export interface ReadStream extends stream.Readable { } + export interface WriteStream extends stream.Writable { } + + export function rename(oldPath: string, newPath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function renameSync(oldPath: string, newPath: string): void; + export function truncate(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function truncate(path: string, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function truncateSync(path: string, len?: number): void; + export function ftruncate(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function ftruncate(fd: number, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function ftruncateSync(fd: number, len?: number): void; + export function chown(path: string, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chownSync(path: string, uid: number, gid: number): void; + export function fchown(fd: number, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fchownSync(fd: number, uid: number, gid: number): void; + export function lchown(path: string, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function lchownSync(path: string, uid: number, gid: number): void; + export function chmod(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chmod(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chmodSync(path: string, mode: number): void; + export function chmodSync(path: string, mode: string): void; + export function fchmod(fd: number, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fchmod(fd: number, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fchmodSync(fd: number, mode: number): void; + export function fchmodSync(fd: number, mode: string): void; + export function lchmod(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function lchmod(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function lchmodSync(path: string, mode: number): void; + export function lchmodSync(path: string, mode: string): void; + export function stat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + export function lstat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + export function fstat(fd: number, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + export function statSync(path: string): Stats; + export function lstatSync(path: string): Stats; + export function fstatSync(fd: number): Stats; + export function link(srcpath: string, dstpath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function linkSync(srcpath: string, dstpath: string): void; + export function symlink(srcpath: string, dstpath: string, type?: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function symlinkSync(srcpath: string, dstpath: string, type?: string): void; + export function readlink(path: string, callback?: (err: NodeJS.ErrnoException, linkString: string) => any): void; + export function readlinkSync(path: string): string; + export function realpath(path: string, callback?: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; + export function realpath(path: string, cache: { [path: string]: string }, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; + export function realpathSync(path: string, cache?: { [path: string]: string }): string; + export function unlink(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function unlinkSync(path: string): void; + export function rmdir(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function rmdirSync(path: string): void; + export function mkdir(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function mkdir(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function mkdir(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function mkdirSync(path: string, mode?: number): void; + export function mkdirSync(path: string, mode?: string): void; + export function readdir(path: string, callback?: (err: NodeJS.ErrnoException, files: string[]) => void): void; + export function readdirSync(path: string): string[]; + export function close(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function closeSync(fd: number): void; + export function open(path: string, flags: string, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; + export function open(path: string, flags: string, mode: number, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; + export function open(path: string, flags: string, mode: string, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; + export function openSync(path: string, flags: string, mode?: number): number; + export function openSync(path: string, flags: string, mode?: string): number; + export function utimes(path: string, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function utimes(path: string, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function utimesSync(path: string, atime: number, mtime: number): void; + export function utimesSync(path: string, atime: Date, mtime: Date): void; + export function futimes(fd: number, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function futimesSync(fd: number, atime: number, mtime: number): void; + export function futimesSync(fd: number, atime: Date, mtime: Date): void; + export function fsync(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fsyncSync(fd: number): void; + export function write(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; + export function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number; + export function read(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: Buffer) => void): void; + export function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number; + export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; + export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void; + export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + export function readFileSync(filename: string, encoding: string): string; + export function readFileSync(filename: string, options: { encoding: string; flag?: string; }): string; + export function readFileSync(filename: string, options?: { flag?: string; }): Buffer; + export function writeFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; + export function writeFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function writeFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; + export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; + export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function appendFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; + export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; + export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; + export function watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void; + export function watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void; + export function unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void; + export function watch(filename: string, listener?: (event: string, filename: string) => any): FSWatcher; + export function watch(filename: string, options: { persistent?: boolean; }, listener?: (event: string, filename: string) => any): FSWatcher; + export function exists(path: string, callback?: (exists: boolean) => void): void; + export function existsSync(path: string): boolean; + export function createReadStream(path: string, options?: { + flags?: string; + encoding?: string; + fd?: string; + mode?: number; + bufferSize?: number; + }): ReadStream; + export function createReadStream(path: string, options?: { + flags?: string; + encoding?: string; + fd?: string; + mode?: string; + bufferSize?: number; + }): ReadStream; + export function createWriteStream(path: string, options?: { + flags?: string; + encoding?: string; + string?: string; + }): WriteStream; + } +} + +declare module NodeJS { + module path { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + } +} + +declare module NodeJS { + module _debugger { + export interface Packet { + raw: string; + headers: string[]; + body: Message; + } + + export interface Message { + seq: number; + type: string; + } + + export interface RequestInfo { + command: string; + arguments: any; + } + + export interface Request extends Message, RequestInfo { + } + + export interface Event extends Message { + event: string; + body?: any; + } + + export interface Response extends Message { + request_seq: number; + success: boolean; + /** Contains error message if success == false. */ + message?: string; + /** Contains message body if success == true. */ + body?: any; + } + + export interface BreakpointMessageBody { + type: string; + target: number; + line: number; + } + + export class Protocol { + res: Packet; + state: string; + execute(data: string): void; + serialize(rq: Request): string; + onResponse: (pkt: Packet) => void; + } + + export var NO_FRAME: number; + export var port: number; + + export interface ScriptDesc { + name: string; + id: number; + isNative?: boolean; + handle?: number; + type: string; + lineOffset?: number; + columnOffset?: number; + lineCount?: number; + } + + export interface Breakpoint { + id: number; + scriptId: number; + script: ScriptDesc; + line: number; + condition?: string; + scriptReq?: string; + } + + export interface RequestHandler { + (err: boolean, body: Message, res: Packet): void; + request_seq?: number; + } + + export interface ResponseBodyHandler { + (err: boolean, body?: any): void; + request_seq?: number; + } + + export interface ExceptionInfo { + text: string; + } + + export interface BreakResponse { + script?: ScriptDesc; + exception?: ExceptionInfo; + sourceLine: number; + sourceLineText: string; + sourceColumn: number; + } + + export function SourceInfo(body: BreakResponse): string; + + export class Client extends events.EventEmitter { + protocol: Protocol; + scripts: ScriptDesc[]; + handles: ScriptDesc[]; + breakpoints: Breakpoint[]; + currentSourceLine: number; + currentSourceColumn: number; + currentSourceLineText: string; + currentFrame: number; + currentScript: string; + + connect(port: number, host: string): void; + req(req: any, cb: RequestHandler): void; + reqFrameEval(code: string, frame: number, cb: RequestHandler): void; + mirrorObject(obj: any, depth: number, cb: ResponseBodyHandler): void; + setBreakpoint(rq: BreakpointMessageBody, cb: RequestHandler): void; + clearBreakpoint(rq: Request, cb: RequestHandler): void; + listbreakpoints(cb: RequestHandler): void; + reqSource(from: number, to: number, cb: RequestHandler): void; + reqScripts(cb: any): void; + reqContinue(cb: RequestHandler): void; + } + } +} \ No newline at end of file diff --git a/src/server/protocol.ts b/src/server/protocol.ts new file mode 100644 index 00000000000..abbce0b3588 --- /dev/null +++ b/src/server/protocol.ts @@ -0,0 +1,1309 @@ +/// +/// +/// +/// +/// + +module ts { + export interface NavigationBarItem { + displayString?: string; + docString?: string; + } + + export interface System { + getModififedTime? (fileName: string): Date; + stat? (path: string, callback?: (err: any, stats: any) => any): void; + } +} + +module ts.server { + var paddedLength = 8; + + var typeNames = ["interface", "class", "enum", "module", "alias", "type"]; + + var spaceCache = [" ", " ", " ", " "]; + + interface StackTraceError extends Error { + stack?: string; + } + + function generateSpaces(n: number): string { + if (!spaceCache[n]) { + var strBuilder = ""; + for (var i = 0; i < n; i++) { + strBuilder += " "; + } + spaceCache[n] = strBuilder; + } + return spaceCache[n]; + } + + function isTypeName(name: string, suffix?: string) { + for (var i = 0, len = typeNames.length; i < len; i++) { + if (typeNames[i] == name) { + return true; + } + else if (suffix && ((typeNames[i] + suffix) == name)) { + return true; + } + } + return false; + } + + function parseTypeName(displayParts: ts.SymbolDisplayPart[]) { + var len = displayParts.length; + for (var i = len - 1; i >= 0; i--) { + if (isTypeName(displayParts[i].kind, "Name")) { + return displayParts[i].text; + } + } + return undefined; + } + + function findExactMatchType(items: ts.NavigateToItem[]) { + for (var i = 0, len = items.length; i < len; i++) { + var navItem = items[i]; + if (navItem.matchKind == "exact") { + if (isTypeName(navItem.kind)) { + return navItem; + } + } + } + } + + interface FileStart { + file: string; + start: ILineInfo; + } + + function compareNumber(a: number, b: number) { + if (a < b) { + return -1; + } + else if (a == b) { + return 0; + } + else return 1; + } + + function printObject(obj: any) { + for (var p in obj) { + if (obj.hasOwnProperty(p)) { + console.log(p + ": " + obj[p]); + } + } + } + + function compareFileStart(a: FileStart, b: FileStart) { + if (a.file < b.file) { + return -1; + } + else if (a.file == b.file) { + var n = compareNumber(a.start.line, b.start.line); + if (n == 0) { + return compareNumber(a.start.col, b.start.col); + } + else return n; + } + else { + return 1; + } + } + + function sortNavItems(items: ts.NavigateToItem[]) { + return items.sort((a, b) => { + if (a.matchKind < b.matchKind) { + return -1; + } + else if (a.matchKind == b.matchKind) { + var lowa = a.name.toLowerCase(); + var lowb = b.name.toLowerCase(); + if (lowa < lowb) { + return -1; + } + else if (lowa == lowb) { + return 0; + } + else { + return 1; + } + } + else { + return 1; + } + }) + } + + //function SourceInfo(body: NodeJS._debugger.BreakResponse) { + // var result = body.exception ? 'exception in ' : 'break in '; + + // if (body.script) { + // if (body.script.name) { + // var name = body.script.name, + // dir = path.resolve() + '/'; + + // // Change path to relative, if possible + // if (name.indexOf(dir) === 0) { + // name = name.slice(dir.length); + // } + + // result += name; + // } else { + // result += '[unnamed]'; + // } + // } + // result += ':'; + // result += body.sourceLine + 1; + + // if (body.exception) result += '\n' + body.exception.text; + + // return result; + //} + + class JsDebugSession { + host = 'localhost'; + port = 5858; + + constructor(public client: NodeJS._debugger.Client) { + this.init(); + } + + cont(cb: NodeJS._debugger.RequestHandler) { + this.client.reqContinue(cb); + } + + listSrc() { + this.client.reqScripts((err: any) => { + if (err) { + console.log("rscr error: " + err); + } + else { + console.log("req scripts"); + for (var id in this.client.scripts) { + var script = this.client.scripts[id]; + if ((typeof script === "object") && script.name) { + console.log(id + ": " + script.name); + } + } + } + }); + } + + findScript(file: string) { + if (file) { + var script: NodeJS._debugger.ScriptDesc; + var scripts = this.client.scripts; + var keys: any[] = Object.keys(scripts); + var ambiguous = false; + for (var v = 0; v < keys.length; v++) { + var id = keys[v]; + if (scripts[id] && + scripts[id].name && + scripts[id].name.indexOf(file) !== -1) { + if (script) { + ambiguous = true; + } + script = scripts[id]; + } + } + return { script: script, ambiguous: ambiguous }; + } + } + + // TODO: condition + setBreakpointOnLine(line: number, file?: string) { + if (!file) { + file = this.client.currentScript; + } + var script: NodeJS._debugger.ScriptDesc; + var scriptResult = this.findScript(file); + if (scriptResult) { + if (scriptResult.ambiguous) { + // TODO: send back error + script = undefined; + } + else { + script = scriptResult.script; + } + } + // TODO: set breakpoint when script not loaded + if (script) { + var brkmsg: NodeJS._debugger.BreakpointMessageBody = { + type: 'scriptId', + target: script.id, + line: line - 1, + } + this.client.setBreakpoint(brkmsg,(err, bod) => { + // TODO: remember breakpoint + if (err) { + console.log("Error: set breakpoint: " + err); + } + }); + } + + } + + init() { + var connectionAttempts = 0; + this.client.on('break',(res: NodeJS._debugger.Event) => { + this.handleBreak(res.body); + }); + this.client.on('exception',(res: NodeJS._debugger.Event) => { + this.handleBreak(res.body); + }); + this.client.on('error',() => { + setTimeout(() => { + ++connectionAttempts; + this.client.connect(this.port, this.host); + }, 500); + }); + this.client.once('ready',() => { + }); + this.client.on('unhandledResponse',() => { + }); + this.client.connect(this.port, this.host); + } + + evaluate(code: string) { + var frame = this.client.currentFrame; + this.client.reqFrameEval(code, frame,(err, bod) => { + if (err) { + console.log("Error: evaluate: " + err); + return; + } + + console.log("Value: " + bod.toString()); + if (typeof bod === "object") { + printObject(bod); + } + + // Request object by handles (and it's sub-properties) + this.client.mirrorObject(bod, 3,(err, mirror) => { + if (mirror) { + if (typeof mirror === "object") { + printObject(mirror); + } + console.log(mirror.toString()); + } + else { + console.log("undefined"); + } + }); + + }); + } + + handleBreak(breakInfo: NodeJS._debugger.BreakResponse) { + this.client.currentSourceLine = breakInfo.sourceLine; + this.client.currentSourceLineText = breakInfo.sourceLineText; + this.client.currentSourceColumn = breakInfo.sourceColumn; + this.client.currentFrame = 0; + this.client.currentScript = breakInfo.script && breakInfo.script.name; + + //console.log(SourceInfo(breakInfo)); + // TODO: watchers + } + } + + interface FileRange { + file?: string; + start: ILineInfo; + end: ILineInfo; + } + + interface FileRanges { + file: string; + locs: FileRange[]; + } + + function formatDiag(file: string, project: Project, diag: ts.Diagnostic) { + return { + start: project.compilerService.host.positionToLineCol(file, diag.start), + len: diag.length, + text: diag.messageText, + }; + } + + interface PendingErrorCheck { + filename: string; + project: Project; + } + + function allEditsBeforePos(edits: ts.TextChange[], pos: number) { + for (var i = 0, len = edits.length; i < len; i++) { + if (ts.textSpanEnd(edits[i].span) >= pos) { + return false; + } + } + return true; + } + + module CommandNames { + export var Abbrev = "abbrev"; + export var Change = "change"; + export var Close = "close"; + export var Completions = "completions"; + export var Definition = "definition"; + export var Format = "format"; + export var Formatonkey = "formatonkey"; + export var Geterr = "geterr"; + export var Navto = "navto"; + export var Open = "open"; + export var Quickinfo = "quickinfo"; + export var References = "references"; + export var Reload = "reload"; + export var Rename = "rename"; + export var Saveto = "saveto"; + export var Type = "type"; + export var Unknown = "unknown"; + } + + export interface ServerHost extends ts.System { + getDebuggerClient? (): NodeJS._debugger.Client; + } + + export class Session { + projectService: ProjectService; + debugSession: JsDebugSession; + pendingOperation = false; + fileHash: ts.Map = {}; + abbrevTable: ts.Map; + fetchedAbbrev = false; + nextFileId = 1; + errorTimer: NodeJS.Timer; + immediateId: any; + changeSeq = 0; + + constructor(private host: ServerHost, private logger: Logger, protected useProtocol: boolean, protected prettyJSON: boolean) { + this.projectService = new ProjectService(host, logger); + this.initAbbrevTable(); + } + + logError(err: Error, cmd: string) { + var typedErr = err; + var msg = "Exception on executing command " + cmd; + if (typedErr.message) { + msg += ":\n" + typedErr.message; + if (typedErr.stack) { + msg += "\n" + typedErr.stack; + } + } + this.projectService.log(msg); + } + + sendLineToClient(line: string) { + this.host.write(line + this.host.newLine); + } + + send(msg: NodeJS._debugger.Message) { + var json: string; + if (this.prettyJSON) { + json = JSON.stringify(msg, null, " "); + } + else { + json = JSON.stringify(msg); + } + this.sendLineToClient('Content-Length: ' + (1 + Buffer.byteLength(json, 'utf8')) + + '\r\n\r\n' + json); + } + + event(info: any, eventName: string) { + var ev: NodeJS._debugger.Event = { + seq: 0, + type: "event", + event: eventName, + body: info, + }; + this.send(ev); + } + + response(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) { + var res: ServerProtocol.Response = { + seq: 0, + type: "response", + command: cmdName, + request_seq: reqSeq, + success: !errorMsg, + } + if (!errorMsg) { + res.body = info; + } + else { + res.message = errorMsg; + } + this.send(res); + } + + initAbbrevTable() { + this.abbrevTable = { + name: "n", + kind: "k", + fileName: "f", + containerName: "cn", + containerKind: "ck", + kindModifiers: "km", + start: "s", + end: "e", + line: "l", + col: "c", + "interface": "i", + "function": "fn", + }; + } + + encodeFilename(filename: string): ServerProtocol.EncodedFile { + if (!this.fetchedAbbrev) { + return filename; + } + else { + var id = ts.lookUp(this.fileHash, filename); + if (!id) { + id = this.nextFileId++; + this.fileHash[filename] = id; + return { id: id, file: filename }; + } + else { + return id; + } + } + } + + abbreviate(obj: any) { + if (this.fetchedAbbrev && (!this.prettyJSON)) { + for (var p in obj) { + if (obj.hasOwnProperty(p)) { + var sub = ts.lookUp(this.abbrevTable, p); + if (sub) { + obj[sub] = obj[p]; + obj[p] = undefined; + } + } + } + } + } + + output(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) { + if (this.useProtocol) { + this.response(info, cmdName, reqSeq, errorMsg); + } + else if (this.prettyJSON) { + if (!errorMsg) { + this.sendLineToClient(JSON.stringify(info, null, " ").trim()); + } + else { + this.sendLineToClient(JSON.stringify(errorMsg)); + } + } else { + if (!errorMsg) { + var infoStr = JSON.stringify(info).trim(); + // [8 digits of length,infoStr] + '\n' + var len = infoStr.length + paddedLength + 4; + var lenStr = len.toString(); + var padLen = paddedLength - lenStr.length; + for (var i = 0; i < padLen; i++) { + lenStr = '0' + lenStr; + } + this.sendLineToClient("[" + lenStr + "," + infoStr + "]"); + } + else { + this.sendLineToClient(JSON.stringify("error: " + errorMsg)); + } + } + } + + 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"); + } + } + + 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"); + } + } + + errorCheck(file: string, project: Project) { + this.syntacticCheck(file, project); + this.semanticCheck(file, project); + } + + updateErrorCheck(checkList: PendingErrorCheck[], seq: number, + matchSeq: (seq: number) => boolean, ms = 1500, followMs = 200) { + if (followMs > ms) { + followMs = ms; + } + if (this.errorTimer) { + clearTimeout(this.errorTimer); + } + if (this.immediateId) { + clearImmediate(this.immediateId); + this.immediateId = undefined; + } + var index = 0; + var checkOne = () => { + if (matchSeq(seq)) { + var checkSpec = checkList[index++]; + if (checkSpec.project.getSourceFileFromName(checkSpec.filename)) { + this.syntacticCheck(checkSpec.filename, checkSpec.project); + this.immediateId = setImmediate(() => { + this.semanticCheck(checkSpec.filename, checkSpec.project); + this.immediateId = undefined; + if (checkList.length > index) { + this.errorTimer = setTimeout(checkOne, followMs); + } + else { + this.errorTimer = undefined; + } + }); + } + } + } + if ((checkList.length > index) && (matchSeq(seq))) { + this.errorTimer = setTimeout(checkOne, ms); + } + } + + goToDefinition(line: number, col: number, rawfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var locs = compilerService.languageService.getDefinitionAtPosition(file, pos); + if (locs) { + var info: ServerProtocol.CodeSpan[] = locs.map(def => ({ + file: def && def.fileName, + start: def && + compilerService.host.positionToLineCol(def.fileName, def.textSpan.start), + end: def && + compilerService.host.positionToLineCol(def.fileName, ts.textSpanEnd(def.textSpan)) + })); + this.output(info, CommandNames.Definition, reqSeq); + } + else { + this.output(undefined, CommandNames.Definition, reqSeq, "could not find def"); + } + } + else { + this.output(undefined, CommandNames.Definition, reqSeq, "no project for " + file); + } + } + + rename(line: number, col: number, rawfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var renameInfo = compilerService.languageService.getRenameInfo(file, pos); + if (renameInfo) { + if (renameInfo.canRename) { + var renameLocs = compilerService.languageService.findRenameLocations(file, pos, false, false); + if (renameLocs) { + var bakedRenameLocs = renameLocs.map(loc=> ({ + file: loc.fileName, + start: compilerService.host.positionToLineCol(loc.fileName, loc.textSpan.start), + end: compilerService.host.positionToLineCol(loc.fileName, ts.textSpanEnd(loc.textSpan)), + })).sort((a, b) => { + if (a.file < b.file) { + return -1; + } + else if (a.file > b.file) { + return 1; + } + else { + // reverse sort assuming no overlap + if (a.start.line < b.start.line) { + return 1; + } + else if (a.start.line > b.start.line) { + return -1; + } + else { + return b.start.col - a.start.col; + } + } + }).reduce((accum: FileRanges[], cur: FileRange) => { + var curFileAccum: FileRanges; + if (accum.length > 0) { + curFileAccum = accum[accum.length - 1]; + if (curFileAccum.file != cur.file) { + curFileAccum = undefined; + } + } + if (!curFileAccum) { + curFileAccum = { file: cur.file, locs: [] }; + accum.push(curFileAccum); + } + curFileAccum.locs.push({ start: cur.start, end: cur.end }); + return accum; + }, []); + this.output({ info: renameInfo, locs: bakedRenameLocs }, CommandNames.Rename, reqSeq); + } + else { + this.output({ info: renameInfo, locs: [] }, CommandNames.Rename, reqSeq); + } + } + else { + this.output(undefined, CommandNames.Rename, reqSeq, renameInfo.localizedErrorMessage); + } + } + else { + this.output(undefined, CommandNames.Rename, reqSeq, "no rename information at cursor"); + } + } + } + + findReferences(line: number, col: number, rawfile: string, reqSeq = 0) { + // TODO: get all projects for this file; report refs for all projects deleting duplicates + // can avoid duplicates by eliminating same ref file from subsequent projects + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var refs = compilerService.languageService.getReferencesAtPosition(file, pos); + if (refs) { + var nameInfo = compilerService.languageService.getQuickInfoAtPosition(file, pos); + if (nameInfo) { + var displayString = ts.displayPartsToString(nameInfo.displayParts); + var nameSpan = nameInfo.textSpan; + var nameColStart = + compilerService.host.positionToLineCol(file, nameSpan.start).col; + var nameText = + compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); + var bakedRefs: ServerProtocol.ReferencesResponseItem[] = refs.map((ref) => { + var start = compilerService.host.positionToLineCol(ref.fileName, ref.textSpan.start); + var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); + var snap = compilerService.host.getScriptSnapshot(ref.fileName); + var lineText = snap.getText(refLineSpan.start, ts.textSpanEnd(refLineSpan)).replace(/\r|\n/g, ""); + return { + file: ref.fileName, + start: start, + lineText: lineText, + end: compilerService.host.positionToLineCol(ref.fileName, ts.textSpanEnd(ref.textSpan)), + }; + }).sort(compareFileStart); + var response: ServerProtocol.ReferencesResponseBody = { + refs: bakedRefs, + symbolName: nameText, + symbolStartCol: nameColStart, + symbolDisplayString: displayString + }; + this.output(response, CommandNames.References, reqSeq); + } + else { + this.output(undefined, CommandNames.References, reqSeq, "no references at this position"); + } + } + else { + this.output(undefined, CommandNames.References, reqSeq, "no references at this position"); + } + } + } + + // TODO: implement this as ls api that can return multiple def sites + goToType(line: number, col: number, rawfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, pos); + var typeLoc: any; + + if (quickInfo && (quickInfo.kind == "var") || (quickInfo.kind == "local var")) { + var typeName = parseTypeName(quickInfo.displayParts); + if (typeName) { + var navItems = compilerService.languageService.getNavigateToItems(typeName); + var navItem = findExactMatchType(navItems); + if (navItem) { + typeLoc = { + file: navItem.fileName, + start: compilerService.host.positionToLineCol(navItem.fileName, + navItem.textSpan.start), + end: compilerService.host.positionToLineCol(navItem.fileName, + ts.textSpanEnd(navItem.textSpan)), + }; + } + } + } + if (typeLoc) { + this.output([typeLoc], CommandNames.Type, reqSeq); + } + else { + this.output(undefined, CommandNames.Type, reqSeq, "no info at this location"); + } + } + else { + this.output(undefined, CommandNames.Type, reqSeq, "no project for " + file); + } + } + + openClientFile(rawfile: string) { + var file = ts.normalizePath(rawfile); + this.projectService.openClientFile(file); + } + + quickInfo(line: number, col: number, rawfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, pos); + if (quickInfo) { + var displayString = ts.displayPartsToString(quickInfo.displayParts); + var docString = ts.displayPartsToString(quickInfo.documentation); + var qi: ServerProtocol.QuickInfoResponseBody = { + kind: quickInfo.kind, + kindModifiers: quickInfo.kindModifiers, + start: compilerService.host.positionToLineCol(file, quickInfo.textSpan.start), + end: compilerService.host.positionToLineCol(file, ts.textSpanEnd(quickInfo.textSpan)), + displayString: displayString, + documentation: docString, + }; + this.output(qi, CommandNames.Quickinfo, reqSeq); + } + else { + this.output(undefined, CommandNames.Quickinfo, reqSeq, "no info") + } + } + } + + format(line: number, col: number, endLine: number, endCol: number, rawfile: string, cmd: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var endPos = compilerService.host.lineColToPosition(file, endLine, endCol); + var edits: ts.TextChange[]; + // TODO: avoid duplicate code (with formatonkey) + try { + edits = compilerService.languageService.getFormattingEditsForRange(file, pos, endPos, + compilerService.formatCodeOptions); + } + catch (err) { + this.logError(err, cmd); + edits = undefined; + } + if (edits) { + var bakedEdits: ServerProtocol.CodeEdit[] = edits.map((edit) => { + return { + start: compilerService.host.positionToLineCol(file, + edit.span.start), + end: compilerService.host.positionToLineCol(file, + ts.textSpanEnd(edit.span)), + newText: edit.newText ? edit.newText : "" + }; + }); + this.output(bakedEdits, CommandNames.Format, reqSeq); + } + else { + this.output(undefined, CommandNames.Format, reqSeq, "no edits") + } + } + } + + formatOnKey(line: number, col: number, key: string, rawfile: string, cmd: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var edits: ts.TextChange[]; + try { + edits = compilerService.languageService.getFormattingEditsAfterKeystroke(file, pos, key, + compilerService.formatCodeOptions); + if ((key == "\n") && ((!edits) || (edits.length == 0) || allEditsBeforePos(edits, pos))) { + // TODO: get these options from host + var editorOptions: ts.EditorOptions = { + IndentSize: 4, + TabSize: 4, + NewLineCharacter: "\n", + ConvertTabsToSpaces: true, + }; + var indentPosition = compilerService.languageService.getIndentationAtPosition(file, pos, editorOptions); + var spaces = generateSpaces(indentPosition); + if (indentPosition > 0) { + edits.push({ span: ts.createTextSpanFromBounds(pos, pos), newText: spaces }); + } + } + } + catch (err) { + this.logError(err, cmd); + edits = undefined; + } + if (edits) { + var bakedEdits: ServerProtocol.CodeEdit[] = edits.map((edit) => { + return { + start: compilerService.host.positionToLineCol(file, + edit.span.start), + end: compilerService.host.positionToLineCol(file, + ts.textSpanEnd(edit.span)), + newText: edit.newText ? edit.newText : "" + }; + }); + this.output(bakedEdits, CommandNames.Formatonkey, reqSeq); + } + else { + this.output(undefined, CommandNames.Formatonkey, reqSeq, "no edits") + } + } + } + + completions(line: number, col: number, prefix: string, rawfile: string, cmd: string, reqSeq = 0) { + if (!prefix) { + prefix = ""; + } + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + var completions: ts.CompletionInfo = undefined; + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + if (pos >= 0) { + try { + completions = compilerService.languageService.getCompletionsAtPosition(file, pos); + } + catch (err) { + this.logError(err, cmd); + completions = undefined; + } + if (completions) { + var compressedEntries: ServerProtocol.CompletionItem[] = + completions.entries.reduce((accum: ts.CompletionEntryDetails[], entry: ts.CompletionEntry) => { + if (entry.name.indexOf(prefix) == 0) { + var protoEntry = {}; + protoEntry.name = entry.name; + protoEntry.kind = entry.kind; + if (entry.kindModifiers && (entry.kindModifiers.length > 0)) { + protoEntry.kindModifiers = entry.kindModifiers; + } + var details = compilerService.languageService.getCompletionEntryDetails(file, pos, entry.name); + if (details && (details.documentation) && (details.documentation.length > 0)) { + protoEntry.documentation = details.documentation; + } + if (details && (details.displayParts) && (details.displayParts.length > 0)) { + protoEntry.displayParts = details.documentation; + } + accum.push(protoEntry); + } + return accum; + }, []); + this.output(compressedEntries, CommandNames.Completions, reqSeq); + } + } + } + if (!completions) { + this.output(undefined, CommandNames.Completions, reqSeq, "no completions"); + } + } + + geterr(ms: number, files: string[]) { + var checkList = files.reduce((accum: PendingErrorCheck[], filename: string) => { + filename = ts.normalizePath(filename); + var project = this.projectService.getProjectForFile(filename); + if (project) { + accum.push({ filename: filename, project: project }); + } + return accum; + }, []); + if (checkList.length > 0) { + this.updateErrorCheck(checkList, this.changeSeq,(n) => n == this.changeSeq, ms) + } + } + + change(line: number, col: number, deleteLen: number, insertString: string, rawfile: string) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + if (pos >= 0) { + var end = pos; + if (deleteLen) { + end += deleteLen; + } + compilerService.host.editScript(file, pos, end, insertString); + this.changeSeq++; + } + } + } + + reload(rawfile: string, rawtmpfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var tmpfile = ts.normalizePath(rawtmpfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + this.changeSeq++; + // make sure no changes happen before this one is finished + project.compilerService.host.reloadScript(file, tmpfile,() => { + this.output(undefined, CommandNames.Reload, reqSeq); + }); + } + } + + saveToTmp(rawfile: string, rawtmpfile: string) { + var file = ts.normalizePath(rawfile); + var tmpfile = ts.normalizePath(rawtmpfile); + + var project = this.projectService.getProjectForFile(file); + if (project) { + project.compilerService.host.saveTo(file, tmpfile); + } + } + + closeClientFile(rawfile: string) { + var file = ts.normalizePath(rawfile); + this.projectService.closeClientFile(file); + } + + decorateNavBarItem(navBarItem: ts.NavigationBarItem, compilerService: CompilerService, file: string) { + if (navBarItem.spans.length == 1) { + var span = navBarItem.spans[0]; + var offset = span.start; + var textForSpan = compilerService.host.getScriptSnapshot(file).getText(offset, offset + span.length); + var adj = textForSpan.indexOf(navBarItem.text); + if (adj > 0) { + offset += adj; + } + var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, + offset + (navBarItem.text.length / 2)); + if (quickInfo) { + var displayString = ts.displayPartsToString(quickInfo.displayParts); + var docString = ts.displayPartsToString(quickInfo.documentation); + navBarItem.displayString = displayString; + navBarItem.docString = docString; + } + } + if (navBarItem.childItems.length > 0) { + navBarItem.childItems = + navBarItem.childItems.map(navBarItem => this.decorateNavBarItem(navBarItem, compilerService, file)); + } + return navBarItem; + } + + navbar(rawfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var navBarItems = compilerService.languageService.getNavigationBarItems(file); + var bakedNavBarItems = navBarItems.map(navBarItem => this.decorateNavBarItem(navBarItem, compilerService, file)); + this.sendLineToClient(JSON.stringify(bakedNavBarItems, null, " ")); + } + } + + navto(searchTerm: string, rawfile: string, cmd: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var navItems: ts.NavigateToItem[]; + var cancellationToken = compilerService.host.getCancellationToken(); + if (this.pendingOperation) { + cancellationToken.cancel(); + cancellationToken.reset(); + } + try { + this.pendingOperation = true; + navItems = sortNavItems(compilerService.languageService.getNavigateToItems(searchTerm)); + } + catch (err) { + this.logError(err, cmd); + navItems = undefined; + } + this.pendingOperation = false; + if (navItems) { + var bakedNavItems: ServerProtocol.NavtoItem[] = navItems.map((navItem) => { + var start = compilerService.host.positionToLineCol(navItem.fileName, + navItem.textSpan.start); + var end = compilerService.host.positionToLineCol(navItem.fileName, ts.textSpanEnd(navItem.textSpan)); + this.abbreviate(start); + var bakedItem: ServerProtocol.NavtoItem = { + name: navItem.name, + kind: navItem.kind, + file: this.encodeFilename(navItem.fileName), + start: start, + end: end, + }; + if (navItem.kindModifiers && (navItem.kindModifiers != "")) { + bakedItem.kindModifiers = navItem.kindModifiers; + } + if (navItem.matchKind != 'none') { + bakedItem.matchKind = navItem.matchKind; + } + if (navItem.containerName && (navItem.containerName.length > 0)) { + bakedItem.containerName = navItem.containerName; + } + if (navItem.containerKind && (navItem.containerKind.length > 0)) { + bakedItem.containerKind = navItem.containerKind; + } + this.abbreviate(bakedItem); + return bakedItem; + }); + + this.output(bakedNavItems, CommandNames.Navto, reqSeq); + } + else { + this.output(undefined, CommandNames.Navto, reqSeq, "no nav items"); + } + } + } + + executeJSONcmd(cmd: string) { + try { + var req = JSON.parse(cmd); + switch (req.command) { + case CommandNames.Definition: { + var defArgs = req.arguments; + this.goToDefinition(defArgs.line, defArgs.col, defArgs.file, req.seq); + break; + } + case CommandNames.References: { + var refArgs = req.arguments; + this.findReferences(refArgs.line, refArgs.col, refArgs.file, req.seq); + break; + } + case CommandNames.Rename: { + var renameArgs = req.arguments; + this.rename(renameArgs.line, renameArgs.col, renameArgs.file, req.seq); + break; + } + case CommandNames.Type: { + var typeArgs = req.arguments; + this.goToType(typeArgs.line, typeArgs.col, typeArgs.file, req.seq); + break; + } + case CommandNames.Open: { + var openArgs = req.arguments; + this.openClientFile(openArgs.file); + break; + } + case CommandNames.Quickinfo: { + var quickinfoArgs = req.arguments; + this.quickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file, req.seq); + break; + } + case CommandNames.Format: { + var formatArgs = req.arguments; + this.format(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file, + cmd, req.seq); + break; + } + case CommandNames.Formatonkey: { + var formatOnKeyArgs = req.arguments; + this.formatOnKey(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file, + cmd, req.seq); + break; + } + case CommandNames.Completions: { + var completionsArgs = req.arguments; + this.completions(req.arguments.line, req.arguments.col, completionsArgs.prefix, req.arguments.file, + cmd, req.seq); + break; + } + case CommandNames.Geterr: { + var geterrArgs = req.arguments; + this.geterr(geterrArgs.delay, geterrArgs.files); + break; + } + case CommandNames.Change: { + var changeArgs = req.arguments; + this.change(changeArgs.line, changeArgs.col, changeArgs.deleteLen, changeArgs.insertString, + changeArgs.file); + break; + } + case CommandNames.Reload: { + var reloadArgs = req.arguments; + this.reload(reloadArgs.file, reloadArgs.tmpfile, req.seq); + break; + } + case CommandNames.Saveto: { + var savetoArgs = req.arguments; + this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); + break; + } + case CommandNames.Close: { + var closeArgs = req.arguments; + this.closeClientFile(closeArgs.file); + break; + } + case CommandNames.Navto: { + var navtoArgs = req.arguments; + this.navto(navtoArgs.searchTerm, navtoArgs.file, cmd, req.seq); + break; + } + default: { + this.projectService.log("Unrecognized JSON command: " + cmd); + break; + } + } + } catch (err) { + this.logError(err, cmd); + } + } + + sendAbbrev(reqSeq = 0) { + if (!this.fetchedAbbrev) { + this.output(this.abbrevTable, CommandNames.Abbrev, reqSeq); + } + this.fetchedAbbrev = true; + } + + executeCmd(cmd: string) { + var line: number, col: number, file: string; + var m: string[]; + + try { + if (m = cmd.match(/^dbg start$/)) { + this.debugSession = new JsDebugSession(this.host.getDebuggerClient()); + } + else if (m = cmd.match(/^dbg cont$/)) { + if (this.debugSession) { + this.debugSession.cont((err, body, res) => { + }); + } + } + else if (m = cmd.match(/^dbg src$/)) { + if (this.debugSession) { + this.debugSession.listSrc(); + } + } + else if (m = cmd.match(/^dbg brk (\d+) (.*)$/)) { + line = parseInt(m[1]); + file = ts.normalizePath(m[2]); + if (this.debugSession) { + this.debugSession.setBreakpointOnLine(line, file); + } + } + else if (m = cmd.match(/^dbg eval (.*)$/)) { + var code = m[1]; + if (this.debugSession) { + this.debugSession.evaluate(code); + } + } + else if (m = cmd.match(/^definition (\d+) (\d+) (.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + file = m[3]; + this.goToDefinition(line, col, file); + } + else if (m = cmd.match(/^rename (\d+) (\d+) (.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + file = m[3]; + this.rename(line, col, file); + } + else if (m = cmd.match(/^type (\d+) (\d+) (.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + file = m[3]; + this.goToType(line, col, file); + } + else if (m = cmd.match(/^open (.*)$/)) { + file = m[1]; + this.openClientFile(file); + } + else if (m = cmd.match(/^references (\d+) (\d+) (.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + file = m[3]; + this.findReferences(line, col, file); + } + else if (m = cmd.match(/^quickinfo (\d+) (\d+) (.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + file = m[3]; + this.quickInfo(line, col, file); + } + else if (m = cmd.match(/^format (\d+) (\d+) (\d+) (\d+) (.*)$/)) { + // format line col endLine endCol file + line = parseInt(m[1]); + col = parseInt(m[2]); + var endLine = parseInt(m[3]); + var endCol = parseInt(m[4]); + file = m[5]; + this.format(line, col, endLine, endCol, file, cmd); + } + else if (m = cmd.match(/^formatonkey (\d+) (\d+) (\{\".*\"\})\s* (.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + var key = JSON.parse(m[3].substring(1, m[3].length - 1)); + file = m[4]; + this.formatOnKey(line, col, key, file, cmd); + } + else if (m = cmd.match(/^completions (\d+) (\d+) (\{.*\})?\s*(.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + var prefix = ""; + file = m[4]; + if (m[3]) { + prefix = m[3].substring(1, m[3].length - 1); + } + this.completions(line, col, prefix, file, cmd); + } + else if (m = cmd.match(/^geterr (\d+) (.*)$/)) { + var ms = parseInt(m[1]); + var rawFiles = m[2]; + this.geterr(ms, rawFiles.split(';')); + } + else if (m = cmd.match(/^change (\d+) (\d+) (\d+) (\d+) (\{\".*\"\})?\s*(.*)$/)) { + line = parseInt(m[1]); + col = parseInt(m[2]); + var deleteLen = parseInt(m[3]); + var insertLen = parseInt(m[4]); + var insertString: string; + if (insertLen) { + insertString = JSON.parse(m[5].substring(1, m[5].length - 1)); + } + file = m[6]; + this.change(line, col, deleteLen, insertString, file); + } + else if (m = cmd.match(/^reload (.*) from (.*)$/)) { + this.reload(m[1], m[2]); + } + // TODO: change this to saveto + else if (m = cmd.match(/^save (.*) to (.*)$/)) { + this.saveToTmp(m[1], m[2]); + } + else if (m = cmd.match(/^close (.*)$/)) { + this.closeClientFile(m[1]); + } + else if (m = cmd.match(/^navto (\{.*\}) (.*)$/)) { + var searchTerm = m[1]; + searchTerm = searchTerm.substring(1, searchTerm.length - 1); + this.navto(searchTerm, m[2], cmd); + } + else if (m = cmd.match(/^navbar (.*)$/)) { + this.navbar(m[1]); + } + else if (m = cmd.match(/^abbrev/)) { + this.sendAbbrev(); + } + else if (m = cmd.match(/^pretty/)) { + this.prettyJSON = true; + } + else if (m = cmd.match(/^printproj/)) { + this.projectService.printProjects(); + } + else if (m = cmd.match(/^fileproj (.*)$/)) { + file = ts.normalizePath(m[1]); + this.projectService.printProjectsForFile(file); + } + else { + this.output(undefined, CommandNames.Unknown, 0, "Unrecognized command " + cmd); + } + } catch (err) { + this.logError(err, cmd); + } + } + } +} diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts new file mode 100644 index 00000000000..75a41cb81ce --- /dev/null +++ b/src/server/protodef.d.ts @@ -0,0 +1,591 @@ +/** Declaration module describing the TypeScript Server protocol */ +declare module ServerProtocol { + /** A TypeScript Server message */ + export interface Message { + /** Sequence number of the message */ + seq: number; + /** One of "request", "response", or "event" */ + type: string; + } + + /** Client-initiated request message */ + export interface Request extends Message { + /** The command to execute */ + command: string; + /** Object containing arguments for the command */ + arguments?: any; + } + + /** Server-initiated event message */ + export interface Event extends Message { + /** Name of event */ + event: string; + /** Event-specific information */ + body?: any; + } + + /** Response by server to client request message */ + export interface Response extends Message { + /** Sequence number of the request message */ + request_seq: number; + /** Outcome of the request */ + success: boolean; + /** The command requested */ + command: string; + /** Contains error message if success == false. */ + message?: string; + /** Contains message body if success == true. */ + body?: any; + } + + /** Arguments for FileRequest messages */ + export interface FileRequestArgs { + /** The file for the request (absolute pathname required) */ + file: string; + } + + /** + Request whose sole parameter is a file name + */ + export interface FileRequest extends Request { + arguments: FileRequestArgs; + } + + /** + Instances of this interface specify a code location: + (file, line, col), where line and column are 1-based. + */ + export interface CodeLocationRequestArgs extends FileRequestArgs { + /** The line number for the request (1-based) */ + line: number; + /** The column for the request (1-based) */ + col: number; + } + + /** + A request whose arguments specify a code location (file, line, col) + */ + export interface CodeLocationRequest extends FileRequest { + arguments: CodeLocationRequestArgs; + } + + /** + Go to definition request; value of command field is + "definition". Return response giving the code locations that + define the symbol found in file at location line, col. + */ + export interface DefinitionRequest extends CodeLocationRequest { + } + + /** + Object containing line and column (one-based) of code location + */ + export interface LineCol { + line: number; + col: number; + } + + /** + Object found in response messages defining a span of text in + source code. + */ + export interface CodeSpan { + /** File containing the definition */ + file: string; + /** First character of the definition */ + start: LineCol; + /** One character past last character of the definition */ + end: LineCol; + } + + /** + Definition response message. Gives text range for definition. + */ + export interface DefinitionResponse extends Response { + body?: CodeSpan[]; + } + + /** + Find references request; value of command field is + "references". Return response giving the code locations that + reference the symbol found in file at location line, col. + */ + export interface ReferencesRequest extends CodeLocationRequest { + } + + export interface ReferencesResponseItem extends CodeSpan { + /** Text of line containing the reference. Including this + with the response avoids latency of editor loading files + to show text of reference line (the server already has + loaded the referencing files). + */ + lineText: string; + } + + /** The body of a "references" response message. */ + export interface ReferencesResponseBody { + /** The code locations referencing the symbol */ + refs: ReferencesResponseItem[]; + /** The name of the symbol */ + symbolName: string; + /** + The start column of the symbol (on the line provided by the references request) + */ + symbolStartCol: number; + /** The full display name of the symbol */ + symbolDisplayString: string; + } + + /** Response to "references" request. */ + export interface ReferencesResponse extends Response { + body?: ReferencesResponseBody; + } + + /** + Rename request; value of command field is "rename". Return + response giving the code locations that reference the symbol + found in file at location line, col. Also return full display + name of the symbol so that client can print it unambiguously. + */ + export interface RenameRequest extends CodeLocationRequest { + } + + /** Information about the item to be renamed. */ + export interface RenameInfo { + /** True if item can be renamed */ + canRename: boolean; + /** Error message if item can not be renamed */ + localizedErrorMessage: string; + /** Display name of the item to be renamed */ + displayName: string; + /** Full display name of item to be renamed */ + fullDisplayName: string; + /** The items's kind (such as 'className' or 'parameterName' or plain 'text') */ + kind: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers: string; + } + + /** + Rename response message. + */ + export interface RenameResponse extends Response { + body?: { + /** Information about the item to be renamed */ + info: RenameInfo; + /** + An array of code locations that refer to the + item to be renamed. + */ + locs: CodeSpan[]; + } + } + + /** + Type request; value of command field is "type". Return response + giving the code locations that define the type of the symbol + found in file at location line, col. + */ + export interface TypeRequest extends CodeLocationRequest { + } + + export interface TypeResponse extends Response { + body?: CodeSpan[]; + } + + /** + Open request; value of command field is "open". Notify the + server that the client has file open. The server will not + monitor the filesystem for changes in this file and will assume + that the client is updating the server (using the change and/or + reload messages) when the file changes. Server does not currently + send a response to an open request. + */ + export interface OpenRequest extends FileRequest { + } + + /** + Close request; value of command field is "close". Notify the + server that the client has closed a previously open file. If + file is still referenced by open files, the server will resume + monitoring the filesystem for changes to file. Server does not + currently send a response to a close request. + */ + export interface CloseRequest extends FileRequest { + } + + /** + Quickinfo request; value of command field is + "quickinfo". Return response giving a quick type and + documentation string for the symbol found in file at location + line, col. + */ + export interface QuickInfoRequest extends CodeLocationRequest { + } + + /** Body of QuickInfoResponse */ + export interface QuickInfoResponseBody { + /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ + kind: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers: string; + /** Starting code location of symbol */ + start: LineCol; + /** One past last character of symbol */ + end: LineCol; + /** Type and kind of symbol */ + displayString: string; + /** Documentation associated with symbol */ + documentation: string; + } + + /** Quickinfo response message */ + export interface QuickInfoResponse extends Response { + body?: QuickInfoResponseBody; + } + + /** Arguments for format messages */ + export interface FormatRequestArgs extends CodeLocationRequestArgs { + /** Last line of range for which to format text in file */ + endLine: number; + /** Last column of range for which to format text in file */ + endCol: number; + } + + /** + Format request; value of command field is "format". Return + response giving zero or more edit instructions. The edit + instructions will be sorted in file order. Applying the edit + instructions in reverse to file will result in correctly + reformatted text. + */ + export interface FormatRequest extends CodeLocationRequest { + arguments: FormatRequestArgs; + } + + /** + Object found in response messages defining an editing + instruction for a span of text in source code. The effect of + this instruction is to replace the text starting at start and + ending one character before end with newText. For an insertion, + the text span is empty. For a deletion, newText is empty. + */ + export interface CodeEdit { + /** First character of the text span to edit. */ + start: LineCol; + /** One character past last character of the text span to edit */ + end: LineCol; + /** + Replace the span defined above with this string (may be + the empty string) + */ + newText: string; + } + + /** Format and format on key response message */ + export interface FormatResponse extends Response { + body?: CodeEdit[]; + } + + /** Arguments for format on key messages */ + export interface FormatOnKeyRequestArgs extends CodeLocationRequestArgs { + /** Key pressed (';', '\n', or '}') */ + key: string; + } + + /** + Format on key request; value of command field is + "formatonkey". Given file location and key typed (as string), + return response giving zero or more edit instructions. The + edit instructions will be sorted in file order. Applying the + edit instructions in reverse to file will result in correctly + reformatted text. + */ + export interface FormatOnKeyRequest extends CodeLocationRequest { + arguments: FormatOnKeyRequestArgs; + } + + /** Arguments for completions messages */ + export interface CompletionsRequestArgs extends CodeLocationRequestArgs { + /** Optional prefix to apply to possible completions. */ + prefix?: string; + } + + /** + Completions request; value of command field is "completions". + Given a file location (file, line, col) and a prefix (which may + be the empty string), return the possible completions that + begin with prefix. + */ + export interface CompletionsRequest extends CodeLocationRequest { + arguments: CompletionsRequestArgs; + } + + /** + Part of a symbol description. + */ + export interface SymbolDisplayPart { + /** Text of an item describing the symbol */ + text: string; + /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ + kind: string; + } + + /** An item found in a completion response */ + export interface CompletionItem { + /** The symbol's name */ + name: string; + /** The symbol's kind (such as 'className' or 'parameterName') */ + kind: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers?: string; + /** Display parts of the symbol (similar to quick info) */ + displayParts?: SymbolDisplayPart[]; + /** Documentation strings for the symbol */ + documentation?: SymbolDisplayPart[]; + } + + export interface CompletionsResponse extends Response { + body?: CompletionItem[]; + } + + /** Arguments for geterr messages. */ + export interface GeterrRequestArgs { + /** + List of file names for which to compute compiler errors. + The files will be checked in list order. + */ + files: string[]; + /** + Delay in milliseconds to wait before starting to compute + errors for the files in the file list + */ + delay: number; + } + + /** + Geterr request; value of command field is "geterr". Wait for + delay milliseconds and then, if during the wait no change or + reload messages have arrived for the first file in the files + list, get the syntactic errors for the file, field requests, + and then get the semantic errors for the file. Repeat with a + smaller delay for each subsequent file on the files list. Best + practice for an editor is to send a file list containing each + file that is currently visible, in most-recently-used order. + */ + export interface GeterrRequest extends Request { + arguments: GeterrRequestArgs; + } + + /** Item of diagnostic information found in a DiagEvent message */ + export interface Diagnostic { + /** Starting code location at which text appies */ + start: LineCol; + /** Length of code location at which text applies */ + len: number; + /** Text of diagnostic message */ + text: string; + } + + /** Event message for "syntaxDiag" and "semanticDiag" event types. + These events provide syntactic and semantic errors for a file. + */ + export interface DiagEvent extends Event { + body?: { + /** The file for which diagnostic information is reported */ + file: string; + /** An array of diagnostic information items */ + diagnostics: Diagnostic[]; + }; + } + + /** Arguments for reload request. */ + export interface ReloadRequestArgs extends FileRequestArgs { + /** + Name of temporary file from which to reload file + contents. May be same as file. + */ + tmpfile: string; + } + + /** + Reload request message; value of command field is "reload". + Reload contents of file with name given by the 'file' argument + from temporary file with name given by the 'tmpfile' argument. + The two names can be identical. + */ + export interface ReloadRequest extends FileRequest { + arguments: ReloadRequestArgs; + } + + /** + Response to "reload" request. This is just an acknowledgement, so + no body field is required. + */ + export interface ReloadResponse extends Response { + } + + /** Arguments for saveto request. */ + export interface SavetoRequestArgs extends FileRequestArgs { + /** + Name of temporary file into which to save server's view of + file contents. + */ + tmpfile: string; + } + + /** + Saveto request message; value of command field is "saveto". + For debugging purposes, save to a temporaryfile (named by + argument 'tmpfile') the contents of file named by argument + 'file'. The server does not currently send a response to a + "saveto" request. + */ + export interface SavetoRequest extends FileRequest { + arguments: SavetoRequestArgs; + } + + /** Arguments for navto request message */ + export interface NavtoRequestArgs extends FileRequestArgs { + /** + Search term to navigate to from current location; term can + be '.*' or an identifier prefix. + */ + searchTerm: string; + } + + /** + Navto request message; value of command field is "navto". + Return list of objects giving code locations and symbols that + match the search term given in argument 'searchTerm'. The + context for the search is given by the named file. + */ + export interface NavtoRequest extends FileRequest { + arguments: NavtoRequestArgs; + } + + /** An item found in a navto response. */ + export interface NavtoItem { + /** The symbol's name */ + name: string; + /** The symbol's kind (such as 'className' or 'parameterName') */ + kind: string; + /** exact, substring, or prefix */ + matchKind?: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers?: string; + /** + The file in which the symbol is found; the value of this + field will always be a string unless the client opts-in to + file encoding by sending the "abbrev" request. + */ + file: EncodedFile; + /** The location within file at which the symbol is found*/ + start: LineCol; + /** One past the last character of the symbol */ + end: LineCol; + /** + Name of symbol's container symbol (if any); for example, + the class name if symbol is a class member + */ + containerName?: string; + /** Kind of symbol's container symbol (if any) */ + containerKind?: string; + } + + /** + Navto response message. Body is an array of navto items. Each + item gives a symbol that matched the search term. + */ + export interface NavtoResponse extends Response { + body?: NavtoItem[]; + } + + /** Arguments for change request message. */ + export interface ChangeRequestArgs extends CodeLocationRequestArgs { + /** + Length of span deleted at location (file, line, col); nothing deleted + if this field is zero or undefined. + */ + deleteLen?: number; + /** Optional string to insert at location (file, line col). */ + insertString?: string; + } + + /** + Change request message; value of command field is "change". + Update the server's view of the file named by argument 'file'. + Server does not currently send a response to a change request. + */ + export interface ChangeRequest extends CodeLocationRequest { + arguments: ChangeRequestArgs; + } + + /* + The following messages describe an OPTIONAL compression scheme + that clients can choose to use. If a client does not opt-in to + this scheme by sending an "abbrev" request, the server will not + compress messages. + */ + + /** + Abbrev request message; value of command field is "abbrev". + Server returns an array of mappings from common message field + names and common message field string values to shortened + versions of these strings. Once a client opts-in by requesting + the abbreviations, the server may send responses whose field + names are shortened. The server may also send file names as + instances of AssignFileId, or as file ids, if the corresponding + id assignment had been previously returned. Currently, only + responses to the "navto" request can be encoded. + */ + export interface AbbrevRequest extends Request { + } + + /** + If an object of this type is returned in place of a string as + the value of a file field in a response message, add the + mapping id => file to the client's cache of file id mappings, + and interpret the value as if it was the string in the 'file' + field. + */ + export interface IdFile { + /** Id to assign to file */ + id: number; + /** File name that will correspond to id */ + file: string; + } + + /** + The type of an encoded file name. If of type number, the value + is a file id. If of type IdFile, the value is interpreted as + 'file' and in addition the mapping 'id' to 'file' is + established. If of type string, the value is simply the file + name. + */ + export type EncodedFile = number | IdFile | string; + + /** + Response to abbrev opt-in request message. This is a map of + string field names and common string field values to shortened + strings. Once the server sends this response, it will assume + that it can use the shortened field names and field values. In + addition, the server will assume it can assign ids to file + names by returning an AssignFileId instance in place of a file + name. Once an AssignFileId instance is returned, the server + may send the file id (a number) in place of the file name. + */ + export interface AbbrevResponse extends Response { + body?: { + /** Map from full string (either field name or string + field value) to shortened string */ + [fullString: string]: string; + } + } +} + + + + + + diff --git a/src/server/server.ts b/src/server/server.ts new file mode 100644 index 00000000000..ec0ee293ce3 --- /dev/null +++ b/src/server/server.ts @@ -0,0 +1,134 @@ +/// +/// + +module ts.server { + var nodeproto: typeof NodeJS._debugger = require('_debugger'); + var readline: NodeJS.ReadLine = require('readline'); + var path: NodeJS.Path = require('path'); + var fs: typeof NodeJS.fs = require('fs'); + + var rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: false, + }); + + class Logger implements ts.server.Logger { + fd = -1; + seq = 0; + inGroup = false; + firstInGroup = true; + + constructor(public logFilename: string) { + } + + static padStringRight(str: string, padding: string) { + return (str + padding).slice(0, padding.length); + } + + close() { + if (this.fd >= 0) { + fs.close(this.fd); + } + } + + perftrc(s: string) { + this.msg(s, "Perf"); + } + + info(s: string) { + this.msg(s, "Info"); + } + + startGroup() { + this.inGroup = true; + this.firstInGroup = true; + } + + endGroup() { + this.inGroup = false; + this.seq++; + this.firstInGroup = true; + } + + msg(s: string, type = "Err") { + if (this.fd < 0) { + this.fd = fs.openSync(this.logFilename, "w"); + } + if (this.fd >= 0) { + s = s + "\n"; + var prefix = Logger.padStringRight(type + " " + this.seq.toString(), " "); + if (this.firstInGroup) { + s = prefix + s; + this.firstInGroup = false; + } + if (!this.inGroup) { + this.seq++; + this.firstInGroup = true; + } + var buf = new Buffer(s); + fs.writeSync(this.fd, buf, 0, buf.length, null); + } + } + } + + class IOSession extends Session { + protocol: NodeJS._debugger.Protocol; + + constructor(host: ServerHost, logger: ts.server.Logger, useProtocol: boolean, prettyJSON: boolean) { + super(host, logger, useProtocol, prettyJSON); + if (useProtocol) { + this.initProtocol(); + } + } + + initProtocol() { + this.protocol = new nodeproto.Protocol(); + // note: onResponse was named by nodejs authors; we are re-purposing the Protocol + // class in this case so that it supports a server instead of a client + this.protocol.onResponse = (pkt) => { + this.handleRequest(pkt); + }; + } + + handleRequest(req: NodeJS._debugger.Packet) { + this.projectService.log("Got JSON msg:\n" + req.raw); + } + + listen() { + rl.on('line',(input: string) => { + var cmd = input.trim(); + if (cmd.indexOf("{") == 0) { + // assumption is JSON on single line + // plan is to also carry this protocol + // over tcp, in which case JSON would + // have a Content-Length header + this.executeJSONcmd(cmd); + } + else { + this.executeCmd(cmd); + } + }); + + rl.on('close',() => { + this.projectService.closeLog(); + this.projectService.log("Exiting..."); + process.exit(0); + }); + } + } + + // This places log file in the directory containing editorServices.js + // TODO: check that this location is writable + var logger = new Logger(__dirname + "/.log" + process.pid.toString()); + + var host: ServerHost = ts.sys; + + // Wire the debugging interface + if (!host.getDebuggerClient) { + host.getDebuggerClient = () => new nodeproto.Client(); + } + + // Start listening + new IOSession(host, logger, /* useProtocol */ true, /* prettyJSON */ false).listen(); +} \ No newline at end of file From 7b28f20affdc7e59e5990299c857e7a7aa33b471 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 19:43:10 -0800 Subject: [PATCH 039/106] Wire the build for the server code --- Jakefile | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Jakefile b/Jakefile index b9406f1a433..acd81b0ccd5 100644 --- a/Jakefile +++ b/Jakefile @@ -8,6 +8,7 @@ var child_process = require("child_process"); // Variables var compilerDirectory = "src/compiler/"; var servicesDirectory = "src/services/"; +var serverDirectory = "src/server/"; var harnessDirectory = "src/harness/"; var libraryDirectory = "src/lib/"; var scriptsDirectory = "scripts/"; @@ -90,6 +91,15 @@ var servicesSources = [ return path.join(servicesDirectory, f); })); +var serverSources = [ + "node.d.ts", + "editorServices.ts", + "protocol.ts", + "server.ts" +].map(function (f) { + return path.join(serverDirectory, f); +}); + var definitionsRoots = [ "compiler/types.d.ts", "compiler/scanner.d.ts", @@ -130,6 +140,12 @@ var harnessSources = [ "services/preProcessFile.ts" ].map(function (f) { return path.join(unittestsDirectory, f); +})).concat([ + "protocol.ts", + "client.ts", + "editorServices.ts", +].map(function (f) { + return path.join(serverDirectory, f); })); var librarySourceMap = [ @@ -382,9 +398,12 @@ compileFile(nodeDefinitionsFile, servicesSources,[builtLocalDirectory, copyright jake.rmRf(tempDirPath, {silent: true}); }); +var serverFile = path.join(builtLocalDirectory, "typescriptServer.js"); +compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true); + // Local target to build the compiler and services desc("Builds the full compiler and services"); -task("local", ["generate-diagnostics", "lib", tscFile, servicesFile, nodeDefinitionsFile]); +task("local", ["generate-diagnostics", "lib", tscFile, servicesFile, nodeDefinitionsFile, serverFile]); // Local target to build only tsc.js desc("Builds only the compiler"); From abec4f97988f4bf02bda0c422566bedd3a2f4dea Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 19:43:30 -0800 Subject: [PATCH 040/106] Wire tests to use the new server --- src/harness/fourslash.ts | 2 + src/harness/fourslashRunner.ts | 7 ++- src/harness/harness.ts | 7 +-- src/harness/harnessLanguageService.ts | 68 ++++++++++++++++++--------- src/harness/runner.ts | 4 ++ 5 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 603a78b5f75..9c61c3b1e27 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -282,6 +282,8 @@ module FourSlash { return new Harness.LanguageService.NativeLanugageServiceAdapter(cancellationToken, compilationOptions); case FourSlashTestType.Shims: return new Harness.LanguageService.ShimLanugageServiceAdapter(cancellationToken, compilationOptions); + case FourSlashTestType.Server: + return new Harness.LanguageService.ServerLanugageServiceAdapter(cancellationToken, compilationOptions); default: throw new Error("Unknown FourSlash test type: "); } diff --git a/src/harness/fourslashRunner.ts b/src/harness/fourslashRunner.ts index fe3b6c7a91f..1ab6e31cdbb 100644 --- a/src/harness/fourslashRunner.ts +++ b/src/harness/fourslashRunner.ts @@ -4,7 +4,8 @@ const enum FourSlashTestType { Native, - Shims + Shims, + Server } class FourSlashRunner extends RunnerBase { @@ -22,6 +23,10 @@ class FourSlashRunner extends RunnerBase { this.basePath = 'tests/cases/fourslash/shims'; this.testSuiteName = 'fourslash-shims'; break; + case FourSlashTestType.Server: + this.basePath = 'tests/cases/fourslash/server'; + this.testSuiteName = 'fourslash-server'; + break; } } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 534bf85d119..cbc4064119a 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -16,14 +16,15 @@ /// /// +/// +/// +/// /// /// /// /// -declare var require: any; -declare var process: any; -var Buffer = require('buffer').Buffer; +var Buffer: BufferConstructor = require('buffer').Buffer; // this will work in the browser via browserify var _chai: typeof chai = require('chai'); diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 2f95f5072d0..eb0daf74dcf 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -1,5 +1,6 @@ /// /// +/// /// module Harness.LanguageService { @@ -23,18 +24,18 @@ module Harness.LanguageService { this.version++; } - public editContent(minChar: number, limChar: number, newText: string): void { + public editContent(start: number, end: number, newText: string): void { // Apply edits - var prefix = this.content.substring(0, minChar); + var prefix = this.content.substring(0, start); var middle = newText; - var suffix = this.content.substring(limChar); + var suffix = this.content.substring(end); this.setContent(prefix + middle + suffix); // Store edit range + new length of script this.editRanges.push({ length: this.content.length, textChangeRange: ts.createTextChangeRange( - ts.createTextSpanFromBounds(minChar, limChar), newText.length) + ts.createTextSpanFromBounds(start, end), newText.length) }); // Update version # @@ -127,9 +128,7 @@ module Harness.LanguageService { protected settings = ts.getDefaultCompilerOptions()) { } - public getNewLine(): string { - return "\r\n"; - } + public getNewLine(): string { return "\r\n"; } public getFilenames(): string[] { var fileNames: string[] = []; @@ -145,20 +144,10 @@ module Harness.LanguageService { this.fileNameToScript[fileName] = new ScriptInfo(fileName, content); } - public updateScript(fileName: string, content: string) { + public editScript(fileName: string, start: number, end: number, newText: string) { var script = this.getScriptInfo(fileName); if (script !== null) { - script.updateContent(content); - return; - } - - this.addScript(fileName, content); - } - - public editScript(fileName: string, minChar: number, limChar: number, newText: string) { - var script = this.getScriptInfo(fileName); - if (script !== null) { - script.editContent(minChar, limChar, newText); + script.editContent(start, end, newText); return; } @@ -236,8 +225,7 @@ module Harness.LanguageService { getFilenames(): string[] { return this.nativeHost.getFilenames(); } getScriptInfo(fileName: string): ScriptInfo { return this.nativeHost.getScriptInfo(fileName); } addScript(fileName: string, content: string): void { this.nativeHost.addScript(fileName, content); } - updateScript(fileName: string, content: string): void { return this.nativeHost.updateScript(fileName, content); } - editScript(fileName: string, minChar: number, limChar: number, newText: string): void { this.nativeHost.editScript(fileName, minChar, limChar, newText); } + editScript(fileName: string, start: number, end: number, newText: string): void { this.nativeHost.editScript(fileName, start, end, newText); } lineColToPosition(fileName: string, line: number, col: number): number { return this.nativeHost.lineColToPosition(fileName, line, col); } positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { return this.nativeHost.positionToZeroBasedLineCol(fileName, position); } @@ -442,5 +430,43 @@ module Harness.LanguageService { return convertResult; } } + + // Server adapter + class ServerLanguageServiceHost extends NativeLanguageServiceHost { + private client: ts.server.SessionClient; + constructor(cancellationToken: ts.CancellationToken, settings: ts.CompilerOptions) { + super(cancellationToken, settings); + } + + setClient(client: ts.server.SessionClient) { + this.client = client; + } + + addScript(fileName: string, content: string): void { + super.addScript(fileName, content); + this.client.openFile(fileName); + } + + editScript(fileName: string, start: number, end: number, newText: string) { + super.editScript(fileName, start, end, newText); + this.client.changeFile(fileName, start, end, newText); + } + } + + export class ServerLanugageServiceAdapter implements LanguageServiceAdapter { + private host: ServerLanguageServiceHost; + private client: ts.server.SessionClient; + constructor(cancellationToken?: ts.CancellationToken, options?: ts.CompilerOptions) { + debugger; + + this.host = new ServerLanguageServiceHost(cancellationToken, options); + this.client = new ts.server.SessionClient(this.host); + this.host.setClient(this.client); + } + getHost() { return this.host; } + getLanguageService(): ts.LanguageService { return this.client; } + getClassifier(): ts.Classifier { throw new Error("getClassifier is not available using the server interface."); } + getPreProcessedFileInfo(fileName: string, fileContents: string): ts.PreProcessedFileInfo { throw new Error("getPreProcessedFileInfo is not available using the server interface."); } + } } \ No newline at end of file diff --git a/src/harness/runner.ts b/src/harness/runner.ts index 942ae56bf6f..e1e5429b007 100644 --- a/src/harness/runner.ts +++ b/src/harness/runner.ts @@ -66,6 +66,9 @@ if (testConfigFile !== '') { case 'fourslash-shims': runners.push(new FourSlashRunner(FourSlashTestType.Shims)); break; + case 'fourslash-server': + runners.push(new FourSlashRunner(FourSlashTestType.Server)); + break; case 'fourslash-generated': runners.push(new GeneratedFourslashRunner(FourSlashTestType.Native)); break; @@ -95,6 +98,7 @@ if (runners.length === 0) { // language services runners.push(new FourSlashRunner(FourSlashTestType.Native)); runners.push(new FourSlashRunner(FourSlashTestType.Shims)); + runners.push(new FourSlashRunner(FourSlashTestType.Server)); //runners.push(new GeneratedFourslashRunner()); } From 54f3250cdd6eeed608dcdcec4ed9e9cd792f7140 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 19:48:32 -0800 Subject: [PATCH 041/106] Add fomratting tests --- tests/cases/fourslash/server/format.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/cases/fourslash/server/format.ts diff --git a/tests/cases/fourslash/server/format.ts b/tests/cases/fourslash/server/format.ts new file mode 100644 index 00000000000..75d06eef0c2 --- /dev/null +++ b/tests/cases/fourslash/server/format.ts @@ -0,0 +1,8 @@ +/// + +/////**/module Default{var x= ( { } ) ;} + + +format.document(); +goTo.marker(); +verify.currentLineContentIs('module Default { var x = ({}); }'); \ No newline at end of file From 096364408959e57cb553de5bcaca56b6fa520f0e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 11 Feb 2015 19:49:36 -0800 Subject: [PATCH 042/106] Add type annotations --- src/server/client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index 1fb93329e03..cf169c6e4cf 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -35,8 +35,8 @@ module ts.server { getCurrentDirectory: () => host.getCurrentDirectory(), readDirectory: (path: string, extension?: string) => [], - getModififedTime: (fileName) => new Date(), - stat: (path, callback) => { throw new Error("Not implemented Yet."); }, + getModififedTime: (fileName: string) => new Date(), + stat: (path: string, callback?: (err: any, stats: any) => any) => { throw new Error("Not implemented Yet."); }, }, { close: () => { }, info: (m) => this.host.log(m), From ee3ee05cc430e64b4834266423025bccb82eb084 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 08:20:41 -0800 Subject: [PATCH 043/106] wire package.json command for the server --- bin/tsserver | 2 ++ package.json | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 bin/tsserver diff --git a/bin/tsserver b/bin/tsserver new file mode 100644 index 00000000000..2327c344c44 --- /dev/null +++ b/bin/tsserver @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('./typescriptServer.js') diff --git a/package.json b/package.json index 94b5435be19..9261174b68f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "preferGlobal": true, "main": "./bin/typescript.js", "bin": { - "tsc": "./bin/tsc" + "tsc": "./bin/tsc", + "tsserver": "./bin/tsserver" }, "engines": { "node": ">=0.8.0" From 07d37fa7fb8d773160e78e1b5fe4268919217b61 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 10:31:41 -0800 Subject: [PATCH 044/106] Simplify host logic in client --- src/server/client.ts | 149 ++++++++++++++++++++++++++++++------------- 1 file changed, 105 insertions(+), 44 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index cf169c6e4cf..6456ab9aa08 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -2,59 +2,121 @@ module ts.server { - export interface SessionClientHost extends LanguageServiceHost { + export interface SessionClientHost extends LanguageServiceHost { lineColToPosition(fileName: string, line: number, col: number): number; positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter; } - export class SessionClient implements LanguageService { - private session: Session; - private sequence: number; - private lastReply: string; + class SessionClientHostProxy implements ServerHost, Logger { + args: string[] = []; + newLine: string; + useCaseSensitiveFileNames: boolean = false; + lastReply: string; constructor(private host: SessionClientHost) { - this.sequence = 0; - - this.session = new Session({ - args: [], - newLine: host.getNewLine(), - useCaseSensitiveFileNames: true, - write: (s) => this.lastReply = s, - readFile: (fileName): string => { - var snapshot = host.getScriptSnapshot(fileName); - return snapshot && snapshot.getText(0, snapshot.getLength()); - }, - writeFile: (name, text, writeByteOrderMark) => { - }, - resolvePath: (path) => path, - fileExists: (path) => !!host.getScriptSnapshot(path), - directoryExists: (path) => false, - getExecutingFilePath: () => "", - exit: (exitCode) => { }, - createDirectory: (directoryName: string) => { }, + this.newLine = this.host.getNewLine(); + } - getCurrentDirectory: () => host.getCurrentDirectory(), - readDirectory: (path: string, extension?: string) => [], - getModififedTime: (fileName: string) => new Date(), - stat: (path: string, callback?: (err: any, stats: any) => any) => { throw new Error("Not implemented Yet."); }, - }, { - close: () => { }, - info: (m) => this.host.log(m), - msg: (m) => this.host.log(m), - endGroup: () => { }, - perftrc: (m) => this.host.log(m), - startGroup: () => { } - }, /* useProtocol */ true, /*prettyJSON*/ true); + write(message: string): void { + this.lastReply = message; + } + + readFile(fileName: string): string { + var snapshot = this.host.getScriptSnapshot(fileName); + return snapshot && snapshot.getText(0, snapshot.getLength()); + } + + writeFile(name: string, text:string, writeByteOrderMark: boolean): void { + } + + resolvePath(path: string): string { + return path; + } + + fileExists(path: string): boolean { + return !!this.host.getScriptSnapshot(path); + } + + directoryExists(path: string): boolean { + return false; + } + + getExecutingFilePath(): string { + return ""; + } + + exit(exitCode: number): void { + } + + createDirectory(directoryName: string): void { + throw new Error("Not Implemented Yet."); + } + + getCurrentDirectory(): string { + return this.host.getCurrentDirectory(); + } + + readDirectory(path: string, extension?: string): string[] { + throw new Error("Not implemented Yet."); + } + + getModififedTime(fileName: string): Date { + return new Date(); + } + + stat(path: string, callback?: (err: any, stats: any) => any) { + throw new Error("Not implemented Yet."); + } + + lineColToPosition(fileName: string, line: number, col: number): number { + return this.host.lineColToPosition(fileName, line, col); + } + + positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { + return this.host.positionToZeroBasedLineCol(fileName, position); + } + + getFileLength(fileName: string): number { + return this.host.getScriptSnapshot(fileName).getLength(); + } + + close(): void { + } + + info(message: string): void { + return this.host.log(message); + } + + msg(message: string) { + return this.host.log(message); + } + + endGroup(): void { + } + + perftrc(message: string): void { + return this.host.log(message); + } + + startGroup(): void { + } + } + + export class SessionClient implements LanguageService { + private session: Session; + private sequence: number = 0; + private host: SessionClientHostProxy; + + constructor(host: SessionClientHost) { + this.sequence = 0; + this.host = new SessionClientHostProxy(host); + this.session = new Session(this.host, this.host, /* useProtocol */ true, /*prettyJSON*/ true); } private lineColToPosition(fileName: string, lineCol: ServerProtocol.LineCol): number { return this.host.lineColToPosition(fileName, lineCol.line, lineCol.col); } - private getFileLength(fileName: string): number { - return this.host.getScriptSnapshot(fileName).getLength(); - } - private positionToOneBasedLineCol(fileName: string, position: number): ServerProtocol.LineCol { var lineCol = this.host.positionToZeroBasedLineCol(fileName, position); return { @@ -103,7 +165,7 @@ module ts.server { // Read the content length var contentLengthPrefix = "Content-Length: "; - var lines = this.lastReply.split("\r\n"); + var lines = this.host.lastReply.split("\r\n"); Debug.assert(lines.length >= 2, "Malformed response: Expected 3 lines in the response."); var contentLengthText = lines[0]; @@ -120,7 +182,7 @@ module ts.server { var response: T = JSON.parse(responseBody); } catch (e) { - throw new Error("Malformed response: Failed to parse server response: " + this.lastReply + ". \r\n Error detailes: " + e.message); + throw new Error("Malformed response: Failed to parse server response: " + this.host.lastReply + ". \r\n Error detailes: " + e.message); } // verify the sequence numbers @@ -239,7 +301,7 @@ module ts.server { } getFormattingEditsForDocument(fileName: string, options: ts.FormatCodeOptions): ts.TextChange[] { - return this.getFormattingEditsForRange(fileName, 0, this.getFileLength(fileName), options); + return this.getFormattingEditsForRange(fileName, 0, this.host.getFileLength(fileName), options); } getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): ts.TextChange[] { @@ -372,7 +434,6 @@ module ts.server { throw new Error("Not Implemented Yet."); } - getProgram(): Program { throw new Error("SourceFile objects are not serializable through the server protocol."); } From 6e94f39397350bb8215b07ad1afba1fa397b5b85 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 10:34:57 -0800 Subject: [PATCH 045/106] Remove redundant type definitions --- src/server/protocol.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/server/protocol.ts b/src/server/protocol.ts index abbce0b3588..bd05cfbd533 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -9,11 +9,6 @@ module ts { displayString?: string; docString?: string; } - - export interface System { - getModififedTime? (fileName: string): Date; - stat? (path: string, callback?: (err: any, stats: any) => any): void; - } } module ts.server { From 4a44b7437a4c4c9f328b9396efb0703753dcc0af Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 11:53:13 -0800 Subject: [PATCH 046/106] Supportt abbreviation --- src/harness/harnessLanguageService.ts | 2 +- src/server/client.ts | 87 ++++++++++++++++++++++++--- src/server/protocol.ts | 4 ++ 3 files changed, 84 insertions(+), 9 deletions(-) diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index eb0daf74dcf..2c0d2549c8e 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -460,7 +460,7 @@ module Harness.LanguageService { debugger; this.host = new ServerLanguageServiceHost(cancellationToken, options); - this.client = new ts.server.SessionClient(this.host); + this.client = new ts.server.SessionClient(this.host, /*abbreviate*/ true); this.host.setClient(this.client); } getHost() { return this.host; } diff --git a/src/server/client.ts b/src/server/client.ts index 6456ab9aa08..908562e589b 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -106,11 +106,53 @@ module ts.server { private session: Session; private sequence: number = 0; private host: SessionClientHostProxy; + private expantionTable: ts.Map; - constructor(host: SessionClientHost) { + constructor(host: SessionClientHost, abbreviate: boolean) { this.sequence = 0; this.host = new SessionClientHostProxy(host); - this.session = new Session(this.host, this.host, /* useProtocol */ true, /*prettyJSON*/ true); + this.session = new Session(this.host, this.host, /* useProtocol */ true, /*prettyJSON*/ false); + + // Setup the abbreviation table + if (abbreviate) { + this.setupExpantionTable() + } + } + + private setupExpantionTable(): void { + var request = this.processRequest("abbrev"); + var response = this.processResponse(request); + var abbriviationTable = response.body; + + Debug.assert(!!abbriviationTable, "Could not setup abbreviation. Abbreviation table was empty."); + + var expantionTable: ts.Map = {}; + for (var p in abbriviationTable) { + if (abbriviationTable.hasOwnProperty(p)) { + expantionTable[abbriviationTable[p]] = p; + } + } + this.expantionTable = expantionTable; + } + + private expand(obj: T): T { + for (var p in obj) { + if (obj.hasOwnProperty(p)) { + if (typeof (obj)[p] === "object") { + // Expand the property value + (obj)[p] = this.expand((obj)[p]); + } + + // Substitute the name if applicaple + var substitution = ts.lookUp(this.expantionTable, p); + if (substitution) { + (obj)[substitution] = (obj)[p]; + (obj)[p] = undefined; + } + } + } + + return obj; } private lineColToPosition(fileName: string, lineCol: ServerProtocol.LineCol): number { @@ -135,6 +177,23 @@ module ts.server { }; } + private getFileNameFromEncodedFile(fileId: ServerProtocol.EncodedFile, fileMapping: ts.Map): string { + var fileName: string; + if (typeof fileId === "object") { + fileName = (fileId).file; + fileMapping[(fileId).id] = fileName; + } + else if (typeof fileId === "number") { + fileName = ts.lookUp(fileMapping, fileId.toString()); + Debug.assert(!!fileName, "Did not find filename in previous fileID mappings."); + } + else { + Debug.fail("Got unexpedted fileId type."); + } + return fileName; + } + + private processRequest(command: "abbrev"): ServerProtocol.AbbrevRequest; private processRequest(command: "open", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.OpenRequest; private processRequest(command: "close", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.CloseRequest; private processRequest(command: "change", arguments: ServerProtocol.ChangeRequestArgs): ServerProtocol.ChangeRequest; @@ -146,7 +205,7 @@ module ts.server { private processRequest(command: "completions", arguments: ServerProtocol.CompletionsRequestArgs): ServerProtocol.CompletionsRequest; private processRequest(command: "navto", arguments: ServerProtocol.NavtoRequestArgs): ServerProtocol.NavtoRequest; private processRequest(command: "saveto", arguments: ServerProtocol.SavetoRequestArgs): ServerProtocol.SavetoRequest; - private processRequest(command: string, arguments: any): ServerProtocol.Request; + private processRequest(command: string, arguments?: any): ServerProtocol.Request; private processRequest(command: string, arguments: any): ServerProtocol.Request { var request: ServerProtocol.Request = { seq: this.sequence++, @@ -163,9 +222,13 @@ module ts.server { private processResponse(request: ServerProtocol.Request): T { debugger; + var lastMessage = this.host.lastReply; + this.host.lastReply = undefined; + Debug.assert(!!lastMessage, "Did not recieve any responses."); + // Read the content length var contentLengthPrefix = "Content-Length: "; - var lines = this.host.lastReply.split("\r\n"); + var lines = lastMessage.split("\r\n"); Debug.assert(lines.length >= 2, "Malformed response: Expected 3 lines in the response."); var contentLengthText = lines[0]; @@ -182,7 +245,7 @@ module ts.server { var response: T = JSON.parse(responseBody); } catch (e) { - throw new Error("Malformed response: Failed to parse server response: " + this.host.lastReply + ". \r\n Error detailes: " + e.message); + throw new Error("Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error detailes: " + e.message); } // verify the sequence numbers @@ -195,9 +258,13 @@ module ts.server { Debug.assert(!!response.body, "Malformed response: Unexpected empty response body."); + if (this.expantionTable) { + // Expand the response if abbreviated + return this.expand(response); + } return response; } - + openFile(fileName: string): void { this.processRequest("open", { file: fileName @@ -265,11 +332,15 @@ module ts.server { getNavigateToItems(seatchTerm: string): NavigateToItem[] { var request = this.processRequest("navto", { seatchTerm }); - + var response = this.processResponse(request); + var fileMapping: ts.Map = {}; + return response.body.map(entry => { + var fileName = this.getFileNameFromEncodedFile(entry.file, fileMapping); var start = this.lineColToPosition(entry.file.toString(), entry.start); var end = this.lineColToPosition(entry.file.toString(), entry.end); + return { name: entry.name, containerName: entry.containerName, @@ -277,7 +348,7 @@ module ts.server { kind: entry.kind, kindModifiers: entry.kindModifiers, matchKind: entry.matchKind, - fileName: entry.file.toString(), + fileName: fileName, textSpan: ts.createTextSpanFromBounds(start, end) }; }); diff --git a/src/server/protocol.ts b/src/server/protocol.ts index bd05cfbd533..7c27eec02dd 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -1136,6 +1136,10 @@ module ts.server { this.navto(navtoArgs.searchTerm, navtoArgs.file, cmd, req.seq); break; } + case CommandNames.Abbrev: { + this.sendAbbrev(); + break; + } default: { this.projectService.log("Unrecognized JSON command: " + cmd); break; From c987ab93f0fb0c46daa183bc2eadb841683aedbb Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 12:52:26 -0800 Subject: [PATCH 047/106] Wire navto tests --- src/server/client.ts | 29 +++++++++++++++++---------- src/server/protocol.ts | 3 +++ tests/cases/fourslash/server/navto.ts | 28 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 tests/cases/fourslash/server/navto.ts diff --git a/src/server/client.ts b/src/server/client.ts index 908562e589b..f637a9f1269 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -80,6 +80,10 @@ module ts.server { return this.host.getScriptSnapshot(fileName).getLength(); } + getFileNames(): string[] { + return this.host.getScriptFileNames(); + } + close(): void { } @@ -107,6 +111,7 @@ module ts.server { private sequence: number = 0; private host: SessionClientHostProxy; private expantionTable: ts.Map; + private fileMapping: ts.Map = {}; constructor(host: SessionClientHost, abbreviate: boolean) { this.sequence = 0; @@ -177,14 +182,14 @@ module ts.server { }; } - private getFileNameFromEncodedFile(fileId: ServerProtocol.EncodedFile, fileMapping: ts.Map): string { + private getFileNameFromEncodedFile(fileId: ServerProtocol.EncodedFile): string { var fileName: string; if (typeof fileId === "object") { fileName = (fileId).file; - fileMapping[(fileId).id] = fileName; + this.fileMapping[(fileId).id] = fileName; } else if (typeof fileId === "number") { - fileName = ts.lookUp(fileMapping, fileId.toString()); + fileName = ts.lookUp(this.fileMapping, fileId.toString()); Debug.assert(!!fileName, "Did not find filename in previous fileID mappings."); } else { @@ -330,21 +335,23 @@ module ts.server { }; } - getNavigateToItems(seatchTerm: string): NavigateToItem[] { - var request = this.processRequest("navto", { seatchTerm }); + getNavigateToItems(searchTerm: string): NavigateToItem[] { + var request = this.processRequest("navto", { + searchTerm, + file: this.host.getFileNames()[0] + }); var response = this.processResponse(request); - var fileMapping: ts.Map = {}; return response.body.map(entry => { - var fileName = this.getFileNameFromEncodedFile(entry.file, fileMapping); - var start = this.lineColToPosition(entry.file.toString(), entry.start); - var end = this.lineColToPosition(entry.file.toString(), entry.end); + var fileName = this.getFileNameFromEncodedFile(entry.file); + var start = this.lineColToPosition(fileName, entry.start); + var end = this.lineColToPosition(fileName, entry.end); return { name: entry.name, - containerName: entry.containerName, - containerKind: entry.containerKind, + containerName: entry.containerName || "", + containerKind: entry.containerKind || "", kind: entry.kind, kindModifiers: entry.kindModifiers, matchKind: entry.matchKind, diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 7c27eec02dd..b4ffddd25ed 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -1051,6 +1051,9 @@ module ts.server { this.output(undefined, CommandNames.Navto, reqSeq, "no nav items"); } } + else { + this.output(undefined, CommandNames.Navto, reqSeq, "no nav items"); + } } executeJSONcmd(cmd: string) { diff --git a/tests/cases/fourslash/server/navto.ts b/tests/cases/fourslash/server/navto.ts new file mode 100644 index 00000000000..8dc42a2365e --- /dev/null +++ b/tests/cases/fourslash/server/navto.ts @@ -0,0 +1,28 @@ +/// + +/////// Module +////{| "itemName": "Shapes", "kind": "module", "parentName": "", "matchKind": "substring" |}module Shapes { +//// +//// // Class +//// {| "itemName": "Point", "kind": "class", "parentName": "Shapes", "matchKind": "substring" |}export class Point { +//// // Instance member +//// {| "itemName": "originPointAttheHorizon", "kind": "property", "parentName": "Point", "matchKind": "substring"|}private originPointAttheHorizon = 0.0; +//// +//// // Getter +//// {| "itemName": "distanceFromOrigin", "kind": "getter", "parentName": "Point", "matchKind": "substring" |}get distanceFromOrigin(): number { return 0; } +//// +//// } +////} +//// +////// Local variables +////{| "itemName": "myPointThatIJustInitiated", "kind": "var", "parentName": "", "matchKind": "substring"|}var myPointThatIJustInitiated = new Shapes.Point(); + +//// Testing for substring matching of navigationItems +//var searchValue = "FromOrigin horizon INITIATED Shape Point"; + +test.markers().forEach((marker) => { + if (marker.data) { + var name = marker.data.itemName; + verify.navigationItemsListContains(name, marker.data.kind, name.substr(1), marker.data.matchKind, marker.fileName, marker.data.parentName); + } +}); \ No newline at end of file From 3e86e557d5d5f7db630bdae52de6adfa6dd2dcbd Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 13:10:55 -0800 Subject: [PATCH 048/106] Use commmandNames module --- src/server/client.ts | 81 +++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index f637a9f1269..60fbd31243e 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -125,7 +125,7 @@ module ts.server { } private setupExpantionTable(): void { - var request = this.processRequest("abbrev"); + var request = this.processRequest(CommandNames.Abbrev); var response = this.processResponse(request); var abbriviationTable = response.body; @@ -198,20 +198,7 @@ module ts.server { return fileName; } - private processRequest(command: "abbrev"): ServerProtocol.AbbrevRequest; - private processRequest(command: "open", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.OpenRequest; - private processRequest(command: "close", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.CloseRequest; - private processRequest(command: "change", arguments: ServerProtocol.ChangeRequestArgs): ServerProtocol.ChangeRequest; - private processRequest(command: "quickinfo", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.QuickInfoRequest; - private processRequest(command: "format", arguments: ServerProtocol.FormatRequestArgs): ServerProtocol.FormatRequest; - private processRequest(command: "formatonkey", arguments: ServerProtocol.FormatOnKeyRequestArgs): ServerProtocol.FormatRequest; - private processRequest(command: "definition", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.DefinitionRequest; - private processRequest(command: "references", arguments: ServerProtocol.FileRequestArgs): ServerProtocol.ReferencesRequest; - private processRequest(command: "completions", arguments: ServerProtocol.CompletionsRequestArgs): ServerProtocol.CompletionsRequest; - private processRequest(command: "navto", arguments: ServerProtocol.NavtoRequestArgs): ServerProtocol.NavtoRequest; - private processRequest(command: "saveto", arguments: ServerProtocol.SavetoRequestArgs): ServerProtocol.SavetoRequest; - private processRequest(command: string, arguments?: any): ServerProtocol.Request; - private processRequest(command: string, arguments: any): ServerProtocol.Request { + private processRequest(command: string, arguments?: any): T { var request: ServerProtocol.Request = { seq: this.sequence++, type: "request", @@ -221,7 +208,7 @@ module ts.server { this.session.executeJSONcmd(JSON.stringify(request)); - return request; + return request; } private processResponse(request: ServerProtocol.Request): T { @@ -271,37 +258,37 @@ module ts.server { } openFile(fileName: string): void { - this.processRequest("open", { - file: fileName - }); + var args: ServerProtocol.FileRequestArgs = { file: fileName }; + this.processRequest(CommandNames.Open, args); } closeFile(fileName: string): void { - this.processRequest("close", { - file: fileName - }); + var args: ServerProtocol.FileRequestArgs = { file: fileName }; + this.processRequest(CommandNames.Close, args); } changeFile(fileName: string, start: number, end: number, newText: string): void { var lineCol = this.positionToOneBasedLineCol(fileName, start); - - this.processRequest("change", { + var args: ServerProtocol.ChangeRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, insertLen: end - start, deleteLen: end - start, insertString: newText - }); + }; + + this.processRequest(CommandNames.Change, args); } getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { - var request = this.processRequest("quickinfo", { + var args: ServerProtocol.CodeLocationRequestArgs = { file: fileName, line: 0, col: 1 - }); + }; + var request = this.processRequest(CommandNames.Quickinfo, args); var response = this.processResponse(request); var start = this.lineColToPosition(fileName, response.body.start); @@ -320,12 +307,13 @@ module ts.server { getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var request = this.processRequest("completions", { + var args: ServerProtocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, - }); + }; + var request = this.processRequest(CommandNames.Completions, args); var response = this.processResponse(request); return { @@ -336,11 +324,12 @@ module ts.server { } getNavigateToItems(searchTerm: string): NavigateToItem[] { - var request = this.processRequest("navto", { - searchTerm, + var args: ServerProtocol.NavtoRequestArgs = { + searchTerm, file: this.host.getFileNames()[0] - }); - + }; + + var request = this.processRequest(CommandNames.Navto, args); var response = this.processResponse(request); return response.body.map(entry => { @@ -364,15 +353,16 @@ module ts.server { getFormattingEditsForRange(fileName: string, start: number, end: number, options: ts.FormatCodeOptions): ts.TextChange[] { var startLineCol = this.positionToOneBasedLineCol(fileName, start); var endLineCol = this.positionToOneBasedLineCol(fileName, end); - // TODO: handle FormatCodeOptions - var request = this.processRequest("format", { + var args: ServerProtocol.FormatRequestArgs = { file: fileName, line: startLineCol.line, col: startLineCol.col, endLine: endLineCol.line, endCol: endLineCol.col, - }); + }; + // TODO: handle FormatCodeOptions + var request = this.processRequest(CommandNames.Format, args); var response = this.processResponse(request); return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); @@ -384,27 +374,31 @@ module ts.server { getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): ts.TextChange[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - // TODO: handle FormatCodeOptions - var request = this.processRequest("formatonkey", { + var args: ServerProtocol.FormatOnKeyRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, key: key - }); + }; + // TODO: handle FormatCodeOptions + var request = this.processRequest(CommandNames.Formatonkey, args); var response = this.processResponse(request); + return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); } getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var request = this.processRequest("definition", { + var args: ServerProtocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, - }); + }; + var request = this.processRequest(CommandNames.Definition, args); var response = this.processResponse(request); + return response.body.map(entry => { var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); @@ -421,12 +415,13 @@ module ts.server { getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var request = this.processRequest("references", { + var args: ServerProtocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, - }); + }; + var request = this.processRequest(CommandNames.References, args); var response = this.processResponse(request); return response.body.refs.map(entry => { From c0b12540726bb5955c80a989fb3d47d82f65723f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 13:35:11 -0800 Subject: [PATCH 049/106] Support brace matching --- src/server/client.ts | 19 +++++++++++- src/server/protocol.ts | 40 ++++++++++++++++++++++++- src/server/protodef.d.ts | 28 +++++++++++++++-- tests/cases/fourslash/server/brace.ts | 43 +++++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/server/brace.ts diff --git a/src/server/client.ts b/src/server/client.ts index 60fbd31243e..07b5d81d8c0 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -488,7 +488,24 @@ module ts.server { } getBraceMatchingAtPosition(fileName: string, position: number): TextSpan[] { - throw new Error("Not Implemented Yet."); + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var args: ServerProtocol.CodeLocationRequestArgs = { + file: fileName, + line: lineCol.line, + col: lineCol.col, + }; + + var request = this.processRequest(CommandNames.Brace, args); + var response = this.processResponse(request); + + return response.body.map(entry => { + var start = this.lineColToPosition(fileName, entry.start); + var end = this.lineColToPosition(fileName, entry.end); + return { + start: start, + length: end - start, + }; + }); } getIndentationAtPosition(fileName: string, position: number, options: EditorOptions): number { diff --git a/src/server/protocol.ts b/src/server/protocol.ts index b4ffddd25ed..6187d8e6140 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -333,7 +333,7 @@ module ts.server { return true; } - module CommandNames { + export module CommandNames { export var Abbrev = "abbrev"; export var Change = "change"; export var Close = "close"; @@ -350,6 +350,7 @@ module ts.server { export var Rename = "rename"; export var Saveto = "saveto"; export var Type = "type"; + export var Brace = "brace"; export var Unknown = "unknown"; } @@ -1056,6 +1057,38 @@ module ts.server { } } + getMatchingBrace(line: number, col: number, rawfile: string, reqSeq = 0) { + var file = ts.normalizePath(rawfile); + var project = this.projectService.getProjectForFile(file); + if (project) { + var compilerService = project.compilerService; + var pos = compilerService.host.lineColToPosition(file, line, col); + var spans: ts.TextSpan[]; + try { + spans = compilerService.languageService.getBraceMatchingAtPosition(file, pos); + } + catch (err) { + this.logError(err, CommandNames.Brace); + spans = undefined; + } + if (spans) { + var bakedSpans: ServerProtocol.TextSpan[] = spans.map(span => ({ + start: span && + compilerService.host.positionToLineCol(file, span.start), + end: span && + compilerService.host.positionToLineCol(file, span.start + span.length) + })); + this.output(bakedSpans, CommandNames.Brace, reqSeq); + } + else { + this.output(undefined, CommandNames.Brace, reqSeq, "no matching braces"); + } + } + else { + this.output(undefined, CommandNames.Brace, reqSeq, "no matching braces"); + } + } + executeJSONcmd(cmd: string) { try { var req = JSON.parse(cmd); @@ -1143,6 +1176,11 @@ module ts.server { this.sendAbbrev(); break; } + case CommandNames.Brace: { + var defArgs = req.arguments; + this.getMatchingBrace(defArgs.line, defArgs.col, defArgs.file, req.seq); + break; + } default: { this.projectService.log("Unrecognized JSON command: " + cmd); break; diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts index 75a41cb81ce..73c39404154 100644 --- a/src/server/protodef.d.ts +++ b/src/server/protodef.d.ts @@ -89,15 +89,22 @@ declare module ServerProtocol { Object found in response messages defining a span of text in source code. */ - export interface CodeSpan { - /** File containing the definition */ - file: string; + export interface TextSpan { /** First character of the definition */ start: LineCol; /** One character past last character of the definition */ end: LineCol; } + /** + Object found in response messages defining a span of text in + a specific source file. + */ + export interface CodeSpan extends TextSpan { + /** File containing the definition */ + file: string; + } + /** Definition response message. Gives text range for definition. */ @@ -582,6 +589,21 @@ declare module ServerProtocol { [fullString: string]: string; } } + + + /** Response to "brace" request. */ + export interface BraceResponse extends Response { + body?: TextSpan[]; + } + + /** + Brace matching request; value of command field is "brace". + Return response giving the code locations of matching braces + found in file at location line, col. + */ + export interface BraceRequest extends CodeLocationRequest { + } + } diff --git a/tests/cases/fourslash/server/brace.ts b/tests/cases/fourslash/server/brace.ts new file mode 100644 index 00000000000..fc8a71197db --- /dev/null +++ b/tests/cases/fourslash/server/brace.ts @@ -0,0 +1,43 @@ +/// + +//////curly braces +////module Foo [|{ +//// class Bar [|{ +//// private f() [|{ +//// }|] +//// +//// private f2() [|{ +//// if (true) [|{ }|] [|{ }|]; +//// }|] +//// }|] +////}|] +//// +//////parenthesis +////class FooBar { +//// private f[|()|] { +//// return [|([|(1 + 1)|])|]; +//// } +//// +//// private f2[|()|] { +//// if [|(true)|] { } +//// } +////} +//// +//////square brackets +////class Baz { +//// private f() { +//// var a: any[|[]|] = [|[[|[1, 2]|], [|[3, 4]|], 5]|]; +//// } +////} +//// +////// angular brackets +////class TemplateTest [||] { +//// public foo(a, b) { +//// return [||] a; +//// } +////} + +test.ranges().forEach((range) => { + verify.matchingBracePositionInCurrentFile(range.start, range.end - 1); + verify.matchingBracePositionInCurrentFile(range.end - 1, range.start); +}); \ No newline at end of file From 93aa3f161dd7ff23240124d2b8d2f917cf5d6783 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 13:35:24 -0800 Subject: [PATCH 050/106] Add test for format on key --- tests/cases/fourslash/server/formatonkey.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/cases/fourslash/server/formatonkey.ts diff --git a/tests/cases/fourslash/server/formatonkey.ts b/tests/cases/fourslash/server/formatonkey.ts new file mode 100644 index 00000000000..64cd74ca858 --- /dev/null +++ b/tests/cases/fourslash/server/formatonkey.ts @@ -0,0 +1,12 @@ +/// + +////switch (1) { +//// case 1: +//// { +//// /*1*/ +//// break; +////} + +goTo.marker("1"); +edit.insert("}"); +verify.currentLineContentIs(" }"); From 99373dbd89acf57f3c3a74f31421e82f092673c4 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 12 Feb 2015 16:31:08 -0800 Subject: [PATCH 051/106] Add test for goto def --- src/harness/fourslash.ts | 3 +++ src/harness/harnessLanguageService.ts | 7 +++++-- src/server/client.ts | 2 +- tests/cases/fourslash/definition.ts | 12 ++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/definition.ts diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 9c61c3b1e27..bc7a8718a76 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -420,6 +420,9 @@ module FourSlash { this.activeFile = fileToOpen; var fileName = fileToOpen.fileName.replace(Harness.IO.directoryName(fileToOpen.fileName), '').substr(1); this.scenarioActions.push(''); + + // Let the host know that this file is now open + this.languageServiceAdapterHost.openFile(fileToOpen.fileName); } public verifyErrorExistsBetweenMarkers(startMarkerName: string, endMarkerName: string, negative: boolean) { diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 2c0d2549c8e..39f59948cbc 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -154,6 +154,9 @@ module Harness.LanguageService { throw new Error("No script with name '" + fileName + "'"); } + public openFile(fileName: string): void { + } + /** * @param line 1 based index * @param col 1 based index @@ -442,8 +445,8 @@ module Harness.LanguageService { this.client = client; } - addScript(fileName: string, content: string): void { - super.addScript(fileName, content); + openFile(fileName: string): void { + super.openFile(fileName); this.client.openFile(fileName); } diff --git a/src/server/client.ts b/src/server/client.ts index 07b5d81d8c0..a93177adb3e 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -65,7 +65,7 @@ module ts.server { } stat(path: string, callback?: (err: any, stats: any) => any) { - throw new Error("Not implemented Yet."); + return 0; } lineColToPosition(fileName: string, line: number, col: number): number { diff --git a/tests/cases/fourslash/definition.ts b/tests/cases/fourslash/definition.ts new file mode 100644 index 00000000000..531e4562843 --- /dev/null +++ b/tests/cases/fourslash/definition.ts @@ -0,0 +1,12 @@ +/// + +// @Filename: b.ts +////import n = require('a/*1*/'); +////var x = new n.Foo(); + +// @Filename: a.ts +//// /*2*/export class Foo {} + +goTo.marker('1'); +goTo.definition(); +verify.caretAtMarker('2'); \ No newline at end of file From 4942c5f615cb675b3ced89c2c29c4f5eeff4b819 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 12 Feb 2015 16:18:01 -0800 Subject: [PATCH 052/106] Address feedback --- src/compiler/checker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 51cf38e5f41..6ba98ba2146 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2503,7 +2503,7 @@ module ts { } // For a type parameter, return the base constraint of the type parameter. For the string, number, - // boolean, and symbol primitive types, return the corresponding object types.Otherwise return the + // boolean, and symbol primitive types, return the corresponding object types. Otherwise return the // type itself. Note that the apparent type of a union type is the union type itself. function getApparentType(type: Type): Type { if (type.flags & TypeFlags.TypeParameter) { @@ -5538,7 +5538,7 @@ module ts { if (!links.resolvedType) { links.resolvedType = checkExpression(node.expression); - // This will allow types number, string, Symbol or any. It will also allow enums, the unknown + // This will allow types number, string, symbol or any. It will also allow enums, the unknown // type, and any union of these types (like string | number). if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); From a51ce92500acc2949f1ea9e69e79965a7f209612 Mon Sep 17 00:00:00 2001 From: Jason Ramsay Date: Fri, 13 Feb 2015 11:56:39 -0800 Subject: [PATCH 053/106] switch to using host.getDefaultLibFileName(options) --- src/services/services.ts | 22 +++++++--------------- src/services/shims.ts | 5 +---- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index ad6643faf3c..6f6d4b869a1 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5517,11 +5517,13 @@ module ts { var declarations = symbol.getDeclarations(); if (declarations && declarations.length > 0) { // Disallow rename for elements that are defined in the standard TypeScript library. - var defaultLibFile = getDefaultLibFileName(host.getCompilationSettings()); - for (var i = 0; i < declarations.length; i++) { - var sourceFile = declarations[i].getSourceFile(); - if (sourceFile && isDefaultLibFile(sourceFile.fileName, defaultLibFile)) { - return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library.key)); + var defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); + if (defaultLibFileName) { + for (var i = 0; i < declarations.length; i++) { + var sourceFile = declarations[i].getSourceFile(); + if (sourceFile && ts.normalizePath(sourceFile.fileName) === ts.normalizePath(defaultLibFileName)) { + return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library.key)); + } } } @@ -5543,16 +5545,6 @@ module ts { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_this_element.key)); - function isDefaultLibFile(fileName: string, defaultLibFile: string): boolean { - var hasValidPrefix = true; - var index = fileName.lastIndexOf(defaultLibFile); - if (index - 1 >= 0) { - var prefix = fileName[index - 1]; - hasValidPrefix = (prefix === "\\" || prefix === "/"); - } - return index >= 0 && hasValidPrefix && (index + defaultLibFile.length === fileName.length); - } - function getRenameInfoError(localizedErrorMessage: string): RenameInfo { return { canRename: false, diff --git a/src/services/shims.ts b/src/services/shims.ts index 0f9f1a12cd1..776fecf374e 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -274,10 +274,7 @@ module ts { } public getDefaultLibFileName(options: CompilerOptions): string { - // Shim the API changes for 1.5 release. This should be removed once - // TypeScript 1.5 has shipped. - return ""; - //return this.shimHost.getDefaultLibFileName(JSON.stringify(options)); + return this.shimHost.getDefaultLibFileName(JSON.stringify(options)); } } From a0b557e1e2d3c56f8c2ece643b7d77b2410a699e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 15:12:06 -0800 Subject: [PATCH 054/106] Recover from git corruption --- src/harness/harnessLanguageService.ts | 149 +++- src/server/client.ts | 294 ++---- src/server/editorServices.ts | 3 +- src/server/protocol.ts | 1190 +++++++------------------ src/server/protodef.d.ts | 56 +- src/server/server.ts | 76 +- 6 files changed, 601 insertions(+), 1167 deletions(-) diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 39f59948cbc..2e50ca59b97 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -128,7 +128,9 @@ module Harness.LanguageService { protected settings = ts.getDefaultCompilerOptions()) { } - public getNewLine(): string { return "\r\n"; } + public getNewLine(): string { + return "\r\n"; + } public getFilenames(): string[] { var fileNames: string[] = []; @@ -435,17 +437,26 @@ module Harness.LanguageService { } // Server adapter - class ServerLanguageServiceHost extends NativeLanguageServiceHost { + class SessionClientHost extends NativeLanguageServiceHost implements ts.server.SessionClientHost { private client: ts.server.SessionClient; + constructor(cancellationToken: ts.CancellationToken, settings: ts.CompilerOptions) { super(cancellationToken, settings); } - setClient(client: ts.server.SessionClient) { + onMessage(message: string): void { + + } + + writeMessage(message: string): void { + + } + + setClient(client: ts.server.SessionClient) { this.client = client; } - openFile(fileName: string): void { + openFile(fileName: string): void { super.openFile(fileName); this.client.openFile(fileName); } @@ -456,15 +467,135 @@ module Harness.LanguageService { } } + class SessionServerHost implements ts.server.ServerHost, ts.server.Logger { + args: string[] = []; + newLine: string; + useCaseSensitiveFileNames: boolean = false; + + constructor(private host: NativeLanguageServiceHost) { + this.newLine = this.host.getNewLine(); + } + + onMessage(message: string): void { + + } + + writeMessage(message: string): void { + } + + write(message: string): void { + this.writeMessage(message); + } + + readFile(fileName: string): string { + var snapshot = this.host.getScriptSnapshot(fileName); + return snapshot && snapshot.getText(0, snapshot.getLength()); + } + + writeFile(name: string, text: string, writeByteOrderMark: boolean): void { + } + + resolvePath(path: string): string { + return path; + } + + fileExists(path: string): boolean { + return !!this.host.getScriptSnapshot(path); + } + + directoryExists(path: string): boolean { + return false; + } + + getExecutingFilePath(): string { + return ""; + } + + exit(exitCode: number): void { + } + + createDirectory(directoryName: string): void { + throw new Error("Not Implemented Yet."); + } + + getCurrentDirectory(): string { + return this.host.getCurrentDirectory(); + } + + readDirectory(path: string, extension?: string): string[] { + throw new Error("Not implemented Yet."); + } + + getModififedTime(fileName: string): Date { + return new Date(); + } + + stat(path: string, callback?: (err: any, stats: any) => any) { + return 0; + } + + lineColToPosition(fileName: string, line: number, col: number): number { + return this.host.lineColToPosition(fileName, line, col); + } + + positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { + return this.host.positionToZeroBasedLineCol(fileName, position); + } + + getFileLength(fileName: string): number { + return this.host.getScriptSnapshot(fileName).getLength(); + } + + getFileNames(): string[] { + return this.host.getScriptFileNames(); + } + + close(): void { + } + + info(message: string): void { + return this.host.log(message); + } + + msg(message: string) { + return this.host.log(message); + } + + endGroup(): void { + } + + perftrc(message: string): void { + return this.host.log(message); + } + + startGroup(): void { + } + } + export class ServerLanugageServiceAdapter implements LanguageServiceAdapter { - private host: ServerLanguageServiceHost; + private host: SessionClientHost; private client: ts.server.SessionClient; constructor(cancellationToken?: ts.CancellationToken, options?: ts.CompilerOptions) { - debugger; + // This is the main host that tests use to direct tests + var clientHost = new SessionClientHost(cancellationToken, options); + var client = new ts.server.SessionClient(clientHost); - this.host = new ServerLanguageServiceHost(cancellationToken, options); - this.client = new ts.server.SessionClient(this.host, /*abbreviate*/ true); - this.host.setClient(this.client); + // This host is just a proxy for the clientHost, it uses the client + // host to answer server queries about files on disk + var serverHost = new SessionServerHost(clientHost); + var server = new ts.server.Session(serverHost, serverHost, /*useProtocol*/ true, /*prettyJSON*/ false); + + // Fake the connection between the client and the server + serverHost.writeMessage = client.onMessage.bind(client); + clientHost.writeMessage = server.onMessage.bind(server); + + // Wire the client to the host to get notifications when a file is open + // or edited. + clientHost.setClient(client); + + // Set the properties + this.client = client; + this.host = clientHost; } getHost() { return this.host; } getLanguageService(): ts.LanguageService { return this.client; } diff --git a/src/server/client.ts b/src/server/client.ts index a93177adb3e..1aa7547f541 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -1,177 +1,49 @@ -/// - -module ts.server { - - export interface SessionClientHost extends LanguageServiceHost { - lineColToPosition(fileName: string, line: number, col: number): number; - positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter; - } - - class SessionClientHostProxy implements ServerHost, Logger { - args: string[] = []; - newLine: string; - useCaseSensitiveFileNames: boolean = false; - lastReply: string; - - constructor(private host: SessionClientHost) { - this.newLine = this.host.getNewLine(); - } +/// - write(message: string): void { - this.lastReply = message; - } +module ts.server { - readFile(fileName: string): string { - var snapshot = this.host.getScriptSnapshot(fileName); - return snapshot && snapshot.getText(0, snapshot.getLength()); - } - - writeFile(name: string, text:string, writeByteOrderMark: boolean): void { - } - - resolvePath(path: string): string { - return path; - } - - fileExists(path: string): boolean { - return !!this.host.getScriptSnapshot(path); - } - - directoryExists(path: string): boolean { - return false; - } - - getExecutingFilePath(): string { - return ""; - } - - exit(exitCode: number): void { - } - - createDirectory(directoryName: string): void { - throw new Error("Not Implemented Yet."); - } - - getCurrentDirectory(): string { - return this.host.getCurrentDirectory(); - } - - readDirectory(path: string, extension?: string): string[] { - throw new Error("Not implemented Yet."); - } - - getModififedTime(fileName: string): Date { - return new Date(); - } - - stat(path: string, callback?: (err: any, stats: any) => any) { - return 0; - } - - lineColToPosition(fileName: string, line: number, col: number): number { - return this.host.lineColToPosition(fileName, line, col); - } - - positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { - return this.host.positionToZeroBasedLineCol(fileName, position); - } - - getFileLength(fileName: string): number { - return this.host.getScriptSnapshot(fileName).getLength(); - } - - getFileNames(): string[] { - return this.host.getScriptFileNames(); - } - - close(): void { - } - - info(message: string): void { - return this.host.log(message); - } - - msg(message: string) { - return this.host.log(message); - } - - endGroup(): void { - } - - perftrc(message: string): void { - return this.host.log(message); - } - - startGroup(): void { - } + export interface SessionClientHost extends LanguageServiceHost { + writeMessage(message: string): void; } - - export class SessionClient implements LanguageService { - private session: Session; - private sequence: number = 0; - private host: SessionClientHostProxy; - private expantionTable: ts.Map; - private fileMapping: ts.Map = {}; - - constructor(host: SessionClientHost, abbreviate: boolean) { - this.sequence = 0; - this.host = new SessionClientHostProxy(host); - this.session = new Session(this.host, this.host, /* useProtocol */ true, /*prettyJSON*/ false); - - // Setup the abbreviation table - if (abbreviate) { - this.setupExpantionTable() - } - } - - private setupExpantionTable(): void { - var request = this.processRequest(CommandNames.Abbrev); - var response = this.processResponse(request); - var abbriviationTable = response.body; - Debug.assert(!!abbriviationTable, "Could not setup abbreviation. Abbreviation table was empty."); - - var expantionTable: ts.Map = {}; - for (var p in abbriviationTable) { - if (abbriviationTable.hasOwnProperty(p)) { - expantionTable[abbriviationTable[p]] = p; - } - } - this.expantionTable = expantionTable; - } - - private expand(obj: T): T { - for (var p in obj) { - if (obj.hasOwnProperty(p)) { - if (typeof (obj)[p] === "object") { - // Expand the property value - (obj)[p] = this.expand((obj)[p]); - } - - // Substitute the name if applicaple - var substitution = ts.lookUp(this.expantionTable, p); - if (substitution) { - (obj)[substitution] = (obj)[p]; - (obj)[p] = undefined; - } - } - } - - return obj; - } - - private lineColToPosition(fileName: string, lineCol: ServerProtocol.LineCol): number { - return this.host.lineColToPosition(fileName, lineCol.line, lineCol.col); + export class SessionClient implements LanguageService { + private sequence: number = 0; + private fileMapping: ts.Map = {}; + private lineMaps: ts.Map = {}; + private messages: string[] = []; + + constructor(private host: SessionClientHost) { } - private positionToOneBasedLineCol(fileName: string, position: number): ServerProtocol.LineCol { - var lineCol = this.host.positionToZeroBasedLineCol(fileName, position); + public onMessage(message: string): void { + this.messages.push(message); + } + + private writeMessage(message: string): void { + this.host.writeMessage(message); + } + + private getLineMap(fileName: string): number[] { + var lineMap = ts.lookUp(this.lineMaps, fileName); + if (!lineMap) { + var scriptSnapshot = this.host.getScriptSnapshot(fileName); + lineMap = this.lineMaps[fileName] = ts.computeLineStarts(scriptSnapshot.getText(0, scriptSnapshot.getLength())); + } + return lineMap; + } + + private lineColToPosition(fileName: string, lineCol: ServerProtocol.LineCol): number { + return ts.computePositionFromLineAndCharacter(this.getLineMap(fileName), lineCol.line, lineCol.col); + } + + private positionToOneBasedLineCol(fileName: string, position: number): ServerProtocol.LineCol { + var lineCol = ts.computeLineAndCharacterOfPosition(this.getLineMap(fileName), position); return { - line: lineCol.line + 1, - col: lineCol.character + 1 + line: lineCol.line, + col: lineCol.character }; - } - + } + private convertCodeEditsToTextChange(fileName: string, codeEdit: ServerProtocol.CodeEdit): ts.TextChange { var start = this.lineColToPosition(fileName, codeEdit.start); var end = this.lineColToPosition(fileName, codeEdit.end); @@ -180,8 +52,8 @@ module ts.server { span: ts.createTextSpanFromBounds(start, end), newText: codeEdit.newText }; - } - + } + private getFileNameFromEncodedFile(fileId: ServerProtocol.EncodedFile): string { var fileName: string; if (typeof fileId === "object") { @@ -196,9 +68,9 @@ module ts.server { Debug.fail("Got unexpedted fileId type."); } return fileName; - } - - private processRequest(command: string, arguments?: any): T { + } + + private processRequest(command: string, arguments?: any): T { var request: ServerProtocol.Request = { seq: this.sequence++, type: "request", @@ -206,34 +78,33 @@ module ts.server { arguments: arguments }; - this.session.executeJSONcmd(JSON.stringify(request)); - - return request; - } - - private processResponse(request: ServerProtocol.Request): T { - debugger; - - var lastMessage = this.host.lastReply; - this.host.lastReply = undefined; - Debug.assert(!!lastMessage, "Did not recieve any responses."); - - // Read the content length - var contentLengthPrefix = "Content-Length: "; - var lines = lastMessage.split("\r\n"); - Debug.assert(lines.length >= 2, "Malformed response: Expected 3 lines in the response."); - - var contentLengthText = lines[0]; - Debug.assert(contentLengthText.indexOf(contentLengthPrefix) === 0, "Malformed response: Response text did not contain content-length header."); - var contentLength = parseInt(contentLengthText.substring(contentLengthPrefix.length)); - - // Read the body - var responseBody = lines[2]; - - // Verify content length - Debug.assert(responseBody.length + 1 === contentLength, "Malformed response: Content length did not match the response's body length."); - - try { + this.writeMessage(JSON.stringify(request)); + + return request; + } + + private processResponse(request: ServerProtocol.Request): T { + debugger; + + var lastMessage = this.messages.shift(); + Debug.assert(!!lastMessage, "Did not recieve any responses."); + + // Read the content length + var contentLengthPrefix = "Content-Length: "; + var lines = lastMessage.split("\r\n"); + Debug.assert(lines.length >= 2, "Malformed response: Expected 3 lines in the response."); + + var contentLengthText = lines[0]; + Debug.assert(contentLengthText.indexOf(contentLengthPrefix) === 0, "Malformed response: Response text did not contain content-length header."); + var contentLength = parseInt(contentLengthText.substring(contentLengthPrefix.length)); + + // Read the body + var responseBody = lines[2]; + + // Verify content length + Debug.assert(responseBody.length + 1 === contentLength, "Malformed response: Content length did not match the response's body length."); + + try { var response: T = JSON.parse(responseBody); } catch (e) { @@ -250,13 +121,9 @@ module ts.server { Debug.assert(!!response.body, "Malformed response: Unexpected empty response body."); - if (this.expantionTable) { - // Expand the response if abbreviated - return this.expand(response); - } return response; - } - + } + openFile(fileName: string): void { var args: ServerProtocol.FileRequestArgs = { file: fileName }; this.processRequest(CommandNames.Open, args); @@ -268,6 +135,9 @@ module ts.server { } changeFile(fileName: string, start: number, end: number, newText: string): void { + // clear the line map after an edit + this.lineMaps[fileName] = undefined; + var lineCol = this.positionToOneBasedLineCol(fileName, start); var args: ServerProtocol.ChangeRequestArgs = { file: fileName, @@ -326,7 +196,7 @@ module ts.server { getNavigateToItems(searchTerm: string): NavigateToItem[] { var args: ServerProtocol.NavtoRequestArgs = { searchTerm, - file: this.host.getFileNames()[0] + file: this.host.getScriptFileNames()[0] }; var request = this.processRequest(CommandNames.Navto, args); @@ -357,7 +227,7 @@ module ts.server { file: fileName, line: startLineCol.line, col: startLineCol.col, - endLine: endLineCol.line, + endLine: endLineCol.line, endCol: endLineCol.col, }; @@ -369,7 +239,7 @@ module ts.server { } getFormattingEditsForDocument(fileName: string, options: ts.FormatCodeOptions): ts.TextChange[] { - return this.getFormattingEditsForRange(fileName, 0, this.host.getFileLength(fileName), options); + return this.getFormattingEditsForRange(fileName, 0, this.host.getScriptSnapshot(fileName).getLength(), options); } getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): ts.TextChange[] { @@ -537,7 +407,7 @@ module ts.server { } dispose(): void { - throw new Error("dispose is not available through the server layer."); - } - } -} + throw new Error("dispose is not available through the server layer."); + } + } +} diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 933435f93a1..7007704a168 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -425,7 +425,8 @@ module ts.server { if (projectOptions.compilerOptions) { this.compilerService.setCompilerOptions(projectOptions.compilerOptions); } - // TODO: format code options } + // TODO: format code options + } } export interface ProjectOpenResult { diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 6187d8e6140..16abbf029d7 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -33,39 +33,6 @@ module ts.server { return spaceCache[n]; } - function isTypeName(name: string, suffix?: string) { - for (var i = 0, len = typeNames.length; i < len; i++) { - if (typeNames[i] == name) { - return true; - } - else if (suffix && ((typeNames[i] + suffix) == name)) { - return true; - } - } - return false; - } - - function parseTypeName(displayParts: ts.SymbolDisplayPart[]) { - var len = displayParts.length; - for (var i = len - 1; i >= 0; i--) { - if (isTypeName(displayParts[i].kind, "Name")) { - return displayParts[i].text; - } - } - return undefined; - } - - function findExactMatchType(items: ts.NavigateToItem[]) { - for (var i = 0, len = items.length; i < len; i++) { - var navItem = items[i]; - if (navItem.matchKind == "exact") { - if (isTypeName(navItem.kind)) { - return navItem; - } - } - } - } - interface FileStart { file: string; start: ILineInfo; @@ -81,14 +48,6 @@ module ts.server { else return 1; } - function printObject(obj: any) { - for (var p in obj) { - if (obj.hasOwnProperty(p)) { - console.log(p + ": " + obj[p]); - } - } - } - function compareFileStart(a: FileStart, b: FileStart) { if (a.file < b.file) { return -1; @@ -128,178 +87,7 @@ module ts.server { } }) } - - //function SourceInfo(body: NodeJS._debugger.BreakResponse) { - // var result = body.exception ? 'exception in ' : 'break in '; - - // if (body.script) { - // if (body.script.name) { - // var name = body.script.name, - // dir = path.resolve() + '/'; - - // // Change path to relative, if possible - // if (name.indexOf(dir) === 0) { - // name = name.slice(dir.length); - // } - - // result += name; - // } else { - // result += '[unnamed]'; - // } - // } - // result += ':'; - // result += body.sourceLine + 1; - - // if (body.exception) result += '\n' + body.exception.text; - - // return result; - //} - - class JsDebugSession { - host = 'localhost'; - port = 5858; - - constructor(public client: NodeJS._debugger.Client) { - this.init(); - } - - cont(cb: NodeJS._debugger.RequestHandler) { - this.client.reqContinue(cb); - } - - listSrc() { - this.client.reqScripts((err: any) => { - if (err) { - console.log("rscr error: " + err); - } - else { - console.log("req scripts"); - for (var id in this.client.scripts) { - var script = this.client.scripts[id]; - if ((typeof script === "object") && script.name) { - console.log(id + ": " + script.name); - } - } - } - }); - } - - findScript(file: string) { - if (file) { - var script: NodeJS._debugger.ScriptDesc; - var scripts = this.client.scripts; - var keys: any[] = Object.keys(scripts); - var ambiguous = false; - for (var v = 0; v < keys.length; v++) { - var id = keys[v]; - if (scripts[id] && - scripts[id].name && - scripts[id].name.indexOf(file) !== -1) { - if (script) { - ambiguous = true; - } - script = scripts[id]; - } - } - return { script: script, ambiguous: ambiguous }; - } - } - - // TODO: condition - setBreakpointOnLine(line: number, file?: string) { - if (!file) { - file = this.client.currentScript; - } - var script: NodeJS._debugger.ScriptDesc; - var scriptResult = this.findScript(file); - if (scriptResult) { - if (scriptResult.ambiguous) { - // TODO: send back error - script = undefined; - } - else { - script = scriptResult.script; - } - } - // TODO: set breakpoint when script not loaded - if (script) { - var brkmsg: NodeJS._debugger.BreakpointMessageBody = { - type: 'scriptId', - target: script.id, - line: line - 1, - } - this.client.setBreakpoint(brkmsg,(err, bod) => { - // TODO: remember breakpoint - if (err) { - console.log("Error: set breakpoint: " + err); - } - }); - } - - } - - init() { - var connectionAttempts = 0; - this.client.on('break',(res: NodeJS._debugger.Event) => { - this.handleBreak(res.body); - }); - this.client.on('exception',(res: NodeJS._debugger.Event) => { - this.handleBreak(res.body); - }); - this.client.on('error',() => { - setTimeout(() => { - ++connectionAttempts; - this.client.connect(this.port, this.host); - }, 500); - }); - this.client.once('ready',() => { - }); - this.client.on('unhandledResponse',() => { - }); - this.client.connect(this.port, this.host); - } - - evaluate(code: string) { - var frame = this.client.currentFrame; - this.client.reqFrameEval(code, frame,(err, bod) => { - if (err) { - console.log("Error: evaluate: " + err); - return; - } - - console.log("Value: " + bod.toString()); - if (typeof bod === "object") { - printObject(bod); - } - - // Request object by handles (and it's sub-properties) - this.client.mirrorObject(bod, 3,(err, mirror) => { - if (mirror) { - if (typeof mirror === "object") { - printObject(mirror); - } - console.log(mirror.toString()); - } - else { - console.log("undefined"); - } - }); - - }); - } - - handleBreak(breakInfo: NodeJS._debugger.BreakResponse) { - this.client.currentSourceLine = breakInfo.sourceLine; - this.client.currentSourceLineText = breakInfo.sourceLineText; - this.client.currentSourceColumn = breakInfo.sourceColumn; - this.client.currentFrame = 0; - this.client.currentScript = breakInfo.script && breakInfo.script.name; - - //console.log(SourceInfo(breakInfo)); - // TODO: watchers - } - } - + interface FileRange { file?: string; start: ILineInfo; @@ -320,7 +108,7 @@ module ts.server { } interface PendingErrorCheck { - filename: string; + fileName: string; project: Project; } @@ -334,7 +122,6 @@ module ts.server { } export module CommandNames { - export var Abbrev = "abbrev"; export var Change = "change"; export var Close = "close"; export var Completions = "completions"; @@ -349,22 +136,22 @@ module ts.server { export var Reload = "reload"; export var Rename = "rename"; export var Saveto = "saveto"; - export var Type = "type"; export var Brace = "brace"; export var Unknown = "unknown"; } + module Errors { + export var NoProject = new Error("No Project."); + export var NoContent = new Error("No Content."); + } + export interface ServerHost extends ts.System { - getDebuggerClient? (): NodeJS._debugger.Client; } export class Session { projectService: ProjectService; - debugSession: JsDebugSession; pendingOperation = false; fileHash: ts.Map = {}; - abbrevTable: ts.Map; - fetchedAbbrev = false; nextFileId = 1; errorTimer: NodeJS.Timer; immediateId: any; @@ -372,7 +159,6 @@ module ts.server { constructor(private host: ServerHost, private logger: Logger, protected useProtocol: boolean, protected prettyJSON: boolean) { this.projectService = new ProjectService(host, logger); - this.initAbbrevTable(); } logError(err: Error, cmd: string) { @@ -387,8 +173,8 @@ module ts.server { this.projectService.log(msg); } - sendLineToClient(line: string) { - this.host.write(line + this.host.newLine); + sendLineToClient(line: string) { + this.host.write(line + this.host.newLine); } send(msg: NodeJS._debugger.Message) { @@ -430,51 +216,15 @@ module ts.server { this.send(res); } - initAbbrevTable() { - this.abbrevTable = { - name: "n", - kind: "k", - fileName: "f", - containerName: "cn", - containerKind: "ck", - kindModifiers: "km", - start: "s", - end: "e", - line: "l", - col: "c", - "interface": "i", - "function": "fn", - }; - } - - encodeFilename(filename: string): ServerProtocol.EncodedFile { - if (!this.fetchedAbbrev) { - return filename; + encodeFilename(fileName: string): ServerProtocol.EncodedFile { + var id = ts.lookUp(this.fileHash, fileName); + if (!id) { + id = this.nextFileId++; + this.fileHash[fileName] = id; + return { id: id, file: fileName }; } else { - var id = ts.lookUp(this.fileHash, filename); - if (!id) { - id = this.nextFileId++; - this.fileHash[filename] = id; - return { id: id, file: filename }; - } - else { - return id; - } - } - } - - abbreviate(obj: any) { - if (this.fetchedAbbrev && (!this.prettyJSON)) { - for (var p in obj) { - if (obj.hasOwnProperty(p)) { - var sub = ts.lookUp(this.abbrevTable, p); - if (sub) { - obj[sub] = obj[p]; - obj[p] = undefined; - } - } - } + return id; } } @@ -544,10 +294,10 @@ module ts.server { var checkOne = () => { if (matchSeq(seq)) { var checkSpec = checkList[index++]; - if (checkSpec.project.getSourceFileFromName(checkSpec.filename)) { - this.syntacticCheck(checkSpec.filename, checkSpec.project); + if (checkSpec.project.getSourceFileFromName(checkSpec.fileName)) { + this.syntacticCheck(checkSpec.fileName, checkSpec.project); this.immediateId = setImmediate(() => { - this.semanticCheck(checkSpec.filename, checkSpec.project); + this.semanticCheck(checkSpec.fileName, checkSpec.project); this.immediateId = undefined; if (checkList.length > index) { this.errorTimer = setTimeout(checkOne, followMs); @@ -564,181 +314,140 @@ module ts.server { } } - goToDefinition(line: number, col: number, rawfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + goToDefinition(line: number, col: number, fileName: string): ServerProtocol.CodeSpan[] { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var locs = compilerService.languageService.getDefinitionAtPosition(file, pos); - if (locs) { - var info: ServerProtocol.CodeSpan[] = locs.map(def => ({ - file: def && def.fileName, - start: def && - compilerService.host.positionToLineCol(def.fileName, def.textSpan.start), - end: def && - compilerService.host.positionToLineCol(def.fileName, ts.textSpanEnd(def.textSpan)) - })); - this.output(info, CommandNames.Definition, reqSeq); - } - else { - this.output(undefined, CommandNames.Definition, reqSeq, "could not find def"); - } + if (!project) { + throw Errors.NoProject; } - else { - this.output(undefined, CommandNames.Definition, reqSeq, "no project for " + file); + + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + + var definitions = compilerService.languageService.getDefinitionAtPosition(file, position); + if (!definitions) { + throw Errors.NoContent; } + + return definitions.map(def => ({ + file: def && def.fileName, + start: def && + compilerService.host.positionToLineCol(def.fileName, def.textSpan.start), + end: def && + compilerService.host.positionToLineCol(def.fileName, ts.textSpanEnd(def.textSpan)) + })); } - rename(line: number, col: number, rawfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + rename(line: number, col: number, fileName: string): { info: RenameInfo; locs: ServerProtocol.CodeSpan[] } { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var renameInfo = compilerService.languageService.getRenameInfo(file, pos); - if (renameInfo) { - if (renameInfo.canRename) { - var renameLocs = compilerService.languageService.findRenameLocations(file, pos, false, false); - if (renameLocs) { - var bakedRenameLocs = renameLocs.map(loc=> ({ - file: loc.fileName, - start: compilerService.host.positionToLineCol(loc.fileName, loc.textSpan.start), - end: compilerService.host.positionToLineCol(loc.fileName, ts.textSpanEnd(loc.textSpan)), - })).sort((a, b) => { - if (a.file < b.file) { - return -1; - } - else if (a.file > b.file) { - return 1; - } - else { - // reverse sort assuming no overlap - if (a.start.line < b.start.line) { - return 1; - } - else if (a.start.line > b.start.line) { - return -1; - } - else { - return b.start.col - a.start.col; - } - } - }).reduce((accum: FileRanges[], cur: FileRange) => { - var curFileAccum: FileRanges; - if (accum.length > 0) { - curFileAccum = accum[accum.length - 1]; - if (curFileAccum.file != cur.file) { - curFileAccum = undefined; - } - } - if (!curFileAccum) { - curFileAccum = { file: cur.file, locs: [] }; - accum.push(curFileAccum); - } - curFileAccum.locs.push({ start: cur.start, end: cur.end }); - return accum; - }, []); - this.output({ info: renameInfo, locs: bakedRenameLocs }, CommandNames.Rename, reqSeq); + if (!project) { + throw Errors.NoProject; + } + + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + var renameInfo = compilerService.languageService.getRenameInfo(file, position); + if (!renameInfo) { + throw Errors.NoContent; + } + + if (!renameInfo.canRename) { + return { + info: renameInfo, + locs: [] + }; + } + + var renameLocs = compilerService.languageService.findRenameLocations(file, position, false, false); + if (renameLocs) { + var bakedRenameLocs = renameLocs.map(loc=> ({ + file: loc.fileName, + start: compilerService.host.positionToLineCol(loc.fileName, loc.textSpan.start), + end: compilerService.host.positionToLineCol(loc.fileName, ts.textSpanEnd(loc.textSpan)), + })).sort((a, b) => { + if (a.file < b.file) { + return -1; + } + else if (a.file > b.file) { + return 1; + } + else { + // reverse sort assuming no overlap + if (a.start.line < b.start.line) { + return 1; + } + else if (a.start.line > b.start.line) { + return -1; } else { - this.output({ info: renameInfo, locs: [] }, CommandNames.Rename, reqSeq); + return b.start.col - a.start.col; } } - else { - this.output(undefined, CommandNames.Rename, reqSeq, renameInfo.localizedErrorMessage); + }).reduce((accum, cur) => { + var curFileAccum: FileRanges; + if (accum.length > 0) { + curFileAccum = accum[accum.length - 1]; + if (curFileAccum.file != cur.file) { + curFileAccum = undefined; + } } - } - else { - this.output(undefined, CommandNames.Rename, reqSeq, "no rename information at cursor"); - } + if (!curFileAccum) { + curFileAccum = { file: cur.file, locs: [] }; + accum.push(curFileAccum); + } + curFileAccum.locs.push({ start: cur.start, end: cur.end }); + return accum; + }, []); } + + return { info: renameInfo, locs: bakedRenameLocs }; } - findReferences(line: number, col: number, rawfile: string, reqSeq = 0) { + findReferences(line: number, col: number, fileName: string): ServerProtocol.ReferencesResponseBody { // TODO: get all projects for this file; report refs for all projects deleting duplicates // can avoid duplicates by eliminating same ref file from subsequent projects - var file = ts.normalizePath(rawfile); + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var refs = compilerService.languageService.getReferencesAtPosition(file, pos); - if (refs) { - var nameInfo = compilerService.languageService.getQuickInfoAtPosition(file, pos); - if (nameInfo) { - var displayString = ts.displayPartsToString(nameInfo.displayParts); - var nameSpan = nameInfo.textSpan; - var nameColStart = - compilerService.host.positionToLineCol(file, nameSpan.start).col; - var nameText = - compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); - var bakedRefs: ServerProtocol.ReferencesResponseItem[] = refs.map((ref) => { - var start = compilerService.host.positionToLineCol(ref.fileName, ref.textSpan.start); - var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); - var snap = compilerService.host.getScriptSnapshot(ref.fileName); - var lineText = snap.getText(refLineSpan.start, ts.textSpanEnd(refLineSpan)).replace(/\r|\n/g, ""); - return { - file: ref.fileName, - start: start, - lineText: lineText, - end: compilerService.host.positionToLineCol(ref.fileName, ts.textSpanEnd(ref.textSpan)), - }; - }).sort(compareFileStart); - var response: ServerProtocol.ReferencesResponseBody = { - refs: bakedRefs, - symbolName: nameText, - symbolStartCol: nameColStart, - symbolDisplayString: displayString - }; - this.output(response, CommandNames.References, reqSeq); - } - else { - this.output(undefined, CommandNames.References, reqSeq, "no references at this position"); - } - } - else { - this.output(undefined, CommandNames.References, reqSeq, "no references at this position"); - } + if (!project) { + throw Errors.NoProject; } - } - // TODO: implement this as ls api that can return multiple def sites - goToType(line: number, col: number, rawfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); - var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, pos); - var typeLoc: any; + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); - if (quickInfo && (quickInfo.kind == "var") || (quickInfo.kind == "local var")) { - var typeName = parseTypeName(quickInfo.displayParts); - if (typeName) { - var navItems = compilerService.languageService.getNavigateToItems(typeName); - var navItem = findExactMatchType(navItems); - if (navItem) { - typeLoc = { - file: navItem.fileName, - start: compilerService.host.positionToLineCol(navItem.fileName, - navItem.textSpan.start), - end: compilerService.host.positionToLineCol(navItem.fileName, - ts.textSpanEnd(navItem.textSpan)), - }; - } - } - } - if (typeLoc) { - this.output([typeLoc], CommandNames.Type, reqSeq); - } - else { - this.output(undefined, CommandNames.Type, reqSeq, "no info at this location"); - } + var references = compilerService.languageService.getReferencesAtPosition(file, position); + if (!references) { + throw Errors.NoContent; } - else { - this.output(undefined, CommandNames.Type, reqSeq, "no project for " + file); + + var nameInfo = compilerService.languageService.getQuickInfoAtPosition(file, position); + if (!nameInfo) { + throw Errors.NoContent; } + + var displayString = ts.displayPartsToString(nameInfo.displayParts); + var nameSpan = nameInfo.textSpan; + var nameColStart = compilerService.host.positionToLineCol(file, nameSpan.start).col; + var nameText = compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); + var bakedRefs: ServerProtocol.ReferencesResponseItem[] = references.map((ref) => { + var start = compilerService.host.positionToLineCol(ref.fileName, ref.textSpan.start); + var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); + var snap = compilerService.host.getScriptSnapshot(ref.fileName); + var lineText = snap.getText(refLineSpan.start, ts.textSpanEnd(refLineSpan)).replace(/\r|\n/g, ""); + return { + file: ref.fileName, + start: start, + lineText: lineText, + end: compilerService.host.positionToLineCol(ref.fileName, ts.textSpanEnd(ref.textSpan)), + }; + }).sort(compareFileStart); + return { + refs: bakedRefs, + symbolName: nameText, + symbolStartCol: nameColStart, + symbolDisplayString: displayString + }; } openClientFile(rawfile: string) { @@ -746,173 +455,151 @@ module ts.server { this.projectService.openClientFile(file); } - quickInfo(line: number, col: number, rawfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + quickInfo(line: number, col: number, fileName: string): ServerProtocol.QuickInfoResponseBody { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, pos); - if (quickInfo) { - var displayString = ts.displayPartsToString(quickInfo.displayParts); - var docString = ts.displayPartsToString(quickInfo.documentation); - var qi: ServerProtocol.QuickInfoResponseBody = { - kind: quickInfo.kind, - kindModifiers: quickInfo.kindModifiers, - start: compilerService.host.positionToLineCol(file, quickInfo.textSpan.start), - end: compilerService.host.positionToLineCol(file, ts.textSpanEnd(quickInfo.textSpan)), - displayString: displayString, - documentation: docString, - }; - this.output(qi, CommandNames.Quickinfo, reqSeq); - } - else { - this.output(undefined, CommandNames.Quickinfo, reqSeq, "no info") - } + if (!project) { + throw Errors.NoProject; } + + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, position); + if (!quickInfo) { + throw Errors.NoContent; + } + + var displayString = ts.displayPartsToString(quickInfo.displayParts); + var docString = ts.displayPartsToString(quickInfo.documentation); + return { + kind: quickInfo.kind, + kindModifiers: quickInfo.kindModifiers, + start: compilerService.host.positionToLineCol(file, quickInfo.textSpan.start), + end: compilerService.host.positionToLineCol(file, ts.textSpanEnd(quickInfo.textSpan)), + displayString: displayString, + documentation: docString, + }; } - format(line: number, col: number, endLine: number, endCol: number, rawfile: string, cmd: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + format(line: number, col: number, endLine: number, endCol: number, fileName: string): ServerProtocol.CodeEdit[] { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var endPos = compilerService.host.lineColToPosition(file, endLine, endCol); - var edits: ts.TextChange[]; - // TODO: avoid duplicate code (with formatonkey) - try { - edits = compilerService.languageService.getFormattingEditsForRange(file, pos, endPos, - compilerService.formatCodeOptions); - } - catch (err) { - this.logError(err, cmd); - edits = undefined; - } - if (edits) { - var bakedEdits: ServerProtocol.CodeEdit[] = edits.map((edit) => { - return { - start: compilerService.host.positionToLineCol(file, - edit.span.start), - end: compilerService.host.positionToLineCol(file, - ts.textSpanEnd(edit.span)), - newText: edit.newText ? edit.newText : "" - }; - }); - this.output(bakedEdits, CommandNames.Format, reqSeq); - } - else { - this.output(undefined, CommandNames.Format, reqSeq, "no edits") - } + if (!project) { + throw Errors.NoProject; } + + var compilerService = project.compilerService; + var startPosition = compilerService.host.lineColToPosition(file, line, col); + var endPosition = compilerService.host.lineColToPosition(file, endLine, endCol); + + // TODO: avoid duplicate code (with formatonkey) + var edits = compilerService.languageService.getFormattingEditsForRange(file, startPosition, endPosition, compilerService.formatCodeOptions); + if (!edits) { + throw Errors.NoContent; + } + + return edits.map((edit) => { + return { + start: compilerService.host.positionToLineCol(file, edit.span.start), + end: compilerService.host.positionToLineCol(file, ts.textSpanEnd(edit.span)), + newText: edit.newText ? edit.newText : "" + }; + }); } - formatOnKey(line: number, col: number, key: string, rawfile: string, cmd: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + formatOnKey(line: number, col: number, key: string, fileName: string): ServerProtocol.CodeEdit[] { + var file = ts.normalizePath(fileName); + var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var edits: ts.TextChange[]; - try { - edits = compilerService.languageService.getFormattingEditsAfterKeystroke(file, pos, key, - compilerService.formatCodeOptions); - if ((key == "\n") && ((!edits) || (edits.length == 0) || allEditsBeforePos(edits, pos))) { - // TODO: get these options from host - var editorOptions: ts.EditorOptions = { - IndentSize: 4, - TabSize: 4, - NewLineCharacter: "\n", - ConvertTabsToSpaces: true, - }; - var indentPosition = compilerService.languageService.getIndentationAtPosition(file, pos, editorOptions); - var spaces = generateSpaces(indentPosition); - if (indentPosition > 0) { - edits.push({ span: ts.createTextSpanFromBounds(pos, pos), newText: spaces }); - } - } - } - catch (err) { - this.logError(err, cmd); - edits = undefined; - } - if (edits) { - var bakedEdits: ServerProtocol.CodeEdit[] = edits.map((edit) => { - return { - start: compilerService.host.positionToLineCol(file, - edit.span.start), - end: compilerService.host.positionToLineCol(file, - ts.textSpanEnd(edit.span)), - newText: edit.newText ? edit.newText : "" - }; - }); - this.output(bakedEdits, CommandNames.Formatonkey, reqSeq); - } - else { - this.output(undefined, CommandNames.Formatonkey, reqSeq, "no edits") + if (!project) { + throw Errors.NoProject; + } + + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + var edits = compilerService.languageService.getFormattingEditsAfterKeystroke(file, position, key, + compilerService.formatCodeOptions); + if ((key == "\n") && ((!edits) || (edits.length == 0) || allEditsBeforePos(edits, position))) { + // TODO: get these options from host + var editorOptions: ts.EditorOptions = { + IndentSize: 4, + TabSize: 4, + NewLineCharacter: "\n", + ConvertTabsToSpaces: true, + }; + var indentPosition = compilerService.languageService.getIndentationAtPosition(file, position, editorOptions); + var spaces = generateSpaces(indentPosition); + if (indentPosition > 0) { + edits.push({ span: ts.createTextSpanFromBounds(position, position), newText: spaces }); } } + + if (!edits) { + throw Errors.NoContent; + } + + return edits.map((edit) => { + return { + start: compilerService.host.positionToLineCol(file, + edit.span.start), + end: compilerService.host.positionToLineCol(file, + ts.textSpanEnd(edit.span)), + newText: edit.newText ? edit.newText : "" + }; + }); } - completions(line: number, col: number, prefix: string, rawfile: string, cmd: string, reqSeq = 0) { + completions(line: number, col: number, prefix: string, fileName: string): ServerProtocol.CompletionItem[] { if (!prefix) { prefix = ""; } - var file = ts.normalizePath(rawfile); + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - var completions: ts.CompletionInfo = undefined; - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - if (pos >= 0) { - try { - completions = compilerService.languageService.getCompletionsAtPosition(file, pos); - } - catch (err) { - this.logError(err, cmd); - completions = undefined; - } - if (completions) { - var compressedEntries: ServerProtocol.CompletionItem[] = - completions.entries.reduce((accum: ts.CompletionEntryDetails[], entry: ts.CompletionEntry) => { - if (entry.name.indexOf(prefix) == 0) { - var protoEntry = {}; - protoEntry.name = entry.name; - protoEntry.kind = entry.kind; - if (entry.kindModifiers && (entry.kindModifiers.length > 0)) { - protoEntry.kindModifiers = entry.kindModifiers; - } - var details = compilerService.languageService.getCompletionEntryDetails(file, pos, entry.name); - if (details && (details.documentation) && (details.documentation.length > 0)) { - protoEntry.documentation = details.documentation; - } - if (details && (details.displayParts) && (details.displayParts.length > 0)) { - protoEntry.displayParts = details.documentation; - } - accum.push(protoEntry); - } - return accum; - }, []); - this.output(compressedEntries, CommandNames.Completions, reqSeq); - } - } + if (!project) { + throw Errors.NoProject; } - if (!completions) { - this.output(undefined, CommandNames.Completions, reqSeq, "no completions"); - } - } - geterr(ms: number, files: string[]) { - var checkList = files.reduce((accum: PendingErrorCheck[], filename: string) => { - filename = ts.normalizePath(filename); - var project = this.projectService.getProjectForFile(filename); - if (project) { - accum.push({ filename: filename, project: project }); + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + + var completions = compilerService.languageService.getCompletionsAtPosition(file, position); + if (!completions) { + throw Errors.NoContent; + } + + return completions.entries.reduce((accum: ts.CompletionEntryDetails[], entry: ts.CompletionEntry) => { + if (entry.name.indexOf(prefix) == 0) { + var protoEntry = {}; + protoEntry.name = entry.name; + protoEntry.kind = entry.kind; + if (entry.kindModifiers && (entry.kindModifiers.length > 0)) { + protoEntry.kindModifiers = entry.kindModifiers; + } + var details = compilerService.languageService.getCompletionEntryDetails(file, position, entry.name); + if (details && (details.documentation) && (details.documentation.length > 0)) { + protoEntry.documentation = details.documentation; + } + if (details && (details.displayParts) && (details.displayParts.length > 0)) { + protoEntry.displayParts = details.documentation; + } + accum.push(protoEntry); } return accum; }, []); + } + + geterr(delay: number, fileNames: string[]) { + var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => { + fileName = ts.normalizePath(fileName); + var project = this.projectService.getProjectForFile(fileName); + if (project) { + accum.push({ fileName, project }); + } + return accum; + }, []); + if (checkList.length > 0) { - this.updateErrorCheck(checkList, this.changeSeq,(n) => n == this.changeSeq, ms) + this.updateErrorCheck(checkList, this.changeSeq,(n) => n == this.changeSeq, delay) } } @@ -997,352 +684,165 @@ module ts.server { } } - navto(searchTerm: string, rawfile: string, cmd: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + navto(searchTerm: string, fileName: string): ServerProtocol.NavtoItem[] { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var navItems: ts.NavigateToItem[]; - var cancellationToken = compilerService.host.getCancellationToken(); - if (this.pendingOperation) { - cancellationToken.cancel(); - cancellationToken.reset(); - } - try { - this.pendingOperation = true; - navItems = sortNavItems(compilerService.languageService.getNavigateToItems(searchTerm)); - } - catch (err) { - this.logError(err, cmd); - navItems = undefined; - } - this.pendingOperation = false; - if (navItems) { - var bakedNavItems: ServerProtocol.NavtoItem[] = navItems.map((navItem) => { - var start = compilerService.host.positionToLineCol(navItem.fileName, - navItem.textSpan.start); - var end = compilerService.host.positionToLineCol(navItem.fileName, ts.textSpanEnd(navItem.textSpan)); - this.abbreviate(start); - var bakedItem: ServerProtocol.NavtoItem = { - name: navItem.name, - kind: navItem.kind, - file: this.encodeFilename(navItem.fileName), - start: start, - end: end, - }; - if (navItem.kindModifiers && (navItem.kindModifiers != "")) { - bakedItem.kindModifiers = navItem.kindModifiers; - } - if (navItem.matchKind != 'none') { - bakedItem.matchKind = navItem.matchKind; - } - if (navItem.containerName && (navItem.containerName.length > 0)) { - bakedItem.containerName = navItem.containerName; - } - if (navItem.containerKind && (navItem.containerKind.length > 0)) { - bakedItem.containerKind = navItem.containerKind; - } - this.abbreviate(bakedItem); - return bakedItem; - }); + if (!project) { + throw Errors.NoProject; + } - this.output(bakedNavItems, CommandNames.Navto, reqSeq); - } - else { - this.output(undefined, CommandNames.Navto, reqSeq, "no nav items"); - } - } - else { - this.output(undefined, CommandNames.Navto, reqSeq, "no nav items"); + var compilerService = project.compilerService; + var navItems = sortNavItems(compilerService.languageService.getNavigateToItems(searchTerm)); + if (!navItems) { + throw Errors.NoContent; } + + return navItems.map((navItem) => { + var start = compilerService.host.positionToLineCol(navItem.fileName, navItem.textSpan.start); + var end = compilerService.host.positionToLineCol(navItem.fileName, ts.textSpanEnd(navItem.textSpan)); + var bakedItem: ServerProtocol.NavtoItem = { + name: navItem.name, + kind: navItem.kind, + file: this.encodeFilename(navItem.fileName), + start: start, + end: end, + }; + if (navItem.kindModifiers && (navItem.kindModifiers != "")) { + bakedItem.kindModifiers = navItem.kindModifiers; + } + if (navItem.matchKind != 'none') { + bakedItem.matchKind = navItem.matchKind; + } + if (navItem.containerName && (navItem.containerName.length > 0)) { + bakedItem.containerName = navItem.containerName; + } + if (navItem.containerKind && (navItem.containerKind.length > 0)) { + bakedItem.containerKind = navItem.containerKind; + } + return bakedItem; + }); } - getMatchingBrace(line: number, col: number, rawfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + getBraceMatching(line: number, col: number, fileName: string): ServerProtocol.TextSpan[] { + var file = ts.normalizePath(fileName); + var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - var spans: ts.TextSpan[]; - try { - spans = compilerService.languageService.getBraceMatchingAtPosition(file, pos); - } - catch (err) { - this.logError(err, CommandNames.Brace); - spans = undefined; - } - if (spans) { - var bakedSpans: ServerProtocol.TextSpan[] = spans.map(span => ({ - start: span && - compilerService.host.positionToLineCol(file, span.start), - end: span && - compilerService.host.positionToLineCol(file, span.start + span.length) - })); - this.output(bakedSpans, CommandNames.Brace, reqSeq); - } - else { - this.output(undefined, CommandNames.Brace, reqSeq, "no matching braces"); - } + if (!project) { + throw Errors.NoProject; } - else { - this.output(undefined, CommandNames.Brace, reqSeq, "no matching braces"); + + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + + var spans = compilerService.languageService.getBraceMatchingAtPosition(file, position); + if (!spans) { + throw Errors.NoContent; } + + return spans.map(span => ({ + start: compilerService.host.positionToLineCol(file, span.start), + end: compilerService.host.positionToLineCol(file, span.start + span.length) + })); } - executeJSONcmd(cmd: string) { + onMessage(message: string) { try { - var req = JSON.parse(cmd); - switch (req.command) { + var request = JSON.parse(message); + var response: any; + switch (request.command) { case CommandNames.Definition: { - var defArgs = req.arguments; - this.goToDefinition(defArgs.line, defArgs.col, defArgs.file, req.seq); + var defArgs = request.arguments; + response = this.goToDefinition(defArgs.line, defArgs.col, defArgs.file); break; } case CommandNames.References: { - var refArgs = req.arguments; - this.findReferences(refArgs.line, refArgs.col, refArgs.file, req.seq); + var refArgs = request.arguments; + response = this.findReferences(refArgs.line, refArgs.col, refArgs.file); break; } case CommandNames.Rename: { - var renameArgs = req.arguments; - this.rename(renameArgs.line, renameArgs.col, renameArgs.file, req.seq); - break; - } - case CommandNames.Type: { - var typeArgs = req.arguments; - this.goToType(typeArgs.line, typeArgs.col, typeArgs.file, req.seq); + var renameArgs = request.arguments; + response = this.rename(renameArgs.line, renameArgs.col, renameArgs.file); break; } case CommandNames.Open: { - var openArgs = req.arguments; + var openArgs = request.arguments; this.openClientFile(openArgs.file); break; } case CommandNames.Quickinfo: { - var quickinfoArgs = req.arguments; - this.quickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file, req.seq); + var quickinfoArgs = request.arguments; + response = this.quickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); break; } case CommandNames.Format: { - var formatArgs = req.arguments; - this.format(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file, - cmd, req.seq); + var formatArgs = request.arguments; + response = this.format(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file); break; } case CommandNames.Formatonkey: { - var formatOnKeyArgs = req.arguments; - this.formatOnKey(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file, - cmd, req.seq); + var formatOnKeyArgs = request.arguments; + response = this.formatOnKey(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file); break; } case CommandNames.Completions: { - var completionsArgs = req.arguments; - this.completions(req.arguments.line, req.arguments.col, completionsArgs.prefix, req.arguments.file, - cmd, req.seq); + var completionsArgs = request.arguments; + response = this.completions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); break; } case CommandNames.Geterr: { - var geterrArgs = req.arguments; - this.geterr(geterrArgs.delay, geterrArgs.files); + var geterrArgs = request.arguments; + response = this.geterr(geterrArgs.delay, geterrArgs.files); break; } case CommandNames.Change: { - var changeArgs = req.arguments; + var changeArgs = request.arguments; this.change(changeArgs.line, changeArgs.col, changeArgs.deleteLen, changeArgs.insertString, changeArgs.file); break; } case CommandNames.Reload: { - var reloadArgs = req.arguments; - this.reload(reloadArgs.file, reloadArgs.tmpfile, req.seq); + var reloadArgs = request.arguments; + this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq); break; } case CommandNames.Saveto: { - var savetoArgs = req.arguments; + var savetoArgs = request.arguments; this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); break; } case CommandNames.Close: { - var closeArgs = req.arguments; + var closeArgs = request.arguments; this.closeClientFile(closeArgs.file); break; } case CommandNames.Navto: { - var navtoArgs = req.arguments; - this.navto(navtoArgs.searchTerm, navtoArgs.file, cmd, req.seq); - break; - } - case CommandNames.Abbrev: { - this.sendAbbrev(); + var navtoArgs = request.arguments; + response = this.navto(navtoArgs.searchTerm, navtoArgs.file); break; } case CommandNames.Brace: { - var defArgs = req.arguments; - this.getMatchingBrace(defArgs.line, defArgs.col, defArgs.file, req.seq); + var braceArguments = request.arguments; + response = this.getBraceMatching(braceArguments.line, braceArguments.col, braceArguments.file); break; } default: { - this.projectService.log("Unrecognized JSON command: " + cmd); + this.projectService.log("Unrecognized JSON command: " + message); + this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command); break; } } + + if (response) { + this.output(response, request.command, request.seq); + } + } catch (err) { - this.logError(err, cmd); - } - } - - sendAbbrev(reqSeq = 0) { - if (!this.fetchedAbbrev) { - this.output(this.abbrevTable, CommandNames.Abbrev, reqSeq); - } - this.fetchedAbbrev = true; - } - - executeCmd(cmd: string) { - var line: number, col: number, file: string; - var m: string[]; - - try { - if (m = cmd.match(/^dbg start$/)) { - this.debugSession = new JsDebugSession(this.host.getDebuggerClient()); + if (err instanceof OperationCanceledException) { + // Handle cancellation exceptions } - else if (m = cmd.match(/^dbg cont$/)) { - if (this.debugSession) { - this.debugSession.cont((err, body, res) => { - }); - } - } - else if (m = cmd.match(/^dbg src$/)) { - if (this.debugSession) { - this.debugSession.listSrc(); - } - } - else if (m = cmd.match(/^dbg brk (\d+) (.*)$/)) { - line = parseInt(m[1]); - file = ts.normalizePath(m[2]); - if (this.debugSession) { - this.debugSession.setBreakpointOnLine(line, file); - } - } - else if (m = cmd.match(/^dbg eval (.*)$/)) { - var code = m[1]; - if (this.debugSession) { - this.debugSession.evaluate(code); - } - } - else if (m = cmd.match(/^definition (\d+) (\d+) (.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - file = m[3]; - this.goToDefinition(line, col, file); - } - else if (m = cmd.match(/^rename (\d+) (\d+) (.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - file = m[3]; - this.rename(line, col, file); - } - else if (m = cmd.match(/^type (\d+) (\d+) (.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - file = m[3]; - this.goToType(line, col, file); - } - else if (m = cmd.match(/^open (.*)$/)) { - file = m[1]; - this.openClientFile(file); - } - else if (m = cmd.match(/^references (\d+) (\d+) (.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - file = m[3]; - this.findReferences(line, col, file); - } - else if (m = cmd.match(/^quickinfo (\d+) (\d+) (.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - file = m[3]; - this.quickInfo(line, col, file); - } - else if (m = cmd.match(/^format (\d+) (\d+) (\d+) (\d+) (.*)$/)) { - // format line col endLine endCol file - line = parseInt(m[1]); - col = parseInt(m[2]); - var endLine = parseInt(m[3]); - var endCol = parseInt(m[4]); - file = m[5]; - this.format(line, col, endLine, endCol, file, cmd); - } - else if (m = cmd.match(/^formatonkey (\d+) (\d+) (\{\".*\"\})\s* (.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - var key = JSON.parse(m[3].substring(1, m[3].length - 1)); - file = m[4]; - this.formatOnKey(line, col, key, file, cmd); - } - else if (m = cmd.match(/^completions (\d+) (\d+) (\{.*\})?\s*(.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - var prefix = ""; - file = m[4]; - if (m[3]) { - prefix = m[3].substring(1, m[3].length - 1); - } - this.completions(line, col, prefix, file, cmd); - } - else if (m = cmd.match(/^geterr (\d+) (.*)$/)) { - var ms = parseInt(m[1]); - var rawFiles = m[2]; - this.geterr(ms, rawFiles.split(';')); - } - else if (m = cmd.match(/^change (\d+) (\d+) (\d+) (\d+) (\{\".*\"\})?\s*(.*)$/)) { - line = parseInt(m[1]); - col = parseInt(m[2]); - var deleteLen = parseInt(m[3]); - var insertLen = parseInt(m[4]); - var insertString: string; - if (insertLen) { - insertString = JSON.parse(m[5].substring(1, m[5].length - 1)); - } - file = m[6]; - this.change(line, col, deleteLen, insertString, file); - } - else if (m = cmd.match(/^reload (.*) from (.*)$/)) { - this.reload(m[1], m[2]); - } - // TODO: change this to saveto - else if (m = cmd.match(/^save (.*) to (.*)$/)) { - this.saveToTmp(m[1], m[2]); - } - else if (m = cmd.match(/^close (.*)$/)) { - this.closeClientFile(m[1]); - } - else if (m = cmd.match(/^navto (\{.*\}) (.*)$/)) { - var searchTerm = m[1]; - searchTerm = searchTerm.substring(1, searchTerm.length - 1); - this.navto(searchTerm, m[2], cmd); - } - else if (m = cmd.match(/^navbar (.*)$/)) { - this.navbar(m[1]); - } - else if (m = cmd.match(/^abbrev/)) { - this.sendAbbrev(); - } - else if (m = cmd.match(/^pretty/)) { - this.prettyJSON = true; - } - else if (m = cmd.match(/^printproj/)) { - this.projectService.printProjects(); - } - else if (m = cmd.match(/^fileproj (.*)$/)) { - file = ts.normalizePath(m[1]); - this.projectService.printProjectsForFile(file); - } - else { - this.output(undefined, CommandNames.Unknown, 0, "Unrecognized command " + cmd); - } - } catch (err) { - this.logError(err, cmd); + this.logError(err, message); + this.output(undefined, request ? request.command : CommandNames.Unknown, request ? request.seq : 0, "Error processing request. " + err.message); } } } diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts index 73c39404154..95e671f561e 100644 --- a/src/server/protodef.d.ts +++ b/src/server/protodef.d.ts @@ -188,18 +188,6 @@ declare module ServerProtocol { } } - /** - Type request; value of command field is "type". Return response - giving the code locations that define the type of the symbol - found in file at location line, col. - */ - export interface TypeRequest extends CodeLocationRequest { - } - - export interface TypeResponse extends Response { - body?: CodeSpan[]; - } - /** Open request; value of command field is "open". Notify the server that the client has file open. The server will not @@ -483,8 +471,8 @@ declare module ServerProtocol { kindModifiers?: string; /** The file in which the symbol is found; the value of this - field will always be a string unless the client opts-in to - file encoding by sending the "abbrev" request. + field will always be a string, number of a mapping between + a string and a number. */ file: EncodedFile; /** The location within file at which the symbol is found*/ @@ -528,27 +516,6 @@ declare module ServerProtocol { arguments: ChangeRequestArgs; } - /* - The following messages describe an OPTIONAL compression scheme - that clients can choose to use. If a client does not opt-in to - this scheme by sending an "abbrev" request, the server will not - compress messages. - */ - - /** - Abbrev request message; value of command field is "abbrev". - Server returns an array of mappings from common message field - names and common message field string values to shortened - versions of these strings. Once a client opts-in by requesting - the abbreviations, the server may send responses whose field - names are shortened. The server may also send file names as - instances of AssignFileId, or as file ids, if the corresponding - id assignment had been previously returned. Currently, only - responses to the "navto" request can be encoded. - */ - export interface AbbrevRequest extends Request { - } - /** If an object of this type is returned in place of a string as the value of a file field in a response message, add the @@ -572,25 +539,6 @@ declare module ServerProtocol { */ export type EncodedFile = number | IdFile | string; - /** - Response to abbrev opt-in request message. This is a map of - string field names and common string field values to shortened - strings. Once the server sends this response, it will assume - that it can use the shortened field names and field values. In - addition, the server will assume it can assign ids to file - names by returning an AssignFileId instance in place of a file - name. Once an AssignFileId instance is returned, the server - may send the file id (a number) in place of the file name. - */ - export interface AbbrevResponse extends Response { - body?: { - /** Map from full string (either field name or string - field value) to shortened string */ - [fullString: string]: string; - } - } - - /** Response to "brace" request. */ export interface BraceResponse extends Response { body?: TextSpan[]; diff --git a/src/server/server.ts b/src/server/server.ts index ec0ee293ce3..9f06e9b0277 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1,18 +1,18 @@ -/// -/// - -module ts.server { +/// +/// + +module ts.server { var nodeproto: typeof NodeJS._debugger = require('_debugger'); var readline: NodeJS.ReadLine = require('readline'); - var path: NodeJS.Path = require('path'); + var path: NodeJS.Path = require('path'); var fs: typeof NodeJS.fs = require('fs'); - + var rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false, - }); - + }); + class Logger implements ts.server.Logger { fd = -1; seq = 0; @@ -71,17 +71,17 @@ module ts.server { } } } - - class IOSession extends Session { - protocol: NodeJS._debugger.Protocol; - - constructor(host: ServerHost, logger: ts.server.Logger, useProtocol: boolean, prettyJSON: boolean) { - super(host, logger, useProtocol, prettyJSON); + + class IOSession extends Session { + protocol: NodeJS._debugger.Protocol; + + constructor(host: ServerHost, logger: ts.server.Logger, useProtocol: boolean, prettyJSON: boolean) { + super(host, logger, useProtocol, prettyJSON); if (useProtocol) { this.initProtocol(); - } - } - + } + } + initProtocol() { this.protocol = new nodeproto.Protocol(); // note: onResponse was named by nodejs authors; we are re-purposing the Protocol @@ -89,25 +89,16 @@ module ts.server { this.protocol.onResponse = (pkt) => { this.handleRequest(pkt); }; - } - + } + handleRequest(req: NodeJS._debugger.Packet) { this.projectService.log("Got JSON msg:\n" + req.raw); - } - + } + listen() { rl.on('line',(input: string) => { - var cmd = input.trim(); - if (cmd.indexOf("{") == 0) { - // assumption is JSON on single line - // plan is to also carry this protocol - // over tcp, in which case JSON would - // have a Content-Length header - this.executeJSONcmd(cmd); - } - else { - this.executeCmd(cmd); - } + var message = input.trim(); + this.onMessage(message); }); rl.on('close',() => { @@ -115,20 +106,13 @@ module ts.server { this.projectService.log("Exiting..."); process.exit(0); }); - } - } - + } + } + // This places log file in the directory containing editorServices.js // TODO: check that this location is writable - var logger = new Logger(__dirname + "/.log" + process.pid.toString()); - - var host: ServerHost = ts.sys; - - // Wire the debugging interface - if (!host.getDebuggerClient) { - host.getDebuggerClient = () => new nodeproto.Client(); - } - - // Start listening - new IOSession(host, logger, /* useProtocol */ true, /* prettyJSON */ false).listen(); + var logger = new Logger(__dirname + "/.log" + process.pid.toString()); + + // Start listening + new IOSession(ts.sys, logger, /* useProtocol */ true, /* prettyJSON */ false).listen(); } \ No newline at end of file From dfd8a0620dcb3130aec0c82b007edd7feb735236 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 15:50:06 -0800 Subject: [PATCH 055/106] Always default to using JSON and do not format it --- src/harness/harnessLanguageService.ts | 2 +- src/server/protocol.ts | 37 +++------------------------ src/server/server.ts | 24 +++-------------- 3 files changed, 7 insertions(+), 56 deletions(-) diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 2e50ca59b97..9f0062cfd71 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -583,7 +583,7 @@ module Harness.LanguageService { // This host is just a proxy for the clientHost, it uses the client // host to answer server queries about files on disk var serverHost = new SessionServerHost(clientHost); - var server = new ts.server.Session(serverHost, serverHost, /*useProtocol*/ true, /*prettyJSON*/ false); + var server = new ts.server.Session(serverHost, serverHost); // Fake the connection between the client and the server serverHost.writeMessage = client.onMessage.bind(client); diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 16abbf029d7..b9eb72a78ed 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -157,7 +157,7 @@ module ts.server { immediateId: any; changeSeq = 0; - constructor(private host: ServerHost, private logger: Logger, protected useProtocol: boolean, protected prettyJSON: boolean) { + constructor(private host: ServerHost, private logger: Logger) { this.projectService = new ProjectService(host, logger); } @@ -178,13 +178,7 @@ module ts.server { } send(msg: NodeJS._debugger.Message) { - var json: string; - if (this.prettyJSON) { - json = JSON.stringify(msg, null, " "); - } - else { - json = JSON.stringify(msg); - } + var json = JSON.stringify(msg); this.sendLineToClient('Content-Length: ' + (1 + Buffer.byteLength(json, 'utf8')) + '\r\n\r\n' + json); } @@ -229,32 +223,7 @@ module ts.server { } output(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) { - if (this.useProtocol) { - this.response(info, cmdName, reqSeq, errorMsg); - } - else if (this.prettyJSON) { - if (!errorMsg) { - this.sendLineToClient(JSON.stringify(info, null, " ").trim()); - } - else { - this.sendLineToClient(JSON.stringify(errorMsg)); - } - } else { - if (!errorMsg) { - var infoStr = JSON.stringify(info).trim(); - // [8 digits of length,infoStr] + '\n' - var len = infoStr.length + paddedLength + 4; - var lenStr = len.toString(); - var padLen = paddedLength - lenStr.length; - for (var i = 0; i < padLen; i++) { - lenStr = '0' + lenStr; - } - this.sendLineToClient("[" + lenStr + "," + infoStr + "]"); - } - else { - this.sendLineToClient(JSON.stringify("error: " + errorMsg)); - } - } + this.response(info, cmdName, reqSeq, errorMsg); } semanticCheck(file: string, project: Project) { diff --git a/src/server/server.ts b/src/server/server.ts index 9f06e9b0277..974fb491674 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -73,26 +73,8 @@ module ts.server { } class IOSession extends Session { - protocol: NodeJS._debugger.Protocol; - - constructor(host: ServerHost, logger: ts.server.Logger, useProtocol: boolean, prettyJSON: boolean) { - super(host, logger, useProtocol, prettyJSON); - if (useProtocol) { - this.initProtocol(); - } - } - - initProtocol() { - this.protocol = new nodeproto.Protocol(); - // note: onResponse was named by nodejs authors; we are re-purposing the Protocol - // class in this case so that it supports a server instead of a client - this.protocol.onResponse = (pkt) => { - this.handleRequest(pkt); - }; - } - - handleRequest(req: NodeJS._debugger.Packet) { - this.projectService.log("Got JSON msg:\n" + req.raw); + constructor(host: ServerHost, logger: ts.server.Logger) { + super(host, logger); } listen() { @@ -114,5 +96,5 @@ module ts.server { var logger = new Logger(__dirname + "/.log" + process.pid.toString()); // Start listening - new IOSession(ts.sys, logger, /* useProtocol */ true, /* prettyJSON */ false).listen(); + new IOSession(ts.sys, logger).listen(); } \ No newline at end of file From b1750453ada87a7037960aef74a0ae2d5643c894 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 17:21:17 -0800 Subject: [PATCH 056/106] use ts.getDefaultLibFileName to get the default library file name --- src/server/editorServices.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 7007704a168..85ee71adce5 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -139,13 +139,7 @@ module ts.server { getDefaultLibFileName() { var nodeModuleBinDir = ts.getDirectoryPath(ts.normalizePath(this.host.getExecutingFilePath())); - - if (this.compilationSettings && this.compilationSettings.target == ts.ScriptTarget.ES6) { - return nodeModuleBinDir + "/lib.es6.d.ts"; - } - else { - return nodeModuleBinDir + "/lib.d.ts"; - } + return ts.combinePaths(nodeModuleBinDir, ts.getDefaultLibFileName(this.compilationSettings)); } cancel() { From ce828d0caec6fd92924fa640035ed76a6c5474d7 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 17:21:49 -0800 Subject: [PATCH 057/106] Get details for member completions as well as completions matching prefix --- src/server/protocol.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/protocol.ts b/src/server/protocol.ts index b9eb72a78ed..1efc79c5c40 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -536,8 +536,8 @@ module ts.server { throw Errors.NoContent; } - return completions.entries.reduce((accum: ts.CompletionEntryDetails[], entry: ts.CompletionEntry) => { - if (entry.name.indexOf(prefix) == 0) { + return completions.entries.reduce((result: ts.CompletionEntryDetails[], entry: ts.CompletionEntry) => { + if (completions.isMemberCompletion || entry.name.indexOf(prefix) == 0) { var protoEntry = {}; protoEntry.name = entry.name; protoEntry.kind = entry.kind; @@ -551,9 +551,9 @@ module ts.server { if (details && (details.displayParts) && (details.displayParts.length > 0)) { protoEntry.displayParts = details.documentation; } - accum.push(protoEntry); + result.push(protoEntry); } - return accum; + return result; }, []); } From 89267bcd6fb967a6273a41ad51fbbc7445d6df24 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 19:53:12 -0800 Subject: [PATCH 058/106] Move fileWatching logic to the server to allow for testing on non-node systems --- src/compiler/sys.ts | 9 -- src/harness/harnessLanguageService.ts | 30 +---- src/server/editorServices.ts | 179 +++++++------------------- src/server/server.ts | 119 +++++++++++++++++ 4 files changed, 169 insertions(+), 168 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index c666ca991cf..5f10a747d42 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -18,8 +18,6 @@ module ts { readDirectory(path: string, extension?: string): string[]; getMemoryUsage? (): number; exit(exitCode?: number): void; - getModififedTime? (fileName: string): Date; - stat? (fileName: string, callback?: (err: any, stats: any) => any): void; } export interface FileWatcher { @@ -305,13 +303,6 @@ module ts { }, exit(exitCode?: number): void { process.exit(exitCode); - }, - getModififedTime(fileName: string): Date { - var stats = _fs.statSync(fileName); - return stats.mtime; - }, - stat(fileName: string, callback?: (err: any, stats: any) => any) { - _fs.stat(fileName, callback); } }; } diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 9f0062cfd71..712f0afe0aa 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -488,6 +488,10 @@ module Harness.LanguageService { } readFile(fileName: string): string { + if (fileName.indexOf(Harness.Compiler.defaultLibFileName) >= 0) { + fileName = Harness.Compiler.defaultLibFileName; + } + var snapshot = this.host.getScriptSnapshot(fileName); return snapshot && snapshot.getText(0, snapshot.getLength()); } @@ -525,29 +529,9 @@ module Harness.LanguageService { readDirectory(path: string, extension?: string): string[] { throw new Error("Not implemented Yet."); } - - getModififedTime(fileName: string): Date { - return new Date(); - } - - stat(path: string, callback?: (err: any, stats: any) => any) { - return 0; - } - - lineColToPosition(fileName: string, line: number, col: number): number { - return this.host.lineColToPosition(fileName, line, col); - } - - positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { - return this.host.positionToZeroBasedLineCol(fileName, position); - } - - getFileLength(fileName: string): number { - return this.host.getScriptSnapshot(fileName).getLength(); - } - - getFileNames(): string[] { - return this.host.getScriptFileNames(); + + watchFile(fileName: string, callback: (fileName: string) => void): ts.FileWatcher { + return { close() { } }; } close(): void { diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 85ee71adce5..9e6363b509f 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -62,18 +62,15 @@ module ts.server { children: ScriptInfo[] = []; // files referenced by this file defaultProject: Project; // project to use by default for file - mtime: Date; - constructor(private host: ServerHost, public filename: string, public content: string, public isOpen = false) { + fileWatcher: FileWatcher; + + constructor(private host: ServerHost, public fileName: string, public content: string, public isOpen = false) { this.svc = ScriptVersionCache.fromString(content); - if (!isOpen) { - this.mtime = this.host.getModififedTime(filename); - } } close() { this.isOpen = false; - this.mtime = this.host.getModififedTime(this.filename); } addChild(childInfo: ScriptInfo) { @@ -203,7 +200,7 @@ module ts.server { removeReferencedFile(info: ScriptInfo) { if (!info.isOpen) { - this.filenameToScript[info.filename] = undefined; + this.filenameToScript[info.fileName] = undefined; } } @@ -212,7 +209,7 @@ module ts.server { if (!scriptInfo) { scriptInfo = this.project.openReferencedFile(filename); if (scriptInfo) { - this.filenameToScript[scriptInfo.filename] = scriptInfo; + this.filenameToScript[scriptInfo.fileName] = scriptInfo; } } else { @@ -221,9 +218,9 @@ module ts.server { } addRoot(info: ScriptInfo) { - var scriptInfo = ts.lookUp(this.filenameToScript, info.filename); + var scriptInfo = ts.lookUp(this.filenameToScript, info.fileName); if (!scriptInfo) { - this.filenameToScript[info.filename] = info; + this.filenameToScript[info.fileName] = info; return info; } } @@ -363,7 +360,7 @@ module ts.server { } getSourceFile(info: ScriptInfo) { - return this.filenameToSourceFile[info.filename]; + return this.filenameToSourceFile[info.fileName]; } getSourceFileFromName(filename: string) { @@ -439,112 +436,6 @@ module ts.server { return copiedList; } - // REVIEW: for now this implementation uses polling. - // The advantage of polling is that it works reliably - // on all os and with network mounted files. - // For 90 referenced files, the average time to detect - // changes is 2*msInterval (by default 5 seconds). - // The overhead of this is .04 percent (1/2500) with - // average pause of < 1 millisecond (and max - // pause less than 1.5 milliseconds); question is - // do we anticipate reference sets in the 100s and - // do we care about waiting 10-20 seconds to detect - // changes for large reference sets? If so, do we want - // to increase the chunk size or decrease the interval - // time dynamically to match the large reference set? - export class WatchedFileSet { - watchedFiles: ScriptInfo[] = []; - nextFileToCheck = 0; - watchTimer: NodeJS.Timer; - - // average async stat takes about 30 microseconds - // set chunk size to do 30 files in < 1 millisecond - constructor(private host: ServerHost, public fileEvent: (info: ScriptInfo, eventName: string) => void, - public msInterval = 2500, public chunkSize = 30) { - } - - checkWatchedFileChanged(checkedIndex: number, stats: NodeJS.fs.Stats) { - var info = this.watchedFiles[checkedIndex]; - if (info && (!info.isOpen)) { - if (info.mtime.getTime() != stats.mtime.getTime()) { - info.svc.reloadFromFile(info.filename); - } - } - } - - fileDeleted(info: ScriptInfo) { - if (this.fileEvent) { - this.fileEvent(info, "deleted"); - } - } - - static fileDeleted = 34; - - poll(checkedIndex: number) { - var watchedFile = this.watchedFiles[checkedIndex]; - if (!watchedFile) { - return; - } - if (measurePerf) { - var start = process.hrtime(); - } - this.host.stat(watchedFile.filename,(err, stats) => { - if (err) { - var msg = err.message; - if (err.errno) { - msg += " errno: " + err.errno.toString(); - } - if (err.errno == WatchedFileSet.fileDeleted) { - this.fileDeleted(watchedFile); - } - } - else { - this.checkWatchedFileChanged(checkedIndex, stats); - } - }); - if (measurePerf) { - var elapsed = process.hrtime(start); - var elapsedNano = 1e9 * elapsed[0] + elapsed[1]; - } - } - - // this implementation uses polling and - // stat due to inconsistencies of fs.watch - // and efficiency of stat on modern filesystems - startWatchTimer() { - this.watchTimer = setInterval(() => { - var count = 0; - var nextToCheck = this.nextFileToCheck; - var firstCheck = -1; - while ((count < this.chunkSize) && (nextToCheck != firstCheck)) { - this.poll(nextToCheck); - if (firstCheck < 0) { - firstCheck = nextToCheck; - } - nextToCheck++; - if (nextToCheck == this.watchedFiles.length) { - nextToCheck = 0; - } - count++; - } - this.nextFileToCheck = nextToCheck; - }, this.msInterval); - } - - // TODO: remove watch file if opened by editor or no longer referenced - // assume normalized and absolute pathname - addFile(info: ScriptInfo) { - this.watchedFiles.push(info); - if (this.watchedFiles.length == 1) { - this.startWatchTimer(); - } - } - - removeFile(info: ScriptInfo) { - this.watchedFiles = copyListRemovingItem(info, this.watchedFiles); - } - } - interface ProjectServiceEventHandler { (eventName: string, project: Project): void; } @@ -556,20 +447,32 @@ module ts.server { openFilesReferenced: ScriptInfo[] = []; // projects covering open files inferredProjects: Project[] = []; - watchedFileSet: WatchedFileSet; constructor(public host: ServerHost, public psLogger: Logger, public eventHandler?: ProjectServiceEventHandler) { if (measurePerf) { calibrateTimer(); } ts.disableIncrementalParsing = true; - this.watchedFileSet = new WatchedFileSet(this.host,(info, eventName) => { - if (eventName == "deleted") { - this.fileDeletedInFilesystem(info); - } - }); } + watchedFileChanged(fileName: string) { + var info = this.filenameToScriptInfo[fileName]; + if (!info) { + this.psLogger.info("Error: got watch notification for unknown file: " + fileName); + } + + if (!this.host.fileExists(fileName)) { + // File was deleted + this.fileDeletedInFilesystem(info); + } + else { + if (info && (!info.isOpen)) { + info.svc.reloadFromFile(info.fileName); + } + } + } + + log(msg: string, type = "Err") { this.psLogger.msg(msg, type); } @@ -587,11 +490,15 @@ module ts.server { } fileDeletedInFilesystem(info: ScriptInfo) { - this.psLogger.info(info.filename + " deleted"); - this.watchedFileSet.removeFile(info); + this.psLogger.info(info.fileName + " deleted"); + + if (info.fileWatcher) { + info.fileWatcher.close(); + info.fileWatcher = undefined; + } if (!info.isOpen) { - this.filenameToScriptInfo[info.filename] = undefined; + this.filenameToScriptInfo[info.fileName] = undefined; var referencingProjects = this.findReferencingProjects(info); for (var i = 0, len = referencingProjects.length; i < len; i++) { referencingProjects[i].removeReferencedFile(info); @@ -697,13 +604,13 @@ module ts.server { /** * @param filename is absolute pathname */ - openFile(filename: string, openedByClient = false) { - filename = ts.normalizePath(filename); - var info = ts.lookUp(this.filenameToScriptInfo, filename); + openFile(fileName: string, openedByClient = false) { + fileName = ts.normalizePath(fileName); + var info = ts.lookUp(this.filenameToScriptInfo, fileName); if (!info) { var content: string; - if (this.host.fileExists(filename)) { - content = this.host.readFile(filename); + if (this.host.fileExists(fileName)) { + content = this.host.readFile(fileName); } if (!content) { if (openedByClient) { @@ -711,10 +618,10 @@ module ts.server { } } if (content !== undefined) { - info = new ScriptInfo(this.host, filename, content, openedByClient); - this.filenameToScriptInfo[filename] = info; + info = new ScriptInfo(this.host, fileName, content, openedByClient); + this.filenameToScriptInfo[fileName] = info; if (!info.isOpen) { - this.watchedFileSet.addFile(info); + info.fileWatcher = this.host.watchFile(fileName, _ => { this.watchedFileChanged(fileName); }); } } } @@ -800,11 +707,11 @@ module ts.server { } this.psLogger.info("Open file roots: ") for (var i = 0, len = this.openFileRoots.length; i < len; i++) { - this.psLogger.info(this.openFileRoots[i].filename); + this.psLogger.info(this.openFileRoots[i].fileName); } this.psLogger.info("Open files referenced: ") for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { - this.psLogger.info(this.openFilesReferenced[i].filename); + this.psLogger.info(this.openFilesReferenced[i].fileName); } this.psLogger.endGroup(); } diff --git a/src/server/server.ts b/src/server/server.ts index 974fb491674..6d210ff0d13 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -72,6 +72,102 @@ module ts.server { } } + interface WatchedFile { + fileName: string; + callback: (fileName: string) => void; + mtime: Date; + } + + class WatchedFileSet { + private watchedFiles: WatchedFile[] = []; + private nextFileToCheck = 0; + private watchTimer: NodeJS.Timer; + private static fileDeleted = 34; + + // average async stat takes about 30 microseconds + // set chunk size to do 30 files in < 1 millisecond + constructor(public interval = 2500, public chunkSize = 30) { + } + + private static copyListRemovingItem(item: T, list: T[]) { + var copiedList: T[] = []; + for (var i = 0, len = list.length; i < len; i++) { + if (list[i] != item) { + copiedList.push(list[i]); + } + } + return copiedList; + } + + private static getModifiedTime(fileName: string): Date { + return fs.statSync(fileName).mtime; + } + + private poll(checkedIndex: number) { + var watchedFile = this.watchedFiles[checkedIndex]; + if (!watchedFile) { + return; + } + + fs.stat(watchedFile.fileName,(err, stats) => { + if (err) { + var msg = err.message; + if (err.errno) { + msg += " errno: " + err.errno.toString(); + } + if (err.errno == WatchedFileSet.fileDeleted) { + watchedFile.callback(watchedFile.fileName); + } + } + else if (watchedFile.mtime.getTime() != stats.mtime.getTime()) { + watchedFile.mtime = WatchedFileSet.getModifiedTime(watchedFile.fileName); + watchedFile.callback(watchedFile.fileName); + } + }); + } + + // this implementation uses polling and + // stat due to inconsistencies of fs.watch + // and efficiency of stat on modern filesystems + private startWatchTimer() { + this.watchTimer = setInterval(() => { + var count = 0; + var nextToCheck = this.nextFileToCheck; + var firstCheck = -1; + while ((count < this.chunkSize) && (nextToCheck != firstCheck)) { + this.poll(nextToCheck); + if (firstCheck < 0) { + firstCheck = nextToCheck; + } + nextToCheck++; + if (nextToCheck === this.watchedFiles.length) { + nextToCheck = 0; + } + count++; + } + this.nextFileToCheck = nextToCheck; + }, this.interval); + } + + addFile(fileName: string, callback: (fileName: string) => void ): WatchedFile { + var file: WatchedFile = { + fileName, + callback, + mtime: WatchedFileSet.getModifiedTime(fileName) + }; + + this.watchedFiles.push(file); + if (this.watchedFiles.length === 1) { + this.startWatchTimer(); + } + return file; + } + + removeFile(file: WatchedFile) { + this.watchedFiles = WatchedFileSet.copyListRemovingItem(file, this.watchedFiles); + } + } + class IOSession extends Session { constructor(host: ServerHost, logger: ts.server.Logger) { super(host, logger); @@ -95,6 +191,29 @@ module ts.server { // TODO: check that this location is writable var logger = new Logger(__dirname + "/.log" + process.pid.toString()); + + // REVIEW: for now this implementation uses polling. + // The advantage of polling is that it works reliably + // on all os and with network mounted files. + // For 90 referenced files, the average time to detect + // changes is 2*msInterval (by default 5 seconds). + // The overhead of this is .04 percent (1/2500) with + // average pause of < 1 millisecond (and max + // pause less than 1.5 milliseconds); question is + // do we anticipate reference sets in the 100s and + // do we care about waiting 10-20 seconds to detect + // changes for large reference sets? If so, do we want + // to increase the chunk size or decrease the interval + // time dynamically to match the large reference set? + var watchedFileSet = new WatchedFileSet(); + ts.sys.watchFile = function (fileName, callback) { + var watchedFile = watchedFileSet.addFile(fileName, callback); + return { + close: () => watchedFileSet.removeFile(watchedFile) + } + + }; + // Start listening new IOSession(ts.sys, logger).listen(); } \ No newline at end of file From d396ddfa7b211216752647419dfc65f6f80a93cc Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 19:53:23 -0800 Subject: [PATCH 059/106] Add test for completions --- src/server/client.ts | 3 ++- tests/cases/fourslash/server/completions.ts | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/server/completions.ts diff --git a/src/server/client.ts b/src/server/client.ts index 1aa7547f541..aa1ddb34bf7 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -177,10 +177,11 @@ module ts.server { getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.CodeLocationRequestArgs = { + var args: ServerProtocol.CompletionsRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, + prefix: undefined }; var request = this.processRequest(CommandNames.Completions, args); diff --git a/tests/cases/fourslash/server/completions.ts b/tests/cases/fourslash/server/completions.ts new file mode 100644 index 00000000000..82d3b5b2400 --- /dev/null +++ b/tests/cases/fourslash/server/completions.ts @@ -0,0 +1,17 @@ +/// + +////var x: string[] = []; +////x.forEach(function (y) { y/*1*/ +////x.forEach(y => y/*2*/ + +goTo.marker('1'); +edit.insert('.'); +verify.memberListContains('trim'); +verify.memberListCount(20); +edit.insert('});'); // need the following lines to not have parse errors in order for completion list to appear + +goTo.marker('2'); +edit.insert('.'); +verify.memberListContains('trim'); +verify.memberListCount(20); + \ No newline at end of file From 9867e062a2b3a0d2a8850ee6aef9654c01cb9056 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 20:23:16 -0800 Subject: [PATCH 060/106] Add a new definition test --- tests/cases/fourslash/server/definition.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/cases/fourslash/server/definition.ts diff --git a/tests/cases/fourslash/server/definition.ts b/tests/cases/fourslash/server/definition.ts new file mode 100644 index 00000000000..531e4562843 --- /dev/null +++ b/tests/cases/fourslash/server/definition.ts @@ -0,0 +1,12 @@ +/// + +// @Filename: b.ts +////import n = require('a/*1*/'); +////var x = new n.Foo(); + +// @Filename: a.ts +//// /*2*/export class Foo {} + +goTo.marker('1'); +goTo.definition(); +verify.caretAtMarker('2'); \ No newline at end of file From 11e246036bf962d0f7d6a7ac1ac12e8df46fe1cc Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 21:49:10 -0800 Subject: [PATCH 061/106] Add test for find references --- src/server/client.ts | 2 +- src/server/protocol.ts | 1 + src/server/protodef.d.ts | 3 +++ tests/cases/fourslash/server/references.ts | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/server/references.ts diff --git a/src/server/client.ts b/src/server/client.ts index aa1ddb34bf7..3295ec76193 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -301,7 +301,7 @@ module ts.server { return { fileName: entry.file, textSpan: ts.createTextSpanFromBounds(start, end), - isWriteAccess: false, + isWriteAccess: entry.isWriteAccess, }; }); } diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 1efc79c5c40..3e28806b696 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -409,6 +409,7 @@ module ts.server { start: start, lineText: lineText, end: compilerService.host.positionToLineCol(ref.fileName, ts.textSpanEnd(ref.textSpan)), + isWriteAccess: ref.isWriteAccess }; }).sort(compareFileStart); return { diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts index 95e671f561e..b68616a13ec 100644 --- a/src/server/protodef.d.ts +++ b/src/server/protodef.d.ts @@ -127,6 +127,9 @@ declare module ServerProtocol { loaded the referencing files). */ lineText: string; + + /** True if reference is a write location, false otherwise. */ + isWriteAccess: boolean; } /** The body of a "references" response message. */ diff --git a/tests/cases/fourslash/server/references.ts b/tests/cases/fourslash/server/references.ts new file mode 100644 index 00000000000..55b21615551 --- /dev/null +++ b/tests/cases/fourslash/server/references.ts @@ -0,0 +1,18 @@ +/// + +// Global class reference. + +// @Filename: referencesForGlobals_1.ts +////class /*2*/globalClass { +//// public f() { } +////} + +// @Filename: referencesForGlobals_2.ts +/////// +////var c = /*1*/globalClass(); + +goTo.marker("1"); +verify.referencesCountIs(2); + +goTo.marker("2"); +verify.referencesCountIs(2); \ No newline at end of file From 178e8f76e65f3c0971a1015753d0c6f11ea2e52f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 22:28:38 -0800 Subject: [PATCH 062/106] Add test for quickInfo --- src/server/client.ts | 11 +++++---- tests/cases/fourslash/server/quickinfo.ts | 27 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 tests/cases/fourslash/server/quickinfo.ts diff --git a/src/server/client.ts b/src/server/client.ts index 3295ec76193..599de2d8505 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -152,10 +152,11 @@ module ts.server { } getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { + var lineCol = this.positionToOneBasedLineCol(fileName, position); var args: ServerProtocol.CodeLocationRequestArgs = { file: fileName, - line: 0, - col: 1 + line: lineCol.line, + col: lineCol.col }; var request = this.processRequest(CommandNames.Quickinfo, args); @@ -168,10 +169,8 @@ module ts.server { kind: response.body.kind, kindModifiers: response.body.kindModifiers, textSpan: ts.createTextSpanFromBounds(start, end), - displayParts: undefined, - documentation: undefined, - documentationString: response.body.documentation, - displayString: response.body.displayString + displayParts: [{ kind: "text", text: response.body.displayString }], + documentation: [{ kind: "text", text: response.body.documentation }] }; } diff --git a/tests/cases/fourslash/server/quickinfo.ts b/tests/cases/fourslash/server/quickinfo.ts new file mode 100644 index 00000000000..b5c7dc0a01c --- /dev/null +++ b/tests/cases/fourslash/server/quickinfo.ts @@ -0,0 +1,27 @@ +/// + +////interface One { +//// commonProperty: number; +//// commonFunction(): number; +////} +//// +////interface Two { +//// commonProperty: string +//// commonFunction(): number; +////} +//// +////var /*1*/x : One | Two; +//// +////x./*2*/commonProperty; +////x./*3*/commonFunction; + + +goTo.marker("1"); +verify.quickInfoIs('(var) x: One | Two'); + + +goTo.marker("2"); +verify.quickInfoIs('(property) commonProperty: string | number'); + +goTo.marker("3"); +verify.quickInfoIs('(method) commonFunction(): number'); From 40d3cb78d50bc5adc262442c61d8e9609f856910 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 14 Feb 2015 23:07:20 -0800 Subject: [PATCH 063/106] Add test for rename --- src/server/client.ts | 45 ++++++++++++++++++++- src/server/protocol.ts | 55 ++++++-------------------- src/server/protodef.d.ts | 7 ++++ tests/cases/fourslash/server/rename.ts | 11 ++++++ 4 files changed, 73 insertions(+), 45 deletions(-) create mode 100644 tests/cases/fourslash/server/rename.ts diff --git a/src/server/client.ts b/src/server/client.ts index 599de2d8505..960c0723c30 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -322,11 +322,52 @@ module ts.server { } getRenameInfo(fileName: string, position: number): RenameInfo { - throw new Error("Not Implemented Yet."); + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var args: ServerProtocol.RenameRequestArgs = { + file: fileName, + line: lineCol.line, + col: lineCol.col + }; + + var request = this.processRequest(CommandNames.Rename, args); + var response = this.processResponse(request); + + return { + canRename: response.body.info.canRename, + displayName: response.body.info.displayName, + fullDisplayName: response.body.info.fullDisplayName, + kind: response.body.info.kind, + kindModifiers: response.body.info.kindModifiers, + localizedErrorMessage: response.body.info.localizedErrorMessage, + triggerSpan: ts.createTextSpanFromBounds(position, position) + }; } findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { - throw new Error("Not Implemented Yet."); + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var args: ServerProtocol.RenameRequestArgs = { + file: fileName, + line: lineCol.line, + col: lineCol.col, + findInStrings, + findInComments + }; + + var request = this.processRequest(CommandNames.Rename, args); + var response = this.processResponse(request); + + if (!response.body.info.canRename) { + return []; + } + + return response.body.locs.map((entry) => { + var start = this.lineColToPosition(entry.file, entry.start); + var end = this.lineColToPosition(entry.file, entry.end); + return { + textSpan: ts.createTextSpanFromBounds(start, end), + fileName: entry.file + }; + }); } getNavigationBarItems(fileName: string): NavigationBarItem[] { diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 3e28806b696..1404b3ea4b1 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -307,7 +307,7 @@ module ts.server { })); } - rename(line: number, col: number, fileName: string): { info: RenameInfo; locs: ServerProtocol.CodeSpan[] } { + rename(line: number, col: number, fileName: string, findInComments: boolean, findInStrings: boolean): { info: RenameInfo; locs: ServerProtocol.CodeSpan[] } { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -328,48 +328,17 @@ module ts.server { }; } - var renameLocs = compilerService.languageService.findRenameLocations(file, position, false, false); - if (renameLocs) { - var bakedRenameLocs = renameLocs.map(loc=> ({ - file: loc.fileName, - start: compilerService.host.positionToLineCol(loc.fileName, loc.textSpan.start), - end: compilerService.host.positionToLineCol(loc.fileName, ts.textSpanEnd(loc.textSpan)), - })).sort((a, b) => { - if (a.file < b.file) { - return -1; - } - else if (a.file > b.file) { - return 1; - } - else { - // reverse sort assuming no overlap - if (a.start.line < b.start.line) { - return 1; - } - else if (a.start.line > b.start.line) { - return -1; - } - else { - return b.start.col - a.start.col; - } - } - }).reduce((accum, cur) => { - var curFileAccum: FileRanges; - if (accum.length > 0) { - curFileAccum = accum[accum.length - 1]; - if (curFileAccum.file != cur.file) { - curFileAccum = undefined; - } - } - if (!curFileAccum) { - curFileAccum = { file: cur.file, locs: [] }; - accum.push(curFileAccum); - } - curFileAccum.locs.push({ start: cur.start, end: cur.end }); - return accum; - }, []); + var renameLocs = compilerService.languageService.findRenameLocations(file, position, findInStrings, findInComments); + if (!renameLocs) { + throw Errors.NoContent; } + var bakedRenameLocs = renameLocs.map(loc => ({ + file: loc.fileName, + start: compilerService.host.positionToLineCol(loc.fileName, loc.textSpan.start), + end: compilerService.host.positionToLineCol(loc.fileName, ts.textSpanEnd(loc.textSpan)), + })); + return { info: renameInfo, locs: bakedRenameLocs }; } @@ -731,8 +700,8 @@ module ts.server { break; } case CommandNames.Rename: { - var renameArgs = request.arguments; - response = this.rename(renameArgs.line, renameArgs.col, renameArgs.file); + var renameArgs = request.arguments; + response = this.rename(renameArgs.line, renameArgs.col, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); break; } case CommandNames.Open: { diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts index b68616a13ec..fb88d30d2ef 100644 --- a/src/server/protodef.d.ts +++ b/src/server/protodef.d.ts @@ -151,6 +151,12 @@ declare module ServerProtocol { body?: ReferencesResponseBody; } + export interface RenameRequestArgs extends CodeLocationRequestArgs { + findInComments?: boolean; + findInStrings?: boolean; + } + + /** Rename request; value of command field is "rename". Return response giving the code locations that reference the symbol @@ -158,6 +164,7 @@ declare module ServerProtocol { name of the symbol so that client can print it unambiguously. */ export interface RenameRequest extends CodeLocationRequest { + arguments: RenameRequestArgs; } /** Information about the item to be renamed. */ diff --git a/tests/cases/fourslash/server/rename.ts b/tests/cases/fourslash/server/rename.ts new file mode 100644 index 00000000000..4f8b7b98cd4 --- /dev/null +++ b/tests/cases/fourslash/server/rename.ts @@ -0,0 +1,11 @@ +/// + +/////// + +////function /**/[|Bar|]() { +//// // This is a reference to [|Bar|] in a comment. +//// "this is a reference to [|Bar|] in a string" +////} + +goTo.marker(); +verify.renameLocations(/*findInStrings:*/ true, /*findInComments:*/ true); \ No newline at end of file From 2a02655f728be9b3d54e1b5c783ed588c280399f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 16:23:36 -0800 Subject: [PATCH 064/106] Add navbar test --- src/harness/fourslash.ts | 2 +- src/server/client.ts | 26 ++++++++- src/server/protocol.ts | 78 +++++++++++++------------- src/server/protodef.d.ts | 28 +++++++++ tests/cases/fourslash/server/navbar.ts | 52 +++++++++++++++++ 5 files changed, 144 insertions(+), 42 deletions(-) create mode 100644 tests/cases/fourslash/server/navbar.ts diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index bc7a8718a76..bb144742f45 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1932,7 +1932,7 @@ module FourSlash { } var missingItem = { name: name, kind: kind }; - this.raiseError('verifyGetScriptLexicalStructureListContains failed - could not find the item: ' + JSON.stringify(missingItem) + ' in the returned list: (' + JSON.stringify(items) + ')'); + this.raiseError('verifyGetScriptLexicalStructureListContains failed - could not find the item: ' + JSON.stringify(missingItem) + ' in the returned list: (' + JSON.stringify(items, null, " ") + ')'); } private navigationBarItemsContains(items: ts.NavigationBarItem[], name: string, kind: string) { diff --git a/src/server/client.ts b/src/server/client.ts index 960c0723c30..d23bc5c7359 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -370,8 +370,32 @@ module ts.server { }); } + decodeNavigationBarItems(items: ServerProtocol.NavigationBarItem[], fileName: string): NavigationBarItem[] { + if (!items) { + return []; + } + + return items.map(item => ({ + text: item.text, + kind: item.kind, + kindModifiers: item.kindModifiers || "", + spans: item.spans.map(span=> createTextSpanFromBounds(this.lineColToPosition(fileName, span.start), this.lineColToPosition(fileName, span.end))), + childItems: this.decodeNavigationBarItems(item.childItems, fileName), + indent: 0, + bolded: false, + grayed: false + })); + } + getNavigationBarItems(fileName: string): NavigationBarItem[] { - throw new Error("Not Implemented Yet."); + var args: ServerProtocol.FileRequestArgs = { + file: fileName + }; + + var request = this.processRequest(CommandNames.NavBar, args); + var response = this.processResponse(request); + + return this.decodeNavigationBarItems(response.body, fileName); } getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan { diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 1404b3ea4b1..0e6a0ff8f65 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -4,13 +4,6 @@ /// /// -module ts { - export interface NavigationBarItem { - displayString?: string; - docString?: string; - } -} - module ts.server { var paddedLength = 8; @@ -129,6 +122,7 @@ module ts.server { export var Format = "format"; export var Formatonkey = "formatonkey"; export var Geterr = "geterr"; + export var NavBar = "navbar"; export var Navto = "navto"; export var Open = "open"; export var Quickinfo = "quickinfo"; @@ -426,7 +420,7 @@ module ts.server { if (!project) { throw Errors.NoProject; } - + var compilerService = project.compilerService; var startPosition = compilerService.host.lineColToPosition(file, line, col); var endPosition = compilerService.host.lineColToPosition(file, endLine, endCol); @@ -436,7 +430,7 @@ module ts.server { if (!edits) { throw Errors.NoContent; } - + return edits.map((edit) => { return { start: compilerService.host.positionToLineCol(file, edit.span.start), @@ -500,7 +494,7 @@ module ts.server { var compilerService = project.compilerService; var position = compilerService.host.lineColToPosition(file, line, col); - + var completions = compilerService.languageService.getCompletionsAtPosition(file, position); if (!completions) { throw Errors.NoContent; @@ -526,7 +520,7 @@ module ts.server { return result; }, []); } - + geterr(delay: number, fileNames: string[]) { var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => { fileName = ts.normalizePath(fileName); @@ -587,40 +581,39 @@ module ts.server { this.projectService.closeClientFile(file); } - decorateNavBarItem(navBarItem: ts.NavigationBarItem, compilerService: CompilerService, file: string) { - if (navBarItem.spans.length == 1) { - var span = navBarItem.spans[0]; - var offset = span.start; - var textForSpan = compilerService.host.getScriptSnapshot(file).getText(offset, offset + span.length); - var adj = textForSpan.indexOf(navBarItem.text); - if (adj > 0) { - offset += adj; - } - var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, - offset + (navBarItem.text.length / 2)); - if (quickInfo) { - var displayString = ts.displayPartsToString(quickInfo.displayParts); - var docString = ts.displayPartsToString(quickInfo.documentation); - navBarItem.displayString = displayString; - navBarItem.docString = docString; - } + decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): ServerProtocol.NavigationBarItem[] { + if (!items) { + return undefined; } - if (navBarItem.childItems.length > 0) { - navBarItem.childItems = - navBarItem.childItems.map(navBarItem => this.decorateNavBarItem(navBarItem, compilerService, file)); - } - return navBarItem; + + var compilerService = project.compilerService; + + return items.map(item => ({ + text: item.text, + kind: item.kind, + kindModifiers: item.kindModifiers, + spans: item.spans.map(span => ({ + start: compilerService.host.positionToLineCol(fileName, span.start), + end: compilerService.host.positionToLineCol(fileName, ts.textSpanEnd(span)) + })), + childItems: this.decorateNavigationBarItem(project, fileName, item.childItems) + })); } - navbar(rawfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); + navbar(fileName: string): ServerProtocol.NavigationBarItem[] { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); - if (project) { - var compilerService = project.compilerService; - var navBarItems = compilerService.languageService.getNavigationBarItems(file); - var bakedNavBarItems = navBarItems.map(navBarItem => this.decorateNavBarItem(navBarItem, compilerService, file)); - this.sendLineToClient(JSON.stringify(bakedNavBarItems, null, " ")); + if (!project) { + throw Errors.NoProject; } + + var compilerService = project.compilerService; + var items = compilerService.languageService.getNavigationBarItems(file); + if (!items) { + throw Errors.NoContent; + } + + return this.decorateNavigationBarItem(project, fileName, items); } navto(searchTerm: string, fileName: string): ServerProtocol.NavtoItem[] { @@ -765,6 +758,11 @@ module ts.server { response = this.getBraceMatching(braceArguments.line, braceArguments.col, braceArguments.file); break; } + case CommandNames.NavBar: { + var navBarArgs = request.arguments; + response = this.navbar(navBarArgs.file); + break; + } default: { this.projectService.log("Unrecognized JSON command: " + message); this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command); diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts index fb88d30d2ef..12fd7163c1a 100644 --- a/src/server/protodef.d.ts +++ b/src/server/protodef.d.ts @@ -562,6 +562,34 @@ declare module ServerProtocol { export interface BraceRequest extends CodeLocationRequest { } + /** + NavBar itesm request; value of command field is "navbar". + Return response giving the list of navigation bar entries + extracted from the requested file. + */ + export interface NavBarRequest extends FileRequest { + } + + export interface NavigationBarItem { + /** The item's display text */ + text: string; + + /** The symbol's kind (such as 'className' or 'parameterName') */ + kind: string; + + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers?: string; + + /** The definition locations of the item */ + spans: TextSpan[]; + + /** Optional children */ + childItems?: NavigationBarItem[]; + } + + export interface NavBarResponse extends Response { + body?: NavigationBarItem[]; + } } diff --git a/tests/cases/fourslash/server/navbar.ts b/tests/cases/fourslash/server/navbar.ts new file mode 100644 index 00000000000..e18f49c1db9 --- /dev/null +++ b/tests/cases/fourslash/server/navbar.ts @@ -0,0 +1,52 @@ +/// + +////// Interface +////{| "itemName": "IPoint", "kind": "interface", "parentName": "" |}interface IPoint { +//// {| "itemName": "getDist", "kind": "method", "parentName": "IPoint" |}getDist(): number; +//// {| "itemName": "new()", "kind": "construct", "parentName": "IPoint" |}new(): IPoint; +//// {| "itemName": "()", "kind": "call", "parentName": "IPoint" |}(): any; +//// {| "itemName": "[]", "kind": "index", "parentName": "IPoint" |}[x:string]: number; +//// {| "itemName": "prop", "kind": "property", "parentName": "IPoint" |}prop: string; +////} +//// +/////// Module +////{| "itemName": "Shapes", "kind": "module", "parentName": "" |}module Shapes { +//// +//// // Class +//// {| "itemName": "Point", "kind": "class", "parentName": "Shapes" |}export class Point implements IPoint { +//// {| "itemName": "constructor", "kind": "constructor", "parentName": "Shapes.Point" |}constructor (public x: number, public y: number) { } +//// +//// // Instance member +//// {| "itemName": "getDist", "kind": "method", "parentName": "Shapes.Point" |}getDist() { return Math.sqrt(this.x * this.x + this.y * this.y); } +//// +//// // Getter +//// {| "itemName": "value", "kind": "getter", "parentName": "Shapes.Point" |}get value(): number { return 0; } +//// +//// // Setter +//// {| "itemName": "value", "kind": "setter", "parentName": "Shapes.Point" |}set value(newValue: number) { return; } +//// +//// // Static member +//// {| "itemName": "origin", "kind": "property", "parentName": "Shapes.Point" |}static origin = new Point(0, 0); +//// +//// // Static method +//// {| "itemName": "getOrigin", "kind": "method", "parentName": "Shapes.Point" |}private static getOrigin() { return Point.origin;} +//// } +//// +//// {| "itemName": "Values", "kind": "enum", "parentName": "Shapes" |}enum Values { +//// value1, +//// {| "itemName": "value2", "kind": "property", "parentName": "Shapes.Values" |}value2, +//// value3, +//// } +////} +//// +////// Local variables +////{| "itemName": "p", "kind": "var", "parentName": "" |}var p: IPoint = new Shapes.Point(3, 4); +////{| "itemName": "dist", "kind": "var", "parentName": "" |}var dist = p.getDist(); + +test.markers().forEach((marker) => { + if (marker.data) { + verify.getScriptLexicalStructureListContains(marker.data.itemName, marker.data.kind, marker.fileName, marker.data.parentName); + } +}); + +verify.getScriptLexicalStructureListCount(23); From 50ca35a979c6ba8744061546b50e743c73280df2 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 16:28:39 -0800 Subject: [PATCH 065/106] Make method names inline with matching LS function names --- src/server/protocol.ts | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 0e6a0ff8f65..04b3ce065b0 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -277,7 +277,7 @@ module ts.server { } } - goToDefinition(line: number, col: number, fileName: string): ServerProtocol.CodeSpan[] { + getDefinition(line: number, col: number, fileName: string): ServerProtocol.CodeSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -301,7 +301,7 @@ module ts.server { })); } - rename(line: number, col: number, fileName: string, findInComments: boolean, findInStrings: boolean): { info: RenameInfo; locs: ServerProtocol.CodeSpan[] } { + getRenameLocations(line: number, col: number, fileName: string, findInComments: boolean, findInStrings: boolean): { info: RenameInfo; locs: ServerProtocol.CodeSpan[] } { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -336,7 +336,7 @@ module ts.server { return { info: renameInfo, locs: bakedRenameLocs }; } - findReferences(line: number, col: number, fileName: string): ServerProtocol.ReferencesResponseBody { + getReferences(line: number, col: number, fileName: string): ServerProtocol.ReferencesResponseBody { // TODO: get all projects for this file; report refs for all projects deleting duplicates // can avoid duplicates by eliminating same ref file from subsequent projects var file = ts.normalizePath(fileName); @@ -388,7 +388,7 @@ module ts.server { this.projectService.openClientFile(file); } - quickInfo(line: number, col: number, fileName: string): ServerProtocol.QuickInfoResponseBody { + getQuickInfo(line: number, col: number, fileName: string): ServerProtocol.QuickInfoResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -414,7 +414,7 @@ module ts.server { }; } - format(line: number, col: number, endLine: number, endCol: number, fileName: string): ServerProtocol.CodeEdit[] { + getFormattingEditsForRange(line: number, col: number, endLine: number, endCol: number, fileName: string): ServerProtocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -440,7 +440,7 @@ module ts.server { }); } - formatOnKey(line: number, col: number, key: string, fileName: string): ServerProtocol.CodeEdit[] { + getFormattingEditsAfterKeystroke(line: number, col: number, key: string, fileName: string): ServerProtocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -482,7 +482,7 @@ module ts.server { }); } - completions(line: number, col: number, prefix: string, fileName: string): ServerProtocol.CompletionItem[] { + getCompletions(line: number, col: number, prefix: string, fileName: string): ServerProtocol.CompletionItem[] { if (!prefix) { prefix = ""; } @@ -521,7 +521,7 @@ module ts.server { }, []); } - geterr(delay: number, fileNames: string[]) { + getDiagnostics(delay: number, fileNames: string[]) { var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => { fileName = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(fileName); @@ -600,7 +600,7 @@ module ts.server { })); } - navbar(fileName: string): ServerProtocol.NavigationBarItem[] { + getNavigationBarItems(fileName: string): ServerProtocol.NavigationBarItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -616,7 +616,7 @@ module ts.server { return this.decorateNavigationBarItem(project, fileName, items); } - navto(searchTerm: string, fileName: string): ServerProtocol.NavtoItem[] { + getNavigateToItems(searchTerm: string, fileName: string): ServerProtocol.NavtoItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -684,17 +684,17 @@ module ts.server { switch (request.command) { case CommandNames.Definition: { var defArgs = request.arguments; - response = this.goToDefinition(defArgs.line, defArgs.col, defArgs.file); + response = this.getDefinition(defArgs.line, defArgs.col, defArgs.file); break; } case CommandNames.References: { var refArgs = request.arguments; - response = this.findReferences(refArgs.line, refArgs.col, refArgs.file); + response = this.getReferences(refArgs.line, refArgs.col, refArgs.file); break; } case CommandNames.Rename: { var renameArgs = request.arguments; - response = this.rename(renameArgs.line, renameArgs.col, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); + response = this.getRenameLocations(renameArgs.line, renameArgs.col, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); break; } case CommandNames.Open: { @@ -704,27 +704,27 @@ module ts.server { } case CommandNames.Quickinfo: { var quickinfoArgs = request.arguments; - response = this.quickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); + response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); break; } case CommandNames.Format: { var formatArgs = request.arguments; - response = this.format(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file); + response = this.getFormattingEditsForRange(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file); break; } case CommandNames.Formatonkey: { var formatOnKeyArgs = request.arguments; - response = this.formatOnKey(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file); + response = this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file); break; } case CommandNames.Completions: { var completionsArgs = request.arguments; - response = this.completions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); + response = this.getCompletions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); break; } case CommandNames.Geterr: { var geterrArgs = request.arguments; - response = this.geterr(geterrArgs.delay, geterrArgs.files); + response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); break; } case CommandNames.Change: { @@ -750,7 +750,7 @@ module ts.server { } case CommandNames.Navto: { var navtoArgs = request.arguments; - response = this.navto(navtoArgs.searchTerm, navtoArgs.file); + response = this.getNavigateToItems(navtoArgs.searchTerm, navtoArgs.file); break; } case CommandNames.Brace: { @@ -760,7 +760,7 @@ module ts.server { } case CommandNames.NavBar: { var navBarArgs = request.arguments; - response = this.navbar(navBarArgs.file); + response = this.getNavigationBarItems(navBarArgs.file); break; } default: { From 8944df18d44da30b689ec53861d7214e534d8ee0 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 17:37:26 -0800 Subject: [PATCH 066/106] use EncodedFile everywhere in responses --- src/server/client.ts | 85 +++++++++++++++++++++++----------------- src/server/protocol.ts | 64 +++++++++++++++--------------- src/server/protodef.d.ts | 8 +++- 3 files changed, 85 insertions(+), 72 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index d23bc5c7359..24666c8f4c7 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -6,11 +6,20 @@ module ts.server { writeMessage(message: string): void; } + interface RenameEntry extends RenameInfo { + fileName: string; + position: number; + locations: RenameLocation[]; + findInStrings: boolean; + findInComments: boolean; + } + export class SessionClient implements LanguageService { private sequence: number = 0; private fileMapping: ts.Map = {}; private lineMaps: ts.Map = {}; private messages: string[] = []; + private lastRenameEntry: RenameEntry; constructor(private host: SessionClientHost) { } @@ -54,7 +63,7 @@ module ts.server { }; } - private getFileNameFromEncodedFile(fileId: ServerProtocol.EncodedFile): string { + private decodeEncodedFileId(fileId: ServerProtocol.EncodedFile): string { var fileName: string; if (typeof fileId === "object") { fileName = (fileId).file; @@ -203,7 +212,7 @@ module ts.server { var response = this.processResponse(request); return response.body.map(entry => { - var fileName = this.getFileNameFromEncodedFile(entry.file); + var fileName = this.decodeEncodedFileId(entry.file); var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); @@ -270,12 +279,13 @@ module ts.server { var response = this.processResponse(request); return response.body.map(entry => { + var fileName = this.decodeEncodedFileId(entry.file); var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); return { containerKind: "", containerName: "", - fileName: entry.file, + fileName: fileName, textSpan: ts.createTextSpanFromBounds(start, end), kind: "", name: "" @@ -295,10 +305,11 @@ module ts.server { var response = this.processResponse(request); return response.body.refs.map(entry => { + var fileName = this.decodeEncodedFileId(entry.file); var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); return { - fileName: entry.file, + fileName: fileName, textSpan: ts.createTextSpanFromBounds(start, end), isWriteAccess: entry.isWriteAccess, }; @@ -321,29 +332,7 @@ module ts.server { throw new Error("Not Implemented Yet."); } - getRenameInfo(fileName: string, position: number): RenameInfo { - var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.RenameRequestArgs = { - file: fileName, - line: lineCol.line, - col: lineCol.col - }; - - var request = this.processRequest(CommandNames.Rename, args); - var response = this.processResponse(request); - - return { - canRename: response.body.info.canRename, - displayName: response.body.info.displayName, - fullDisplayName: response.body.info.fullDisplayName, - kind: response.body.info.kind, - kindModifiers: response.body.info.kindModifiers, - localizedErrorMessage: response.body.info.localizedErrorMessage, - triggerSpan: ts.createTextSpanFromBounds(position, position) - }; - } - - findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { + getRenameInfo(fileName: string, position: number, findInStrings?: boolean, findInComments?: boolean): RenameInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); var args: ServerProtocol.RenameRequestArgs = { file: fileName, @@ -356,18 +345,40 @@ module ts.server { var request = this.processRequest(CommandNames.Rename, args); var response = this.processResponse(request); - if (!response.body.info.canRename) { - return []; + return this.lastRenameEntry = { + canRename: response.body.info.canRename, + displayName: response.body.info.displayName, + fullDisplayName: response.body.info.fullDisplayName, + kind: response.body.info.kind, + kindModifiers: response.body.info.kindModifiers, + localizedErrorMessage: response.body.info.localizedErrorMessage, + triggerSpan: ts.createTextSpanFromBounds(position, position), + fileName: fileName, + position: position, + findInStrings: findInStrings, + findInComments: findInComments, + locations: response.body.locs.map((entry) => { + var fileName = this.decodeEncodedFileId(entry.file); + var start = this.lineColToPosition(fileName, entry.start); + var end = this.lineColToPosition(fileName, entry.end); + return { + textSpan: ts.createTextSpanFromBounds(start, end), + fileName: fileName + }; + }) + }; + } + + findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { + if (!this.lastRenameEntry || + this.lastRenameEntry.fileName !== fileName || + this.lastRenameEntry.position !== position || + this.lastRenameEntry.findInStrings != findInStrings || + this.lastRenameEntry.findInComments != findInComments) { + this.getRenameInfo(fileName, position, findInStrings, findInComments); } - return response.body.locs.map((entry) => { - var start = this.lineColToPosition(entry.file, entry.start); - var end = this.lineColToPosition(entry.file, entry.end); - return { - textSpan: ts.createTextSpanFromBounds(start, end), - fileName: entry.file - }; - }); + return this.lastRenameEntry.locations; } decodeNavigationBarItems(items: ServerProtocol.NavigationBarItem[], fileName: string): NavigationBarItem[] { diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 04b3ce065b0..386a477cf0f 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -27,7 +27,7 @@ module ts.server { } interface FileStart { - file: string; + file: ServerProtocol.EncodedFile; start: ILineInfo; } @@ -92,9 +92,9 @@ module ts.server { locs: FileRange[]; } - function formatDiag(file: string, project: Project, diag: ts.Diagnostic) { + function formatDiag(fileName: string, project: Project, diag: ts.Diagnostic) { return { - start: project.compilerService.host.positionToLineCol(file, diag.start), + start: project.compilerService.host.positionToLineCol(fileName, diag.start), len: diag.length, text: diag.messageText, }; @@ -204,7 +204,7 @@ module ts.server { this.send(res); } - encodeFilename(fileName: string): ServerProtocol.EncodedFile { + encodeFileName(fileName: string): ServerProtocol.EncodedFile { var id = ts.lookUp(this.fileHash, fileName); if (!id) { id = this.nextFileId++; @@ -216,15 +216,15 @@ module ts.server { } } - output(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) { - this.response(info, cmdName, reqSeq, errorMsg); + output(body: any, commandName: string, requestSequence = 0, errorMessage?: string) { + this.response(body, commandName, requestSequence, errorMessage); } 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"); + this.event({ file: this.encodeFileName(file), diagnostics: bakedDiags }, "semanticDiag"); } } @@ -232,7 +232,7 @@ module ts.server { 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"); + this.event({ file: this.encodeFileName(file), diagnostics: bakedDiags }, "syntaxDiag"); } } @@ -293,11 +293,9 @@ module ts.server { } return definitions.map(def => ({ - file: def && def.fileName, - start: def && - compilerService.host.positionToLineCol(def.fileName, def.textSpan.start), - end: def && - compilerService.host.positionToLineCol(def.fileName, ts.textSpanEnd(def.textSpan)) + file: this.encodeFileName(def.fileName), + start: compilerService.host.positionToLineCol(def.fileName, def.textSpan.start), + end: compilerService.host.positionToLineCol(def.fileName, ts.textSpanEnd(def.textSpan)) })); } @@ -322,15 +320,15 @@ module ts.server { }; } - var renameLocs = compilerService.languageService.findRenameLocations(file, position, findInStrings, findInComments); - if (!renameLocs) { + var renameLocations = compilerService.languageService.findRenameLocations(file, position, findInStrings, findInComments); + if (!renameLocations) { throw Errors.NoContent; } - var bakedRenameLocs = renameLocs.map(loc => ({ - file: loc.fileName, - start: compilerService.host.positionToLineCol(loc.fileName, loc.textSpan.start), - end: compilerService.host.positionToLineCol(loc.fileName, ts.textSpanEnd(loc.textSpan)), + var bakedRenameLocs = renameLocations.map(location => ({ + file: this.encodeFileName(location.fileName), + start: compilerService.host.positionToLineCol(location.fileName, location.textSpan.start), + end: compilerService.host.positionToLineCol(location.fileName, ts.textSpanEnd(location.textSpan)), })); return { info: renameInfo, locs: bakedRenameLocs }; @@ -368,7 +366,7 @@ module ts.server { var snap = compilerService.host.getScriptSnapshot(ref.fileName); var lineText = snap.getText(refLineSpan.start, ts.textSpanEnd(refLineSpan)).replace(/\r|\n/g, ""); return { - file: ref.fileName, + file: this.encodeFileName(ref.fileName), start: start, lineText: lineText, end: compilerService.host.positionToLineCol(ref.fileName, ts.textSpanEnd(ref.textSpan)), @@ -383,8 +381,8 @@ module ts.server { }; } - openClientFile(rawfile: string) { - var file = ts.normalizePath(rawfile); + openClientFile(fileName: string) { + var file = ts.normalizePath(fileName); this.projectService.openClientFile(file); } @@ -536,8 +534,8 @@ module ts.server { } } - change(line: number, col: number, deleteLen: number, insertString: string, rawfile: string) { - var file = ts.normalizePath(rawfile); + change(line: number, col: number, deleteLen: number, insertString: string, fileName: string) { + var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (project) { var compilerService = project.compilerService; @@ -553,9 +551,9 @@ module ts.server { } } - reload(rawfile: string, rawtmpfile: string, reqSeq = 0) { - var file = ts.normalizePath(rawfile); - var tmpfile = ts.normalizePath(rawtmpfile); + reload(fileName: string, tempFileName: string, reqSeq = 0) { + var file = ts.normalizePath(fileName); + var tmpfile = ts.normalizePath(tempFileName); var project = this.projectService.getProjectForFile(file); if (project) { this.changeSeq++; @@ -566,9 +564,9 @@ module ts.server { } } - saveToTmp(rawfile: string, rawtmpfile: string) { - var file = ts.normalizePath(rawfile); - var tmpfile = ts.normalizePath(rawtmpfile); + saveToTmp(fileName: string, tempFileName: string) { + var file = ts.normalizePath(fileName); + var tmpfile = ts.normalizePath(tempFileName); var project = this.projectService.getProjectForFile(file); if (project) { @@ -576,8 +574,8 @@ module ts.server { } } - closeClientFile(rawfile: string) { - var file = ts.normalizePath(rawfile); + closeClientFile(fileName: string) { + var file = ts.normalizePath(fileName); this.projectService.closeClientFile(file); } @@ -635,7 +633,7 @@ module ts.server { var bakedItem: ServerProtocol.NavtoItem = { name: navItem.name, kind: navItem.kind, - file: this.encodeFilename(navItem.fileName), + file: this.encodeFileName(navItem.fileName), start: start, end: end, }; diff --git a/src/server/protodef.d.ts b/src/server/protodef.d.ts index 12fd7163c1a..d2dcf4260ef 100644 --- a/src/server/protodef.d.ts +++ b/src/server/protodef.d.ts @@ -101,8 +101,12 @@ declare module ServerProtocol { a specific source file. */ export interface CodeSpan extends TextSpan { - /** File containing the definition */ - file: string; + /** + File containing the definition; the value of this + field will always be a string, number of a mapping between + a string and a number. + */ + file: EncodedFile; } /** From 76c7fdf6d171af73be8f060457a56e2bcdd0f67f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 18:24:30 -0800 Subject: [PATCH 067/106] Add test for completionEntryDetails --- src/server/client.ts | 31 ++++++++++++++++---- src/server/protocol.ts | 2 +- tests/cases/fourslash/server/completions2.ts | 18 ++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 tests/cases/fourslash/server/completions2.ts diff --git a/src/server/client.ts b/src/server/client.ts index 24666c8f4c7..0f06fc106af 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -6,6 +6,11 @@ module ts.server { writeMessage(message: string): void; } + interface CompletionEntry extends CompletionInfo { + fileName: string; + position: number; + } + interface RenameEntry extends RenameInfo { fileName: string; position: number; @@ -19,6 +24,7 @@ module ts.server { private fileMapping: ts.Map = {}; private lineMaps: ts.Map = {}; private messages: string[] = []; + private lastCompletionEntry: CompletionEntry; private lastRenameEntry: RenameEntry; constructor(private host: SessionClientHost) { @@ -195,13 +201,30 @@ module ts.server { var request = this.processRequest(CommandNames.Completions, args); var response = this.processResponse(request); - return { + return this.lastCompletionEntry = { isMemberCompletion: false, isNewIdentifierLocation: false, - entries: response.body.map(entry => ({ kind: entry.kind, kindModifiers: entry.kindModifiers, name: entry.name })) + entries: response.body.map(entry => ({ + kind: entry.kind, + kindModifiers: entry.kindModifiers, + name: entry.name, + displayParts: entry.displayParts, + documentation: entry.documentation + })), + fileName: fileName, + position: position }; } + getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails { + debugger; + if (!this.lastCompletionEntry || this.lastCompletionEntry.fileName !== fileName || this.lastCompletionEntry.position !== position) { + this.getCompletionsAtPosition(fileName, position); + } + + return this.lastCompletionEntry.entries.filter(entry => entry.name === entryName)[0]; + } + getNavigateToItems(searchTerm: string): NavigateToItem[] { var args: ServerProtocol.NavtoRequestArgs = { searchTerm, @@ -466,10 +489,6 @@ module ts.server { throw new Error("Not Implemented Yet."); } - getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails { - throw new Error("Not Implemented Yet."); - } - getProgram(): Program { throw new Error("SourceFile objects are not serializable through the server protocol."); } diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 386a477cf0f..0b62e86d16e 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -511,7 +511,7 @@ module ts.server { protoEntry.documentation = details.documentation; } if (details && (details.displayParts) && (details.displayParts.length > 0)) { - protoEntry.displayParts = details.documentation; + protoEntry.displayParts = details.displayParts; } result.push(protoEntry); } diff --git a/tests/cases/fourslash/server/completions2.ts b/tests/cases/fourslash/server/completions2.ts new file mode 100644 index 00000000000..b34aad66ba2 --- /dev/null +++ b/tests/cases/fourslash/server/completions2.ts @@ -0,0 +1,18 @@ +/// + +////class Foo { +////} +////module Foo { +//// export var x: number; +////} +////Foo./**/ + +goTo.marker(""); +verify.completionListContains("x"); + +// Make an edit +edit.insert("a"); +edit.backspace(); + +// Checking for completion details after edit should work too +verify.completionEntryDetailIs("x", "(var) Foo.x: number"); From d9d2e994950b614f8afc91794879155464038891 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 18:43:39 -0800 Subject: [PATCH 068/106] Remove debugging statemetns --- src/server/client.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index 0f06fc106af..8ff881611d3 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -99,8 +99,6 @@ module ts.server { } private processResponse(request: ServerProtocol.Request): T { - debugger; - var lastMessage = this.messages.shift(); Debug.assert(!!lastMessage, "Did not recieve any responses."); @@ -217,7 +215,6 @@ module ts.server { } getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails { - debugger; if (!this.lastCompletionEntry || this.lastCompletionEntry.fileName !== fileName || this.lastCompletionEntry.position !== position) { this.getCompletionsAtPosition(fileName, position); } From f5c1bfbca7618e8638f447e1679dbac6e11959e5 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 18:49:22 -0800 Subject: [PATCH 069/106] renmae protodef.d.ts to protocol.d.ts and protocol.ts to session.ts --- Jakefile | 6 ++++-- src/harness/harness.ts | 2 +- src/server/client.ts | 2 +- src/server/{protodef.d.ts => protocol.d.ts} | 0 src/server/server.ts | 2 +- src/server/{protocol.ts => session.ts} | 10 +++++----- 6 files changed, 12 insertions(+), 10 deletions(-) rename src/server/{protodef.d.ts => protocol.d.ts} (100%) rename src/server/{protocol.ts => session.ts} (97%) diff --git a/Jakefile b/Jakefile index acd81b0ccd5..bb57469ac33 100644 --- a/Jakefile +++ b/Jakefile @@ -94,7 +94,8 @@ var servicesSources = [ var serverSources = [ "node.d.ts", "editorServices.ts", - "protocol.ts", + "protocol.d.ts", + "session.ts", "server.ts" ].map(function (f) { return path.join(serverDirectory, f); @@ -141,7 +142,8 @@ var harnessSources = [ ].map(function (f) { return path.join(unittestsDirectory, f); })).concat([ - "protocol.ts", + "protocol.d.ts", + "session.ts", "client.ts", "editorServices.ts", ].map(function (f) { diff --git a/src/harness/harness.ts b/src/harness/harness.ts index cbc4064119a..8ee51f89c9c 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -16,7 +16,7 @@ /// /// -/// +/// /// /// /// diff --git a/src/server/client.ts b/src/server/client.ts index 8ff881611d3..9da5ed9fdbd 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -1,4 +1,4 @@ -/// +/// module ts.server { diff --git a/src/server/protodef.d.ts b/src/server/protocol.d.ts similarity index 100% rename from src/server/protodef.d.ts rename to src/server/protocol.d.ts diff --git a/src/server/server.ts b/src/server/server.ts index 6d210ff0d13..8921a4b4768 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1,5 +1,5 @@ /// -/// +/// module ts.server { var nodeproto: typeof NodeJS._debugger = require('_debugger'); diff --git a/src/server/protocol.ts b/src/server/session.ts similarity index 97% rename from src/server/protocol.ts rename to src/server/session.ts index 0b62e86d16e..715b8fa3d6a 100644 --- a/src/server/protocol.ts +++ b/src/server/session.ts @@ -1,7 +1,7 @@ /// /// /// -/// +/// /// module ts.server { @@ -587,13 +587,13 @@ module ts.server { var compilerService = project.compilerService; return items.map(item => ({ - text: item.text, - kind: item.kind, - kindModifiers: item.kindModifiers, + text: item.text, + kind: item.kind, + kindModifiers: item.kindModifiers, spans: item.spans.map(span => ({ start: compilerService.host.positionToLineCol(fileName, span.start), end: compilerService.host.positionToLineCol(fileName, ts.textSpanEnd(span)) - })), + })), childItems: this.decorateNavigationBarItem(project, fileName, item.childItems) })); } From d081c9c463b742e79a3eb5d2d493e126f70ae92b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 18:52:17 -0800 Subject: [PATCH 070/106] rename output file to tsserver.js --- Jakefile | 2 +- bin/tsserver | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Jakefile b/Jakefile index bb57469ac33..07b0d267a68 100644 --- a/Jakefile +++ b/Jakefile @@ -400,7 +400,7 @@ compileFile(nodeDefinitionsFile, servicesSources,[builtLocalDirectory, copyright jake.rmRf(tempDirPath, {silent: true}); }); -var serverFile = path.join(builtLocalDirectory, "typescriptServer.js"); +var serverFile = path.join(builtLocalDirectory, "tsserver.js"); compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true); // Local target to build the compiler and services diff --git a/bin/tsserver b/bin/tsserver index 2327c344c44..003eb0d22af 100644 --- a/bin/tsserver +++ b/bin/tsserver @@ -1,2 +1,2 @@ #!/usr/bin/env node -require('./typescriptServer.js') +require('./tsserver.js') From ca348385354d563014b7b7b56c76c65750808f6c Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 19:13:52 -0800 Subject: [PATCH 071/106] Remove unused code --- src/server/editorServices.ts | 61 +----------------------------------- 1 file changed, 1 insertion(+), 60 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 9e6363b509f..4f23e9a7c14 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -12,7 +12,6 @@ module ts.server { msg(s: string, type?: string): void; } - var measurePerf = false; var lineCollectionCapacity = 4; var indentStrings: string[] = []; var indentBase = " "; @@ -26,37 +25,6 @@ module ts.server { return indentStrings[indentAmt]; } - export function printLine(s: string) { - ts.sys.write(s + '\n'); - } - - function showLines(s: string) { - var strBuilder = ""; - for (var i = 0, len = s.length; i < len; i++) { - if (s.charCodeAt(i) == 10) { - strBuilder += '\\n'; - } - else if (s.charCodeAt(i) == 13) { - strBuilder += '\\r'; - } - else { - strBuilder += s.charAt(i); - } - } - return strBuilder; - } - - function calibrateTimer() { - var count = 20; - var total = 0; - for (var i = 0; i < count; i++) { - var start = process.hrtime(); - var elapsed = process.hrtime(start); - var elapsedNano = 1e9 * elapsed[0] + elapsed[1]; - total += elapsedNano; - } - } - export class ScriptInfo { svc: ScriptVersionCache; children: ScriptInfo[] = []; // files referenced by this file @@ -449,10 +417,7 @@ module ts.server { inferredProjects: Project[] = []; constructor(public host: ServerHost, public psLogger: Logger, public eventHandler?: ProjectServiceEventHandler) { - if (measurePerf) { - calibrateTimer(); - } - ts.disableIncrementalParsing = true; + // ts.disableIncrementalParsing = true; } watchedFileChanged(fileName: string) { @@ -820,7 +785,6 @@ module ts.server { lineCount(): number; isLeaf(): boolean; walk(rangeStart: number, rangeLength: number, walkFns: ILineIndexWalker): void; - print(indentAmt: number): void; } export interface ILineInfo { @@ -1253,12 +1217,6 @@ module ts.server { } } - print() { - printLine("index TC " + this.root.charCount() + " TL " + this.root.lineCount()); - this.root.print(0); - printLine(""); - } - load(lines: string[]) { if (lines.length > 0) { var leaves: LineLeaf[] = []; @@ -1424,15 +1382,6 @@ module ts.server { return false; } - print(indentAmt: number) { - var strBuilder = getIndent(indentAmt); - strBuilder += ("node ch " + this.children.length + " TC " + this.totalChars + " TL " + this.totalLines + " :"); - printLine(strBuilder); - for (var ch = 0, clen = this.children.length; ch < clen; ch++) { - this.children[ch].print(indentAmt + 1); - } - } - updateCounts() { this.totalChars = 0; this.totalLines = 0; @@ -1492,9 +1441,6 @@ module ts.server { } var adjustedLength = rangeLength - (childCharCount - adjustedStart); child = this.children[++childIndex]; - if (!child) { - this.print(2); - } childCharCount = child.charCount(); while (adjustedLength > childCharCount) { if (this.execWalk(0, childCharCount, walkFns, childIndex, CharRangeSection.Mid)) { @@ -1743,10 +1689,5 @@ module ts.server { lineCount() { return 1; } - - print(indentAmt: number) { - var strBuilder = getIndent(indentAmt); - printLine(strBuilder + showLines(this.text)); - } } } \ No newline at end of file From 8a9ac8d33802b8105b68fc8866fd3b760b590c38 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 19:14:33 -0800 Subject: [PATCH 072/106] Change ServerProtocol module to ts.server.protocol --- src/server/client.ts | 86 +-- src/server/protocol.d.ts | 1192 +++++++++++++++++++------------------- src/server/session.ts | 68 +-- 3 files changed, 670 insertions(+), 676 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index 9da5ed9fdbd..22b346aa3ec 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -47,11 +47,11 @@ module ts.server { return lineMap; } - private lineColToPosition(fileName: string, lineCol: ServerProtocol.LineCol): number { + private lineColToPosition(fileName: string, lineCol: ts.server.protocol.LineCol): number { return ts.computePositionFromLineAndCharacter(this.getLineMap(fileName), lineCol.line, lineCol.col); } - private positionToOneBasedLineCol(fileName: string, position: number): ServerProtocol.LineCol { + private positionToOneBasedLineCol(fileName: string, position: number): ts.server.protocol.LineCol { var lineCol = ts.computeLineAndCharacterOfPosition(this.getLineMap(fileName), position); return { line: lineCol.line, @@ -59,7 +59,7 @@ module ts.server { }; } - private convertCodeEditsToTextChange(fileName: string, codeEdit: ServerProtocol.CodeEdit): ts.TextChange { + private convertCodeEditsToTextChange(fileName: string, codeEdit: ts.server.protocol.CodeEdit): ts.TextChange { var start = this.lineColToPosition(fileName, codeEdit.start); var end = this.lineColToPosition(fileName, codeEdit.end); @@ -69,11 +69,11 @@ module ts.server { }; } - private decodeEncodedFileId(fileId: ServerProtocol.EncodedFile): string { + private decodeEncodedFileId(fileId: ts.server.protocol.EncodedFile): string { var fileName: string; if (typeof fileId === "object") { - fileName = (fileId).file; - this.fileMapping[(fileId).id] = fileName; + fileName = (fileId).file; + this.fileMapping[(fileId).id] = fileName; } else if (typeof fileId === "number") { fileName = ts.lookUp(this.fileMapping, fileId.toString()); @@ -85,8 +85,8 @@ module ts.server { return fileName; } - private processRequest(command: string, arguments?: any): T { - var request: ServerProtocol.Request = { + private processRequest(command: string, arguments?: any): T { + var request: ts.server.protocol.Request = { seq: this.sequence++, type: "request", command: command, @@ -98,7 +98,7 @@ module ts.server { return request; } - private processResponse(request: ServerProtocol.Request): T { + private processResponse(request: ts.server.protocol.Request): T { var lastMessage = this.messages.shift(); Debug.assert(!!lastMessage, "Did not recieve any responses."); @@ -138,12 +138,12 @@ module ts.server { } openFile(fileName: string): void { - var args: ServerProtocol.FileRequestArgs = { file: fileName }; + var args: ts.server.protocol.FileRequestArgs = { file: fileName }; this.processRequest(CommandNames.Open, args); } closeFile(fileName: string): void { - var args: ServerProtocol.FileRequestArgs = { file: fileName }; + var args: ts.server.protocol.FileRequestArgs = { file: fileName }; this.processRequest(CommandNames.Close, args); } @@ -152,7 +152,7 @@ module ts.server { this.lineMaps[fileName] = undefined; var lineCol = this.positionToOneBasedLineCol(fileName, start); - var args: ServerProtocol.ChangeRequestArgs = { + var args: ts.server.protocol.ChangeRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, @@ -166,14 +166,14 @@ module ts.server { getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.CodeLocationRequestArgs = { + var args: ts.server.protocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col }; - var request = this.processRequest(CommandNames.Quickinfo, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Quickinfo, args); + var response = this.processResponse(request); var start = this.lineColToPosition(fileName, response.body.start); var end = this.lineColToPosition(fileName, response.body.end); @@ -189,15 +189,15 @@ module ts.server { getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.CompletionsRequestArgs = { + var args: ts.server.protocol.CompletionsRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, prefix: undefined }; - var request = this.processRequest(CommandNames.Completions, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Completions, args); + var response = this.processResponse(request); return this.lastCompletionEntry = { isMemberCompletion: false, @@ -223,13 +223,13 @@ module ts.server { } getNavigateToItems(searchTerm: string): NavigateToItem[] { - var args: ServerProtocol.NavtoRequestArgs = { + var args: ts.server.protocol.NavtoRequestArgs = { searchTerm, file: this.host.getScriptFileNames()[0] }; - var request = this.processRequest(CommandNames.Navto, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Navto, args); + var response = this.processResponse(request); return response.body.map(entry => { var fileName = this.decodeEncodedFileId(entry.file); @@ -252,7 +252,7 @@ module ts.server { getFormattingEditsForRange(fileName: string, start: number, end: number, options: ts.FormatCodeOptions): ts.TextChange[] { var startLineCol = this.positionToOneBasedLineCol(fileName, start); var endLineCol = this.positionToOneBasedLineCol(fileName, end); - var args: ServerProtocol.FormatRequestArgs = { + var args: ts.server.protocol.FormatRequestArgs = { file: fileName, line: startLineCol.line, col: startLineCol.col, @@ -261,8 +261,8 @@ module ts.server { }; // TODO: handle FormatCodeOptions - var request = this.processRequest(CommandNames.Format, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Format, args); + var response = this.processResponse(request); return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); } @@ -273,7 +273,7 @@ module ts.server { getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): ts.TextChange[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.FormatOnKeyRequestArgs = { + var args: ts.server.protocol.FormatOnKeyRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, @@ -281,22 +281,22 @@ module ts.server { }; // TODO: handle FormatCodeOptions - var request = this.processRequest(CommandNames.Formatonkey, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Formatonkey, args); + var response = this.processResponse(request); return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); } getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.CodeLocationRequestArgs = { + var args: ts.server.protocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, }; - var request = this.processRequest(CommandNames.Definition, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Definition, args); + var response = this.processResponse(request); return response.body.map(entry => { var fileName = this.decodeEncodedFileId(entry.file); @@ -315,14 +315,14 @@ module ts.server { getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.CodeLocationRequestArgs = { + var args: ts.server.protocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, }; - var request = this.processRequest(CommandNames.References, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.References, args); + var response = this.processResponse(request); return response.body.refs.map(entry => { var fileName = this.decodeEncodedFileId(entry.file); @@ -354,7 +354,7 @@ module ts.server { getRenameInfo(fileName: string, position: number, findInStrings?: boolean, findInComments?: boolean): RenameInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.RenameRequestArgs = { + var args: ts.server.protocol.RenameRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, @@ -362,8 +362,8 @@ module ts.server { findInComments }; - var request = this.processRequest(CommandNames.Rename, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Rename, args); + var response = this.processResponse(request); return this.lastRenameEntry = { canRename: response.body.info.canRename, @@ -401,7 +401,7 @@ module ts.server { return this.lastRenameEntry.locations; } - decodeNavigationBarItems(items: ServerProtocol.NavigationBarItem[], fileName: string): NavigationBarItem[] { + decodeNavigationBarItems(items: ts.server.protocol.NavigationBarItem[], fileName: string): NavigationBarItem[] { if (!items) { return []; } @@ -419,12 +419,12 @@ module ts.server { } getNavigationBarItems(fileName: string): NavigationBarItem[] { - var args: ServerProtocol.FileRequestArgs = { + var args: ts.server.protocol.FileRequestArgs = { file: fileName }; - var request = this.processRequest(CommandNames.NavBar, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.NavBar, args); + var response = this.processResponse(request); return this.decodeNavigationBarItems(response.body, fileName); } @@ -455,14 +455,14 @@ module ts.server { getBraceMatchingAtPosition(fileName: string, position: number): TextSpan[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ServerProtocol.CodeLocationRequestArgs = { + var args: ts.server.protocol.CodeLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, }; - var request = this.processRequest(CommandNames.Brace, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Brace, args); + var response = this.processResponse(request); return response.body.map(entry => { var start = this.lineColToPosition(fileName, entry.start); diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index d2dcf4260ef..b1eef8f1b7f 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -1,603 +1,597 @@ -/** Declaration module describing the TypeScript Server protocol */ -declare module ServerProtocol { - /** A TypeScript Server message */ - export interface Message { - /** Sequence number of the message */ - seq: number; - /** One of "request", "response", or "event" */ - type: string; - } - - /** Client-initiated request message */ - export interface Request extends Message { - /** The command to execute */ - command: string; - /** Object containing arguments for the command */ - arguments?: any; - } - - /** Server-initiated event message */ - export interface Event extends Message { - /** Name of event */ - event: string; - /** Event-specific information */ - body?: any; - } - - /** Response by server to client request message */ - export interface Response extends Message { - /** Sequence number of the request message */ - request_seq: number; - /** Outcome of the request */ - success: boolean; - /** The command requested */ - command: string; - /** Contains error message if success == false. */ - message?: string; - /** Contains message body if success == true. */ - body?: any; - } - - /** Arguments for FileRequest messages */ - export interface FileRequestArgs { - /** The file for the request (absolute pathname required) */ - file: string; - } - - /** - Request whose sole parameter is a file name - */ - export interface FileRequest extends Request { - arguments: FileRequestArgs; - } - - /** - Instances of this interface specify a code location: - (file, line, col), where line and column are 1-based. - */ - export interface CodeLocationRequestArgs extends FileRequestArgs { - /** The line number for the request (1-based) */ - line: number; - /** The column for the request (1-based) */ - col: number; - } - - /** - A request whose arguments specify a code location (file, line, col) - */ - export interface CodeLocationRequest extends FileRequest { - arguments: CodeLocationRequestArgs; - } - - /** - Go to definition request; value of command field is - "definition". Return response giving the code locations that - define the symbol found in file at location line, col. - */ - export interface DefinitionRequest extends CodeLocationRequest { - } - - /** - Object containing line and column (one-based) of code location - */ - export interface LineCol { - line: number; - col: number; - } - - /** - Object found in response messages defining a span of text in - source code. - */ - export interface TextSpan { - /** First character of the definition */ - start: LineCol; - /** One character past last character of the definition */ - end: LineCol; - } - - /** - Object found in response messages defining a span of text in - a specific source file. - */ - export interface CodeSpan extends TextSpan { - /** - File containing the definition; the value of this - field will always be a string, number of a mapping between - a string and a number. - */ - file: EncodedFile; - } - - /** - Definition response message. Gives text range for definition. - */ - export interface DefinitionResponse extends Response { - body?: CodeSpan[]; - } - - /** - Find references request; value of command field is - "references". Return response giving the code locations that - reference the symbol found in file at location line, col. - */ - export interface ReferencesRequest extends CodeLocationRequest { - } - - export interface ReferencesResponseItem extends CodeSpan { - /** Text of line containing the reference. Including this - with the response avoids latency of editor loading files - to show text of reference line (the server already has - loaded the referencing files). - */ - lineText: string; - - /** True if reference is a write location, false otherwise. */ - isWriteAccess: boolean; - } - - /** The body of a "references" response message. */ - export interface ReferencesResponseBody { - /** The code locations referencing the symbol */ - refs: ReferencesResponseItem[]; - /** The name of the symbol */ - symbolName: string; - /** - The start column of the symbol (on the line provided by the references request) - */ - symbolStartCol: number; - /** The full display name of the symbol */ - symbolDisplayString: string; - } - - /** Response to "references" request. */ - export interface ReferencesResponse extends Response { - body?: ReferencesResponseBody; - } - - export interface RenameRequestArgs extends CodeLocationRequestArgs { - findInComments?: boolean; - findInStrings?: boolean; - } - - - /** - Rename request; value of command field is "rename". Return - response giving the code locations that reference the symbol - found in file at location line, col. Also return full display - name of the symbol so that client can print it unambiguously. - */ - export interface RenameRequest extends CodeLocationRequest { - arguments: RenameRequestArgs; - } - - /** Information about the item to be renamed. */ - export interface RenameInfo { - /** True if item can be renamed */ - canRename: boolean; - /** Error message if item can not be renamed */ - localizedErrorMessage: string; - /** Display name of the item to be renamed */ - displayName: string; - /** Full display name of item to be renamed */ - fullDisplayName: string; - /** The items's kind (such as 'className' or 'parameterName' or plain 'text') */ - kind: string; - /** Optional modifiers for the kind (such as 'public') */ - kindModifiers: string; - } - - /** - Rename response message. - */ - export interface RenameResponse extends Response { - body?: { - /** Information about the item to be renamed */ - info: RenameInfo; - /** - An array of code locations that refer to the - item to be renamed. - */ - locs: CodeSpan[]; - } - } - - /** - Open request; value of command field is "open". Notify the - server that the client has file open. The server will not - monitor the filesystem for changes in this file and will assume - that the client is updating the server (using the change and/or - reload messages) when the file changes. Server does not currently - send a response to an open request. - */ - export interface OpenRequest extends FileRequest { - } - - /** - Close request; value of command field is "close". Notify the - server that the client has closed a previously open file. If - file is still referenced by open files, the server will resume - monitoring the filesystem for changes to file. Server does not - currently send a response to a close request. - */ - export interface CloseRequest extends FileRequest { - } - - /** - Quickinfo request; value of command field is - "quickinfo". Return response giving a quick type and - documentation string for the symbol found in file at location - line, col. - */ - export interface QuickInfoRequest extends CodeLocationRequest { - } - - /** Body of QuickInfoResponse */ - export interface QuickInfoResponseBody { - /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ - kind: string; - /** Optional modifiers for the kind (such as 'public') */ - kindModifiers: string; - /** Starting code location of symbol */ - start: LineCol; - /** One past last character of symbol */ - end: LineCol; - /** Type and kind of symbol */ - displayString: string; - /** Documentation associated with symbol */ - documentation: string; - } - - /** Quickinfo response message */ - export interface QuickInfoResponse extends Response { - body?: QuickInfoResponseBody; - } - - /** Arguments for format messages */ - export interface FormatRequestArgs extends CodeLocationRequestArgs { - /** Last line of range for which to format text in file */ - endLine: number; - /** Last column of range for which to format text in file */ - endCol: number; - } - - /** - Format request; value of command field is "format". Return - response giving zero or more edit instructions. The edit - instructions will be sorted in file order. Applying the edit - instructions in reverse to file will result in correctly - reformatted text. - */ - export interface FormatRequest extends CodeLocationRequest { - arguments: FormatRequestArgs; - } - - /** - Object found in response messages defining an editing - instruction for a span of text in source code. The effect of - this instruction is to replace the text starting at start and - ending one character before end with newText. For an insertion, - the text span is empty. For a deletion, newText is empty. - */ - export interface CodeEdit { - /** First character of the text span to edit. */ - start: LineCol; - /** One character past last character of the text span to edit */ - end: LineCol; - /** - Replace the span defined above with this string (may be - the empty string) - */ - newText: string; - } - - /** Format and format on key response message */ - export interface FormatResponse extends Response { - body?: CodeEdit[]; - } - - /** Arguments for format on key messages */ - export interface FormatOnKeyRequestArgs extends CodeLocationRequestArgs { - /** Key pressed (';', '\n', or '}') */ - key: string; - } - - /** - Format on key request; value of command field is - "formatonkey". Given file location and key typed (as string), - return response giving zero or more edit instructions. The - edit instructions will be sorted in file order. Applying the - edit instructions in reverse to file will result in correctly - reformatted text. - */ - export interface FormatOnKeyRequest extends CodeLocationRequest { - arguments: FormatOnKeyRequestArgs; - } - - /** Arguments for completions messages */ - export interface CompletionsRequestArgs extends CodeLocationRequestArgs { - /** Optional prefix to apply to possible completions. */ - prefix?: string; - } - - /** - Completions request; value of command field is "completions". - Given a file location (file, line, col) and a prefix (which may - be the empty string), return the possible completions that - begin with prefix. - */ - export interface CompletionsRequest extends CodeLocationRequest { - arguments: CompletionsRequestArgs; - } - - /** - Part of a symbol description. - */ - export interface SymbolDisplayPart { - /** Text of an item describing the symbol */ - text: string; - /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ - kind: string; - } - - /** An item found in a completion response */ - export interface CompletionItem { - /** The symbol's name */ - name: string; - /** The symbol's kind (such as 'className' or 'parameterName') */ - kind: string; - /** Optional modifiers for the kind (such as 'public') */ - kindModifiers?: string; - /** Display parts of the symbol (similar to quick info) */ - displayParts?: SymbolDisplayPart[]; - /** Documentation strings for the symbol */ - documentation?: SymbolDisplayPart[]; - } - - export interface CompletionsResponse extends Response { - body?: CompletionItem[]; - } - - /** Arguments for geterr messages. */ - export interface GeterrRequestArgs { - /** - List of file names for which to compute compiler errors. - The files will be checked in list order. - */ - files: string[]; - /** - Delay in milliseconds to wait before starting to compute - errors for the files in the file list - */ - delay: number; - } - - /** - Geterr request; value of command field is "geterr". Wait for - delay milliseconds and then, if during the wait no change or - reload messages have arrived for the first file in the files - list, get the syntactic errors for the file, field requests, - and then get the semantic errors for the file. Repeat with a - smaller delay for each subsequent file on the files list. Best - practice for an editor is to send a file list containing each - file that is currently visible, in most-recently-used order. - */ - export interface GeterrRequest extends Request { - arguments: GeterrRequestArgs; - } - - /** Item of diagnostic information found in a DiagEvent message */ - export interface Diagnostic { - /** Starting code location at which text appies */ - start: LineCol; - /** Length of code location at which text applies */ - len: number; - /** Text of diagnostic message */ - text: string; - } - - /** Event message for "syntaxDiag" and "semanticDiag" event types. - These events provide syntactic and semantic errors for a file. - */ - export interface DiagEvent extends Event { - body?: { - /** The file for which diagnostic information is reported */ - file: string; - /** An array of diagnostic information items */ - diagnostics: Diagnostic[]; - }; - } - - /** Arguments for reload request. */ - export interface ReloadRequestArgs extends FileRequestArgs { - /** - Name of temporary file from which to reload file - contents. May be same as file. - */ - tmpfile: string; - } - - /** - Reload request message; value of command field is "reload". - Reload contents of file with name given by the 'file' argument - from temporary file with name given by the 'tmpfile' argument. - The two names can be identical. - */ - export interface ReloadRequest extends FileRequest { - arguments: ReloadRequestArgs; - } - - /** - Response to "reload" request. This is just an acknowledgement, so - no body field is required. - */ - export interface ReloadResponse extends Response { - } - - /** Arguments for saveto request. */ - export interface SavetoRequestArgs extends FileRequestArgs { - /** - Name of temporary file into which to save server's view of - file contents. - */ - tmpfile: string; - } - - /** - Saveto request message; value of command field is "saveto". - For debugging purposes, save to a temporaryfile (named by - argument 'tmpfile') the contents of file named by argument - 'file'. The server does not currently send a response to a - "saveto" request. - */ - export interface SavetoRequest extends FileRequest { - arguments: SavetoRequestArgs; - } - - /** Arguments for navto request message */ - export interface NavtoRequestArgs extends FileRequestArgs { - /** - Search term to navigate to from current location; term can - be '.*' or an identifier prefix. - */ - searchTerm: string; - } - - /** - Navto request message; value of command field is "navto". - Return list of objects giving code locations and symbols that - match the search term given in argument 'searchTerm'. The - context for the search is given by the named file. - */ - export interface NavtoRequest extends FileRequest { - arguments: NavtoRequestArgs; - } - - /** An item found in a navto response. */ - export interface NavtoItem { - /** The symbol's name */ - name: string; - /** The symbol's kind (such as 'className' or 'parameterName') */ - kind: string; - /** exact, substring, or prefix */ - matchKind?: string; - /** Optional modifiers for the kind (such as 'public') */ - kindModifiers?: string; - /** - The file in which the symbol is found; the value of this - field will always be a string, number of a mapping between - a string and a number. - */ - file: EncodedFile; - /** The location within file at which the symbol is found*/ - start: LineCol; - /** One past the last character of the symbol */ - end: LineCol; - /** - Name of symbol's container symbol (if any); for example, - the class name if symbol is a class member - */ - containerName?: string; - /** Kind of symbol's container symbol (if any) */ - containerKind?: string; - } - - /** - Navto response message. Body is an array of navto items. Each - item gives a symbol that matched the search term. - */ - export interface NavtoResponse extends Response { - body?: NavtoItem[]; - } - - /** Arguments for change request message. */ - export interface ChangeRequestArgs extends CodeLocationRequestArgs { - /** - Length of span deleted at location (file, line, col); nothing deleted - if this field is zero or undefined. - */ - deleteLen?: number; - /** Optional string to insert at location (file, line col). */ - insertString?: string; - } - - /** - Change request message; value of command field is "change". - Update the server's view of the file named by argument 'file'. - Server does not currently send a response to a change request. - */ - export interface ChangeRequest extends CodeLocationRequest { - arguments: ChangeRequestArgs; - } - - /** - If an object of this type is returned in place of a string as - the value of a file field in a response message, add the - mapping id => file to the client's cache of file id mappings, - and interpret the value as if it was the string in the 'file' - field. - */ - export interface IdFile { - /** Id to assign to file */ - id: number; - /** File name that will correspond to id */ - file: string; - } - - /** - The type of an encoded file name. If of type number, the value - is a file id. If of type IdFile, the value is interpreted as - 'file' and in addition the mapping 'id' to 'file' is - established. If of type string, the value is simply the file - name. - */ - export type EncodedFile = number | IdFile | string; - - /** Response to "brace" request. */ - export interface BraceResponse extends Response { - body?: TextSpan[]; - } - - /** - Brace matching request; value of command field is "brace". - Return response giving the code locations of matching braces - found in file at location line, col. - */ - export interface BraceRequest extends CodeLocationRequest { - } - - /** - NavBar itesm request; value of command field is "navbar". - Return response giving the list of navigation bar entries - extracted from the requested file. - */ - export interface NavBarRequest extends FileRequest { - } - +/** Declaration module describing the TypeScript Server protocol */ +declare module ts.server.protocol { + /** A TypeScript Server message */ + export interface Message { + /** Sequence number of the message */ + seq: number; + /** One of "request", "response", or "event" */ + type: string; + } + + /** Client-initiated request message */ + export interface Request extends Message { + /** The command to execute */ + command: string; + /** Object containing arguments for the command */ + arguments?: any; + } + + /** Server-initiated event message */ + export interface Event extends Message { + /** Name of event */ + event: string; + /** Event-specific information */ + body?: any; + } + + /** Response by server to client request message */ + export interface Response extends Message { + /** Sequence number of the request message */ + request_seq: number; + /** Outcome of the request */ + success: boolean; + /** The command requested */ + command: string; + /** Contains error message if success == false. */ + message?: string; + /** Contains message body if success == true. */ + body?: any; + } + + /** Arguments for FileRequest messages */ + export interface FileRequestArgs { + /** The file for the request (absolute pathname required) */ + file: string; + } + + /** + Request whose sole parameter is a file name + */ + export interface FileRequest extends Request { + arguments: FileRequestArgs; + } + + /** + Instances of this interface specify a code location: + (file, line, col), where line and column are 1-based. + */ + export interface CodeLocationRequestArgs extends FileRequestArgs { + /** The line number for the request (1-based) */ + line: number; + /** The column for the request (1-based) */ + col: number; + } + + /** + A request whose arguments specify a code location (file, line, col) + */ + export interface CodeLocationRequest extends FileRequest { + arguments: CodeLocationRequestArgs; + } + + /** + Go to definition request; value of command field is + "definition". Return response giving the code locations that + define the symbol found in file at location line, col. + */ + export interface DefinitionRequest extends CodeLocationRequest { + } + + /** + Object containing line and column (one-based) of code location + */ + export interface LineCol { + line: number; + col: number; + } + + /** + Object found in response messages defining a span of text in + source code. + */ + export interface TextSpan { + /** First character of the definition */ + start: LineCol; + /** One character past last character of the definition */ + end: LineCol; + } + + /** + Object found in response messages defining a span of text in + a specific source file. + */ + export interface CodeSpan extends TextSpan { + /** + File containing the definition; the value of this + field will always be a string, number of a mapping between + a string and a number. + */ + file: EncodedFile; + } + + /** + Definition response message. Gives text range for definition. + */ + export interface DefinitionResponse extends Response { + body?: CodeSpan[]; + } + + /** + Find references request; value of command field is + "references". Return response giving the code locations that + reference the symbol found in file at location line, col. + */ + export interface ReferencesRequest extends CodeLocationRequest { + } + + export interface ReferencesResponseItem extends CodeSpan { + /** Text of line containing the reference. Including this + with the response avoids latency of editor loading files + to show text of reference line (the server already has + loaded the referencing files). + */ + lineText: string; + + /** True if reference is a write location, false otherwise. */ + isWriteAccess: boolean; + } + + /** The body of a "references" response message. */ + export interface ReferencesResponseBody { + /** The code locations referencing the symbol */ + refs: ReferencesResponseItem[]; + /** The name of the symbol */ + symbolName: string; + /** + The start column of the symbol (on the line provided by the references request) + */ + symbolStartCol: number; + /** The full display name of the symbol */ + symbolDisplayString: string; + } + + /** Response to "references" request. */ + export interface ReferencesResponse extends Response { + body?: ReferencesResponseBody; + } + + export interface RenameRequestArgs extends CodeLocationRequestArgs { + findInComments?: boolean; + findInStrings?: boolean; + } + + + /** + Rename request; value of command field is "rename". Return + response giving the code locations that reference the symbol + found in file at location line, col. Also return full display + name of the symbol so that client can print it unambiguously. + */ + export interface RenameRequest extends CodeLocationRequest { + arguments: RenameRequestArgs; + } + + /** Information about the item to be renamed. */ + export interface RenameInfo { + /** True if item can be renamed */ + canRename: boolean; + /** Error message if item can not be renamed */ + localizedErrorMessage: string; + /** Display name of the item to be renamed */ + displayName: string; + /** Full display name of item to be renamed */ + fullDisplayName: string; + /** The items's kind (such as 'className' or 'parameterName' or plain 'text') */ + kind: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers: string; + } + + /** + Rename response message. + */ + export interface RenameResponse extends Response { + body?: { + /** Information about the item to be renamed */ + info: RenameInfo; + /** + An array of code locations that refer to the + item to be renamed. + */ + locs: CodeSpan[]; + } + } + + /** + Open request; value of command field is "open". Notify the + server that the client has file open. The server will not + monitor the filesystem for changes in this file and will assume + that the client is updating the server (using the change and/or + reload messages) when the file changes. Server does not currently + send a response to an open request. + */ + export interface OpenRequest extends FileRequest { + } + + /** + Close request; value of command field is "close". Notify the + server that the client has closed a previously open file. If + file is still referenced by open files, the server will resume + monitoring the filesystem for changes to file. Server does not + currently send a response to a close request. + */ + export interface CloseRequest extends FileRequest { + } + + /** + Quickinfo request; value of command field is + "quickinfo". Return response giving a quick type and + documentation string for the symbol found in file at location + line, col. + */ + export interface QuickInfoRequest extends CodeLocationRequest { + } + + /** Body of QuickInfoResponse */ + export interface QuickInfoResponseBody { + /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ + kind: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers: string; + /** Starting code location of symbol */ + start: LineCol; + /** One past last character of symbol */ + end: LineCol; + /** Type and kind of symbol */ + displayString: string; + /** Documentation associated with symbol */ + documentation: string; + } + + /** Quickinfo response message */ + export interface QuickInfoResponse extends Response { + body?: QuickInfoResponseBody; + } + + /** Arguments for format messages */ + export interface FormatRequestArgs extends CodeLocationRequestArgs { + /** Last line of range for which to format text in file */ + endLine: number; + /** Last column of range for which to format text in file */ + endCol: number; + } + + /** + Format request; value of command field is "format". Return + response giving zero or more edit instructions. The edit + instructions will be sorted in file order. Applying the edit + instructions in reverse to file will result in correctly + reformatted text. + */ + export interface FormatRequest extends CodeLocationRequest { + arguments: FormatRequestArgs; + } + + /** + Object found in response messages defining an editing + instruction for a span of text in source code. The effect of + this instruction is to replace the text starting at start and + ending one character before end with newText. For an insertion, + the text span is empty. For a deletion, newText is empty. + */ + export interface CodeEdit { + /** First character of the text span to edit. */ + start: LineCol; + /** One character past last character of the text span to edit */ + end: LineCol; + /** + Replace the span defined above with this string (may be + the empty string) + */ + newText: string; + } + + /** Format and format on key response message */ + export interface FormatResponse extends Response { + body?: CodeEdit[]; + } + + /** Arguments for format on key messages */ + export interface FormatOnKeyRequestArgs extends CodeLocationRequestArgs { + /** Key pressed (';', '\n', or '}') */ + key: string; + } + + /** + Format on key request; value of command field is + "formatonkey". Given file location and key typed (as string), + return response giving zero or more edit instructions. The + edit instructions will be sorted in file order. Applying the + edit instructions in reverse to file will result in correctly + reformatted text. + */ + export interface FormatOnKeyRequest extends CodeLocationRequest { + arguments: FormatOnKeyRequestArgs; + } + + /** Arguments for completions messages */ + export interface CompletionsRequestArgs extends CodeLocationRequestArgs { + /** Optional prefix to apply to possible completions. */ + prefix?: string; + } + + /** + Completions request; value of command field is "completions". + Given a file location (file, line, col) and a prefix (which may + be the empty string), return the possible completions that + begin with prefix. + */ + export interface CompletionsRequest extends CodeLocationRequest { + arguments: CompletionsRequestArgs; + } + + /** + Part of a symbol description. + */ + export interface SymbolDisplayPart { + /** Text of an item describing the symbol */ + text: string; + /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ + kind: string; + } + + /** An item found in a completion response */ + export interface CompletionItem { + /** The symbol's name */ + name: string; + /** The symbol's kind (such as 'className' or 'parameterName') */ + kind: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers?: string; + /** Display parts of the symbol (similar to quick info) */ + displayParts?: SymbolDisplayPart[]; + /** Documentation strings for the symbol */ + documentation?: SymbolDisplayPart[]; + } + + export interface CompletionsResponse extends Response { + body?: CompletionItem[]; + } + + /** Arguments for geterr messages. */ + export interface GeterrRequestArgs { + /** + List of file names for which to compute compiler errors. + The files will be checked in list order. + */ + files: string[]; + /** + Delay in milliseconds to wait before starting to compute + errors for the files in the file list + */ + delay: number; + } + + /** + Geterr request; value of command field is "geterr". Wait for + delay milliseconds and then, if during the wait no change or + reload messages have arrived for the first file in the files + list, get the syntactic errors for the file, field requests, + and then get the semantic errors for the file. Repeat with a + smaller delay for each subsequent file on the files list. Best + practice for an editor is to send a file list containing each + file that is currently visible, in most-recently-used order. + */ + export interface GeterrRequest extends Request { + arguments: GeterrRequestArgs; + } + + /** Item of diagnostic information found in a DiagEvent message */ + export interface Diagnostic { + /** Starting code location at which text appies */ + start: LineCol; + /** Length of code location at which text applies */ + len: number; + /** Text of diagnostic message */ + text: string; + } + + /** Event message for "syntaxDiag" and "semanticDiag" event types. + These events provide syntactic and semantic errors for a file. + */ + export interface DiagEvent extends Event { + body?: { + /** The file for which diagnostic information is reported */ + file: string; + /** An array of diagnostic information items */ + diagnostics: Diagnostic[]; + }; + } + + /** Arguments for reload request. */ + export interface ReloadRequestArgs extends FileRequestArgs { + /** + Name of temporary file from which to reload file + contents. May be same as file. + */ + tmpfile: string; + } + + /** + Reload request message; value of command field is "reload". + Reload contents of file with name given by the 'file' argument + from temporary file with name given by the 'tmpfile' argument. + The two names can be identical. + */ + export interface ReloadRequest extends FileRequest { + arguments: ReloadRequestArgs; + } + + /** + Response to "reload" request. This is just an acknowledgement, so + no body field is required. + */ + export interface ReloadResponse extends Response { + } + + /** Arguments for saveto request. */ + export interface SavetoRequestArgs extends FileRequestArgs { + /** + Name of temporary file into which to save server's view of + file contents. + */ + tmpfile: string; + } + + /** + Saveto request message; value of command field is "saveto". + For debugging purposes, save to a temporaryfile (named by + argument 'tmpfile') the contents of file named by argument + 'file'. The server does not currently send a response to a + "saveto" request. + */ + export interface SavetoRequest extends FileRequest { + arguments: SavetoRequestArgs; + } + + /** Arguments for navto request message */ + export interface NavtoRequestArgs extends FileRequestArgs { + /** + Search term to navigate to from current location; term can + be '.*' or an identifier prefix. + */ + searchTerm: string; + } + + /** + Navto request message; value of command field is "navto". + Return list of objects giving code locations and symbols that + match the search term given in argument 'searchTerm'. The + context for the search is given by the named file. + */ + export interface NavtoRequest extends FileRequest { + arguments: NavtoRequestArgs; + } + + /** An item found in a navto response. */ + export interface NavtoItem { + /** The symbol's name */ + name: string; + /** The symbol's kind (such as 'className' or 'parameterName') */ + kind: string; + /** exact, substring, or prefix */ + matchKind?: string; + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers?: string; + /** + The file in which the symbol is found; the value of this + field will always be a string, number of a mapping between + a string and a number. + */ + file: EncodedFile; + /** The location within file at which the symbol is found*/ + start: LineCol; + /** One past the last character of the symbol */ + end: LineCol; + /** + Name of symbol's container symbol (if any); for example, + the class name if symbol is a class member + */ + containerName?: string; + /** Kind of symbol's container symbol (if any) */ + containerKind?: string; + } + + /** + Navto response message. Body is an array of navto items. Each + item gives a symbol that matched the search term. + */ + export interface NavtoResponse extends Response { + body?: NavtoItem[]; + } + + /** Arguments for change request message. */ + export interface ChangeRequestArgs extends CodeLocationRequestArgs { + /** + Length of span deleted at location (file, line, col); nothing deleted + if this field is zero or undefined. + */ + deleteLen?: number; + /** Optional string to insert at location (file, line col). */ + insertString?: string; + } + + /** + Change request message; value of command field is "change". + Update the server's view of the file named by argument 'file'. + Server does not currently send a response to a change request. + */ + export interface ChangeRequest extends CodeLocationRequest { + arguments: ChangeRequestArgs; + } + + /** + If an object of this type is returned in place of a string as + the value of a file field in a response message, add the + mapping id => file to the client's cache of file id mappings, + and interpret the value as if it was the string in the 'file' + field. + */ + export interface IdFile { + /** Id to assign to file */ + id: number; + /** File name that will correspond to id */ + file: string; + } + + /** + The type of an encoded file name. If of type number, the value + is a file id. If of type IdFile, the value is interpreted as + 'file' and in addition the mapping 'id' to 'file' is + established. If of type string, the value is simply the file + name. + */ + export type EncodedFile = number | IdFile | string; + + /** Response to "brace" request. */ + export interface BraceResponse extends Response { + body?: TextSpan[]; + } + + /** + Brace matching request; value of command field is "brace". + Return response giving the code locations of matching braces + found in file at location line, col. + */ + export interface BraceRequest extends CodeLocationRequest { + } + + /** + NavBar itesm request; value of command field is "navbar". + Return response giving the list of navigation bar entries + extracted from the requested file. + */ + export interface NavBarRequest extends FileRequest { + } + export interface NavigationBarItem { - /** The item's display text */ - text: string; - - /** The symbol's kind (such as 'className' or 'parameterName') */ - kind: string; - - /** Optional modifiers for the kind (such as 'public') */ - kindModifiers?: string; - - /** The definition locations of the item */ - spans: TextSpan[]; + /** The item's display text */ + text: string; + + /** The symbol's kind (such as 'className' or 'parameterName') */ + kind: string; + + /** Optional modifiers for the kind (such as 'public') */ + kindModifiers?: string; + + /** The definition locations of the item */ + spans: TextSpan[]; /** Optional children */ childItems?: NavigationBarItem[]; - } - - export interface NavBarResponse extends Response { - body?: NavigationBarItem[]; - } -} - - - - - - + } + + export interface NavBarResponse extends Response { + body?: NavigationBarItem[]; + } +} diff --git a/src/server/session.ts b/src/server/session.ts index 715b8fa3d6a..e88932dcb77 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -27,7 +27,7 @@ module ts.server { } interface FileStart { - file: ServerProtocol.EncodedFile; + file: ts.server.protocol.EncodedFile; start: ILineInfo; } @@ -188,7 +188,7 @@ module ts.server { } response(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) { - var res: ServerProtocol.Response = { + var res: ts.server.protocol.Response = { seq: 0, type: "response", command: cmdName, @@ -204,7 +204,7 @@ module ts.server { this.send(res); } - encodeFileName(fileName: string): ServerProtocol.EncodedFile { + encodeFileName(fileName: string): ts.server.protocol.EncodedFile { var id = ts.lookUp(this.fileHash, fileName); if (!id) { id = this.nextFileId++; @@ -277,7 +277,7 @@ module ts.server { } } - getDefinition(line: number, col: number, fileName: string): ServerProtocol.CodeSpan[] { + getDefinition(line: number, col: number, fileName: string): ts.server.protocol.CodeSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -299,7 +299,7 @@ module ts.server { })); } - getRenameLocations(line: number, col: number, fileName: string, findInComments: boolean, findInStrings: boolean): { info: RenameInfo; locs: ServerProtocol.CodeSpan[] } { + getRenameLocations(line: number, col: number, fileName: string, findInComments: boolean, findInStrings: boolean): { info: RenameInfo; locs: ts.server.protocol.CodeSpan[] } { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -325,7 +325,7 @@ module ts.server { throw Errors.NoContent; } - var bakedRenameLocs = renameLocations.map(location => ({ + var bakedRenameLocs = renameLocations.map(location => ({ file: this.encodeFileName(location.fileName), start: compilerService.host.positionToLineCol(location.fileName, location.textSpan.start), end: compilerService.host.positionToLineCol(location.fileName, ts.textSpanEnd(location.textSpan)), @@ -334,7 +334,7 @@ module ts.server { return { info: renameInfo, locs: bakedRenameLocs }; } - getReferences(line: number, col: number, fileName: string): ServerProtocol.ReferencesResponseBody { + getReferences(line: number, col: number, fileName: string): ts.server.protocol.ReferencesResponseBody { // TODO: get all projects for this file; report refs for all projects deleting duplicates // can avoid duplicates by eliminating same ref file from subsequent projects var file = ts.normalizePath(fileName); @@ -360,7 +360,7 @@ module ts.server { var nameSpan = nameInfo.textSpan; var nameColStart = compilerService.host.positionToLineCol(file, nameSpan.start).col; var nameText = compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); - var bakedRefs: ServerProtocol.ReferencesResponseItem[] = references.map((ref) => { + var bakedRefs: ts.server.protocol.ReferencesResponseItem[] = references.map((ref) => { var start = compilerService.host.positionToLineCol(ref.fileName, ref.textSpan.start); var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); var snap = compilerService.host.getScriptSnapshot(ref.fileName); @@ -386,7 +386,7 @@ module ts.server { this.projectService.openClientFile(file); } - getQuickInfo(line: number, col: number, fileName: string): ServerProtocol.QuickInfoResponseBody { + getQuickInfo(line: number, col: number, fileName: string): ts.server.protocol.QuickInfoResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -412,7 +412,7 @@ module ts.server { }; } - getFormattingEditsForRange(line: number, col: number, endLine: number, endCol: number, fileName: string): ServerProtocol.CodeEdit[] { + getFormattingEditsForRange(line: number, col: number, endLine: number, endCol: number, fileName: string): ts.server.protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -438,7 +438,7 @@ module ts.server { }); } - getFormattingEditsAfterKeystroke(line: number, col: number, key: string, fileName: string): ServerProtocol.CodeEdit[] { + getFormattingEditsAfterKeystroke(line: number, col: number, key: string, fileName: string): ts.server.protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -480,7 +480,7 @@ module ts.server { }); } - getCompletions(line: number, col: number, prefix: string, fileName: string): ServerProtocol.CompletionItem[] { + getCompletions(line: number, col: number, prefix: string, fileName: string): ts.server.protocol.CompletionItem[] { if (!prefix) { prefix = ""; } @@ -579,7 +579,7 @@ module ts.server { this.projectService.closeClientFile(file); } - decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): ServerProtocol.NavigationBarItem[] { + decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): ts.server.protocol.NavigationBarItem[] { if (!items) { return undefined; } @@ -598,7 +598,7 @@ module ts.server { })); } - getNavigationBarItems(fileName: string): ServerProtocol.NavigationBarItem[] { + getNavigationBarItems(fileName: string): ts.server.protocol.NavigationBarItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -614,7 +614,7 @@ module ts.server { return this.decorateNavigationBarItem(project, fileName, items); } - getNavigateToItems(searchTerm: string, fileName: string): ServerProtocol.NavtoItem[] { + getNavigateToItems(searchTerm: string, fileName: string): ts.server.protocol.NavtoItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -630,7 +630,7 @@ module ts.server { return navItems.map((navItem) => { var start = compilerService.host.positionToLineCol(navItem.fileName, navItem.textSpan.start); var end = compilerService.host.positionToLineCol(navItem.fileName, ts.textSpanEnd(navItem.textSpan)); - var bakedItem: ServerProtocol.NavtoItem = { + var bakedItem: ts.server.protocol.NavtoItem = { name: navItem.name, kind: navItem.kind, file: this.encodeFileName(navItem.fileName), @@ -653,7 +653,7 @@ module ts.server { }); } - getBraceMatching(line: number, col: number, fileName: string): ServerProtocol.TextSpan[] { + getBraceMatching(line: number, col: number, fileName: string): ts.server.protocol.TextSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -677,87 +677,87 @@ module ts.server { onMessage(message: string) { try { - var request = JSON.parse(message); + var request = JSON.parse(message); var response: any; switch (request.command) { case CommandNames.Definition: { - var defArgs = request.arguments; + var defArgs = request.arguments; response = this.getDefinition(defArgs.line, defArgs.col, defArgs.file); break; } case CommandNames.References: { - var refArgs = request.arguments; + var refArgs = request.arguments; response = this.getReferences(refArgs.line, refArgs.col, refArgs.file); break; } case CommandNames.Rename: { - var renameArgs = request.arguments; + var renameArgs = request.arguments; response = this.getRenameLocations(renameArgs.line, renameArgs.col, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); break; } case CommandNames.Open: { - var openArgs = request.arguments; + var openArgs = request.arguments; this.openClientFile(openArgs.file); break; } case CommandNames.Quickinfo: { - var quickinfoArgs = request.arguments; + var quickinfoArgs = request.arguments; response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); break; } case CommandNames.Format: { - var formatArgs = request.arguments; + var formatArgs = request.arguments; response = this.getFormattingEditsForRange(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file); break; } case CommandNames.Formatonkey: { - var formatOnKeyArgs = request.arguments; + var formatOnKeyArgs = request.arguments; response = this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file); break; } case CommandNames.Completions: { - var completionsArgs = request.arguments; + var completionsArgs = request.arguments; response = this.getCompletions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); break; } case CommandNames.Geterr: { - var geterrArgs = request.arguments; + var geterrArgs = request.arguments; response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); break; } case CommandNames.Change: { - var changeArgs = request.arguments; + var changeArgs = request.arguments; this.change(changeArgs.line, changeArgs.col, changeArgs.deleteLen, changeArgs.insertString, changeArgs.file); break; } case CommandNames.Reload: { - var reloadArgs = request.arguments; + var reloadArgs = request.arguments; this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq); break; } case CommandNames.Saveto: { - var savetoArgs = request.arguments; + var savetoArgs = request.arguments; this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); break; } case CommandNames.Close: { - var closeArgs = request.arguments; + var closeArgs = request.arguments; this.closeClientFile(closeArgs.file); break; } case CommandNames.Navto: { - var navtoArgs = request.arguments; + var navtoArgs = request.arguments; response = this.getNavigateToItems(navtoArgs.searchTerm, navtoArgs.file); break; } case CommandNames.Brace: { - var braceArguments = request.arguments; + var braceArguments = request.arguments; response = this.getBraceMatching(braceArguments.line, braceArguments.col, braceArguments.file); break; } case CommandNames.NavBar: { - var navBarArgs = request.arguments; + var navBarArgs = request.arguments; response = this.getNavigationBarItems(navBarArgs.file); break; } From bdd0bf341b171ceba3eaecd2f84a21f435aa992f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 19:48:35 -0800 Subject: [PATCH 073/106] Comment formatting --- src/server/protocol.d.ts | 777 +++++++++++++++++++++++++-------------- 1 file changed, 500 insertions(+), 277 deletions(-) diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index b1eef8f1b7f..e3433e24690 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -1,156 +1,222 @@ -/** Declaration module describing the TypeScript Server protocol */ +/** + * Declaration module describing the TypeScript Server protocol + */ declare module ts.server.protocol { - /** A TypeScript Server message */ + /** + * A TypeScript Server message + */ export interface Message { - /** Sequence number of the message */ + /** + * Sequence number of the message + */ seq: number; - /** One of "request", "response", or "event" */ + + /** + * One of "request", "response", or "event" + */ type: string; } - /** Client-initiated request message */ + /** + * Client-initiated request message + */ export interface Request extends Message { - /** The command to execute */ + /** + * The command to execute + */ command: string; - /** Object containing arguments for the command */ + + /** + * Object containing arguments for the command + */ arguments?: any; } - /** Server-initiated event message */ + /** + * Server-initiated event message + */ export interface Event extends Message { - /** Name of event */ + /** + * Name of event + */ event: string; - /** Event-specific information */ + + /** + * Event-specific information + */ body?: any; } - /** Response by server to client request message */ + /** + * Response by server to client request message. + */ export interface Response extends Message { - /** Sequence number of the request message */ + /** + * Sequence number of the request message. + */ request_seq: number; - /** Outcome of the request */ + + /** + * Outcome of the request. + */ success: boolean; - /** The command requested */ + + /** + * The command requested. + */ command: string; - /** Contains error message if success == false. */ + + /** + * Contains error message if success == false. + */ message?: string; - /** Contains message body if success == true. */ + + /** + * Contains message body if success == true. + */ body?: any; } - /** Arguments for FileRequest messages */ + /** + * Arguments for FileRequest messages. + */ export interface FileRequestArgs { - /** The file for the request (absolute pathname required) */ + /** + * The file for the request (absolute pathname required). + */ file: string; } /** - Request whose sole parameter is a file name - */ + * Request whose sole parameter is a file name. + */ export interface FileRequest extends Request { arguments: FileRequestArgs; } /** - Instances of this interface specify a code location: - (file, line, col), where line and column are 1-based. - */ + * Instances of this interface specify a code location: + * (file, line, col), where line and column are 1-based. + */ export interface CodeLocationRequestArgs extends FileRequestArgs { - /** The line number for the request (1-based) */ + /** + * The line number for the request (1-based). + */ line: number; - /** The column for the request (1-based) */ + + /** + * The column for the request (1-based). + */ col: number; } /** - A request whose arguments specify a code location (file, line, col) - */ + * A request whose arguments specify a code location (file, line, col). + */ export interface CodeLocationRequest extends FileRequest { arguments: CodeLocationRequestArgs; } /** - Go to definition request; value of command field is - "definition". Return response giving the code locations that - define the symbol found in file at location line, col. - */ + * Go to definition request; value of command field is + * "definition". Return response giving the code locations that + * define the symbol found in file at location line, col. + */ export interface DefinitionRequest extends CodeLocationRequest { } /** - Object containing line and column (one-based) of code location - */ + * Object containing line and column (one-based) of code location. + */ export interface LineCol { line: number; col: number; } /** - Object found in response messages defining a span of text in - source code. - */ + * Object found in response messages defining a span of text in source code. + */ export interface TextSpan { - /** First character of the definition */ + /** + * First character of the definition. + */ start: LineCol; - /** One character past last character of the definition */ + + /** + * One character past last character of the definition. + */ end: LineCol; } /** - Object found in response messages defining a span of text in - a specific source file. - */ + * Object found in response messages defining a span of text in a specific source file. + */ export interface CodeSpan extends TextSpan { /** - File containing the definition; the value of this - field will always be a string, number of a mapping between - a string and a number. - */ + * File containing the definition; the value of this + * field will always be a string, number of a mapping between + * a string and a number. + */ file: EncodedFile; } /** - Definition response message. Gives text range for definition. - */ + * Definition response message. Gives text range for definition. + */ export interface DefinitionResponse extends Response { body?: CodeSpan[]; } /** - Find references request; value of command field is - "references". Return response giving the code locations that - reference the symbol found in file at location line, col. - */ + * Find references request; value of command field is + * "references". Return response giving the code locations that + * reference the symbol found in file at location line, col. + */ export interface ReferencesRequest extends CodeLocationRequest { } export interface ReferencesResponseItem extends CodeSpan { /** Text of line containing the reference. Including this - with the response avoids latency of editor loading files - to show text of reference line (the server already has - loaded the referencing files). - */ + * with the response avoids latency of editor loading files + * to show text of reference line (the server already has + * loaded the referencing files). + */ lineText: string; - /** True if reference is a write location, false otherwise. */ + /** + * True if reference is a write location, false otherwise. + */ isWriteAccess: boolean; } - /** The body of a "references" response message. */ + /** + * The body of a "references" response message. + */ export interface ReferencesResponseBody { - /** The code locations referencing the symbol */ - refs: ReferencesResponseItem[]; - /** The name of the symbol */ - symbolName: string; /** - The start column of the symbol (on the line provided by the references request) - */ + * The code locations referencing the symbol. + */ + refs: ReferencesResponseItem[]; + + /** + * The name of the symbol. + */ + symbolName: string; + + /** + * The start column of the symbol (on the line provided by the references request). + */ symbolStartCol: number; - /** The full display name of the symbol */ + + /** + * The full display name of the symbol. + */ symbolDisplayString: string; } - /** Response to "references" request. */ + /** + * Response to "references" request. + */ export interface ReferencesResponse extends Response { body?: ReferencesResponseBody; } @@ -162,195 +228,281 @@ declare module ts.server.protocol { /** - Rename request; value of command field is "rename". Return - response giving the code locations that reference the symbol - found in file at location line, col. Also return full display - name of the symbol so that client can print it unambiguously. - */ + * Rename request; value of command field is "rename". Return + * response giving the code locations that reference the symbol + * found in file at location line, col. Also return full display + * name of the symbol so that client can print it unambiguously. + */ export interface RenameRequest extends CodeLocationRequest { arguments: RenameRequestArgs; } - /** Information about the item to be renamed. */ + /** + * Information about the item to be renamed. + */ export interface RenameInfo { - /** True if item can be renamed */ + /** + * True if item can be renamed. + */ canRename: boolean; - /** Error message if item can not be renamed */ + + /** + * Error message if item can not be renamed. + */ localizedErrorMessage: string; - /** Display name of the item to be renamed */ + + /** + * Display name of the item to be renamed. + */ displayName: string; - /** Full display name of item to be renamed */ + + /** + * Full display name of item to be renamed. + */ fullDisplayName: string; - /** The items's kind (such as 'className' or 'parameterName' or plain 'text') */ + + /** + * The items's kind (such as 'className' or 'parameterName' or plain 'text'). + */ kind: string; - /** Optional modifiers for the kind (such as 'public') */ + + /** + * Optional modifiers for the kind (such as 'public'). + */ kindModifiers: string; } /** - Rename response message. - */ + * Rename response message. + */ export interface RenameResponse extends Response { body?: { - /** Information about the item to be renamed */ - info: RenameInfo; /** - An array of code locations that refer to the - item to be renamed. - */ + * Information about the item to be renamed. + */ + info: RenameInfo; + + /** + * An array of code locations that refer to the item to be renamed. + */ locs: CodeSpan[]; } } /** - Open request; value of command field is "open". Notify the - server that the client has file open. The server will not - monitor the filesystem for changes in this file and will assume - that the client is updating the server (using the change and/or - reload messages) when the file changes. Server does not currently - send a response to an open request. - */ + * Open request; value of command field is "open". Notify the + * server that the client has file open. The server will not + * monitor the filesystem for changes in this file and will assume + * that the client is updating the server (using the change and/or + * reload messages) when the file changes. Server does not currently + * send a response to an open request. + */ export interface OpenRequest extends FileRequest { } /** - Close request; value of command field is "close". Notify the - server that the client has closed a previously open file. If - file is still referenced by open files, the server will resume - monitoring the filesystem for changes to file. Server does not - currently send a response to a close request. - */ + * Close request; value of command field is "close". Notify the + * server that the client has closed a previously open file. If + * file is still referenced by open files, the server will resume + * monitoring the filesystem for changes to file. Server does not + * currently send a response to a close request. + */ export interface CloseRequest extends FileRequest { } /** - Quickinfo request; value of command field is - "quickinfo". Return response giving a quick type and - documentation string for the symbol found in file at location - line, col. - */ + * Quickinfo request; value of command field is + * "quickinfo". Return response giving a quick type and + * documentation string for the symbol found in file at location + * line, col. + */ export interface QuickInfoRequest extends CodeLocationRequest { } - /** Body of QuickInfoResponse */ + /** + * Body of QuickInfoResponse. + */ export interface QuickInfoResponseBody { - /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ + /** + * The symbol's kind (such as 'className' or 'parameterName' or plain 'text'). + */ kind: string; - /** Optional modifiers for the kind (such as 'public') */ + + /** + * Optional modifiers for the kind (such as 'public'). + */ kindModifiers: string; - /** Starting code location of symbol */ + + /** + * Starting code location of symbol. + */ start: LineCol; - /** One past last character of symbol */ + + /** + * One past last character of symbol. + */ end: LineCol; - /** Type and kind of symbol */ + + /** + * Type and kind of symbol. + */ displayString: string; - /** Documentation associated with symbol */ + + /** + * Documentation associated with symbol. + */ documentation: string; } - /** Quickinfo response message */ + /** + * Quickinfo response message. + */ export interface QuickInfoResponse extends Response { body?: QuickInfoResponseBody; } - /** Arguments for format messages */ + /** + * Arguments for format messages. + */ export interface FormatRequestArgs extends CodeLocationRequestArgs { - /** Last line of range for which to format text in file */ + /** + * Last line of range for which to format text in file. + */ endLine: number; - /** Last column of range for which to format text in file */ + + /** + * Last column of range for which to format text in file. + */ endCol: number; } /** - Format request; value of command field is "format". Return - response giving zero or more edit instructions. The edit - instructions will be sorted in file order. Applying the edit - instructions in reverse to file will result in correctly - reformatted text. - */ + * Format request; value of command field is "format". Return + * response giving zero or more edit instructions. The edit + * instructions will be sorted in file order. Applying the edit + * instructions in reverse to file will result in correctly + * reformatted text. + */ export interface FormatRequest extends CodeLocationRequest { arguments: FormatRequestArgs; } /** - Object found in response messages defining an editing - instruction for a span of text in source code. The effect of - this instruction is to replace the text starting at start and - ending one character before end with newText. For an insertion, - the text span is empty. For a deletion, newText is empty. - */ + * Object found in response messages defining an editing + * instruction for a span of text in source code. The effect of + * this instruction is to replace the text starting at start and + * ending one character before end with newText. For an insertion, + * the text span is empty. For a deletion, newText is empty. + */ export interface CodeEdit { - /** First character of the text span to edit. */ - start: LineCol; - /** One character past last character of the text span to edit */ - end: LineCol; /** - Replace the span defined above with this string (may be - the empty string) - */ + * First character of the text span to edit. + */ + start: LineCol; + + /** + * One character past last character of the text span to edit. + */ + end: LineCol; + + /** + * Replace the span defined above with this string (may be + * the empty string). + */ newText: string; } - /** Format and format on key response message */ + /** + * Format and format on key response message. + */ export interface FormatResponse extends Response { body?: CodeEdit[]; } - /** Arguments for format on key messages */ + /** + * Arguments for format on key messages. + */ export interface FormatOnKeyRequestArgs extends CodeLocationRequestArgs { - /** Key pressed (';', '\n', or '}') */ + /** + * Key pressed (';', '\n', or '}'). + */ key: string; } /** - Format on key request; value of command field is - "formatonkey". Given file location and key typed (as string), - return response giving zero or more edit instructions. The - edit instructions will be sorted in file order. Applying the - edit instructions in reverse to file will result in correctly - reformatted text. - */ + * Format on key request; value of command field is + * "formatonkey". Given file location and key typed (as string), + * return response giving zero or more edit instructions. The + * edit instructions will be sorted in file order. Applying the + * edit instructions in reverse to file will result in correctly + * reformatted text. + */ export interface FormatOnKeyRequest extends CodeLocationRequest { arguments: FormatOnKeyRequestArgs; } - /** Arguments for completions messages */ + /** + * Arguments for completions messages. + */ export interface CompletionsRequestArgs extends CodeLocationRequestArgs { - /** Optional prefix to apply to possible completions. */ + /** + * Optional prefix to apply to possible completions. + */ prefix?: string; } /** - Completions request; value of command field is "completions". - Given a file location (file, line, col) and a prefix (which may - be the empty string), return the possible completions that - begin with prefix. - */ + * Completions request; value of command field is "completions". + * Given a file location (file, line, col) and a prefix (which may + * be the empty string), return the possible completions that + * begin with prefix. + */ export interface CompletionsRequest extends CodeLocationRequest { arguments: CompletionsRequestArgs; } /** - Part of a symbol description. - */ + * Part of a symbol description. + */ export interface SymbolDisplayPart { - /** Text of an item describing the symbol */ + /** + * Text of an item describing the symbol. + */ text: string; - /** The symbol's kind (such as 'className' or 'parameterName' or plain 'text') */ + + /** + * The symbol's kind (such as 'className' or 'parameterName' or plain 'text'). + */ kind: string; } - /** An item found in a completion response */ + /** + * An item found in a completion response. + */ export interface CompletionItem { - /** The symbol's name */ + /** + * The symbol's name. + */ name: string; - /** The symbol's kind (such as 'className' or 'parameterName') */ + + /** + * The symbol's kind (such as 'className' or 'parameterName'). + */ kind: string; - /** Optional modifiers for the kind (such as 'public') */ + + /** + * Optional modifiers for the kind (such as 'public'). + */ kindModifiers?: string; - /** Display parts of the symbol (similar to quick info) */ + + /** + * Display parts of the symbol (similar to quick info). + */ displayParts?: SymbolDisplayPart[]; - /** Documentation strings for the symbol */ + + /** + * Documentation strings for the symbol. + */ documentation?: SymbolDisplayPart[]; } @@ -358,236 +510,307 @@ declare module ts.server.protocol { body?: CompletionItem[]; } - /** Arguments for geterr messages. */ + /** + * Arguments for geterr messages. + */ export interface GeterrRequestArgs { /** - List of file names for which to compute compiler errors. - The files will be checked in list order. - */ + * List of file names for which to compute compiler errors. + * The files will be checked in list order. + */ files: string[]; + /** - Delay in milliseconds to wait before starting to compute - errors for the files in the file list - */ + * Delay in milliseconds to wait before starting to compute + * errors for the files in the file list + */ delay: number; } /** - Geterr request; value of command field is "geterr". Wait for - delay milliseconds and then, if during the wait no change or - reload messages have arrived for the first file in the files - list, get the syntactic errors for the file, field requests, - and then get the semantic errors for the file. Repeat with a - smaller delay for each subsequent file on the files list. Best - practice for an editor is to send a file list containing each - file that is currently visible, in most-recently-used order. - */ + * Geterr request; value of command field is "geterr". Wait for + * delay milliseconds and then, if during the wait no change or + * reload messages have arrived for the first file in the files + * list, get the syntactic errors for the file, field requests, + * and then get the semantic errors for the file. Repeat with a + * smaller delay for each subsequent file on the files list. Best + * practice for an editor is to send a file list containing each + * file that is currently visible, in most-recently-used order. + */ export interface GeterrRequest extends Request { arguments: GeterrRequestArgs; } - /** Item of diagnostic information found in a DiagEvent message */ + /** + * Item of diagnostic information found in a DiagEvent message. + */ export interface Diagnostic { - /** Starting code location at which text appies */ + /** + * Starting code location at which text appies. + */ start: LineCol; - /** Length of code location at which text applies */ + + /** + * Length of code location at which text applies. + */ len: number; - /** Text of diagnostic message */ + + /** + * Text of diagnostic message. + */ text: string; } - /** Event message for "syntaxDiag" and "semanticDiag" event types. - These events provide syntactic and semantic errors for a file. - */ + /** + * Event message for "syntaxDiag" and "semanticDiag" event types. + * These events provide syntactic and semantic errors for a file. + */ export interface DiagEvent extends Event { body?: { - /** The file for which diagnostic information is reported */ + /** + * The file for which diagnostic information is reported. + */ file: string; - /** An array of diagnostic information items */ + + /** + * An array of diagnostic information items. + */ diagnostics: Diagnostic[]; }; } - /** Arguments for reload request. */ + /** + * Arguments for reload request. + */ export interface ReloadRequestArgs extends FileRequestArgs { /** - Name of temporary file from which to reload file - contents. May be same as file. - */ + * Name of temporary file from which to reload file + * contents. May be same as file. + */ tmpfile: string; } /** - Reload request message; value of command field is "reload". - Reload contents of file with name given by the 'file' argument - from temporary file with name given by the 'tmpfile' argument. - The two names can be identical. - */ + * Reload request message; value of command field is "reload". + * Reload contents of file with name given by the 'file' argument + * from temporary file with name given by the 'tmpfile' argument. + * The two names can be identical. + */ export interface ReloadRequest extends FileRequest { arguments: ReloadRequestArgs; } /** - Response to "reload" request. This is just an acknowledgement, so - no body field is required. - */ + * Response to "reload" request. This is just an acknowledgement, so + * no body field is required. + */ export interface ReloadResponse extends Response { } - /** Arguments for saveto request. */ + /** + * Arguments for saveto request. + */ export interface SavetoRequestArgs extends FileRequestArgs { /** - Name of temporary file into which to save server's view of - file contents. - */ + * Name of temporary file into which to save server's view of + * file contents. + */ tmpfile: string; } /** - Saveto request message; value of command field is "saveto". - For debugging purposes, save to a temporaryfile (named by - argument 'tmpfile') the contents of file named by argument - 'file'. The server does not currently send a response to a - "saveto" request. - */ + * Saveto request message; value of command field is "saveto". + * For debugging purposes, save to a temporaryfile (named by + * argument 'tmpfile') the contents of file named by argument + * 'file'. The server does not currently send a response to a + * "saveto" request. + */ export interface SavetoRequest extends FileRequest { arguments: SavetoRequestArgs; } - /** Arguments for navto request message */ + /** + * Arguments for navto request message. + */ export interface NavtoRequestArgs extends FileRequestArgs { /** - Search term to navigate to from current location; term can - be '.*' or an identifier prefix. - */ + * Search term to navigate to from current location; term can + * be '.*' or an identifier prefix. + */ searchTerm: string; } /** - Navto request message; value of command field is "navto". - Return list of objects giving code locations and symbols that - match the search term given in argument 'searchTerm'. The - context for the search is given by the named file. - */ + * Navto request message; value of command field is "navto". + * Return list of objects giving code locations and symbols that + * match the search term given in argument 'searchTerm'. The + * context for the search is given by the named file. + */ export interface NavtoRequest extends FileRequest { arguments: NavtoRequestArgs; } - /** An item found in a navto response. */ + /** + * An item found in a navto response. + */ export interface NavtoItem { - /** The symbol's name */ - name: string; - /** The symbol's kind (such as 'className' or 'parameterName') */ - kind: string; - /** exact, substring, or prefix */ - matchKind?: string; - /** Optional modifiers for the kind (such as 'public') */ - kindModifiers?: string; - /** - The file in which the symbol is found; the value of this - field will always be a string, number of a mapping between - a string and a number. - */ - file: EncodedFile; - /** The location within file at which the symbol is found*/ - start: LineCol; - /** One past the last character of the symbol */ - end: LineCol; /** - Name of symbol's container symbol (if any); for example, - the class name if symbol is a class member - */ + * The symbol's name. + */ + name: string; + + /** + * The symbol's kind (such as 'className' or 'parameterName'). + */ + kind: string; + + /** + * exact, substring, or prefix. + */ + matchKind?: string; + + /** + * Optional modifiers for the kind (such as 'public'). + */ + kindModifiers?: string; + + /** + * The file in which the symbol is found; the value of this + * field will always be a string, number of a mapping between + * a string and a number. + */ + file: EncodedFile; + + /** + * The location within file at which the symbol is found. + */ + start: LineCol; + + /** + * One past the last character of the symbol. + */ + end: LineCol; + + /** + * Name of symbol's container symbol (if any); for example, + * the class name if symbol is a class member. + */ containerName?: string; - /** Kind of symbol's container symbol (if any) */ + + /** + * Kind of symbol's container symbol (if any). + */ containerKind?: string; } /** - Navto response message. Body is an array of navto items. Each - item gives a symbol that matched the search term. - */ + * Navto response message. Body is an array of navto items. Each + * item gives a symbol that matched the search term. + */ export interface NavtoResponse extends Response { body?: NavtoItem[]; } - /** Arguments for change request message. */ + /** + * Arguments for change request message. + */ export interface ChangeRequestArgs extends CodeLocationRequestArgs { /** - Length of span deleted at location (file, line, col); nothing deleted - if this field is zero or undefined. - */ + * Length of span deleted at location (file, line, col); nothing deleted + * if this field is zero or undefined. + */ deleteLen?: number; - /** Optional string to insert at location (file, line col). */ + + /** + * Optional string to insert at location (file, line col). + */ insertString?: string; } /** - Change request message; value of command field is "change". - Update the server's view of the file named by argument 'file'. - Server does not currently send a response to a change request. - */ + * Change request message; value of command field is "change". + * Update the server's view of the file named by argument 'file'. + * Server does not currently send a response to a change request. + */ export interface ChangeRequest extends CodeLocationRequest { arguments: ChangeRequestArgs; } /** - If an object of this type is returned in place of a string as - the value of a file field in a response message, add the - mapping id => file to the client's cache of file id mappings, - and interpret the value as if it was the string in the 'file' - field. - */ + * If an object of this type is returned in place of a string as + * the value of a file field in a response message, add the + * mapping id => file to the client's cache of file id mappings, + * and interpret the value as if it was the string in the 'file' + * field. + */ export interface IdFile { - /** Id to assign to file */ + /** + * Id to assign to file. + */ id: number; - /** File name that will correspond to id */ + + /** + * File name that will correspond to id. + */ file: string; } /** - The type of an encoded file name. If of type number, the value - is a file id. If of type IdFile, the value is interpreted as - 'file' and in addition the mapping 'id' to 'file' is - established. If of type string, the value is simply the file - name. - */ + * The type of an encoded file name. If of type number, the value + * is a file id. If of type IdFile, the value is interpreted as + * 'file' and in addition the mapping 'id' to 'file' is + * established. If of type string, the value is simply the file + * name. + */ export type EncodedFile = number | IdFile | string; - /** Response to "brace" request. */ + /** + * Response to "brace" request. + */ export interface BraceResponse extends Response { body?: TextSpan[]; } /** - Brace matching request; value of command field is "brace". - Return response giving the code locations of matching braces - found in file at location line, col. - */ + * Brace matching request; value of command field is "brace". + * Return response giving the code locations of matching braces + * found in file at location line, col. + */ export interface BraceRequest extends CodeLocationRequest { } /** - NavBar itesm request; value of command field is "navbar". - Return response giving the list of navigation bar entries - extracted from the requested file. + * NavBar itesm request; value of command field is "navbar". + * Return response giving the list of navigation bar entries + * extracted from the requested file. */ export interface NavBarRequest extends FileRequest { } export interface NavigationBarItem { - /** The item's display text */ + /** + * The item's display text. + */ text: string; - /** The symbol's kind (such as 'className' or 'parameterName') */ + /** + * The symbol's kind (such as 'className' or 'parameterName'). + */ kind: string; - /** Optional modifiers for the kind (such as 'public') */ + /** + * Optional modifiers for the kind (such as 'public'). + */ kindModifiers?: string; - /** The definition locations of the item */ + /** + * The definition locations of the item. + */ spans: TextSpan[]; - /** Optional children */ + /** + * Optional children. + */ childItems?: NavigationBarItem[]; } From bbcdb6125487a68cbed44ffc981758e9a5dc5e11 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 19:55:10 -0800 Subject: [PATCH 074/106] remove unused cancellationToken class --- src/server/editorServices.ts | 39 ++---------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 4f23e9a7c14..7a055b77eac 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -72,34 +72,12 @@ module ts.server { } } - export class CancellationToken { - public static None = new CancellationToken(); - - requestPending = false; - - constructor() { - } - - cancel() { - this.requestPending = true; - } - - reset() { - this.requestPending = false; - } - - public isCancellationRequested() { - var temp = this.requestPending; - return temp; - } - } - export class LSHost implements ts.LanguageServiceHost { ls: ts.LanguageService = null; compilationSettings: ts.CompilerOptions; filenameToScript: ts.Map = {}; - constructor(public host: ServerHost, public project: Project, private cancellationToken: CancellationToken = CancellationToken.None) { + constructor(public host: ServerHost, public project: Project) { } getDefaultLibFileName() { @@ -107,14 +85,6 @@ module ts.server { return ts.combinePaths(nodeModuleBinDir, ts.getDefaultLibFileName(this.compilationSettings)); } - cancel() { - this.cancellationToken.cancel(); - } - - reset() { - this.cancellationToken.reset(); - } - getScriptSnapshot(filename: string): ts.IScriptSnapshot { var scriptInfo = this.getScriptInfo(filename); if (scriptInfo) { @@ -154,10 +124,6 @@ module ts.server { return this.getScriptInfo(filename).svc.latestVersion().toString(); } - getCancellationToken(): ts.CancellationToken { - return this.cancellationToken; - } - getCurrentDirectory(): string { return ""; } @@ -736,7 +702,6 @@ module ts.server { } export class CompilerService { - cancellationToken = new CancellationToken(); host: LSHost; languageService: ts.LanguageService; classifier: ts.Classifier; @@ -745,7 +710,7 @@ module ts.server { formatCodeOptions: ts.FormatCodeOptions = CompilerService.defaultFormatCodeOptions; constructor(public project: Project) { - this.host = new LSHost(project.projectService.host, project, this.cancellationToken); + this.host = new LSHost(project.projectService.host, project); // override default ES6 (remove when compiler default back at ES5) this.settings.target = ts.ScriptTarget.ES5; this.host.setCompilationSettings(this.settings); From 54e67568318dc852b62a012a92cbc231806f610a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 15 Feb 2015 20:04:14 -0800 Subject: [PATCH 075/106] Remove unused code and only expose needed types/classes --- src/server/editorServices.ts | 40 +++++++++++++----------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 7a055b77eac..5b5ee27d707 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -13,19 +13,8 @@ module ts.server { } var lineCollectionCapacity = 4; - var indentStrings: string[] = []; - var indentBase = " "; - function getIndent(indentAmt: number) { - if (!indentStrings[indentAmt]) { - indentStrings[indentAmt] = ""; - for (var i = 0; i < indentAmt; i++) { - indentStrings[indentAmt] += indentBase; - } - } - return indentStrings[indentAmt]; - } - export class ScriptInfo { + class ScriptInfo { svc: ScriptVersionCache; children: ScriptInfo[] = []; // files referenced by this file @@ -72,7 +61,7 @@ module ts.server { } } - export class LSHost implements ts.LanguageServiceHost { + class LSHost implements ts.LanguageServiceHost { ls: ts.LanguageService = null; compilationSettings: ts.CompilerOptions; filenameToScript: ts.Map = {}; @@ -270,7 +259,7 @@ module ts.server { } } - export interface ProjectOptions { + interface ProjectOptions { // these fields can be present in the project file files?: string[]; formatCodeOptions?: ts.FormatCodeOptions; @@ -354,7 +343,7 @@ module ts.server { } } - export interface ProjectOpenResult { + interface ProjectOpenResult { success?: boolean; errorMsg?: string; project?: Project; @@ -701,7 +690,7 @@ module ts.server { } - export class CompilerService { + class CompilerService { host: LSHost; languageService: ts.LanguageService; classifier: ts.Classifier; @@ -745,7 +734,7 @@ module ts.server { } - export interface LineCollection { + interface LineCollection { charCount(): number; lineCount(): number; isLeaf(): boolean; @@ -759,7 +748,7 @@ module ts.server { leaf?: LineLeaf; } - export enum CharRangeSection { + enum CharRangeSection { PreStart, Start, Entire, @@ -768,7 +757,7 @@ module ts.server { PostEnd } - export interface ILineIndexWalker { + interface ILineIndexWalker { goSubtree: boolean; done: boolean; leaf(relativeStart: number, relativeLength: number, lineCollection: LineLeaf): void; @@ -994,7 +983,7 @@ module ts.server { } // text change information - export class TextChange { + class TextChange { constructor(public pos: number, public deleteLen: number, public insertedText?: string) { } @@ -1004,7 +993,7 @@ module ts.server { } } - export class ScriptVersionCache { + class ScriptVersionCache { changes: TextChange[] = []; versions: LineIndexSnapshot[] = []; minVersion = 0; // no versions earlier than min version will maintain change history @@ -1109,7 +1098,7 @@ module ts.server { } } - export class LineIndexSnapshot implements ts.IScriptSnapshot { + class LineIndexSnapshot implements ts.IScriptSnapshot { index: LineIndex; changesSincePreviousVersion: TextChange[] = []; @@ -1157,8 +1146,7 @@ module ts.server { } } - - export class LineIndex { + class LineIndex { root: LineNode; // set this to true to check each edit for accuracy checkEdits = false; @@ -1338,7 +1326,7 @@ module ts.server { } } - export class LineNode implements LineCollection { + class LineNode implements LineCollection { totalChars = 0; totalLines = 0; children: LineCollection[] = []; @@ -1624,7 +1612,7 @@ module ts.server { } } - export class LineLeaf implements LineCollection { + class LineLeaf implements LineCollection { udata: any; constructor(public text: string) { From ac829a838457762fe00f6e116c543a0c81f496c5 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 16 Feb 2015 10:44:30 -0800 Subject: [PATCH 076/106] Error for naming an interface 'symbol' --- src/compiler/checker.ts | 1 + tests/baselines/reference/symbolType20.errors.txt | 7 +++++++ tests/baselines/reference/symbolType20.js | 4 ++++ tests/cases/conformance/es6/Symbols/symbolType20.ts | 2 ++ 4 files changed, 14 insertions(+) create mode 100644 tests/baselines/reference/symbolType20.errors.txt create mode 100644 tests/baselines/reference/symbolType20.js create mode 100644 tests/cases/conformance/es6/Symbols/symbolType20.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 08ed3c622e5..5d840a51264 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8903,6 +8903,7 @@ module ts { case "number": case "boolean": case "string": + case "symbol": case "void": error(name, message, (name).text); } diff --git a/tests/baselines/reference/symbolType20.errors.txt b/tests/baselines/reference/symbolType20.errors.txt new file mode 100644 index 00000000000..41345e371f8 --- /dev/null +++ b/tests/baselines/reference/symbolType20.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/Symbols/symbolType20.ts(1,11): error TS2427: Interface name cannot be 'symbol' + + +==== tests/cases/conformance/es6/Symbols/symbolType20.ts (1 errors) ==== + interface symbol { } + ~~~~~~ +!!! error TS2427: Interface name cannot be 'symbol' \ No newline at end of file diff --git a/tests/baselines/reference/symbolType20.js b/tests/baselines/reference/symbolType20.js new file mode 100644 index 00000000000..cf80d0d30ac --- /dev/null +++ b/tests/baselines/reference/symbolType20.js @@ -0,0 +1,4 @@ +//// [symbolType20.ts] +interface symbol { } + +//// [symbolType20.js] diff --git a/tests/cases/conformance/es6/Symbols/symbolType20.ts b/tests/cases/conformance/es6/Symbols/symbolType20.ts new file mode 100644 index 00000000000..ef14e34048b --- /dev/null +++ b/tests/cases/conformance/es6/Symbols/symbolType20.ts @@ -0,0 +1,2 @@ +//@target: ES6 +interface symbol { } \ No newline at end of file From 32e2f4d95d007667b827f34c8109be5b32b49ffe Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 16 Feb 2015 12:04:34 -0800 Subject: [PATCH 077/106] Accept APISamples baselines --- tests/baselines/reference/APISample_compile.js | 1 + tests/baselines/reference/APISample_compile.types | 3 +++ tests/baselines/reference/APISample_linter.js | 1 + tests/baselines/reference/APISample_linter.types | 3 +++ tests/baselines/reference/APISample_transform.js | 1 + tests/baselines/reference/APISample_transform.types | 3 +++ tests/baselines/reference/APISample_watcher.js | 1 + tests/baselines/reference/APISample_watcher.types | 3 +++ 8 files changed, 16 insertions(+) diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index 7d89d88b5b3..1b7ca0c37d2 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -1605,6 +1605,7 @@ declare module "typescript" { InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; + [s: string]: boolean | number | string; } interface DefinitionInfo { fileName: string; diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index 8cf789bf20f..98063887df4 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -5195,6 +5195,9 @@ declare module "typescript" { PlaceOpenBraceOnNewLineForControlBlocks: boolean; >PlaceOpenBraceOnNewLineForControlBlocks : boolean + + [s: string]: boolean | number | string; +>s : string } interface DefinitionInfo { >DefinitionInfo : DefinitionInfo diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 0ce5a277968..ebb2f7503d8 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -1636,6 +1636,7 @@ declare module "typescript" { InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; + [s: string]: boolean | number | string; } interface DefinitionInfo { fileName: string; diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 115a0f5a16b..4d92af6dd2e 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -5339,6 +5339,9 @@ declare module "typescript" { PlaceOpenBraceOnNewLineForControlBlocks: boolean; >PlaceOpenBraceOnNewLineForControlBlocks : boolean + + [s: string]: boolean | number | string; +>s : string } interface DefinitionInfo { >DefinitionInfo : DefinitionInfo diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 6ecf4e7c395..315b1a97eac 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -1637,6 +1637,7 @@ declare module "typescript" { InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; + [s: string]: boolean | number | string; } interface DefinitionInfo { fileName: string; diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index e2797fe5267..bad0f064116 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -5291,6 +5291,9 @@ declare module "typescript" { PlaceOpenBraceOnNewLineForControlBlocks: boolean; >PlaceOpenBraceOnNewLineForControlBlocks : boolean + + [s: string]: boolean | number | string; +>s : string } interface DefinitionInfo { >DefinitionInfo : DefinitionInfo diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index eb141f20672..543677016a5 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -1674,6 +1674,7 @@ declare module "typescript" { InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; + [s: string]: boolean | number | string; } interface DefinitionInfo { fileName: string; diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 692e07f317a..7889e492db6 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -5464,6 +5464,9 @@ declare module "typescript" { PlaceOpenBraceOnNewLineForControlBlocks: boolean; >PlaceOpenBraceOnNewLineForControlBlocks : boolean + + [s: string]: boolean | number | string; +>s : string } interface DefinitionInfo { >DefinitionInfo : DefinitionInfo From 935c6024c27593388a00bc1975f21e5e291b41a9 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 16 Feb 2015 13:48:36 -0800 Subject: [PATCH 078/106] Rebaseline after merge --- ...arationShadowedByVarDeclaration.errors.txt | 12 ++--- .../constEnumBadPropertyNames.errors.txt | 4 +- .../reference/constEnumErrors.errors.txt | 44 +++++++++---------- .../letInLetOrConstDeclarations.errors.txt | 12 ++--- .../shadowingViaLocalValue.errors.txt | 8 ++-- 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/tests/baselines/reference/constDeclarationShadowedByVarDeclaration.errors.txt b/tests/baselines/reference/constDeclarationShadowedByVarDeclaration.errors.txt index ff669e41396..24af601139f 100644 --- a/tests/baselines/reference/constDeclarationShadowedByVarDeclaration.errors.txt +++ b/tests/baselines/reference/constDeclarationShadowedByVarDeclaration.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(7,9): error TS2477: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. -tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(15,13): error TS2477: Cannot initialize outer scoped variable 'y' in the same scope as block scoped declaration 'y'. -tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(22,7): error TS2477: Cannot initialize outer scoped variable 'z' in the same scope as block scoped declaration 'z'. +tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(7,9): error TS2481: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. +tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(15,13): error TS2481: Cannot initialize outer scoped variable 'y' in the same scope as block scoped declaration 'y'. +tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(22,7): error TS2481: Cannot initialize outer scoped variable 'z' in the same scope as block scoped declaration 'z'. ==== tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts (3 errors) ==== @@ -12,7 +12,7 @@ tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(22,7): error TS var x = 0; ~ -!!! error TS2477: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. +!!! error TS2481: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. } @@ -22,7 +22,7 @@ tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(22,7): error TS { var y = 0; ~ -!!! error TS2477: Cannot initialize outer scoped variable 'y' in the same scope as block scoped declaration 'y'. +!!! error TS2481: Cannot initialize outer scoped variable 'y' in the same scope as block scoped declaration 'y'. } } @@ -31,5 +31,5 @@ tests/cases/compiler/constDeclarationShadowedByVarDeclaration.ts(22,7): error TS const z = 0; var z = 0 ~ -!!! error TS2477: Cannot initialize outer scoped variable 'z' in the same scope as block scoped declaration 'z'. +!!! error TS2481: Cannot initialize outer scoped variable 'z' in the same scope as block scoped declaration 'z'. } \ No newline at end of file diff --git a/tests/baselines/reference/constEnumBadPropertyNames.errors.txt b/tests/baselines/reference/constEnumBadPropertyNames.errors.txt index 52c78fa68ae..f2330617dea 100644 --- a/tests/baselines/reference/constEnumBadPropertyNames.errors.txt +++ b/tests/baselines/reference/constEnumBadPropertyNames.errors.txt @@ -1,8 +1,8 @@ -tests/cases/compiler/constEnumBadPropertyNames.ts(2,11): error TS2475: Property 'B' does not exist on 'const' enum 'E'. +tests/cases/compiler/constEnumBadPropertyNames.ts(2,11): error TS2479: Property 'B' does not exist on 'const' enum 'E'. ==== tests/cases/compiler/constEnumBadPropertyNames.ts (1 errors) ==== const enum E { A } var x = E["B"] ~~~ -!!! error TS2475: Property 'B' does not exist on 'const' enum 'E'. \ No newline at end of file +!!! error TS2479: Property 'B' does not exist on 'const' enum 'E'. \ No newline at end of file diff --git a/tests/baselines/reference/constEnumErrors.errors.txt b/tests/baselines/reference/constEnumErrors.errors.txt index edd3044f0bc..be7dad54eeb 100644 --- a/tests/baselines/reference/constEnumErrors.errors.txt +++ b/tests/baselines/reference/constEnumErrors.errors.txt @@ -1,16 +1,16 @@ tests/cases/compiler/constEnumErrors.ts(1,12): error TS2300: Duplicate identifier 'E'. tests/cases/compiler/constEnumErrors.ts(5,8): error TS2300: Duplicate identifier 'E'. -tests/cases/compiler/constEnumErrors.ts(12,9): error TS2470: In 'const' enum declarations member initializer must be constant expression. -tests/cases/compiler/constEnumErrors.ts(14,9): error TS2470: In 'const' enum declarations member initializer must be constant expression. -tests/cases/compiler/constEnumErrors.ts(15,10): error TS2470: In 'const' enum declarations member initializer must be constant expression. -tests/cases/compiler/constEnumErrors.ts(22,13): error TS2472: A const enum member can only be accessed using a string literal. -tests/cases/compiler/constEnumErrors.ts(24,13): error TS2472: A const enum member can only be accessed using a string literal. -tests/cases/compiler/constEnumErrors.ts(26,9): error TS2471: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. -tests/cases/compiler/constEnumErrors.ts(27,10): error TS2471: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. -tests/cases/compiler/constEnumErrors.ts(32,5): error TS2471: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. -tests/cases/compiler/constEnumErrors.ts(40,9): error TS2473: 'const' enum member initializer was evaluated to a non-finite value. -tests/cases/compiler/constEnumErrors.ts(41,9): error TS2473: 'const' enum member initializer was evaluated to a non-finite value. -tests/cases/compiler/constEnumErrors.ts(42,9): error TS2474: 'const' enum member initializer was evaluated to disallowed value 'NaN'. +tests/cases/compiler/constEnumErrors.ts(12,9): error TS2474: In 'const' enum declarations member initializer must be constant expression. +tests/cases/compiler/constEnumErrors.ts(14,9): error TS2474: In 'const' enum declarations member initializer must be constant expression. +tests/cases/compiler/constEnumErrors.ts(15,10): error TS2474: In 'const' enum declarations member initializer must be constant expression. +tests/cases/compiler/constEnumErrors.ts(22,13): error TS2476: A const enum member can only be accessed using a string literal. +tests/cases/compiler/constEnumErrors.ts(24,13): error TS2476: A const enum member can only be accessed using a string literal. +tests/cases/compiler/constEnumErrors.ts(26,9): error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. +tests/cases/compiler/constEnumErrors.ts(27,10): error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. +tests/cases/compiler/constEnumErrors.ts(32,5): error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. +tests/cases/compiler/constEnumErrors.ts(40,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value. +tests/cases/compiler/constEnumErrors.ts(41,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value. +tests/cases/compiler/constEnumErrors.ts(42,9): error TS2478: 'const' enum member initializer was evaluated to disallowed value 'NaN'. ==== tests/cases/compiler/constEnumErrors.ts (13 errors) ==== @@ -31,14 +31,14 @@ tests/cases/compiler/constEnumErrors.ts(42,9): error TS2474: 'const' enum member // forward reference to the element of the same enum X = Y, ~ -!!! error TS2470: In 'const' enum declarations member initializer must be constant expression. +!!! error TS2474: In 'const' enum declarations member initializer must be constant expression. // forward reference to the element of the same enum Y = E1.Z, ~~~~ -!!! error TS2470: In 'const' enum declarations member initializer must be constant expression. +!!! error TS2474: In 'const' enum declarations member initializer must be constant expression. Y1 = E1["Z"] ~~~~~~~ -!!! error TS2470: In 'const' enum declarations member initializer must be constant expression. +!!! error TS2474: In 'const' enum declarations member initializer must be constant expression. } const enum E2 { @@ -47,25 +47,25 @@ tests/cases/compiler/constEnumErrors.ts(42,9): error TS2474: 'const' enum member var y0 = E2[1] ~ -!!! error TS2472: A const enum member can only be accessed using a string literal. +!!! error TS2476: A const enum member can only be accessed using a string literal. var name = "A"; var y1 = E2[name]; ~~~~ -!!! error TS2472: A const enum member can only be accessed using a string literal. +!!! error TS2476: A const enum member can only be accessed using a string literal. var x = E2; ~~ -!!! error TS2471: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. +!!! error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. var y = [E2]; ~~ -!!! error TS2471: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. +!!! error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. function foo(t: any): void { } foo(E2); ~~ -!!! error TS2471: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. +!!! error TS2475: 'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment. const enum NaNOrInfinity { A = 9007199254740992, @@ -75,11 +75,11 @@ tests/cases/compiler/constEnumErrors.ts(42,9): error TS2474: 'const' enum member E = D * D, F = E * E, // overflow ~~~~~ -!!! error TS2473: 'const' enum member initializer was evaluated to a non-finite value. +!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value. G = 1 / 0, // overflow ~~~~~ -!!! error TS2473: 'const' enum member initializer was evaluated to a non-finite value. +!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value. H = 0 / 0 // NaN ~~~~~ -!!! error TS2474: 'const' enum member initializer was evaluated to disallowed value 'NaN'. +!!! error TS2478: 'const' enum member initializer was evaluated to disallowed value 'NaN'. } \ No newline at end of file diff --git a/tests/baselines/reference/letInLetOrConstDeclarations.errors.txt b/tests/baselines/reference/letInLetOrConstDeclarations.errors.txt index 799d2d6b698..fbcee276583 100644 --- a/tests/baselines/reference/letInLetOrConstDeclarations.errors.txt +++ b/tests/baselines/reference/letInLetOrConstDeclarations.errors.txt @@ -1,21 +1,21 @@ -tests/cases/compiler/letInLetOrConstDeclarations.ts(2,9): error TS2476: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. -tests/cases/compiler/letInLetOrConstDeclarations.ts(3,14): error TS2476: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. -tests/cases/compiler/letInLetOrConstDeclarations.ts(6,11): error TS2476: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. +tests/cases/compiler/letInLetOrConstDeclarations.ts(2,9): error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. +tests/cases/compiler/letInLetOrConstDeclarations.ts(3,14): error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. +tests/cases/compiler/letInLetOrConstDeclarations.ts(6,11): error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. ==== tests/cases/compiler/letInLetOrConstDeclarations.ts (3 errors) ==== { let let = 1; // should error ~~~ -!!! error TS2476: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. +!!! error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. for (let let in []) { } // should error ~~~ -!!! error TS2476: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. +!!! error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. } { const let = 1; // should error ~~~ -!!! error TS2476: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. +!!! error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. } { function let() { // should be ok diff --git a/tests/baselines/reference/shadowingViaLocalValue.errors.txt b/tests/baselines/reference/shadowingViaLocalValue.errors.txt index 5e683d3ee6f..8e6f16b91cc 100644 --- a/tests/baselines/reference/shadowingViaLocalValue.errors.txt +++ b/tests/baselines/reference/shadowingViaLocalValue.errors.txt @@ -1,7 +1,7 @@ tests/cases/compiler/shadowingViaLocalValue.ts(2,5): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. -tests/cases/compiler/shadowingViaLocalValue.ts(4,13): error TS2477: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. +tests/cases/compiler/shadowingViaLocalValue.ts(4,13): error TS2481: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. tests/cases/compiler/shadowingViaLocalValue.ts(9,5): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. -tests/cases/compiler/shadowingViaLocalValue.ts(11,18): error TS2477: Cannot initialize outer scoped variable 'x1' in the same scope as block scoped declaration 'x1'. +tests/cases/compiler/shadowingViaLocalValue.ts(11,18): error TS2481: Cannot initialize outer scoped variable 'x1' in the same scope as block scoped declaration 'x1'. ==== tests/cases/compiler/shadowingViaLocalValue.ts (4 errors) ==== @@ -12,7 +12,7 @@ tests/cases/compiler/shadowingViaLocalValue.ts(11,18): error TS2477: Cannot init { var x = 1; ~ -!!! error TS2477: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. +!!! error TS2481: Cannot initialize outer scoped variable 'x' in the same scope as block scoped declaration 'x'. } } @@ -23,7 +23,7 @@ tests/cases/compiler/shadowingViaLocalValue.ts(11,18): error TS2477: Cannot init { for (var x1 = 0; ;); ~~ -!!! error TS2477: Cannot initialize outer scoped variable 'x1' in the same scope as block scoped declaration 'x1'. +!!! error TS2481: Cannot initialize outer scoped variable 'x1' in the same scope as block scoped declaration 'x1'. } } From 59dc7d3a5bf606e7e2b00786fbc57ea6f6f02319 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 16 Feb 2015 16:50:40 -0800 Subject: [PATCH 079/106] Address feedback --- src/compiler/checker.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5d840a51264..aab9f49eae6 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5505,7 +5505,7 @@ module ts { function isNumericComputedName(name: ComputedPropertyName): boolean { // It seems odd to consider an expression of type Any to result in a numeric name, // but this behavior is consistent with checkIndexedAccess - return isTypeOfKind(checkComputedPropertyName(name), TypeFlags.Any | TypeFlags.NumberLike); + return allConstituentTypesHaveKind(checkComputedPropertyName(name), TypeFlags.Any | TypeFlags.NumberLike); } function isNumericLiteralName(name: string) { @@ -5540,7 +5540,7 @@ module ts { // This will allow types number, string, symbol or any. It will also allow enums, the unknown // type, and any union of these types (like string | number). - if (!isTypeOfKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { + if (!allConstituentTypesHaveKind(links.resolvedType, TypeFlags.Any | TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.ESSymbol)) { error(node, Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any); } else { @@ -5808,10 +5808,10 @@ module ts { } // Check for compatible indexer types. - if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { + if (allConstituentTypesHaveKind(indexType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { // Try to use a number indexer. - if (isTypeOfKind(indexType, TypeFlags.Any | TypeFlags.NumberLike)) { + if (allConstituentTypesHaveKind(indexType, TypeFlags.Any | TypeFlags.NumberLike)) { var numberIndexType = getIndexTypeOfType(objectType, IndexKind.Number); if (numberIndexType) { return numberIndexType; @@ -6819,7 +6819,7 @@ module ts { } function checkArithmeticOperandType(operand: Node, type: Type, diagnostic: DiagnosticMessage): boolean { - if (!isTypeOfKind(type, TypeFlags.Any | TypeFlags.NumberLike)) { + if (!allConstituentTypesHaveKind(type, TypeFlags.Any | TypeFlags.NumberLike)) { error(operand, diagnostic); return false; } @@ -6935,7 +6935,7 @@ module ts { case SyntaxKind.PlusToken: case SyntaxKind.MinusToken: case SyntaxKind.TildeToken: - if (hasSomeTypeOfKind(operandType, TypeFlags.ESSymbol)) { + if (someConstituentTypeHasKind(operandType, TypeFlags.ESSymbol)) { error(node.operand, Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, tokenToString(node.operator)); } return numberType; @@ -6975,7 +6975,7 @@ module ts { // Just like isTypeOfKind below, except that it returns true if *any* constituent // has this kind. - function hasSomeTypeOfKind(type: Type, kind: TypeFlags): boolean { + function someConstituentTypeHasKind(type: Type, kind: TypeFlags): boolean { if (type.flags & kind) { return true; } @@ -6992,7 +6992,7 @@ module ts { } // Return true if type has the given flags, or is a union type composed of types that all have those flags. - function isTypeOfKind(type: Type, kind: TypeFlags): boolean { + function allConstituentTypesHaveKind(type: Type, kind: TypeFlags): boolean { if (type.flags & kind) { return true; } @@ -7022,7 +7022,7 @@ module ts { // and the right operand to be of type Any or a subtype of the 'Function' interface type. // The result is always of the Boolean primitive type. // NOTE: do not raise error if leftType is unknown as related error was already reported - if (isTypeOfKind(leftType, TypeFlags.Primitive)) { + if (allConstituentTypesHaveKind(leftType, TypeFlags.Primitive)) { error(node.left, Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } // NOTE: do not raise error if right is unknown as related error was already reported @@ -7037,10 +7037,10 @@ module ts { // The in operator requires the left operand to be of type Any, the String primitive type, or the Number primitive type, // and the right operand to be of type Any, an object type, or a type parameter type. // The result is always of the Boolean primitive type. - if (!isTypeOfKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { + if (!allConstituentTypesHaveKind(leftType, TypeFlags.Any | TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbol)) { error(node.left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol); } - if (!isTypeOfKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { + if (!allConstituentTypesHaveKind(rightType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { error(node.right, Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter); } return booleanType; @@ -7201,13 +7201,13 @@ module ts { if (rightType.flags & (TypeFlags.Undefined | TypeFlags.Null)) rightType = leftType; var resultType: Type; - if (isTypeOfKind(leftType, TypeFlags.NumberLike) && isTypeOfKind(rightType, TypeFlags.NumberLike)) { + if (allConstituentTypesHaveKind(leftType, TypeFlags.NumberLike) && allConstituentTypesHaveKind(rightType, TypeFlags.NumberLike)) { // Operands of an enum type are treated as having the primitive type Number. // If both operands are of the Number primitive type, the result is of the Number primitive type. resultType = numberType; } else { - if (isTypeOfKind(leftType, TypeFlags.StringLike) || isTypeOfKind(rightType, TypeFlags.StringLike)) { + if (allConstituentTypesHaveKind(leftType, TypeFlags.StringLike) || allConstituentTypesHaveKind(rightType, TypeFlags.StringLike)) { // If one or both operands are of the String primitive type, the result is of the String primitive type. resultType = stringType; } @@ -7266,8 +7266,8 @@ module ts { // Return type is true if there was no error, false if there was an error. function checkForDisallowedESSymbolOperand(operator: SyntaxKind): boolean { var offendingSymbolOperand = - hasSomeTypeOfKind(leftType, TypeFlags.ESSymbol) ? node.left : - hasSomeTypeOfKind(rightType, TypeFlags.ESSymbol) ? node.right : + someConstituentTypeHasKind(leftType, TypeFlags.ESSymbol) ? node.left : + someConstituentTypeHasKind(rightType, TypeFlags.ESSymbol) ? node.right : undefined; if (offendingSymbolOperand) { error(offendingSymbolOperand, Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, tokenToString(operator)); @@ -8640,7 +8640,7 @@ module ts { // and Expr must be an expression of type Any, an object type, or a type parameter type. var varExpr = node.initializer; var exprType = checkExpression(varExpr); - if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.StringLike)) { + if (!allConstituentTypesHaveKind(exprType, TypeFlags.Any | TypeFlags.StringLike)) { error(varExpr, Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any); } else { @@ -8652,7 +8652,7 @@ module ts { var exprType = checkExpression(node.expression); // unknownType is returned i.e. if node.expression is identifier whose name cannot be resolved // in this case error about missing name is already reported - do not report extra one - if (!isTypeOfKind(exprType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { + if (!allConstituentTypesHaveKind(exprType, TypeFlags.Any | TypeFlags.ObjectType | TypeFlags.TypeParameter)) { error(node.expression, Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter); } From d2712dd793db7032b11e5ef71c1f4a4ee06131b2 Mon Sep 17 00:00:00 2001 From: steveluc Date: Mon, 16 Feb 2015 23:43:05 -0800 Subject: [PATCH 080/106] Removed file mapping compression technique due to brittleness of approach. As necessary, will substitute grouping or paging approaches. --- src/server/client.ts | 24 ++++-------------------- src/server/protocol.d.ts | 40 ++++------------------------------------ src/server/session.ts | 30 +++++++----------------------- 3 files changed, 15 insertions(+), 79 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index 22b346aa3ec..a3b32be31ed 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -69,22 +69,6 @@ module ts.server { }; } - private decodeEncodedFileId(fileId: ts.server.protocol.EncodedFile): string { - var fileName: string; - if (typeof fileId === "object") { - fileName = (fileId).file; - this.fileMapping[(fileId).id] = fileName; - } - else if (typeof fileId === "number") { - fileName = ts.lookUp(this.fileMapping, fileId.toString()); - Debug.assert(!!fileName, "Did not find filename in previous fileID mappings."); - } - else { - Debug.fail("Got unexpedted fileId type."); - } - return fileName; - } - private processRequest(command: string, arguments?: any): T { var request: ts.server.protocol.Request = { seq: this.sequence++, @@ -232,7 +216,7 @@ module ts.server { var response = this.processResponse(request); return response.body.map(entry => { - var fileName = this.decodeEncodedFileId(entry.file); + var fileName = entry.file; var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); @@ -299,7 +283,7 @@ module ts.server { var response = this.processResponse(request); return response.body.map(entry => { - var fileName = this.decodeEncodedFileId(entry.file); + var fileName = entry.file; var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); return { @@ -325,7 +309,7 @@ module ts.server { var response = this.processResponse(request); return response.body.refs.map(entry => { - var fileName = this.decodeEncodedFileId(entry.file); + var fileName = entry.file; var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); return { @@ -378,7 +362,7 @@ module ts.server { findInStrings: findInStrings, findInComments: findInComments, locations: response.body.locs.map((entry) => { - var fileName = this.decodeEncodedFileId(entry.file); + var fileName = entry.file; var start = this.lineColToPosition(fileName, entry.start); var end = this.lineColToPosition(fileName, entry.end); return { diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index e3433e24690..06974b58cb3 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -153,11 +153,9 @@ declare module ts.server.protocol { */ export interface CodeSpan extends TextSpan { /** - * File containing the definition; the value of this - * field will always be a string, number of a mapping between - * a string and a number. + * File containing text span. */ - file: EncodedFile; + file: string; } /** @@ -675,11 +673,9 @@ declare module ts.server.protocol { kindModifiers?: string; /** - * The file in which the symbol is found; the value of this - * field will always be a string, number of a mapping between - * a string and a number. + * The file in which the symbol is found. */ - file: EncodedFile; + file: string; /** * The location within file at which the symbol is found. @@ -736,34 +732,6 @@ declare module ts.server.protocol { arguments: ChangeRequestArgs; } - /** - * If an object of this type is returned in place of a string as - * the value of a file field in a response message, add the - * mapping id => file to the client's cache of file id mappings, - * and interpret the value as if it was the string in the 'file' - * field. - */ - export interface IdFile { - /** - * Id to assign to file. - */ - id: number; - - /** - * File name that will correspond to id. - */ - file: string; - } - - /** - * The type of an encoded file name. If of type number, the value - * is a file id. If of type IdFile, the value is interpreted as - * 'file' and in addition the mapping 'id' to 'file' is - * established. If of type string, the value is simply the file - * name. - */ - export type EncodedFile = number | IdFile | string; - /** * Response to "brace" request. */ diff --git a/src/server/session.ts b/src/server/session.ts index e88932dcb77..812d2fc6c15 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -5,10 +5,6 @@ /// module ts.server { - var paddedLength = 8; - - var typeNames = ["interface", "class", "enum", "module", "alias", "type"]; - var spaceCache = [" ", " ", " ", " "]; interface StackTraceError extends Error { @@ -27,7 +23,7 @@ module ts.server { } interface FileStart { - file: ts.server.protocol.EncodedFile; + file: string; start: ILineInfo; } @@ -204,18 +200,6 @@ module ts.server { this.send(res); } - encodeFileName(fileName: string): ts.server.protocol.EncodedFile { - var id = ts.lookUp(this.fileHash, fileName); - if (!id) { - id = this.nextFileId++; - this.fileHash[fileName] = id; - return { id: id, file: fileName }; - } - else { - return id; - } - } - output(body: any, commandName: string, requestSequence = 0, errorMessage?: string) { this.response(body, commandName, requestSequence, errorMessage); } @@ -224,7 +208,7 @@ module ts.server { var diags = project.compilerService.languageService.getSemanticDiagnostics(file); if (diags) { var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); - this.event({ file: this.encodeFileName(file), diagnostics: bakedDiags }, "semanticDiag"); + this.event({ file: file, diagnostics: bakedDiags }, "semanticDiag"); } } @@ -232,7 +216,7 @@ module ts.server { var diags = project.compilerService.languageService.getSyntacticDiagnostics(file); if (diags) { var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); - this.event({ file: this.encodeFileName(file), diagnostics: bakedDiags }, "syntaxDiag"); + this.event({ file: file, diagnostics: bakedDiags }, "syntaxDiag"); } } @@ -293,7 +277,7 @@ module ts.server { } return definitions.map(def => ({ - file: this.encodeFileName(def.fileName), + file: def.fileName, start: compilerService.host.positionToLineCol(def.fileName, def.textSpan.start), end: compilerService.host.positionToLineCol(def.fileName, ts.textSpanEnd(def.textSpan)) })); @@ -326,7 +310,7 @@ module ts.server { } var bakedRenameLocs = renameLocations.map(location => ({ - file: this.encodeFileName(location.fileName), + file: location.fileName, start: compilerService.host.positionToLineCol(location.fileName, location.textSpan.start), end: compilerService.host.positionToLineCol(location.fileName, ts.textSpanEnd(location.textSpan)), })); @@ -366,7 +350,7 @@ module ts.server { var snap = compilerService.host.getScriptSnapshot(ref.fileName); var lineText = snap.getText(refLineSpan.start, ts.textSpanEnd(refLineSpan)).replace(/\r|\n/g, ""); return { - file: this.encodeFileName(ref.fileName), + file: ref.fileName, start: start, lineText: lineText, end: compilerService.host.positionToLineCol(ref.fileName, ts.textSpanEnd(ref.textSpan)), @@ -633,7 +617,7 @@ module ts.server { var bakedItem: ts.server.protocol.NavtoItem = { name: navItem.name, kind: navItem.kind, - file: this.encodeFileName(navItem.fileName), + file: navItem.fileName, start: start, end: end, }; From cadd57c10fe8036661427c9bf4fa1c22c85658c3 Mon Sep 17 00:00:00 2001 From: steveluc Date: Tue, 17 Feb 2015 02:02:59 -0800 Subject: [PATCH 081/106] Change rename response to return the rename info + nested location information: one array of location information per file. Add interface definition for rename response body. --- src/server/client.ts | 23 ++++++++++-------- src/server/protocol.d.ts | 36 ++++++++++++++++++---------- src/server/session.ts | 51 +++++++++++++++++++++++++++++----------- 3 files changed, 74 insertions(+), 36 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index a3b32be31ed..e12a9fecd3e 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -348,7 +348,18 @@ module ts.server { var request = this.processRequest(CommandNames.Rename, args); var response = this.processResponse(request); - + var locations: RenameLocation[] = []; + response.body.locs.map((entry: ts.server.protocol.SpanGroup) => { + var fileName = entry.file; + entry.locs.map((loc: ts.server.protocol.TextSpan) => { + var start = this.lineColToPosition(fileName, loc.start); + var end = this.lineColToPosition(fileName, loc.end); + locations.push({ + textSpan: ts.createTextSpanFromBounds(start, end), + fileName: fileName + }); + }); + }); return this.lastRenameEntry = { canRename: response.body.info.canRename, displayName: response.body.info.displayName, @@ -361,15 +372,7 @@ module ts.server { position: position, findInStrings: findInStrings, findInComments: findInComments, - locations: response.body.locs.map((entry) => { - var fileName = entry.file; - var start = this.lineColToPosition(fileName, entry.start); - var end = this.lineColToPosition(fileName, entry.end); - return { - textSpan: ts.createTextSpanFromBounds(start, end), - fileName: fileName - }; - }) + locations: locations }; } diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index 06974b58cb3..3fdded3aa6a 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -247,7 +247,7 @@ declare module ts.server.protocol { /** * Error message if item can not be renamed. */ - localizedErrorMessage: string; + localizedErrorMessage?: string; /** * Display name of the item to be renamed. @@ -270,21 +270,33 @@ declare module ts.server.protocol { kindModifiers: string; } + /** + * A group of text spans, all in 'file'. + */ + export interface SpanGroup { + /** The file to which the spans apply */ + file: string; + /** The text spans in this group */ + locs: TextSpan[]; + } + + export interface RenameResponseBody { + /** + * Information about the item to be renamed. + */ + info: RenameInfo; + + /** + * An array of span groups (one per file) that refer to the item to be renamed. + */ + locs: SpanGroup[]; + } + /** * Rename response message. */ export interface RenameResponse extends Response { - body?: { - /** - * Information about the item to be renamed. - */ - info: RenameInfo; - - /** - * An array of code locations that refer to the item to be renamed. - */ - locs: CodeSpan[]; - } + body?: RenameResponseBody; } /** diff --git a/src/server/session.ts b/src/server/session.ts index 812d2fc6c15..67811c76412 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -18,7 +18,7 @@ module ts.server { strBuilder += " "; } spaceCache[n] = strBuilder; - } + } return spaceCache[n]; } @@ -54,6 +54,7 @@ module ts.server { } function sortNavItems(items: ts.NavigateToItem[]) { + return items.sort((a, b) => { if (a.matchKind < b.matchKind) { return -1; @@ -77,17 +78,6 @@ module ts.server { }) } - interface FileRange { - file?: string; - start: ILineInfo; - end: ILineInfo; - } - - interface FileRanges { - file: string; - locs: FileRange[]; - } - function formatDiag(fileName: string, project: Project, diag: ts.Diagnostic) { return { start: project.compilerService.host.positionToLineCol(fileName, diag.start), @@ -283,7 +273,7 @@ module ts.server { })); } - getRenameLocations(line: number, col: number, fileName: string, findInComments: boolean, findInStrings: boolean): { info: RenameInfo; locs: ts.server.protocol.CodeSpan[] } { + getRenameLocations(line: number, col: number, fileName: string,findInComments: boolean, findInStrings: boolean): ts.server.protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -313,7 +303,40 @@ module ts.server { file: location.fileName, start: compilerService.host.positionToLineCol(location.fileName, location.textSpan.start), end: compilerService.host.positionToLineCol(location.fileName, ts.textSpanEnd(location.textSpan)), - })); + })).sort((a, b) => { + if (a.file < b.file) { + return -1; + } + else if (a.file > b.file) { + return 1; + } + else { + // reverse sort assuming no overlap + if (a.start.line < b.start.line) { + return 1; + } + else if (a.start.line > b.start.line) { + return -1; + } + else { + return b.start.col - a.start.col; + } + } + }).reduce((accum: ts.server.protocol.SpanGroup[], cur: ts.server.protocol.CodeSpan) => { + var curFileAccum: ts.server.protocol.SpanGroup; + if (accum.length > 0) { + curFileAccum = accum[accum.length - 1]; + if (curFileAccum.file != cur.file) { + curFileAccum = undefined; + } + } + if (!curFileAccum) { + curFileAccum = { file: cur.file, locs: [] }; + accum.push(curFileAccum); + } + curFileAccum.locs.push({ start: cur.start, end: cur.end }); + return accum; + }, []); return { info: renameInfo, locs: bakedRenameLocs }; } From 975f10c6a1bff1c1b71e8cac52ea81b4814615c0 Mon Sep 17 00:00:00 2001 From: Jason Ramsay Date: Tue, 17 Feb 2015 14:44:45 -0800 Subject: [PATCH 082/106] Adding getCanonicalFileName to ensure case-sensitive systems do not have issues --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index 94ad9d60b6c..a69a3b4154c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5522,7 +5522,7 @@ module ts { if (defaultLibFileName) { for (var i = 0; i < declarations.length; i++) { var sourceFile = declarations[i].getSourceFile(); - if (sourceFile && ts.normalizePath(sourceFile.fileName) === ts.normalizePath(defaultLibFileName)) { + if (sourceFile && getCanonicalFileName(ts.normalizePath(sourceFile.fileName)) === getCanonicalFileName(ts.normalizePath(defaultLibFileName))) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library.key)); } } From 3868fb5a6b26ab132a20edb85665d0c422eed0c2 Mon Sep 17 00:00:00 2001 From: steveluc Date: Wed, 18 Feb 2015 00:14:52 -0800 Subject: [PATCH 083/106] Removed deleteLen from change request; added endLine, endCol that mark the end of the deleted Range (inclusive). DeleteLen was not always accurate because editors normalize \r\n to \n in some cases, affecting the length of ranges. In Diagnostic response items, changed len field to end to address the same range length issue. Flattened MessageDiagnosticChains in diagnostic message text, since clients expect string there. Renamed ts.server.protocol to simply protocol in session.ts and client.ts since module name prefix is clear. Based on protocol feedback: Changed LineCol to Location. Changed CodeLocation interface name prefix to FileLocation. Changed DiagEvent to DiagnosticEvent. Removed anonymous types. --- src/server/client.ts | 92 +++++++++++++++-------------- src/server/protocol.d.ts | 124 +++++++++++++++++++-------------------- src/server/session.ts | 95 +++++++++++++++--------------- 3 files changed, 153 insertions(+), 158 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index e12a9fecd3e..d51777c2e99 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -47,11 +47,11 @@ module ts.server { return lineMap; } - private lineColToPosition(fileName: string, lineCol: ts.server.protocol.LineCol): number { + private lineColToPosition(fileName: string, lineCol: protocol.Location): number { return ts.computePositionFromLineAndCharacter(this.getLineMap(fileName), lineCol.line, lineCol.col); } - private positionToOneBasedLineCol(fileName: string, position: number): ts.server.protocol.LineCol { + private positionToOneBasedLineCol(fileName: string, position: number): protocol.Location { var lineCol = ts.computeLineAndCharacterOfPosition(this.getLineMap(fileName), position); return { line: lineCol.line, @@ -59,7 +59,7 @@ module ts.server { }; } - private convertCodeEditsToTextChange(fileName: string, codeEdit: ts.server.protocol.CodeEdit): ts.TextChange { + private convertCodeEditsToTextChange(fileName: string, codeEdit: protocol.CodeEdit): ts.TextChange { var start = this.lineColToPosition(fileName, codeEdit.start); var end = this.lineColToPosition(fileName, codeEdit.end); @@ -69,8 +69,8 @@ module ts.server { }; } - private processRequest(command: string, arguments?: any): T { - var request: ts.server.protocol.Request = { + private processRequest(command: string, arguments?: any): T { + var request: protocol.Request = { seq: this.sequence++, type: "request", command: command, @@ -82,7 +82,7 @@ module ts.server { return request; } - private processResponse(request: ts.server.protocol.Request): T { + private processResponse(request: protocol.Request): T { var lastMessage = this.messages.shift(); Debug.assert(!!lastMessage, "Did not recieve any responses."); @@ -122,12 +122,12 @@ module ts.server { } openFile(fileName: string): void { - var args: ts.server.protocol.FileRequestArgs = { file: fileName }; + var args: protocol.FileRequestArgs = { file: fileName }; this.processRequest(CommandNames.Open, args); } closeFile(fileName: string): void { - var args: ts.server.protocol.FileRequestArgs = { file: fileName }; + var args: protocol.FileRequestArgs = { file: fileName }; this.processRequest(CommandNames.Close, args); } @@ -136,12 +136,14 @@ module ts.server { this.lineMaps[fileName] = undefined; var lineCol = this.positionToOneBasedLineCol(fileName, start); - var args: ts.server.protocol.ChangeRequestArgs = { + var endLineCol = this.positionToOneBasedLineCol(fileName, end); + + var args: protocol.ChangeRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, - insertLen: end - start, - deleteLen: end - start, + endLine: endLineCol.line, + endCol: endLineCol.col, insertString: newText }; @@ -150,14 +152,14 @@ module ts.server { getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.CodeLocationRequestArgs = { + var args: protocol.FileLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col }; - var request = this.processRequest(CommandNames.Quickinfo, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Quickinfo, args); + var response = this.processResponse(request); var start = this.lineColToPosition(fileName, response.body.start); var end = this.lineColToPosition(fileName, response.body.end); @@ -173,15 +175,15 @@ module ts.server { getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.CompletionsRequestArgs = { + var args: protocol.CompletionsRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, prefix: undefined }; - var request = this.processRequest(CommandNames.Completions, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Completions, args); + var response = this.processResponse(request); return this.lastCompletionEntry = { isMemberCompletion: false, @@ -207,13 +209,13 @@ module ts.server { } getNavigateToItems(searchTerm: string): NavigateToItem[] { - var args: ts.server.protocol.NavtoRequestArgs = { + var args: protocol.NavtoRequestArgs = { searchTerm, file: this.host.getScriptFileNames()[0] }; - var request = this.processRequest(CommandNames.Navto, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Navto, args); + var response = this.processResponse(request); return response.body.map(entry => { var fileName = entry.file; @@ -236,7 +238,7 @@ module ts.server { getFormattingEditsForRange(fileName: string, start: number, end: number, options: ts.FormatCodeOptions): ts.TextChange[] { var startLineCol = this.positionToOneBasedLineCol(fileName, start); var endLineCol = this.positionToOneBasedLineCol(fileName, end); - var args: ts.server.protocol.FormatRequestArgs = { + var args: protocol.FormatRequestArgs = { file: fileName, line: startLineCol.line, col: startLineCol.col, @@ -245,8 +247,8 @@ module ts.server { }; // TODO: handle FormatCodeOptions - var request = this.processRequest(CommandNames.Format, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Format, args); + var response = this.processResponse(request); return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); } @@ -257,7 +259,7 @@ module ts.server { getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): ts.TextChange[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.FormatOnKeyRequestArgs = { + var args: protocol.FormatOnKeyRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, @@ -265,22 +267,22 @@ module ts.server { }; // TODO: handle FormatCodeOptions - var request = this.processRequest(CommandNames.Formatonkey, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Formatonkey, args); + var response = this.processResponse(request); return response.body.map(entry=> this.convertCodeEditsToTextChange(fileName, entry)); } getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.CodeLocationRequestArgs = { + var args: protocol.FileLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, }; - var request = this.processRequest(CommandNames.Definition, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Definition, args); + var response = this.processResponse(request); return response.body.map(entry => { var fileName = entry.file; @@ -299,14 +301,14 @@ module ts.server { getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.CodeLocationRequestArgs = { + var args: protocol.FileLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, }; - var request = this.processRequest(CommandNames.References, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.References, args); + var response = this.processResponse(request); return response.body.refs.map(entry => { var fileName = entry.file; @@ -338,7 +340,7 @@ module ts.server { getRenameInfo(fileName: string, position: number, findInStrings?: boolean, findInComments?: boolean): RenameInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.RenameRequestArgs = { + var args: protocol.RenameRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, @@ -346,12 +348,12 @@ module ts.server { findInComments }; - var request = this.processRequest(CommandNames.Rename, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Rename, args); + var response = this.processResponse(request); var locations: RenameLocation[] = []; - response.body.locs.map((entry: ts.server.protocol.SpanGroup) => { + response.body.locs.map((entry: protocol.SpanGroup) => { var fileName = entry.file; - entry.locs.map((loc: ts.server.protocol.TextSpan) => { + entry.locs.map((loc: protocol.TextSpan) => { var start = this.lineColToPosition(fileName, loc.start); var end = this.lineColToPosition(fileName, loc.end); locations.push({ @@ -388,7 +390,7 @@ module ts.server { return this.lastRenameEntry.locations; } - decodeNavigationBarItems(items: ts.server.protocol.NavigationBarItem[], fileName: string): NavigationBarItem[] { + decodeNavigationBarItems(items: protocol.NavigationBarItem[], fileName: string): NavigationBarItem[] { if (!items) { return []; } @@ -406,12 +408,12 @@ module ts.server { } getNavigationBarItems(fileName: string): NavigationBarItem[] { - var args: ts.server.protocol.FileRequestArgs = { + var args: protocol.FileRequestArgs = { file: fileName }; - var request = this.processRequest(CommandNames.NavBar, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.NavBar, args); + var response = this.processResponse(request); return this.decodeNavigationBarItems(response.body, fileName); } @@ -437,19 +439,19 @@ module ts.server { } getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[] { - throw new Error("Not Implemented Yet."); + throw new Error("Not Implemented Yet."); } getBraceMatchingAtPosition(fileName: string, position: number): TextSpan[] { var lineCol = this.positionToOneBasedLineCol(fileName, position); - var args: ts.server.protocol.CodeLocationRequestArgs = { + var args: protocol.FileLocationRequestArgs = { file: fileName, line: lineCol.line, col: lineCol.col, }; - var request = this.processRequest(CommandNames.Brace, args); - var response = this.processResponse(request); + var request = this.processRequest(CommandNames.Brace, args); + var response = this.processResponse(request); return response.body.map(entry => { var start = this.lineColToPosition(fileName, entry.start); diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index 3fdded3aa6a..a446f0176ae 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -95,10 +95,10 @@ declare module ts.server.protocol { } /** - * Instances of this interface specify a code location: + * Instances of this interface specify a location in a source file: * (file, line, col), where line and column are 1-based. */ - export interface CodeLocationRequestArgs extends FileRequestArgs { + export interface FileLocationRequestArgs extends FileRequestArgs { /** * The line number for the request (1-based). */ @@ -111,24 +111,24 @@ declare module ts.server.protocol { } /** - * A request whose arguments specify a code location (file, line, col). + * A request whose arguments specify a file location (file, line, col). */ - export interface CodeLocationRequest extends FileRequest { - arguments: CodeLocationRequestArgs; + export interface FileLocationRequest extends FileRequest { + arguments: FileLocationRequestArgs; } /** * Go to definition request; value of command field is - * "definition". Return response giving the code locations that + * "definition". Return response giving the file locations that * define the symbol found in file at location line, col. */ - export interface DefinitionRequest extends CodeLocationRequest { + export interface DefinitionRequest extends FileLocationRequest { } /** - * Object containing line and column (one-based) of code location. + * Location in source code expressed as (one-based) line and column. */ - export interface LineCol { + export interface Location { line: number; col: number; } @@ -140,18 +140,18 @@ declare module ts.server.protocol { /** * First character of the definition. */ - start: LineCol; + start: Location; /** * One character past last character of the definition. */ - end: LineCol; + end: Location; } /** * Object found in response messages defining a span of text in a specific source file. */ - export interface CodeSpan extends TextSpan { + export interface FileSpan extends TextSpan { /** * File containing text span. */ @@ -162,18 +162,18 @@ declare module ts.server.protocol { * Definition response message. Gives text range for definition. */ export interface DefinitionResponse extends Response { - body?: CodeSpan[]; + body?: FileSpan[]; } /** * Find references request; value of command field is - * "references". Return response giving the code locations that + * "references". Return response giving the file locations that * reference the symbol found in file at location line, col. */ - export interface ReferencesRequest extends CodeLocationRequest { + export interface ReferencesRequest extends FileLocationRequest { } - export interface ReferencesResponseItem extends CodeSpan { + export interface ReferencesResponseItem extends FileSpan { /** Text of line containing the reference. Including this * with the response avoids latency of editor loading files * to show text of reference line (the server already has @@ -192,7 +192,7 @@ declare module ts.server.protocol { */ export interface ReferencesResponseBody { /** - * The code locations referencing the symbol. + * The file locations referencing the symbol. */ refs: ReferencesResponseItem[]; @@ -219,7 +219,7 @@ declare module ts.server.protocol { body?: ReferencesResponseBody; } - export interface RenameRequestArgs extends CodeLocationRequestArgs { + export interface RenameRequestArgs extends FileLocationRequestArgs { findInComments?: boolean; findInStrings?: boolean; } @@ -227,11 +227,11 @@ declare module ts.server.protocol { /** * Rename request; value of command field is "rename". Return - * response giving the code locations that reference the symbol + * response giving the file locations that reference the symbol * found in file at location line, col. Also return full display * name of the symbol so that client can print it unambiguously. */ - export interface RenameRequest extends CodeLocationRequest { + export interface RenameRequest extends FileLocationRequest { arguments: RenameRequestArgs; } @@ -326,7 +326,7 @@ declare module ts.server.protocol { * documentation string for the symbol found in file at location * line, col. */ - export interface QuickInfoRequest extends CodeLocationRequest { + export interface QuickInfoRequest extends FileLocationRequest { } /** @@ -344,14 +344,14 @@ declare module ts.server.protocol { kindModifiers: string; /** - * Starting code location of symbol. + * Starting file location of symbol. */ - start: LineCol; + start: Location; /** * One past last character of symbol. */ - end: LineCol; + end: Location; /** * Type and kind of symbol. @@ -374,7 +374,7 @@ declare module ts.server.protocol { /** * Arguments for format messages. */ - export interface FormatRequestArgs extends CodeLocationRequestArgs { + export interface FormatRequestArgs extends FileLocationRequestArgs { /** * Last line of range for which to format text in file. */ @@ -393,7 +393,7 @@ declare module ts.server.protocol { * instructions in reverse to file will result in correctly * reformatted text. */ - export interface FormatRequest extends CodeLocationRequest { + export interface FormatRequest extends FileLocationRequest { arguments: FormatRequestArgs; } @@ -408,12 +408,12 @@ declare module ts.server.protocol { /** * First character of the text span to edit. */ - start: LineCol; + start: Location; /** * One character past last character of the text span to edit. */ - end: LineCol; + end: Location; /** * Replace the span defined above with this string (may be @@ -432,7 +432,7 @@ declare module ts.server.protocol { /** * Arguments for format on key messages. */ - export interface FormatOnKeyRequestArgs extends CodeLocationRequestArgs { + export interface FormatOnKeyRequestArgs extends FileLocationRequestArgs { /** * Key pressed (';', '\n', or '}'). */ @@ -447,14 +447,14 @@ declare module ts.server.protocol { * edit instructions in reverse to file will result in correctly * reformatted text. */ - export interface FormatOnKeyRequest extends CodeLocationRequest { + export interface FormatOnKeyRequest extends FileLocationRequest { arguments: FormatOnKeyRequestArgs; } /** * Arguments for completions messages. */ - export interface CompletionsRequestArgs extends CodeLocationRequestArgs { + export interface CompletionsRequestArgs extends FileLocationRequestArgs { /** * Optional prefix to apply to possible completions. */ @@ -467,7 +467,7 @@ declare module ts.server.protocol { * be the empty string), return the possible completions that * begin with prefix. */ - export interface CompletionsRequest extends CodeLocationRequest { + export interface CompletionsRequest extends FileLocationRequest { arguments: CompletionsRequestArgs; } @@ -552,18 +552,18 @@ declare module ts.server.protocol { } /** - * Item of diagnostic information found in a DiagEvent message. + * Item of diagnostic information found in a DiagnosticEvent message. */ export interface Diagnostic { /** - * Starting code location at which text appies. + * Starting file location at which text appies. */ - start: LineCol; + start: Location; /** - * Length of code location at which text applies. + * The last file location at which the text applies. */ - len: number; + end: Location; /** * Text of diagnostic message. @@ -571,24 +571,26 @@ declare module ts.server.protocol { text: string; } + export interface DiagnosticEventBody { + /** + * The file for which diagnostic information is reported. + */ + file: string; + + /** + * An array of diagnostic information items. + */ + diagnostics: Diagnostic[]; + } + /** * Event message for "syntaxDiag" and "semanticDiag" event types. * These events provide syntactic and semantic errors for a file. */ - export interface DiagEvent extends Event { - body?: { - /** - * The file for which diagnostic information is reported. - */ - file: string; - - /** - * An array of diagnostic information items. - */ - diagnostics: Diagnostic[]; - }; + export interface DiagnosticEvent extends Event { + body?: DiagnosticEventBody; } - + /** * Arguments for reload request. */ @@ -652,7 +654,7 @@ declare module ts.server.protocol { /** * Navto request message; value of command field is "navto". - * Return list of objects giving code locations and symbols that + * Return list of objects giving file locations and symbols that * match the search term given in argument 'searchTerm'. The * context for the search is given by the named file. */ @@ -692,12 +694,12 @@ declare module ts.server.protocol { /** * The location within file at which the symbol is found. */ - start: LineCol; + start: Location; /** * One past the last character of the symbol. */ - end: LineCol; + end: Location; /** * Name of symbol's container symbol (if any); for example, @@ -722,15 +724,9 @@ declare module ts.server.protocol { /** * Arguments for change request message. */ - export interface ChangeRequestArgs extends CodeLocationRequestArgs { + export interface ChangeRequestArgs extends FormatRequestArgs { /** - * Length of span deleted at location (file, line, col); nothing deleted - * if this field is zero or undefined. - */ - deleteLen?: number; - - /** - * Optional string to insert at location (file, line col). + * Optional string to insert at location (file, line, col). */ insertString?: string; } @@ -740,7 +736,7 @@ declare module ts.server.protocol { * Update the server's view of the file named by argument 'file'. * Server does not currently send a response to a change request. */ - export interface ChangeRequest extends CodeLocationRequest { + export interface ChangeRequest extends FileLocationRequest { arguments: ChangeRequestArgs; } @@ -753,10 +749,10 @@ declare module ts.server.protocol { /** * Brace matching request; value of command field is "brace". - * Return response giving the code locations of matching braces + * Return response giving the file locations of matching braces * found in file at location line, col. */ - export interface BraceRequest extends CodeLocationRequest { + export interface BraceRequest extends FileLocationRequest { } /** diff --git a/src/server/session.ts b/src/server/session.ts index 67811c76412..1a0a8d98a90 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -81,8 +81,8 @@ module ts.server { function formatDiag(fileName: string, project: Project, diag: ts.Diagnostic) { return { start: project.compilerService.host.positionToLineCol(fileName, diag.start), - len: diag.length, - text: diag.messageText, + end: project.compilerService.host.positionToLineCol(fileName, diag.start+diag.length), + text: ts.flattenDiagnosticMessageText(diag.messageText, "\n") }; } @@ -174,7 +174,7 @@ module ts.server { } response(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) { - var res: ts.server.protocol.Response = { + var res: protocol.Response = { seq: 0, type: "response", command: cmdName, @@ -251,7 +251,7 @@ module ts.server { } } - getDefinition(line: number, col: number, fileName: string): ts.server.protocol.CodeSpan[] { + getDefinition(line: number, col: number, fileName: string): protocol.FileSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -273,7 +273,7 @@ module ts.server { })); } - getRenameLocations(line: number, col: number, fileName: string,findInComments: boolean, findInStrings: boolean): ts.server.protocol.RenameResponseBody { + getRenameLocations(line: number, col: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -299,7 +299,7 @@ module ts.server { throw Errors.NoContent; } - var bakedRenameLocs = renameLocations.map(location => ({ + var bakedRenameLocs = renameLocations.map(location => ({ file: location.fileName, start: compilerService.host.positionToLineCol(location.fileName, location.textSpan.start), end: compilerService.host.positionToLineCol(location.fileName, ts.textSpanEnd(location.textSpan)), @@ -322,8 +322,8 @@ module ts.server { return b.start.col - a.start.col; } } - }).reduce((accum: ts.server.protocol.SpanGroup[], cur: ts.server.protocol.CodeSpan) => { - var curFileAccum: ts.server.protocol.SpanGroup; + }).reduce((accum: protocol.SpanGroup[], cur: protocol.FileSpan) => { + var curFileAccum: protocol.SpanGroup; if (accum.length > 0) { curFileAccum = accum[accum.length - 1]; if (curFileAccum.file != cur.file) { @@ -341,7 +341,7 @@ module ts.server { return { info: renameInfo, locs: bakedRenameLocs }; } - getReferences(line: number, col: number, fileName: string): ts.server.protocol.ReferencesResponseBody { + getReferences(line: number, col: number, fileName: string): protocol.ReferencesResponseBody { // TODO: get all projects for this file; report refs for all projects deleting duplicates // can avoid duplicates by eliminating same ref file from subsequent projects var file = ts.normalizePath(fileName); @@ -367,7 +367,7 @@ module ts.server { var nameSpan = nameInfo.textSpan; var nameColStart = compilerService.host.positionToLineCol(file, nameSpan.start).col; var nameText = compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); - var bakedRefs: ts.server.protocol.ReferencesResponseItem[] = references.map((ref) => { + var bakedRefs: protocol.ReferencesResponseItem[] = references.map((ref) => { var start = compilerService.host.positionToLineCol(ref.fileName, ref.textSpan.start); var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); var snap = compilerService.host.getScriptSnapshot(ref.fileName); @@ -393,7 +393,7 @@ module ts.server { this.projectService.openClientFile(file); } - getQuickInfo(line: number, col: number, fileName: string): ts.server.protocol.QuickInfoResponseBody { + getQuickInfo(line: number, col: number, fileName: string): protocol.QuickInfoResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -419,7 +419,7 @@ module ts.server { }; } - getFormattingEditsForRange(line: number, col: number, endLine: number, endCol: number, fileName: string): ts.server.protocol.CodeEdit[] { + getFormattingEditsForRange(line: number, col: number, endLine: number, endCol: number, fileName: string): protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -445,7 +445,7 @@ module ts.server { }); } - getFormattingEditsAfterKeystroke(line: number, col: number, key: string, fileName: string): ts.server.protocol.CodeEdit[] { + getFormattingEditsAfterKeystroke(line: number, col: number, key: string, fileName: string): protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -456,7 +456,7 @@ module ts.server { var compilerService = project.compilerService; var position = compilerService.host.lineColToPosition(file, line, col); var edits = compilerService.languageService.getFormattingEditsAfterKeystroke(file, position, key, - compilerService.formatCodeOptions); + compilerService.formatCodeOptions); if ((key == "\n") && ((!edits) || (edits.length == 0) || allEditsBeforePos(edits, position))) { // TODO: get these options from host var editorOptions: ts.EditorOptions = { @@ -487,7 +487,7 @@ module ts.server { }); } - getCompletions(line: number, col: number, prefix: string, fileName: string): ts.server.protocol.CompletionItem[] { + getCompletions(line: number, col: number, prefix: string, fileName: string): protocol.CompletionItem[] { if (!prefix) { prefix = ""; } @@ -541,18 +541,15 @@ module ts.server { } } - change(line: number, col: number, deleteLen: number, insertString: string, fileName: string) { + change(line: number, col: number, endLine: number, endCol: number, insertString: string, fileName: string) { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (project) { var compilerService = project.compilerService; - var pos = compilerService.host.lineColToPosition(file, line, col); - if (pos >= 0) { - var end = pos; - if (deleteLen) { - end += deleteLen; - } - compilerService.host.editScript(file, pos, end, insertString); + var start = compilerService.host.lineColToPosition(file, line, col); + var end = compilerService.host.lineColToPosition(file, endLine, endCol); + if (start >= 0) { + compilerService.host.editScript(file, start, end, insertString); this.changeSeq++; } } @@ -586,7 +583,7 @@ module ts.server { this.projectService.closeClientFile(file); } - decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): ts.server.protocol.NavigationBarItem[] { + decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): protocol.NavigationBarItem[] { if (!items) { return undefined; } @@ -605,7 +602,7 @@ module ts.server { })); } - getNavigationBarItems(fileName: string): ts.server.protocol.NavigationBarItem[] { + getNavigationBarItems(fileName: string): protocol.NavigationBarItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -621,7 +618,7 @@ module ts.server { return this.decorateNavigationBarItem(project, fileName, items); } - getNavigateToItems(searchTerm: string, fileName: string): ts.server.protocol.NavtoItem[] { + getNavigateToItems(searchTerm: string, fileName: string): protocol.NavtoItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -637,7 +634,7 @@ module ts.server { return navItems.map((navItem) => { var start = compilerService.host.positionToLineCol(navItem.fileName, navItem.textSpan.start); var end = compilerService.host.positionToLineCol(navItem.fileName, ts.textSpanEnd(navItem.textSpan)); - var bakedItem: ts.server.protocol.NavtoItem = { + var bakedItem: protocol.NavtoItem = { name: navItem.name, kind: navItem.kind, file: navItem.fileName, @@ -660,7 +657,7 @@ module ts.server { }); } - getBraceMatching(line: number, col: number, fileName: string): ts.server.protocol.TextSpan[] { + getBraceMatching(line: number, col: number, fileName: string): protocol.TextSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -684,87 +681,87 @@ module ts.server { onMessage(message: string) { try { - var request = JSON.parse(message); + var request = JSON.parse(message); var response: any; switch (request.command) { - case CommandNames.Definition: { - var defArgs = request.arguments; + case CommandNames.Definition: { + var defArgs = request.arguments; response = this.getDefinition(defArgs.line, defArgs.col, defArgs.file); break; } - case CommandNames.References: { - var refArgs = request.arguments; + case CommandNames.References: { + var refArgs = request.arguments; response = this.getReferences(refArgs.line, refArgs.col, refArgs.file); break; } case CommandNames.Rename: { - var renameArgs = request.arguments; + var renameArgs = request.arguments; response = this.getRenameLocations(renameArgs.line, renameArgs.col, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); break; } case CommandNames.Open: { - var openArgs = request.arguments; + var openArgs = request.arguments; this.openClientFile(openArgs.file); break; } case CommandNames.Quickinfo: { - var quickinfoArgs = request.arguments; + var quickinfoArgs = request.arguments; response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); break; } case CommandNames.Format: { - var formatArgs = request.arguments; + var formatArgs = request.arguments; response = this.getFormattingEditsForRange(formatArgs.line, formatArgs.col, formatArgs.endLine, formatArgs.endCol, formatArgs.file); break; } case CommandNames.Formatonkey: { - var formatOnKeyArgs = request.arguments; + var formatOnKeyArgs = request.arguments; response = this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.col, formatOnKeyArgs.key, formatOnKeyArgs.file); break; } case CommandNames.Completions: { - var completionsArgs = request.arguments; + var completionsArgs = request.arguments; response = this.getCompletions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); break; } case CommandNames.Geterr: { - var geterrArgs = request.arguments; + var geterrArgs = request.arguments; response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); break; } case CommandNames.Change: { - var changeArgs = request.arguments; - this.change(changeArgs.line, changeArgs.col, changeArgs.deleteLen, changeArgs.insertString, - changeArgs.file); + var changeArgs = request.arguments; + this.change(changeArgs.line, changeArgs.col, changeArgs.endLine, changeArgs.endCol, + changeArgs.insertString, changeArgs.file); break; } case CommandNames.Reload: { - var reloadArgs = request.arguments; + var reloadArgs = request.arguments; this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq); break; } case CommandNames.Saveto: { - var savetoArgs = request.arguments; + var savetoArgs = request.arguments; this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); break; } case CommandNames.Close: { - var closeArgs = request.arguments; + var closeArgs = request.arguments; this.closeClientFile(closeArgs.file); break; } case CommandNames.Navto: { - var navtoArgs = request.arguments; + var navtoArgs = request.arguments; response = this.getNavigateToItems(navtoArgs.searchTerm, navtoArgs.file); break; } case CommandNames.Brace: { - var braceArguments = request.arguments; + var braceArguments = request.arguments; response = this.getBraceMatching(braceArguments.line, braceArguments.col, braceArguments.file); break; } case CommandNames.NavBar: { - var navBarArgs = request.arguments; + var navBarArgs = request.arguments; response = this.getNavigationBarItems(navBarArgs.file); break; } From 1dfd1b470ea9b65d707700e50db818fde1a3cca9 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 5 Feb 2015 16:19:04 -0800 Subject: [PATCH 084/106] initial version of parsing 'for-of' Conflicts: src/compiler/diagnosticInformationMap.generated.ts src/compiler/diagnosticMessages.json --- src/compiler/checker.ts | 15 +++++++++ .../diagnosticInformationMap.generated.ts | 1 + src/compiler/diagnosticMessages.json | 6 +++- src/compiler/emitter.ts | 13 ++++++-- src/compiler/parser.ts | 32 +++++++++++++------ src/compiler/scanner.ts | 1 + src/compiler/types.ts | 10 ++++-- 7 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b9f8857cb23..caf07cbf4dc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8447,6 +8447,13 @@ module ts { checkSourceElement(node.statement); } + function checkForOfStatement(node: ForOfStatement) { + // TODO: not yet implemented + if (!checkGrammarForStatementInAmbientContext(node)) { + checkGrammarForOfStatement(node); + } + } + function checkForInStatement(node: ForInStatement) { // Grammar checking if (!checkGrammarForStatementInAmbientContext(node)) { @@ -9450,6 +9457,8 @@ module ts { return checkForStatement(node); case SyntaxKind.ForInStatement: return checkForInStatement(node); + case SyntaxKind.ForOfStatement: + return checkForOfStatement(node); case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: return checkBreakOrContinueStatement(node); @@ -10755,6 +10764,12 @@ module ts { } } + function checkGrammarForOfStatement(forOfStatement: ForOfStatement): boolean { + if (languageVersion < ScriptTarget.ES6) { + return grammarErrorOnFirstToken(forOfStatement, Diagnostics.For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher); + } + } + function checkGrammarAccessor(accessor: MethodDeclaration): boolean { var kind = accessor.kind; if (languageVersion < ScriptTarget.ES5) { diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 2c64f8ff4b0..a661f53ddfc 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -313,6 +313,7 @@ module ts { Property_0_does_not_exist_on_const_enum_1: { code: 2475, category: DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." }, let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2476, category: DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." }, Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2477, category: DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." }, + For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "For-of statements are only available when targeting ECMAScript 6 or higher" }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 8299e9f7733..d59d4fe0d8e 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1244,6 +1244,10 @@ "category": "Error", "code": 2477 }, + "For-of statements are only available when targeting ECMAScript 6 or higher": { + "category": "Error", + "code": 2482 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", @@ -1520,7 +1524,7 @@ "Exported type alias '{0}' has or is using private name '{1}'.": { "category": "Error", "code": 4081 - }, + }, "The current host does not support the '{0}' option.": { "category": "Error", "code": 5001 diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6a2338268e8..8aa2fb72df3 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2911,7 +2911,7 @@ module ts { emitEmbeddedStatement(node.statement); } - function emitForInStatement(node: ForInStatement) { + function emitForInOrForOfStatement(node: ForInStatement | ForOfStatement) { var endPos = emitToken(SyntaxKind.ForKeyword, node.pos); write(" "); endPos = emitToken(SyntaxKind.OpenParenToken, endPos); @@ -2932,7 +2932,13 @@ module ts { else { emit(node.initializer); } - write(" in "); + + if (node.kind === SyntaxKind.ForInStatement) { + write(" in "); + } + else { + write(" of "); + } emit(node.expression); emitToken(SyntaxKind.CloseParenToken, node.expression.end); emitEmbeddedStatement(node.statement); @@ -4351,8 +4357,9 @@ module ts { return emitWhileStatement(node); case SyntaxKind.ForStatement: return emitForStatement(node); + case SyntaxKind.ForOfStatement: case SyntaxKind.ForInStatement: - return emitForInStatement(node); + return emitForInOrForOfStatement(node); case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: return emitBreakOrContinueStatement(node); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 630418dc485..a90a4a9ab62 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1599,7 +1599,7 @@ module ts { // in the case where we're parsing the variable declarator of a 'for-in' statement, we // are done if we see an 'in' keyword in front of us. - if (token === SyntaxKind.InKeyword) { + if (isInOrOfKeyword(token)) { return true; } @@ -3159,6 +3159,10 @@ module ts { return parseBinaryExpressionRest(precedence, leftOperand); } + function isInOrOfKeyword(t: SyntaxKind) { + return t === SyntaxKind.InKeyword || t === SyntaxKind.OfKeyword; + } + function parseBinaryExpressionRest(precedence: number, leftOperand: Expression): Expression { while (true) { // We either have a binary operator here, or we're finished. We call @@ -3788,7 +3792,7 @@ module ts { return finishNode(node); } - function parseForOrForInStatement(): Statement { + function parseForOrForInOrForOfStatement(): Statement { var pos = getNodePos(); parseExpected(SyntaxKind.ForKeyword); parseExpected(SyntaxKind.OpenParenToken); @@ -3802,15 +3806,21 @@ module ts { initializer = disallowInAnd(parseExpression); } } - var forOrForInStatement: IterationStatement; + var forOrForInOrForOfStatement: IterationStatement; if (parseOptional(SyntaxKind.InKeyword)) { var forInStatement = createNode(SyntaxKind.ForInStatement, pos); forInStatement.initializer = initializer; forInStatement.expression = allowInAnd(parseExpression); parseExpected(SyntaxKind.CloseParenToken); - forOrForInStatement = forInStatement; + forOrForInOrForOfStatement = forInStatement; } - else { + else if (parseOptional(SyntaxKind.OfKeyword)) { + var forOfStatement = createNode(SyntaxKind.ForOfStatement, pos); + forOfStatement.initializer = initializer; + forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher); + parseExpected(SyntaxKind.CloseParenToken); + forOrForInOrForOfStatement = forOfStatement; + } else { var forStatement = createNode(SyntaxKind.ForStatement, pos); forStatement.initializer = initializer; parseExpected(SyntaxKind.SemicolonToken); @@ -3822,12 +3832,12 @@ module ts { forStatement.iterator = allowInAnd(parseExpression); } parseExpected(SyntaxKind.CloseParenToken); - forOrForInStatement = forStatement; + forOrForInOrForOfStatement = forStatement; } - forOrForInStatement.statement = parseStatement(); + forOrForInOrForOfStatement.statement = parseStatement(); - return finishNode(forOrForInStatement); + return finishNode(forOrForInOrForOfStatement); } function parseBreakOrContinueStatement(kind: SyntaxKind): BreakOrContinueStatement { @@ -4073,7 +4083,7 @@ module ts { case SyntaxKind.WhileKeyword: return parseWhileStatement(); case SyntaxKind.ForKeyword: - return parseForOrForInStatement(); + return parseForOrForInOrForOfStatement(); case SyntaxKind.ContinueKeyword: return parseBreakOrContinueStatement(SyntaxKind.ContinueStatement); case SyntaxKind.BreakKeyword: @@ -4215,7 +4225,9 @@ module ts { var node = createNode(SyntaxKind.VariableDeclaration); node.name = parseIdentifierOrPattern(); node.type = parseTypeAnnotation(); - node.initializer = parseInitializer(/*inParameter*/ false); + if (!isInOrOfKeyword(token)) { + node.initializer = parseInitializer(/*inParameter*/ false); + } return finishNode(node); } diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index fbbd69bbd69..7700d2389a0 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -93,6 +93,7 @@ module ts { "while": SyntaxKind.WhileKeyword, "with": SyntaxKind.WithKeyword, "yield": SyntaxKind.YieldKeyword, + "of": SyntaxKind.OfKeyword, "{": SyntaxKind.OpenBraceToken, "}": SyntaxKind.CloseBraceToken, "(": SyntaxKind.OpenParenToken, diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 12c5af21e12..04b44a5c1c0 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -141,7 +141,7 @@ module ts { SetKeyword, StringKeyword, TypeKeyword, - + OfKeyword, // Parse tree nodes // Names @@ -210,6 +210,7 @@ module ts { WhileStatement, ForStatement, ForInStatement, + ForOfStatement, ContinueStatement, BreakStatement, ReturnStatement, @@ -259,7 +260,7 @@ module ts { FirstReservedWord = BreakKeyword, LastReservedWord = WithKeyword, FirstKeyword = BreakKeyword, - LastKeyword = TypeKeyword, + LastKeyword = OfKeyword, FirstFutureReservedWord = ImplementsKeyword, LastFutureReservedWord = YieldKeyword, FirstTypeNode = TypeReference, @@ -752,6 +753,11 @@ module ts { expression: Expression; } + export interface ForOfStatement extends IterationStatement { + initializer: VariableDeclarationList | Expression; + expression: Expression; + } + export interface BreakOrContinueStatement extends Statement { label?: Identifier; } From 7947590ee5ad1bdb4b98ff708ae7659031c87df6 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 5 Feb 2015 16:29:59 -0800 Subject: [PATCH 085/106] added ForOfStatement to forEachChild --- src/compiler/parser.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index a90a4a9ab62..64f9560999b 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -191,6 +191,10 @@ module ts { return visitNode(cbNode, (node).initializer) || visitNode(cbNode, (node).expression) || visitNode(cbNode, (node).statement); + case SyntaxKind.ForOfStatement: + return visitNode(cbNode, (node).initializer) || + visitNode(cbNode, (node).expression) || + visitNode(cbNode, (node).statement); case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: return visitNode(cbNode, (node).label); From 2c4244d749fb591f4c6eb15dba86045e229ec92b Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 16 Feb 2015 16:33:07 -0800 Subject: [PATCH 086/106] Accept API baseline changes --- .../baselines/reference/APISample_compile.js | 192 ++++++++-------- .../reference/APISample_compile.types | 205 +++++++++-------- tests/baselines/reference/APISample_linter.js | 210 +++++++++--------- .../reference/APISample_linter.types | 205 +++++++++-------- .../reference/APISample_transform.js | 192 ++++++++-------- .../reference/APISample_transform.types | 205 +++++++++-------- .../baselines/reference/APISample_watcher.js | 192 ++++++++-------- .../reference/APISample_watcher.types | 205 +++++++++-------- 8 files changed, 853 insertions(+), 753 deletions(-) diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index b91a706aa45..3a291f8375c 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -180,105 +180,107 @@ declare module "typescript" { SetKeyword = 118, StringKeyword = 119, TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + OfKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ForOfStatement = 180, + ContinueStatement = 181, + BreakStatement = 182, + ReturnStatement = 183, + WithStatement = 184, + SwitchStatement = 185, + LabeledStatement = 186, + ThrowStatement = 187, + TryStatement = 188, + DebuggerStatement = 189, + VariableDeclaration = 190, + VariableDeclarationList = 191, + FunctionDeclaration = 192, + ClassDeclaration = 193, + InterfaceDeclaration = 194, + TypeAliasDeclaration = 195, + EnumDeclaration = 196, + ModuleDeclaration = 197, + ModuleBlock = 198, + ImportDeclaration = 199, + ExportAssignment = 200, + ExternalModuleReference = 201, + CaseClause = 202, + DefaultClause = 203, + HeritageClause = 204, + CatchClause = 205, + PropertyAssignment = 206, + ShorthandPropertyAssignment = 207, + EnumMember = 208, + SourceFile = 209, + SyntaxList = 210, + Count = 211, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, @@ -291,7 +293,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, @@ -622,6 +624,10 @@ declare module "typescript" { initializer: VariableDeclarationList | Expression; expression: Expression; } + interface ForOfStatement extends IterationStatement { + initializer: VariableDeclarationList | Expression; + expression: Expression; + } interface BreakOrContinueStatement extends Statement { label?: Identifier; } diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index ae53c666807..70b9451af81 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -556,271 +556,277 @@ declare module "typescript" { TypeKeyword = 120, >TypeKeyword : SyntaxKind - QualifiedName = 121, + OfKeyword = 121, +>OfKeyword : SyntaxKind + + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ForOfStatement = 180, +>ForOfStatement : SyntaxKind + + ContinueStatement = 181, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 182, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 183, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 184, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 185, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 186, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 187, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 188, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 189, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 190, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 191, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 192, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 193, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 194, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 195, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 196, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 197, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 198, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 199, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 200, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 201, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 202, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 203, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 204, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 205, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 206, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 207, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 208, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 209, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 210, >SyntaxList : SyntaxKind - Count = 209, + Count = 211, >Count : SyntaxKind FirstAssignment = 52, @@ -838,7 +844,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -847,10 +853,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -889,7 +895,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { @@ -1870,6 +1876,19 @@ declare module "typescript" { expression: Expression; >expression : Expression +>Expression : Expression + } + interface ForOfStatement extends IterationStatement { +>ForOfStatement : ForOfStatement +>IterationStatement : IterationStatement + + initializer: VariableDeclarationList | Expression; +>initializer : Expression | VariableDeclarationList +>VariableDeclarationList : VariableDeclarationList +>Expression : Expression + + expression: Expression; +>expression : Expression >Expression : Expression } interface BreakOrContinueStatement extends Statement { diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 68c13edb7db..f1c5c0fe99e 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -211,105 +211,107 @@ declare module "typescript" { SetKeyword = 118, StringKeyword = 119, TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + OfKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ForOfStatement = 180, + ContinueStatement = 181, + BreakStatement = 182, + ReturnStatement = 183, + WithStatement = 184, + SwitchStatement = 185, + LabeledStatement = 186, + ThrowStatement = 187, + TryStatement = 188, + DebuggerStatement = 189, + VariableDeclaration = 190, + VariableDeclarationList = 191, + FunctionDeclaration = 192, + ClassDeclaration = 193, + InterfaceDeclaration = 194, + TypeAliasDeclaration = 195, + EnumDeclaration = 196, + ModuleDeclaration = 197, + ModuleBlock = 198, + ImportDeclaration = 199, + ExportAssignment = 200, + ExternalModuleReference = 201, + CaseClause = 202, + DefaultClause = 203, + HeritageClause = 204, + CatchClause = 205, + PropertyAssignment = 206, + ShorthandPropertyAssignment = 207, + EnumMember = 208, + SourceFile = 209, + SyntaxList = 210, + Count = 211, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, @@ -322,7 +324,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, @@ -653,6 +655,10 @@ declare module "typescript" { initializer: VariableDeclarationList | Expression; expression: Expression; } + interface ForOfStatement extends IterationStatement { + initializer: VariableDeclarationList | Expression; + expression: Expression; + } interface BreakOrContinueStatement extends Statement { label?: Identifier; } @@ -1976,24 +1982,24 @@ function delint(sourceFile) { delintNode(sourceFile); function delintNode(node) { switch (node.kind) { - case 177 /* ForStatement */: - case 178 /* ForInStatement */: - case 176 /* WhileStatement */: - case 175 /* DoStatement */: - if (node.statement.kind !== 170 /* Block */) { + case 178 /* ForStatement */: + case 179 /* ForInStatement */: + case 177 /* WhileStatement */: + case 176 /* DoStatement */: + if (node.statement.kind !== 171 /* Block */) { report(node, "A looping statement's contents should be wrapped in a block body."); } break; - case 174 /* IfStatement */: + case 175 /* IfStatement */: var ifStatement = node; - if (ifStatement.thenStatement.kind !== 170 /* Block */) { + if (ifStatement.thenStatement.kind !== 171 /* Block */) { report(ifStatement.thenStatement, "An if statement's contents should be wrapped in a block body."); } - if (ifStatement.elseStatement && ifStatement.elseStatement.kind !== 170 /* Block */ && ifStatement.elseStatement.kind !== 174 /* IfStatement */) { + if (ifStatement.elseStatement && ifStatement.elseStatement.kind !== 171 /* Block */ && ifStatement.elseStatement.kind !== 175 /* IfStatement */) { report(ifStatement.elseStatement, "An else statement's contents should be wrapped in a block body."); } break; - case 163 /* BinaryExpression */: + case 164 /* BinaryExpression */: var op = node.operator; if (op === 28 /* EqualsEqualsToken */ || op === 29 /* ExclamationEqualsToken */) { report(node, "Use '===' and '!=='."); diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 0c153e7b1dc..87ff77cb26b 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -700,271 +700,277 @@ declare module "typescript" { TypeKeyword = 120, >TypeKeyword : SyntaxKind - QualifiedName = 121, + OfKeyword = 121, +>OfKeyword : SyntaxKind + + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ForOfStatement = 180, +>ForOfStatement : SyntaxKind + + ContinueStatement = 181, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 182, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 183, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 184, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 185, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 186, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 187, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 188, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 189, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 190, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 191, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 192, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 193, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 194, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 195, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 196, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 197, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 198, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 199, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 200, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 201, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 202, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 203, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 204, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 205, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 206, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 207, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 208, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 209, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 210, >SyntaxList : SyntaxKind - Count = 209, + Count = 211, >Count : SyntaxKind FirstAssignment = 52, @@ -982,7 +988,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -991,10 +997,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -1033,7 +1039,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { @@ -2014,6 +2020,19 @@ declare module "typescript" { expression: Expression; >expression : Expression +>Expression : Expression + } + interface ForOfStatement extends IterationStatement { +>ForOfStatement : ForOfStatement +>IterationStatement : IterationStatement + + initializer: VariableDeclarationList | Expression; +>initializer : Expression | VariableDeclarationList +>VariableDeclarationList : VariableDeclarationList +>Expression : Expression + + expression: Expression; +>expression : Expression >Expression : Expression } interface BreakOrContinueStatement extends Statement { diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 0e80f6b55b9..0abe024854f 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -212,105 +212,107 @@ declare module "typescript" { SetKeyword = 118, StringKeyword = 119, TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + OfKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ForOfStatement = 180, + ContinueStatement = 181, + BreakStatement = 182, + ReturnStatement = 183, + WithStatement = 184, + SwitchStatement = 185, + LabeledStatement = 186, + ThrowStatement = 187, + TryStatement = 188, + DebuggerStatement = 189, + VariableDeclaration = 190, + VariableDeclarationList = 191, + FunctionDeclaration = 192, + ClassDeclaration = 193, + InterfaceDeclaration = 194, + TypeAliasDeclaration = 195, + EnumDeclaration = 196, + ModuleDeclaration = 197, + ModuleBlock = 198, + ImportDeclaration = 199, + ExportAssignment = 200, + ExternalModuleReference = 201, + CaseClause = 202, + DefaultClause = 203, + HeritageClause = 204, + CatchClause = 205, + PropertyAssignment = 206, + ShorthandPropertyAssignment = 207, + EnumMember = 208, + SourceFile = 209, + SyntaxList = 210, + Count = 211, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, @@ -323,7 +325,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, @@ -654,6 +656,10 @@ declare module "typescript" { initializer: VariableDeclarationList | Expression; expression: Expression; } + interface ForOfStatement extends IterationStatement { + initializer: VariableDeclarationList | Expression; + expression: Expression; + } interface BreakOrContinueStatement extends Statement { label?: Identifier; } diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 0c201b0a5fd..8e9d349cf1f 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -652,271 +652,277 @@ declare module "typescript" { TypeKeyword = 120, >TypeKeyword : SyntaxKind - QualifiedName = 121, + OfKeyword = 121, +>OfKeyword : SyntaxKind + + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ForOfStatement = 180, +>ForOfStatement : SyntaxKind + + ContinueStatement = 181, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 182, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 183, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 184, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 185, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 186, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 187, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 188, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 189, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 190, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 191, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 192, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 193, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 194, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 195, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 196, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 197, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 198, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 199, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 200, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 201, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 202, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 203, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 204, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 205, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 206, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 207, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 208, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 209, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 210, >SyntaxList : SyntaxKind - Count = 209, + Count = 211, >Count : SyntaxKind FirstAssignment = 52, @@ -934,7 +940,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -943,10 +949,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -985,7 +991,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { @@ -1966,6 +1972,19 @@ declare module "typescript" { expression: Expression; >expression : Expression +>Expression : Expression + } + interface ForOfStatement extends IterationStatement { +>ForOfStatement : ForOfStatement +>IterationStatement : IterationStatement + + initializer: VariableDeclarationList | Expression; +>initializer : Expression | VariableDeclarationList +>VariableDeclarationList : VariableDeclarationList +>Expression : Expression + + expression: Expression; +>expression : Expression >Expression : Expression } interface BreakOrContinueStatement extends Statement { diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 27a2ce5e415..2aeede54d51 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -249,105 +249,107 @@ declare module "typescript" { SetKeyword = 118, StringKeyword = 119, TypeKeyword = 120, - QualifiedName = 121, - ComputedPropertyName = 122, - TypeParameter = 123, - Parameter = 124, - PropertySignature = 125, - PropertyDeclaration = 126, - MethodSignature = 127, - MethodDeclaration = 128, - Constructor = 129, - GetAccessor = 130, - SetAccessor = 131, - CallSignature = 132, - ConstructSignature = 133, - IndexSignature = 134, - TypeReference = 135, - FunctionType = 136, - ConstructorType = 137, - TypeQuery = 138, - TypeLiteral = 139, - ArrayType = 140, - TupleType = 141, - UnionType = 142, - ParenthesizedType = 143, - ObjectBindingPattern = 144, - ArrayBindingPattern = 145, - BindingElement = 146, - ArrayLiteralExpression = 147, - ObjectLiteralExpression = 148, - PropertyAccessExpression = 149, - ElementAccessExpression = 150, - CallExpression = 151, - NewExpression = 152, - TaggedTemplateExpression = 153, - TypeAssertionExpression = 154, - ParenthesizedExpression = 155, - FunctionExpression = 156, - ArrowFunction = 157, - DeleteExpression = 158, - TypeOfExpression = 159, - VoidExpression = 160, - PrefixUnaryExpression = 161, - PostfixUnaryExpression = 162, - BinaryExpression = 163, - ConditionalExpression = 164, - TemplateExpression = 165, - YieldExpression = 166, - SpreadElementExpression = 167, - OmittedExpression = 168, - TemplateSpan = 169, - Block = 170, - VariableStatement = 171, - EmptyStatement = 172, - ExpressionStatement = 173, - IfStatement = 174, - DoStatement = 175, - WhileStatement = 176, - ForStatement = 177, - ForInStatement = 178, - ContinueStatement = 179, - BreakStatement = 180, - ReturnStatement = 181, - WithStatement = 182, - SwitchStatement = 183, - LabeledStatement = 184, - ThrowStatement = 185, - TryStatement = 186, - DebuggerStatement = 187, - VariableDeclaration = 188, - VariableDeclarationList = 189, - FunctionDeclaration = 190, - ClassDeclaration = 191, - InterfaceDeclaration = 192, - TypeAliasDeclaration = 193, - EnumDeclaration = 194, - ModuleDeclaration = 195, - ModuleBlock = 196, - ImportDeclaration = 197, - ExportAssignment = 198, - ExternalModuleReference = 199, - CaseClause = 200, - DefaultClause = 201, - HeritageClause = 202, - CatchClause = 203, - PropertyAssignment = 204, - ShorthandPropertyAssignment = 205, - EnumMember = 206, - SourceFile = 207, - SyntaxList = 208, - Count = 209, + OfKeyword = 121, + QualifiedName = 122, + ComputedPropertyName = 123, + TypeParameter = 124, + Parameter = 125, + PropertySignature = 126, + PropertyDeclaration = 127, + MethodSignature = 128, + MethodDeclaration = 129, + Constructor = 130, + GetAccessor = 131, + SetAccessor = 132, + CallSignature = 133, + ConstructSignature = 134, + IndexSignature = 135, + TypeReference = 136, + FunctionType = 137, + ConstructorType = 138, + TypeQuery = 139, + TypeLiteral = 140, + ArrayType = 141, + TupleType = 142, + UnionType = 143, + ParenthesizedType = 144, + ObjectBindingPattern = 145, + ArrayBindingPattern = 146, + BindingElement = 147, + ArrayLiteralExpression = 148, + ObjectLiteralExpression = 149, + PropertyAccessExpression = 150, + ElementAccessExpression = 151, + CallExpression = 152, + NewExpression = 153, + TaggedTemplateExpression = 154, + TypeAssertionExpression = 155, + ParenthesizedExpression = 156, + FunctionExpression = 157, + ArrowFunction = 158, + DeleteExpression = 159, + TypeOfExpression = 160, + VoidExpression = 161, + PrefixUnaryExpression = 162, + PostfixUnaryExpression = 163, + BinaryExpression = 164, + ConditionalExpression = 165, + TemplateExpression = 166, + YieldExpression = 167, + SpreadElementExpression = 168, + OmittedExpression = 169, + TemplateSpan = 170, + Block = 171, + VariableStatement = 172, + EmptyStatement = 173, + ExpressionStatement = 174, + IfStatement = 175, + DoStatement = 176, + WhileStatement = 177, + ForStatement = 178, + ForInStatement = 179, + ForOfStatement = 180, + ContinueStatement = 181, + BreakStatement = 182, + ReturnStatement = 183, + WithStatement = 184, + SwitchStatement = 185, + LabeledStatement = 186, + ThrowStatement = 187, + TryStatement = 188, + DebuggerStatement = 189, + VariableDeclaration = 190, + VariableDeclarationList = 191, + FunctionDeclaration = 192, + ClassDeclaration = 193, + InterfaceDeclaration = 194, + TypeAliasDeclaration = 195, + EnumDeclaration = 196, + ModuleDeclaration = 197, + ModuleBlock = 198, + ImportDeclaration = 199, + ExportAssignment = 200, + ExternalModuleReference = 201, + CaseClause = 202, + DefaultClause = 203, + HeritageClause = 204, + CatchClause = 205, + PropertyAssignment = 206, + ShorthandPropertyAssignment = 207, + EnumMember = 208, + SourceFile = 209, + SyntaxList = 210, + Count = 211, FirstAssignment = 52, LastAssignment = 63, FirstReservedWord = 65, LastReservedWord = 100, FirstKeyword = 65, - LastKeyword = 120, + LastKeyword = 121, FirstFutureReservedWord = 101, LastFutureReservedWord = 109, - FirstTypeNode = 135, - LastTypeNode = 143, + FirstTypeNode = 136, + LastTypeNode = 144, FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, @@ -360,7 +362,7 @@ declare module "typescript" { LastTemplateToken = 13, FirstBinaryOperator = 24, LastBinaryOperator = 63, - FirstNode = 121, + FirstNode = 122, } const enum NodeFlags { Export = 1, @@ -691,6 +693,10 @@ declare module "typescript" { initializer: VariableDeclarationList | Expression; expression: Expression; } + interface ForOfStatement extends IterationStatement { + initializer: VariableDeclarationList | Expression; + expression: Expression; + } interface BreakOrContinueStatement extends Statement { label?: Identifier; } diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 4e137cae59d..bcf11cc6df4 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -825,271 +825,277 @@ declare module "typescript" { TypeKeyword = 120, >TypeKeyword : SyntaxKind - QualifiedName = 121, + OfKeyword = 121, +>OfKeyword : SyntaxKind + + QualifiedName = 122, >QualifiedName : SyntaxKind - ComputedPropertyName = 122, + ComputedPropertyName = 123, >ComputedPropertyName : SyntaxKind - TypeParameter = 123, + TypeParameter = 124, >TypeParameter : SyntaxKind - Parameter = 124, + Parameter = 125, >Parameter : SyntaxKind - PropertySignature = 125, + PropertySignature = 126, >PropertySignature : SyntaxKind - PropertyDeclaration = 126, + PropertyDeclaration = 127, >PropertyDeclaration : SyntaxKind - MethodSignature = 127, + MethodSignature = 128, >MethodSignature : SyntaxKind - MethodDeclaration = 128, + MethodDeclaration = 129, >MethodDeclaration : SyntaxKind - Constructor = 129, + Constructor = 130, >Constructor : SyntaxKind - GetAccessor = 130, + GetAccessor = 131, >GetAccessor : SyntaxKind - SetAccessor = 131, + SetAccessor = 132, >SetAccessor : SyntaxKind - CallSignature = 132, + CallSignature = 133, >CallSignature : SyntaxKind - ConstructSignature = 133, + ConstructSignature = 134, >ConstructSignature : SyntaxKind - IndexSignature = 134, + IndexSignature = 135, >IndexSignature : SyntaxKind - TypeReference = 135, + TypeReference = 136, >TypeReference : SyntaxKind - FunctionType = 136, + FunctionType = 137, >FunctionType : SyntaxKind - ConstructorType = 137, + ConstructorType = 138, >ConstructorType : SyntaxKind - TypeQuery = 138, + TypeQuery = 139, >TypeQuery : SyntaxKind - TypeLiteral = 139, + TypeLiteral = 140, >TypeLiteral : SyntaxKind - ArrayType = 140, + ArrayType = 141, >ArrayType : SyntaxKind - TupleType = 141, + TupleType = 142, >TupleType : SyntaxKind - UnionType = 142, + UnionType = 143, >UnionType : SyntaxKind - ParenthesizedType = 143, + ParenthesizedType = 144, >ParenthesizedType : SyntaxKind - ObjectBindingPattern = 144, + ObjectBindingPattern = 145, >ObjectBindingPattern : SyntaxKind - ArrayBindingPattern = 145, + ArrayBindingPattern = 146, >ArrayBindingPattern : SyntaxKind - BindingElement = 146, + BindingElement = 147, >BindingElement : SyntaxKind - ArrayLiteralExpression = 147, + ArrayLiteralExpression = 148, >ArrayLiteralExpression : SyntaxKind - ObjectLiteralExpression = 148, + ObjectLiteralExpression = 149, >ObjectLiteralExpression : SyntaxKind - PropertyAccessExpression = 149, + PropertyAccessExpression = 150, >PropertyAccessExpression : SyntaxKind - ElementAccessExpression = 150, + ElementAccessExpression = 151, >ElementAccessExpression : SyntaxKind - CallExpression = 151, + CallExpression = 152, >CallExpression : SyntaxKind - NewExpression = 152, + NewExpression = 153, >NewExpression : SyntaxKind - TaggedTemplateExpression = 153, + TaggedTemplateExpression = 154, >TaggedTemplateExpression : SyntaxKind - TypeAssertionExpression = 154, + TypeAssertionExpression = 155, >TypeAssertionExpression : SyntaxKind - ParenthesizedExpression = 155, + ParenthesizedExpression = 156, >ParenthesizedExpression : SyntaxKind - FunctionExpression = 156, + FunctionExpression = 157, >FunctionExpression : SyntaxKind - ArrowFunction = 157, + ArrowFunction = 158, >ArrowFunction : SyntaxKind - DeleteExpression = 158, + DeleteExpression = 159, >DeleteExpression : SyntaxKind - TypeOfExpression = 159, + TypeOfExpression = 160, >TypeOfExpression : SyntaxKind - VoidExpression = 160, + VoidExpression = 161, >VoidExpression : SyntaxKind - PrefixUnaryExpression = 161, + PrefixUnaryExpression = 162, >PrefixUnaryExpression : SyntaxKind - PostfixUnaryExpression = 162, + PostfixUnaryExpression = 163, >PostfixUnaryExpression : SyntaxKind - BinaryExpression = 163, + BinaryExpression = 164, >BinaryExpression : SyntaxKind - ConditionalExpression = 164, + ConditionalExpression = 165, >ConditionalExpression : SyntaxKind - TemplateExpression = 165, + TemplateExpression = 166, >TemplateExpression : SyntaxKind - YieldExpression = 166, + YieldExpression = 167, >YieldExpression : SyntaxKind - SpreadElementExpression = 167, + SpreadElementExpression = 168, >SpreadElementExpression : SyntaxKind - OmittedExpression = 168, + OmittedExpression = 169, >OmittedExpression : SyntaxKind - TemplateSpan = 169, + TemplateSpan = 170, >TemplateSpan : SyntaxKind - Block = 170, + Block = 171, >Block : SyntaxKind - VariableStatement = 171, + VariableStatement = 172, >VariableStatement : SyntaxKind - EmptyStatement = 172, + EmptyStatement = 173, >EmptyStatement : SyntaxKind - ExpressionStatement = 173, + ExpressionStatement = 174, >ExpressionStatement : SyntaxKind - IfStatement = 174, + IfStatement = 175, >IfStatement : SyntaxKind - DoStatement = 175, + DoStatement = 176, >DoStatement : SyntaxKind - WhileStatement = 176, + WhileStatement = 177, >WhileStatement : SyntaxKind - ForStatement = 177, + ForStatement = 178, >ForStatement : SyntaxKind - ForInStatement = 178, + ForInStatement = 179, >ForInStatement : SyntaxKind - ContinueStatement = 179, + ForOfStatement = 180, +>ForOfStatement : SyntaxKind + + ContinueStatement = 181, >ContinueStatement : SyntaxKind - BreakStatement = 180, + BreakStatement = 182, >BreakStatement : SyntaxKind - ReturnStatement = 181, + ReturnStatement = 183, >ReturnStatement : SyntaxKind - WithStatement = 182, + WithStatement = 184, >WithStatement : SyntaxKind - SwitchStatement = 183, + SwitchStatement = 185, >SwitchStatement : SyntaxKind - LabeledStatement = 184, + LabeledStatement = 186, >LabeledStatement : SyntaxKind - ThrowStatement = 185, + ThrowStatement = 187, >ThrowStatement : SyntaxKind - TryStatement = 186, + TryStatement = 188, >TryStatement : SyntaxKind - DebuggerStatement = 187, + DebuggerStatement = 189, >DebuggerStatement : SyntaxKind - VariableDeclaration = 188, + VariableDeclaration = 190, >VariableDeclaration : SyntaxKind - VariableDeclarationList = 189, + VariableDeclarationList = 191, >VariableDeclarationList : SyntaxKind - FunctionDeclaration = 190, + FunctionDeclaration = 192, >FunctionDeclaration : SyntaxKind - ClassDeclaration = 191, + ClassDeclaration = 193, >ClassDeclaration : SyntaxKind - InterfaceDeclaration = 192, + InterfaceDeclaration = 194, >InterfaceDeclaration : SyntaxKind - TypeAliasDeclaration = 193, + TypeAliasDeclaration = 195, >TypeAliasDeclaration : SyntaxKind - EnumDeclaration = 194, + EnumDeclaration = 196, >EnumDeclaration : SyntaxKind - ModuleDeclaration = 195, + ModuleDeclaration = 197, >ModuleDeclaration : SyntaxKind - ModuleBlock = 196, + ModuleBlock = 198, >ModuleBlock : SyntaxKind - ImportDeclaration = 197, + ImportDeclaration = 199, >ImportDeclaration : SyntaxKind - ExportAssignment = 198, + ExportAssignment = 200, >ExportAssignment : SyntaxKind - ExternalModuleReference = 199, + ExternalModuleReference = 201, >ExternalModuleReference : SyntaxKind - CaseClause = 200, + CaseClause = 202, >CaseClause : SyntaxKind - DefaultClause = 201, + DefaultClause = 203, >DefaultClause : SyntaxKind - HeritageClause = 202, + HeritageClause = 204, >HeritageClause : SyntaxKind - CatchClause = 203, + CatchClause = 205, >CatchClause : SyntaxKind - PropertyAssignment = 204, + PropertyAssignment = 206, >PropertyAssignment : SyntaxKind - ShorthandPropertyAssignment = 205, + ShorthandPropertyAssignment = 207, >ShorthandPropertyAssignment : SyntaxKind - EnumMember = 206, + EnumMember = 208, >EnumMember : SyntaxKind - SourceFile = 207, + SourceFile = 209, >SourceFile : SyntaxKind - SyntaxList = 208, + SyntaxList = 210, >SyntaxList : SyntaxKind - Count = 209, + Count = 211, >Count : SyntaxKind FirstAssignment = 52, @@ -1107,7 +1113,7 @@ declare module "typescript" { FirstKeyword = 65, >FirstKeyword : SyntaxKind - LastKeyword = 120, + LastKeyword = 121, >LastKeyword : SyntaxKind FirstFutureReservedWord = 101, @@ -1116,10 +1122,10 @@ declare module "typescript" { LastFutureReservedWord = 109, >LastFutureReservedWord : SyntaxKind - FirstTypeNode = 135, + FirstTypeNode = 136, >FirstTypeNode : SyntaxKind - LastTypeNode = 143, + LastTypeNode = 144, >LastTypeNode : SyntaxKind FirstPunctuation = 14, @@ -1158,7 +1164,7 @@ declare module "typescript" { LastBinaryOperator = 63, >LastBinaryOperator : SyntaxKind - FirstNode = 121, + FirstNode = 122, >FirstNode : SyntaxKind } const enum NodeFlags { @@ -2139,6 +2145,19 @@ declare module "typescript" { expression: Expression; >expression : Expression +>Expression : Expression + } + interface ForOfStatement extends IterationStatement { +>ForOfStatement : ForOfStatement +>IterationStatement : IterationStatement + + initializer: VariableDeclarationList | Expression; +>initializer : Expression | VariableDeclarationList +>VariableDeclarationList : VariableDeclarationList +>Expression : Expression + + expression: Expression; +>expression : Expression >Expression : Expression } interface BreakOrContinueStatement extends Statement { From 1a3294a7d246ce1fb3d073dd8388f6ce1426d1b5 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 12:37:14 -0800 Subject: [PATCH 087/106] Parity sweep for for-in & for-of --- src/compiler/binder.ts | 1 + src/compiler/checker.ts | 42 +++++++++++++------ .../diagnosticInformationMap.generated.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- src/compiler/parser.ts | 3 +- src/compiler/utilities.ts | 5 ++- src/services/breakpoints.ts | 7 +++- src/services/formatting/rules.ts | 1 + src/services/formatting/smartIndenter.ts | 1 + src/services/outliningElementsCollector.ts | 1 + src/services/services.ts | 6 ++- 11 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index be9e9a525c0..037892bf972 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -495,6 +495,7 @@ module ts { case SyntaxKind.CatchClause: case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.SwitchStatement: bindChildren(node, 0, /*isBlockScopeContainer*/ true); break; diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index caf07cbf4dc..3e6ac9ffe2e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4612,6 +4612,7 @@ module ts { case SyntaxKind.WhileStatement: case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.ReturnStatement: case SyntaxKind.WithStatement: case SyntaxKind.SwitchStatement: @@ -8449,23 +8450,12 @@ module ts { function checkForOfStatement(node: ForOfStatement) { // TODO: not yet implemented - if (!checkGrammarForStatementInAmbientContext(node)) { - checkGrammarForOfStatement(node); - } + checkGrammarForOfStatement(node); } function checkForInStatement(node: ForInStatement) { // Grammar checking - if (!checkGrammarForStatementInAmbientContext(node)) { - if (node.initializer.kind === SyntaxKind.VariableDeclarationList) { - var variableList = node.initializer; - if (!checkGrammarVariableDeclarationList(variableList)) { - if (variableList.declarations.length > 1) { - grammarErrorOnFirstToken(variableList.declarations[1], Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement); - } - } - } - } + checkGrammarForInOrForOfStatement(node); // TypeScript 1.0 spec (April 2014): 5.4 // In a 'for-in' statement of the form @@ -9568,6 +9558,7 @@ module ts { case SyntaxKind.WhileStatement: case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: case SyntaxKind.ReturnStatement: @@ -10764,10 +10755,33 @@ module ts { } } + function checkGrammarForInOrForOfStatement(forInOrOfStatement: ForInStatement | ForOfStatement): boolean { + if (checkGrammarForStatementInAmbientContext(forInOrOfStatement)) { + return true; + } + + if (forInOrOfStatement.initializer.kind === SyntaxKind.VariableDeclarationList) { + var variableList = forInOrOfStatement.initializer; + if (!checkGrammarVariableDeclarationList(variableList)) { + if (variableList.declarations.length > 1) { + var keywordText = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? "in" : "of"; + return grammarErrorOnFirstToken(variableList.declarations[1], Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_0_statement, keywordText); + } + } + } + + return false; + } + function checkGrammarForOfStatement(forOfStatement: ForOfStatement): boolean { + if (checkGrammarForInOrForOfStatement(forOfStatement)) { + return true; + } if (languageVersion < ScriptTarget.ES6) { return grammarErrorOnFirstToken(forOfStatement, Diagnostics.For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher); } + + return false; } function checkGrammarAccessor(accessor: MethodDeclaration): boolean { @@ -10862,6 +10876,7 @@ module ts { switch (node.kind) { case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: return true; @@ -11018,6 +11033,7 @@ module ts { case SyntaxKind.WithStatement: case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: return false; case SyntaxKind.LabeledStatement: return allowLetAndConstDeclarations(parent.parent); diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index a661f53ddfc..b9b407eb1d5 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -55,7 +55,7 @@ module ts { An_accessor_cannot_be_declared_in_an_ambient_context: { code: 1086, category: DiagnosticCategory.Error, key: "An accessor cannot be declared in an ambient context." }, _0_modifier_cannot_appear_on_a_constructor_declaration: { code: 1089, category: DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a constructor declaration." }, _0_modifier_cannot_appear_on_a_parameter: { code: 1090, category: DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a parameter." }, - Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: { code: 1091, category: DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...in' statement." }, + Only_a_single_variable_declaration_is_allowed_in_a_for_0_statement: { code: 1091, category: DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...{0}' statement." }, Type_parameters_cannot_appear_on_a_constructor_declaration: { code: 1092, category: DiagnosticCategory.Error, key: "Type parameters cannot appear on a constructor declaration." }, Type_annotation_cannot_appear_on_a_constructor_declaration: { code: 1093, category: DiagnosticCategory.Error, key: "Type annotation cannot appear on a constructor declaration." }, An_accessor_cannot_have_type_parameters: { code: 1094, category: DiagnosticCategory.Error, key: "An accessor cannot have type parameters." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index d59d4fe0d8e..b59bd229e62 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -211,7 +211,7 @@ "category": "Error", "code": 1090 }, - "Only a single variable declaration is allowed in a 'for...in' statement.": { + "Only a single variable declaration is allowed in a 'for...{0}' statement.": { "category": "Error", "code": 1091 }, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 64f9560999b..d40101aacc3 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1602,7 +1602,7 @@ module ts { } // in the case where we're parsing the variable declarator of a 'for-in' statement, we - // are done if we see an 'in' keyword in front of us. + // are done if we see an 'in' keyword in front of us. Same with for-of if (isInOrOfKeyword(token)) { return true; } @@ -1881,6 +1881,7 @@ module ts { case SyntaxKind.BreakStatement: case SyntaxKind.ContinueStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.ForStatement: case SyntaxKind.WhileStatement: case SyntaxKind.WithStatement: diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5a50e2799dc..d3a7392c2bc 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -343,6 +343,7 @@ module ts { case SyntaxKind.WhileStatement: case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.WithStatement: case SyntaxKind.SwitchStatement: case SyntaxKind.CaseClause: @@ -560,7 +561,8 @@ module ts { forStatement.condition === node || forStatement.iterator === node; case SyntaxKind.ForInStatement: - var forInStatement = parent; + case SyntaxKind.ForOfStatement: + var forInStatement = parent; return (forInStatement.initializer === node && forInStatement.initializer.kind !== SyntaxKind.VariableDeclarationList) || forInStatement.expression === node; case SyntaxKind.TypeAssertionExpression: @@ -688,6 +690,7 @@ module ts { case SyntaxKind.ExpressionStatement: case SyntaxKind.EmptyStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.ForStatement: case SyntaxKind.IfStatement: case SyntaxKind.LabeledStatement: diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index e49d035559b..86b72b711c1 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -151,8 +151,9 @@ module ts.BreakpointResolver { return spanInForStatement(node); case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: // span on for (a in ...) - return textSpan(node, findNextToken((node).expression, node)); + return textSpan(node, findNextToken((node).expression, node)); case SyntaxKind.SwitchStatement: // span on switch(...) @@ -261,7 +262,8 @@ module ts.BreakpointResolver { function spanInVariableDeclaration(variableDeclaration: VariableDeclaration): TextSpan { // If declaration of for in statement, just set the span in parent - if (variableDeclaration.parent.parent.kind === SyntaxKind.ForInStatement) { + if (variableDeclaration.parent.parent.kind === SyntaxKind.ForInStatement || + variableDeclaration.parent.parent.kind === SyntaxKind.ForOfStatement) { return spanInNode(variableDeclaration.parent.parent); } @@ -362,6 +364,7 @@ module ts.BreakpointResolver { case SyntaxKind.WhileStatement: case SyntaxKind.IfStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: return spanInNodeIfStartsOnSameLine(block.parent, block.statements[0]); // Set span on previous token if it starts on same line otherwise on the first statement of the block diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 9fcc787030d..bf7e3f3988a 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -592,6 +592,7 @@ module ts.formatting { case SyntaxKind.SwitchStatement: case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.WhileStatement: case SyntaxKind.TryStatement: case SyntaxKind.DoStatement: diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 3aa97fe6ae6..8d7d96e5887 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -359,6 +359,7 @@ module ts.formatting { case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.ForStatement: case SyntaxKind.IfStatement: case SyntaxKind.FunctionDeclaration: diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index 0b39f54ca29..b65ad7e36c8 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -61,6 +61,7 @@ module ts { // to be the entire span of the parent. if (parent.kind === SyntaxKind.DoStatement || parent.kind === SyntaxKind.ForInStatement || + parent.kind === SyntaxKind.ForOfStatement || parent.kind === SyntaxKind.ForStatement || parent.kind === SyntaxKind.IfStatement || parent.kind === SyntaxKind.WhileStatement || diff --git a/src/services/services.ts b/src/services/services.ts index 767d1a7f099..c1528fe67cf 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3441,7 +3441,9 @@ module ts { } break; case SyntaxKind.ForKeyword: - if (hasKind(node.parent, SyntaxKind.ForStatement) || hasKind(node.parent, SyntaxKind.ForInStatement)) { + if (hasKind(node.parent, SyntaxKind.ForStatement) || + hasKind(node.parent, SyntaxKind.ForInStatement) || + hasKind(node.parent, SyntaxKind.ForOfStatement)) { return getLoopBreakContinueOccurrences(node.parent); } break; @@ -3718,6 +3720,7 @@ module ts { switch (owner.kind) { case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: return getLoopBreakContinueOccurrences(owner) @@ -3762,6 +3765,7 @@ module ts { // Fall through. case SyntaxKind.ForStatement: case SyntaxKind.ForInStatement: + case SyntaxKind.ForOfStatement: case SyntaxKind.WhileStatement: case SyntaxKind.DoStatement: if (!statement.label || isLabeledBy(node, statement.label.text)) { From 7fe286061d7275ce50582952564f5cb5d2f632f2 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 12:38:10 -0800 Subject: [PATCH 088/106] Add tests for for-of --- .../ecmascript5/Statements/parserES5ForOfStatement1.d.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement10.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement11.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement12.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement13.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement14.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement15.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement16.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement2.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement3.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement4.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement5.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement6.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement7.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement8.ts | 3 +++ .../parser/ecmascript5/Statements/parserES5ForOfStatement9.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement1.d.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement10.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement11.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement12.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement13.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement14.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement15.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement16.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement2.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement3.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement4.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement5.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement6.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement7.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement8.ts | 3 +++ .../parser/ecmascript6/Iterators/parserForOfStatement9.ts | 3 +++ 32 files changed, 96 insertions(+) create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts new file mode 100644 index 00000000000..8f9a4072f42 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var i of e) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts new file mode 100644 index 00000000000..3a6f932e821 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (const v of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts new file mode 100644 index 00000000000..94ca9330ab0 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (const [a, b] of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts new file mode 100644 index 00000000000..7d4655e4b36 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (const {a, b} of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts new file mode 100644 index 00000000000..7a11d2e073e --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (let {a, b} of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts new file mode 100644 index 00000000000..c39939a1a08 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (let [a, b] of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts new file mode 100644 index 00000000000..95c5c2c53ee --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var [a, b] of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts new file mode 100644 index 00000000000..9a68bad827c --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var {a, b} of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts new file mode 100644 index 00000000000..7ef97688115 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts new file mode 100644 index 00000000000..1b183225b74 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var a, b of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts new file mode 100644 index 00000000000..a99b69a2f4a --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var a = 1 of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts new file mode 100644 index 00000000000..c3c434b605c --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var a: number of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts new file mode 100644 index 00000000000..4e03b361e73 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var a = 1, b = 2 of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts new file mode 100644 index 00000000000..8340bab563b --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var a: number = 1, b: string = "" of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts new file mode 100644 index 00000000000..39ecbcfbcb3 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (var v of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts new file mode 100644 index 00000000000..63fe58a93f8 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts @@ -0,0 +1,3 @@ +//@target: ES5 +for (let v of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts new file mode 100644 index 00000000000..9248d2fb45c --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var i of e) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts new file mode 100644 index 00000000000..9febb87d74f --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (const v of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts new file mode 100644 index 00000000000..dbcf40c36ab --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (const [a, b] of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts new file mode 100644 index 00000000000..8bb57d3a356 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (const {a, b} of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts new file mode 100644 index 00000000000..5da8edc65c4 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (let {a, b} of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts new file mode 100644 index 00000000000..ddd1216471f --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (let [a, b] of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts new file mode 100644 index 00000000000..43e18b460ca --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var [a, b] of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts new file mode 100644 index 00000000000..e042179fbba --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var {a, b} of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts new file mode 100644 index 00000000000..8274876781d --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts new file mode 100644 index 00000000000..d16c99e6c3d --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var a, b of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts new file mode 100644 index 00000000000..f7cd4b34d26 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var a = 1 of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts new file mode 100644 index 00000000000..789e5f9725d --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var a: number of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts new file mode 100644 index 00000000000..946e5ba1574 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var a = 1, b = 2 of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts new file mode 100644 index 00000000000..e7e56f74c4e --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var a: number = 1, b: string = "" of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts new file mode 100644 index 00000000000..7a528a9898e --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (var v of X) { +} \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts new file mode 100644 index 00000000000..741a56a8cf7 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts @@ -0,0 +1,3 @@ +//@target: ES6 +for (let v of X) { +} \ No newline at end of file From 8d0829594c239d0d7f251f96aa4edb5dca12ed70 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 12:38:21 -0800 Subject: [PATCH 089/106] Accept baselines for added tests --- .../reference/parserES5ForOfStatement1.d.errors.txt | 8 ++++++++ .../reference/parserES5ForOfStatement10.errors.txt | 11 +++++++++++ .../baselines/reference/parserES5ForOfStatement10.js | 7 +++++++ .../reference/parserES5ForOfStatement11.errors.txt | 11 +++++++++++ .../baselines/reference/parserES5ForOfStatement11.js | 7 +++++++ .../reference/parserES5ForOfStatement12.errors.txt | 11 +++++++++++ .../baselines/reference/parserES5ForOfStatement12.js | 7 +++++++ .../reference/parserES5ForOfStatement13.errors.txt | 11 +++++++++++ .../baselines/reference/parserES5ForOfStatement13.js | 7 +++++++ .../reference/parserES5ForOfStatement14.errors.txt | 11 +++++++++++ .../baselines/reference/parserES5ForOfStatement14.js | 7 +++++++ .../reference/parserES5ForOfStatement15.errors.txt | 8 ++++++++ .../baselines/reference/parserES5ForOfStatement15.js | 7 +++++++ .../reference/parserES5ForOfStatement16.errors.txt | 8 ++++++++ .../baselines/reference/parserES5ForOfStatement16.js | 7 +++++++ .../reference/parserES5ForOfStatement3.errors.txt | 8 ++++++++ tests/baselines/reference/parserES5ForOfStatement3.js | 7 +++++++ .../reference/parserES5ForOfStatement4.errors.txt | 8 ++++++++ tests/baselines/reference/parserES5ForOfStatement4.js | 7 +++++++ .../reference/parserES5ForOfStatement5.errors.txt | 8 ++++++++ tests/baselines/reference/parserES5ForOfStatement5.js | 7 +++++++ .../reference/parserES5ForOfStatement6.errors.txt | 8 ++++++++ tests/baselines/reference/parserES5ForOfStatement6.js | 7 +++++++ .../reference/parserES5ForOfStatement7.errors.txt | 8 ++++++++ tests/baselines/reference/parserES5ForOfStatement7.js | 7 +++++++ .../reference/parserES5ForOfStatement8.errors.txt | 8 ++++++++ tests/baselines/reference/parserES5ForOfStatement8.js | 7 +++++++ .../reference/parserES5ForOfStatement9.errors.txt | 11 +++++++++++ tests/baselines/reference/parserES5ForOfStatement9.js | 7 +++++++ .../reference/parserForOfStatement1.d.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement10.js | 7 +++++++ .../baselines/reference/parserForOfStatement10.types | 5 +++++ tests/baselines/reference/parserForOfStatement11.js | 7 +++++++ .../baselines/reference/parserForOfStatement11.types | 6 ++++++ tests/baselines/reference/parserForOfStatement12.js | 7 +++++++ .../baselines/reference/parserForOfStatement12.types | 6 ++++++ tests/baselines/reference/parserForOfStatement13.js | 7 +++++++ .../baselines/reference/parserForOfStatement13.types | 6 ++++++ tests/baselines/reference/parserForOfStatement14.js | 7 +++++++ .../baselines/reference/parserForOfStatement14.types | 6 ++++++ tests/baselines/reference/parserForOfStatement15.js | 7 +++++++ .../baselines/reference/parserForOfStatement15.types | 6 ++++++ tests/baselines/reference/parserForOfStatement16.js | 7 +++++++ .../baselines/reference/parserForOfStatement16.types | 6 ++++++ .../reference/parserForOfStatement3.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement3.js | 7 +++++++ tests/baselines/reference/parserForOfStatement4.js | 7 +++++++ tests/baselines/reference/parserForOfStatement5.js | 7 +++++++ .../reference/parserForOfStatement6.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement6.js | 7 +++++++ .../reference/parserForOfStatement7.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement7.js | 7 +++++++ tests/baselines/reference/parserForOfStatement8.js | 7 +++++++ tests/baselines/reference/parserForOfStatement8.types | 5 +++++ tests/baselines/reference/parserForOfStatement9.js | 7 +++++++ tests/baselines/reference/parserForOfStatement9.types | 5 +++++ 56 files changed, 417 insertions(+) create mode 100644 tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement10.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement10.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement11.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement11.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement12.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement12.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement13.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement13.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement14.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement14.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement15.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement15.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement16.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement16.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement3.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement3.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement4.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement4.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement5.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement5.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement6.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement6.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement7.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement7.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement8.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement8.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement9.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement9.js create mode 100644 tests/baselines/reference/parserForOfStatement1.d.errors.txt create mode 100644 tests/baselines/reference/parserForOfStatement10.js create mode 100644 tests/baselines/reference/parserForOfStatement10.types create mode 100644 tests/baselines/reference/parserForOfStatement11.js create mode 100644 tests/baselines/reference/parserForOfStatement11.types create mode 100644 tests/baselines/reference/parserForOfStatement12.js create mode 100644 tests/baselines/reference/parserForOfStatement12.types create mode 100644 tests/baselines/reference/parserForOfStatement13.js create mode 100644 tests/baselines/reference/parserForOfStatement13.types create mode 100644 tests/baselines/reference/parserForOfStatement14.js create mode 100644 tests/baselines/reference/parserForOfStatement14.types create mode 100644 tests/baselines/reference/parserForOfStatement15.js create mode 100644 tests/baselines/reference/parserForOfStatement15.types create mode 100644 tests/baselines/reference/parserForOfStatement16.js create mode 100644 tests/baselines/reference/parserForOfStatement16.types create mode 100644 tests/baselines/reference/parserForOfStatement3.errors.txt create mode 100644 tests/baselines/reference/parserForOfStatement3.js create mode 100644 tests/baselines/reference/parserForOfStatement4.js create mode 100644 tests/baselines/reference/parserForOfStatement5.js create mode 100644 tests/baselines/reference/parserForOfStatement6.errors.txt create mode 100644 tests/baselines/reference/parserForOfStatement6.js create mode 100644 tests/baselines/reference/parserForOfStatement7.errors.txt create mode 100644 tests/baselines/reference/parserForOfStatement7.js create mode 100644 tests/baselines/reference/parserForOfStatement8.js create mode 100644 tests/baselines/reference/parserForOfStatement8.types create mode 100644 tests/baselines/reference/parserForOfStatement9.js create mode 100644 tests/baselines/reference/parserForOfStatement9.types diff --git a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt new file mode 100644 index 00000000000..f3034cd2c27 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS1036: Statements are not allowed in ambient contexts. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts (1 errors) ==== + for (var i of e) { + ~~~ +!!! error TS1036: Statements are not allowed in ambient contexts. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt new file mode 100644 index 00000000000..7fdbe80e12e --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,6): error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts (2 errors) ==== + for (const v of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~~~~~ +!!! error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement10.js b/tests/baselines/reference/parserES5ForOfStatement10.js new file mode 100644 index 00000000000..2b9dc843887 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement10.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement10.ts] +for (const v of X) { +} + +//// [parserES5ForOfStatement10.js] +for (var v of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt new file mode 100644 index 00000000000..146aff8f91b --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,6): error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts (2 errors) ==== + for (const [a, b] of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~~~~~ +!!! error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement11.js b/tests/baselines/reference/parserES5ForOfStatement11.js new file mode 100644 index 00000000000..45a24b109c0 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement11.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement11.ts] +for (const [a, b] of X) { +} + +//// [parserES5ForOfStatement11.js] +for (var _a = void 0, a = _a[0], b = _a[1] of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt new file mode 100644 index 00000000000..ea1ad1d8eb7 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,6): error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts (2 errors) ==== + for (const {a, b} of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~~~~~ +!!! error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement12.js b/tests/baselines/reference/parserES5ForOfStatement12.js new file mode 100644 index 00000000000..30beac5118c --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement12.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement12.ts] +for (const {a, b} of X) { +} + +//// [parserES5ForOfStatement12.js] +for (var _a = void 0, a = _a.a, b = _a.b of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt new file mode 100644 index 00000000000..27dc44f094a --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,6): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts (2 errors) ==== + for (let {a, b} of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~~~ +!!! error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement13.js b/tests/baselines/reference/parserES5ForOfStatement13.js new file mode 100644 index 00000000000..89706613add --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement13.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement13.ts] +for (let {a, b} of X) { +} + +//// [parserES5ForOfStatement13.js] +for (let _a = void 0, a = _a.a, b = _a.b of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt new file mode 100644 index 00000000000..9eba6e25c9a --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,6): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts (2 errors) ==== + for (let [a, b] of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~~~ +!!! error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement14.js b/tests/baselines/reference/parserES5ForOfStatement14.js new file mode 100644 index 00000000000..96aa327a625 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement14.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement14.ts] +for (let [a, b] of X) { +} + +//// [parserES5ForOfStatement14.js] +for (let _a = void 0, a = _a[0], b = _a[1] of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt new file mode 100644 index 00000000000..2f39244ecd5 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts (1 errors) ==== + for (var [a, b] of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement15.js b/tests/baselines/reference/parserES5ForOfStatement15.js new file mode 100644 index 00000000000..efca0b289f6 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement15.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement15.ts] +for (var [a, b] of X) { +} + +//// [parserES5ForOfStatement15.js] +for (var _a = void 0, a = _a[0], b = _a[1] of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt new file mode 100644 index 00000000000..80a45c0f8b5 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts (1 errors) ==== + for (var {a, b} of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement16.js b/tests/baselines/reference/parserES5ForOfStatement16.js new file mode 100644 index 00000000000..102e91685c3 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement16.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement16.ts] +for (var {a, b} of X) { +} + +//// [parserES5ForOfStatement16.js] +for (var _a = void 0, a = _a.a, b = _a.b of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt new file mode 100644 index 00000000000..6209ed2475f --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,13): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (1 errors) ==== + for (var a, b of X) { + ~ +!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement3.js b/tests/baselines/reference/parserES5ForOfStatement3.js new file mode 100644 index 00000000000..64892eb5094 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement3.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement3.ts] +for (var a, b of X) { +} + +//// [parserES5ForOfStatement3.js] +for (var a of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt new file mode 100644 index 00000000000..36c1894ed78 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (1 errors) ==== + for (var a = 1 of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement4.js b/tests/baselines/reference/parserES5ForOfStatement4.js new file mode 100644 index 00000000000..e17699a8662 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement4.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement4.ts] +for (var a = 1 of X) { +} + +//// [parserES5ForOfStatement4.js] +for (var a = 1 of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt new file mode 100644 index 00000000000..55c56d60aae --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (1 errors) ==== + for (var a: number of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement5.js b/tests/baselines/reference/parserES5ForOfStatement5.js new file mode 100644 index 00000000000..2eeb504365e --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement5.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement5.ts] +for (var a: number of X) { +} + +//// [parserES5ForOfStatement5.js] +for (var a of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt new file mode 100644 index 00000000000..1bbacc01c9e --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,17): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (1 errors) ==== + for (var a = 1, b = 2 of X) { + ~ +!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement6.js b/tests/baselines/reference/parserES5ForOfStatement6.js new file mode 100644 index 00000000000..575368fcd20 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement6.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement6.ts] +for (var a = 1, b = 2 of X) { +} + +//// [parserES5ForOfStatement6.js] +for (var a = 1 of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt new file mode 100644 index 00000000000..7d2810f6de7 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,25): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (1 errors) ==== + for (var a: number = 1, b: string = "" of X) { + ~ +!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement7.js b/tests/baselines/reference/parserES5ForOfStatement7.js new file mode 100644 index 00000000000..ac240494c18 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement7.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement7.ts] +for (var a: number = 1, b: string = "" of X) { +} + +//// [parserES5ForOfStatement7.js] +for (var a = 1 of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt new file mode 100644 index 00000000000..739369e8f82 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts (1 errors) ==== + for (var v of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement8.js b/tests/baselines/reference/parserES5ForOfStatement8.js new file mode 100644 index 00000000000..c926784adfe --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement8.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement8.ts] +for (var v of X) { +} + +//// [parserES5ForOfStatement8.js] +for (var v of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt new file mode 100644 index 00000000000..c03669fcb98 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,6): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts (2 errors) ==== + for (let v of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~~~ +!!! error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement9.js b/tests/baselines/reference/parserES5ForOfStatement9.js new file mode 100644 index 00000000000..e2ec49e9ac9 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement9.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement9.ts] +for (let v of X) { +} + +//// [parserES5ForOfStatement9.js] +for (let v of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement1.d.errors.txt b/tests/baselines/reference/parserForOfStatement1.d.errors.txt new file mode 100644 index 00000000000..3b1b2a65922 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement1.d.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts(1,1): error TS1036: Statements are not allowed in ambient contexts. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts (1 errors) ==== + for (var i of e) { + ~~~ +!!! error TS1036: Statements are not allowed in ambient contexts. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement10.js b/tests/baselines/reference/parserForOfStatement10.js new file mode 100644 index 00000000000..d0b48203090 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement10.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement10.ts] +for (const v of X) { +} + +//// [parserForOfStatement10.js] +for (var v of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement10.types b/tests/baselines/reference/parserForOfStatement10.types new file mode 100644 index 00000000000..1707fa934cb --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement10.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts === +for (const v of X) { +>v : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement11.js b/tests/baselines/reference/parserForOfStatement11.js new file mode 100644 index 00000000000..daa3fb6df48 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement11.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement11.ts] +for (const [a, b] of X) { +} + +//// [parserForOfStatement11.js] +for (var [a, b] of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement11.types b/tests/baselines/reference/parserForOfStatement11.types new file mode 100644 index 00000000000..eebc0c6a864 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement11.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts === +for (const [a, b] of X) { +>a : any +>b : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement12.js b/tests/baselines/reference/parserForOfStatement12.js new file mode 100644 index 00000000000..2e62b90de5e --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement12.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement12.ts] +for (const {a, b} of X) { +} + +//// [parserForOfStatement12.js] +for (var { a, b } of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement12.types b/tests/baselines/reference/parserForOfStatement12.types new file mode 100644 index 00000000000..51071059db1 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement12.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts === +for (const {a, b} of X) { +>a : any +>b : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement13.js b/tests/baselines/reference/parserForOfStatement13.js new file mode 100644 index 00000000000..a9c59046b8e --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement13.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement13.ts] +for (let {a, b} of X) { +} + +//// [parserForOfStatement13.js] +for (let { a, b } of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement13.types b/tests/baselines/reference/parserForOfStatement13.types new file mode 100644 index 00000000000..22c7af5605c --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement13.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts === +for (let {a, b} of X) { +>a : any +>b : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement14.js b/tests/baselines/reference/parserForOfStatement14.js new file mode 100644 index 00000000000..e46e2c46ea6 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement14.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement14.ts] +for (let [a, b] of X) { +} + +//// [parserForOfStatement14.js] +for (let [a, b] of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement14.types b/tests/baselines/reference/parserForOfStatement14.types new file mode 100644 index 00000000000..f255015bb15 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement14.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts === +for (let [a, b] of X) { +>a : any +>b : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement15.js b/tests/baselines/reference/parserForOfStatement15.js new file mode 100644 index 00000000000..81782393383 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement15.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement15.ts] +for (var [a, b] of X) { +} + +//// [parserForOfStatement15.js] +for (var [a, b] of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement15.types b/tests/baselines/reference/parserForOfStatement15.types new file mode 100644 index 00000000000..bf6faf3478e --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement15.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts === +for (var [a, b] of X) { +>a : any +>b : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement16.js b/tests/baselines/reference/parserForOfStatement16.js new file mode 100644 index 00000000000..f0ca1ee3e6d --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement16.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement16.ts] +for (var {a, b} of X) { +} + +//// [parserForOfStatement16.js] +for (var { a, b } of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement16.types b/tests/baselines/reference/parserForOfStatement16.types new file mode 100644 index 00000000000..48476dfae0a --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement16.types @@ -0,0 +1,6 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts === +for (var {a, b} of X) { +>a : any +>b : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement3.errors.txt b/tests/baselines/reference/parserForOfStatement3.errors.txt new file mode 100644 index 00000000000..36cd23b0931 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement3.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,13): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts (1 errors) ==== + for (var a, b of X) { + ~ +!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement3.js b/tests/baselines/reference/parserForOfStatement3.js new file mode 100644 index 00000000000..206e8fe5af8 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement3.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement3.ts] +for (var a, b of X) { +} + +//// [parserForOfStatement3.js] +for (var a of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement4.js b/tests/baselines/reference/parserForOfStatement4.js new file mode 100644 index 00000000000..9e7549c20fc --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement4.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement4.ts] +for (var a = 1 of X) { +} + +//// [parserForOfStatement4.js] +for (var a = 1 of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement5.js b/tests/baselines/reference/parserForOfStatement5.js new file mode 100644 index 00000000000..9028ebe7e3f --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement5.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement5.ts] +for (var a: number of X) { +} + +//// [parserForOfStatement5.js] +for (var a of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement6.errors.txt b/tests/baselines/reference/parserForOfStatement6.errors.txt new file mode 100644 index 00000000000..f6a87d8a37d --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement6.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,17): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts (1 errors) ==== + for (var a = 1, b = 2 of X) { + ~ +!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement6.js b/tests/baselines/reference/parserForOfStatement6.js new file mode 100644 index 00000000000..37f3560a29c --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement6.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement6.ts] +for (var a = 1, b = 2 of X) { +} + +//// [parserForOfStatement6.js] +for (var a = 1 of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement7.errors.txt b/tests/baselines/reference/parserForOfStatement7.errors.txt new file mode 100644 index 00000000000..e40bcd448f6 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement7.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,25): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts (1 errors) ==== + for (var a: number = 1, b: string = "" of X) { + ~ +!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement7.js b/tests/baselines/reference/parserForOfStatement7.js new file mode 100644 index 00000000000..0b18d0358b4 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement7.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement7.ts] +for (var a: number = 1, b: string = "" of X) { +} + +//// [parserForOfStatement7.js] +for (var a = 1 of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement8.js b/tests/baselines/reference/parserForOfStatement8.js new file mode 100644 index 00000000000..3565998701e --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement8.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement8.ts] +for (var v of X) { +} + +//// [parserForOfStatement8.js] +for (var v of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement8.types b/tests/baselines/reference/parserForOfStatement8.types new file mode 100644 index 00000000000..a4168caf262 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement8.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts === +for (var v of X) { +>v : any +>X : unknown +} diff --git a/tests/baselines/reference/parserForOfStatement9.js b/tests/baselines/reference/parserForOfStatement9.js new file mode 100644 index 00000000000..f03dad33c5f --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement9.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement9.ts] +for (let v of X) { +} + +//// [parserForOfStatement9.js] +for (let v of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement9.types b/tests/baselines/reference/parserForOfStatement9.types new file mode 100644 index 00000000000..0285a3e4b76 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement9.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts === +for (let v of X) { +>v : any +>X : unknown +} From cc81a670ac4ca600b0f6aed0ec2defb617cd95b1 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 12:47:57 -0800 Subject: [PATCH 090/106] Fork grammar message into two messages --- src/compiler/checker.ts | 6 ++++-- src/compiler/diagnosticInformationMap.generated.ts | 3 ++- src/compiler/diagnosticMessages.json | 6 +++++- .../baselines/reference/parserES5ForOfStatement3.errors.txt | 4 ++-- .../baselines/reference/parserES5ForOfStatement6.errors.txt | 4 ++-- .../baselines/reference/parserES5ForOfStatement7.errors.txt | 4 ++-- tests/baselines/reference/parserForOfStatement3.errors.txt | 4 ++-- tests/baselines/reference/parserForOfStatement6.errors.txt | 4 ++-- tests/baselines/reference/parserForOfStatement7.errors.txt | 4 ++-- 9 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3e6ac9ffe2e..125f5623412 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10764,8 +10764,10 @@ module ts { var variableList = forInOrOfStatement.initializer; if (!checkGrammarVariableDeclarationList(variableList)) { if (variableList.declarations.length > 1) { - var keywordText = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? "in" : "of"; - return grammarErrorOnFirstToken(variableList.declarations[1], Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_0_statement, keywordText); + var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? + Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement : + Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; + return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic); } } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index b9b407eb1d5..ab9097ae76e 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -55,7 +55,7 @@ module ts { An_accessor_cannot_be_declared_in_an_ambient_context: { code: 1086, category: DiagnosticCategory.Error, key: "An accessor cannot be declared in an ambient context." }, _0_modifier_cannot_appear_on_a_constructor_declaration: { code: 1089, category: DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a constructor declaration." }, _0_modifier_cannot_appear_on_a_parameter: { code: 1090, category: DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a parameter." }, - Only_a_single_variable_declaration_is_allowed_in_a_for_0_statement: { code: 1091, category: DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...{0}' statement." }, + Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: { code: 1091, category: DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...in' statement." }, Type_parameters_cannot_appear_on_a_constructor_declaration: { code: 1092, category: DiagnosticCategory.Error, key: "Type parameters cannot appear on a constructor declaration." }, Type_annotation_cannot_appear_on_a_constructor_declaration: { code: 1093, category: DiagnosticCategory.Error, key: "Type annotation cannot appear on a constructor declaration." }, An_accessor_cannot_have_type_parameters: { code: 1094, category: DiagnosticCategory.Error, key: "An accessor cannot have type parameters." }, @@ -147,6 +147,7 @@ module ts { Merge_conflict_marker_encountered: { code: 1185, category: DiagnosticCategory.Error, key: "Merge conflict marker encountered." }, A_rest_element_cannot_have_an_initializer: { code: 1186, category: DiagnosticCategory.Error, key: "A rest element cannot have an initializer." }, A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." }, + Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: { code: 1188, category: DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...of' statement." }, Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." }, Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." }, Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index b59bd229e62..6a5fb54f228 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -211,7 +211,7 @@ "category": "Error", "code": 1090 }, - "Only a single variable declaration is allowed in a 'for...{0}' statement.": { + "Only a single variable declaration is allowed in a 'for...in' statement.": { "category": "Error", "code": 1091 }, @@ -579,6 +579,10 @@ "category": "Error", "code": 1187 }, + "Only a single variable declaration is allowed in a 'for...of' statement.": { + "category": "Error", + "code": 1188 + }, "Duplicate identifier '{0}'.": { "category": "Error", diff --git a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt index 6209ed2475f..a976d9c0d54 100644 --- a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,13): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,13): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (1 errors) ==== for (var a, b of X) { ~ -!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt index 1bbacc01c9e..da76589190d 100644 --- a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,17): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,17): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { ~ -!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt index 7d2810f6de7..ced399ca103 100644 --- a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,25): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,25): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { ~ -!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement3.errors.txt b/tests/baselines/reference/parserForOfStatement3.errors.txt index 36cd23b0931..995ef4637c2 100644 --- a/tests/baselines/reference/parserForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,13): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,13): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts (1 errors) ==== for (var a, b of X) { ~ -!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement6.errors.txt b/tests/baselines/reference/parserForOfStatement6.errors.txt index f6a87d8a37d..57d95361b65 100644 --- a/tests/baselines/reference/parserForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,17): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,17): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { ~ -!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement7.errors.txt b/tests/baselines/reference/parserForOfStatement7.errors.txt index e40bcd448f6..07f93c263ec 100644 --- a/tests/baselines/reference/parserForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,25): error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,25): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { ~ -!!! error TS1091: Only a single variable declaration is allowed in a 'for...of' statement. +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file From f7a6354470d59e3d1a8c17733c0e500b3c83ed9d Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 16:59:58 -0800 Subject: [PATCH 091/106] More resilient error recovery when declaration in for-of is empty --- src/compiler/parser.ts | 33 +++++++++++++++---- .../reference/parserES5ForOfStatement17.js | 5 +++ .../reference/parserES5ForOfStatement17.types | 4 +++ .../parserES5ForOfStatement18.errors.txt | 7 ++++ .../reference/parserES5ForOfStatement18.js | 5 +++ .../reference/parserES5ForOfStatement19.js | 5 +++ .../reference/parserES5ForOfStatement19.types | 5 +++ .../parserES5ForOfStatement2.errors.txt | 11 +++++++ .../reference/parserES5ForOfStatement2.js | 7 ++++ .../reference/parserES5ForOfStatement20.js | 5 +++ .../reference/parserES5ForOfStatement20.types | 5 +++ .../parserES5ForOfStatement21.errors.txt | 10 ++++++ .../reference/parserES5ForOfStatement21.js | 5 +++ .../reference/parserForOfStatement17.js | 5 +++ .../reference/parserForOfStatement17.types | 4 +++ .../reference/parserForOfStatement18.js | 5 +++ .../reference/parserForOfStatement18.types | 5 +++ .../reference/parserForOfStatement19.js | 5 +++ .../reference/parserForOfStatement19.types | 5 +++ .../parserForOfStatement2.errors.txt | 8 +++++ .../reference/parserForOfStatement2.js | 7 ++++ .../reference/parserForOfStatement20.js | 5 +++ .../reference/parserForOfStatement20.types | 5 +++ .../parserForOfStatement21.errors.txt | 7 ++++ .../reference/parserForOfStatement21.js | 5 +++ .../Statements/parserES5ForOfStatement17.ts | 2 ++ .../Statements/parserES5ForOfStatement18.ts | 2 ++ .../Statements/parserES5ForOfStatement19.ts | 2 ++ .../Statements/parserES5ForOfStatement20.ts | 2 ++ .../Statements/parserES5ForOfStatement21.ts | 2 ++ .../Iterators/parserForOfStatement17.ts | 2 ++ .../Iterators/parserForOfStatement18.ts | 2 ++ .../Iterators/parserForOfStatement19.ts | 2 ++ .../Iterators/parserForOfStatement20.ts | 2 ++ .../Iterators/parserForOfStatement21.ts | 2 ++ 35 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 tests/baselines/reference/parserES5ForOfStatement17.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement17.types create mode 100644 tests/baselines/reference/parserES5ForOfStatement18.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement18.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement19.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement19.types create mode 100644 tests/baselines/reference/parserES5ForOfStatement2.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement2.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement20.js create mode 100644 tests/baselines/reference/parserES5ForOfStatement20.types create mode 100644 tests/baselines/reference/parserES5ForOfStatement21.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement21.js create mode 100644 tests/baselines/reference/parserForOfStatement17.js create mode 100644 tests/baselines/reference/parserForOfStatement17.types create mode 100644 tests/baselines/reference/parserForOfStatement18.js create mode 100644 tests/baselines/reference/parserForOfStatement18.types create mode 100644 tests/baselines/reference/parserForOfStatement19.js create mode 100644 tests/baselines/reference/parserForOfStatement19.types create mode 100644 tests/baselines/reference/parserForOfStatement2.errors.txt create mode 100644 tests/baselines/reference/parserForOfStatement2.js create mode 100644 tests/baselines/reference/parserForOfStatement20.js create mode 100644 tests/baselines/reference/parserForOfStatement20.types create mode 100644 tests/baselines/reference/parserForOfStatement21.errors.txt create mode 100644 tests/baselines/reference/parserForOfStatement21.js create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement17.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement19.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement17.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement19.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d40101aacc3..159aa545ec9 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3805,7 +3805,7 @@ module ts { var initializer: VariableDeclarationList | Expression = undefined; if (token !== SyntaxKind.SemicolonToken) { if (token === SyntaxKind.VarKeyword || token === SyntaxKind.LetKeyword || token === SyntaxKind.ConstKeyword) { - initializer = parseVariableDeclarationList(/*disallowIn:*/ true); + initializer = parseVariableDeclarationList(/*inForStatementInitializer:*/ true); } else { initializer = disallowInAnd(parseExpression); @@ -4236,7 +4236,7 @@ module ts { return finishNode(node); } - function parseVariableDeclarationList(disallowIn: boolean): VariableDeclarationList { + function parseVariableDeclarationList(inForStatementInitializer: boolean): VariableDeclarationList { var node = createNode(SyntaxKind.VariableDeclarationList); switch (token) { @@ -4253,20 +4253,39 @@ module ts { } nextToken(); - var savedDisallowIn = inDisallowInContext(); - setDisallowInContext(disallowIn); - node.declarations = parseDelimitedList(ParsingContext.VariableDeclarations, parseVariableDeclaration); + // The user may have written the following: + // + // for (var of X) { } + // + // In this case, we want to parse an empty declaration list, and then parse 'of' + // as a keyword. The reason this is not automatic is that 'of' is a valid identifier. + // So we need to look ahead to determine if 'of' should be treated as a keyword in + // this context. + // The checker will then give an error that there is an empty declaration list. + if (token === SyntaxKind.OfKeyword && lookAhead(canFollowContextualOfKeyword)) { + node.declarations = createMissingList(); + } + else { + var savedDisallowIn = inDisallowInContext(); + setDisallowInContext(inForStatementInitializer); - setDisallowInContext(savedDisallowIn); + node.declarations = parseDelimitedList(ParsingContext.VariableDeclarations, parseVariableDeclaration); + + setDisallowInContext(savedDisallowIn); + } return finishNode(node); } + + function canFollowContextualOfKeyword(): boolean { + return nextTokenIsIdentifier() && nextToken() === SyntaxKind.CloseParenToken; + } function parseVariableStatement(fullStart: number, modifiers: ModifiersArray): VariableStatement { var node = createNode(SyntaxKind.VariableStatement, fullStart); setModifiers(node, modifiers); - node.declarationList = parseVariableDeclarationList(/*disallowIn:*/ false); + node.declarationList = parseVariableDeclarationList(/*inForStatementInitializer:*/ false); parseSemicolon(); return finishNode(node); } diff --git a/tests/baselines/reference/parserES5ForOfStatement17.js b/tests/baselines/reference/parserES5ForOfStatement17.js new file mode 100644 index 00000000000..7995c4c689e --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement17.js @@ -0,0 +1,5 @@ +//// [parserES5ForOfStatement17.ts] +for (var of; ;) { } + +//// [parserES5ForOfStatement17.js] +for (var of;;) { } diff --git a/tests/baselines/reference/parserES5ForOfStatement17.types b/tests/baselines/reference/parserES5ForOfStatement17.types new file mode 100644 index 00000000000..5dd0f6e9b93 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement17.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement17.ts === +for (var of; ;) { } +>of : any + diff --git a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt new file mode 100644 index 00000000000..e07b516abf0 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts (1 errors) ==== + for (var of of of) { } + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement18.js b/tests/baselines/reference/parserES5ForOfStatement18.js new file mode 100644 index 00000000000..1df3e0bed7b --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement18.js @@ -0,0 +1,5 @@ +//// [parserES5ForOfStatement18.ts] +for (var of of of) { } + +//// [parserES5ForOfStatement18.js] +for (var of of of) { } diff --git a/tests/baselines/reference/parserES5ForOfStatement19.js b/tests/baselines/reference/parserES5ForOfStatement19.js new file mode 100644 index 00000000000..7ed0d5a333a --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement19.js @@ -0,0 +1,5 @@ +//// [parserES5ForOfStatement19.ts] +for (var of in of) { } + +//// [parserES5ForOfStatement19.js] +for (var of in of) { } diff --git a/tests/baselines/reference/parserES5ForOfStatement19.types b/tests/baselines/reference/parserES5ForOfStatement19.types new file mode 100644 index 00000000000..13abc7ae757 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement19.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement19.ts === +for (var of in of) { } +>of : any +>of : any + diff --git a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt new file mode 100644 index 00000000000..70bf84999f5 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,9): error TS1123: Variable declaration list cannot be empty. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts (2 errors) ==== + for (var of X) { + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + +!!! error TS1123: Variable declaration list cannot be empty. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement2.js b/tests/baselines/reference/parserES5ForOfStatement2.js new file mode 100644 index 00000000000..dfcfb476172 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement2.js @@ -0,0 +1,7 @@ +//// [parserES5ForOfStatement2.ts] +for (var of X) { +} + +//// [parserES5ForOfStatement2.js] +for ( of X) { +} diff --git a/tests/baselines/reference/parserES5ForOfStatement20.js b/tests/baselines/reference/parserES5ForOfStatement20.js new file mode 100644 index 00000000000..c51cbbc2a3a --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement20.js @@ -0,0 +1,5 @@ +//// [parserES5ForOfStatement20.ts] +for (var of = 0 in of) { } + +//// [parserES5ForOfStatement20.js] +for (var of = 0 in of) { } diff --git a/tests/baselines/reference/parserES5ForOfStatement20.types b/tests/baselines/reference/parserES5ForOfStatement20.types new file mode 100644 index 00000000000..54df94516c3 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement20.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts === +for (var of = 0 in of) { } +>of : any +>of : any + diff --git a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt new file mode 100644 index 00000000000..338d1e34b2f --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,9): error TS1123: Variable declaration list cannot be empty. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts (2 errors) ==== + for (var of of) { } + ~~~ +!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + +!!! error TS1123: Variable declaration list cannot be empty. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement21.js b/tests/baselines/reference/parserES5ForOfStatement21.js new file mode 100644 index 00000000000..e02ed853cb5 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement21.js @@ -0,0 +1,5 @@ +//// [parserES5ForOfStatement21.ts] +for (var of of) { } + +//// [parserES5ForOfStatement21.js] +for ( of of) { } diff --git a/tests/baselines/reference/parserForOfStatement17.js b/tests/baselines/reference/parserForOfStatement17.js new file mode 100644 index 00000000000..a6e2aee79a4 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement17.js @@ -0,0 +1,5 @@ +//// [parserForOfStatement17.ts] +for (var of; ;) { } + +//// [parserForOfStatement17.js] +for (var of;;) { } diff --git a/tests/baselines/reference/parserForOfStatement17.types b/tests/baselines/reference/parserForOfStatement17.types new file mode 100644 index 00000000000..64e15462dd6 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement17.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement17.ts === +for (var of; ;) { } +>of : any + diff --git a/tests/baselines/reference/parserForOfStatement18.js b/tests/baselines/reference/parserForOfStatement18.js new file mode 100644 index 00000000000..c30fbb60857 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement18.js @@ -0,0 +1,5 @@ +//// [parserForOfStatement18.ts] +for (var of of of) { } + +//// [parserForOfStatement18.js] +for (var of of of) { } diff --git a/tests/baselines/reference/parserForOfStatement18.types b/tests/baselines/reference/parserForOfStatement18.types new file mode 100644 index 00000000000..8e3b52ac877 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement18.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts === +for (var of of of) { } +>of : any +>of : any + diff --git a/tests/baselines/reference/parserForOfStatement19.js b/tests/baselines/reference/parserForOfStatement19.js new file mode 100644 index 00000000000..c838e8c71e0 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement19.js @@ -0,0 +1,5 @@ +//// [parserForOfStatement19.ts] +for (var of in of) { } + +//// [parserForOfStatement19.js] +for (var of in of) { } diff --git a/tests/baselines/reference/parserForOfStatement19.types b/tests/baselines/reference/parserForOfStatement19.types new file mode 100644 index 00000000000..6fcc5e8f792 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement19.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement19.ts === +for (var of in of) { } +>of : any +>of : any + diff --git a/tests/baselines/reference/parserForOfStatement2.errors.txt b/tests/baselines/reference/parserForOfStatement2.errors.txt new file mode 100644 index 00000000000..7229fe4196d --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement2.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts(1,9): error TS1123: Variable declaration list cannot be empty. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts (1 errors) ==== + for (var of X) { + +!!! error TS1123: Variable declaration list cannot be empty. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement2.js b/tests/baselines/reference/parserForOfStatement2.js new file mode 100644 index 00000000000..84d23d4e2aa --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement2.js @@ -0,0 +1,7 @@ +//// [parserForOfStatement2.ts] +for (var of X) { +} + +//// [parserForOfStatement2.js] +for ( of X) { +} diff --git a/tests/baselines/reference/parserForOfStatement20.js b/tests/baselines/reference/parserForOfStatement20.js new file mode 100644 index 00000000000..8599238d853 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement20.js @@ -0,0 +1,5 @@ +//// [parserForOfStatement20.ts] +for (var of = 0 in of) { } + +//// [parserForOfStatement20.js] +for (var of = 0 in of) { } diff --git a/tests/baselines/reference/parserForOfStatement20.types b/tests/baselines/reference/parserForOfStatement20.types new file mode 100644 index 00000000000..de664ca3c0f --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement20.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts === +for (var of = 0 in of) { } +>of : any +>of : any + diff --git a/tests/baselines/reference/parserForOfStatement21.errors.txt b/tests/baselines/reference/parserForOfStatement21.errors.txt new file mode 100644 index 00000000000..9103e2fedee --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement21.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts(1,9): error TS1123: Variable declaration list cannot be empty. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts (1 errors) ==== + for (var of of) { } + +!!! error TS1123: Variable declaration list cannot be empty. \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement21.js b/tests/baselines/reference/parserForOfStatement21.js new file mode 100644 index 00000000000..5db883e18a0 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement21.js @@ -0,0 +1,5 @@ +//// [parserForOfStatement21.ts] +for (var of of) { } + +//// [parserForOfStatement21.js] +for ( of of) { } diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement17.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement17.ts new file mode 100644 index 00000000000..882ae938d6c --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement17.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var of; ;) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts new file mode 100644 index 00000000000..a7dff6f225b --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var of of of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement19.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement19.ts new file mode 100644 index 00000000000..730f574be33 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement19.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var of in of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts new file mode 100644 index 00000000000..edffb88a1e3 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var of = 0 in of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts new file mode 100644 index 00000000000..a61edfbd050 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var of of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement17.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement17.ts new file mode 100644 index 00000000000..f088b36f4fd --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement17.ts @@ -0,0 +1,2 @@ +//@target: ES6 +for (var of; ;) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts new file mode 100644 index 00000000000..268dc163dde --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts @@ -0,0 +1,2 @@ +//@target: ES6 +for (var of of of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement19.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement19.ts new file mode 100644 index 00000000000..4dff469112b --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement19.ts @@ -0,0 +1,2 @@ +//@target: ES6 +for (var of in of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts new file mode 100644 index 00000000000..d0b7b75175d --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts @@ -0,0 +1,2 @@ +//@target: ES6 +for (var of = 0 in of) { } \ No newline at end of file diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts new file mode 100644 index 00000000000..f480ac371a2 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts @@ -0,0 +1,2 @@ +//@target: ES6 +for (var of of) { } \ No newline at end of file From 147cc204b8d2ca2fbd032f8feaf085af481eeae0 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 17:52:55 -0800 Subject: [PATCH 092/106] Disallow initializers in for-in and for-of loops --- src/compiler/checker.ts | 6 ++++++ src/compiler/diagnosticInformationMap.generated.ts | 2 ++ src/compiler/diagnosticMessages.json | 8 ++++++++ .../reference/parserES5ForOfStatement20.errors.txt | 7 +++++++ tests/baselines/reference/parserES5ForOfStatement20.types | 5 ----- .../reference/parserES5ForOfStatement4.errors.txt | 6 +++--- .../baselines/reference/parserForInStatement4.errors.txt | 5 ++++- .../baselines/reference/parserForOfStatement20.errors.txt | 7 +++++++ tests/baselines/reference/parserForOfStatement20.types | 5 ----- .../baselines/reference/parserForOfStatement4.errors.txt | 8 ++++++++ 10 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 tests/baselines/reference/parserES5ForOfStatement20.errors.txt delete mode 100644 tests/baselines/reference/parserES5ForOfStatement20.types create mode 100644 tests/baselines/reference/parserForOfStatement20.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement20.types create mode 100644 tests/baselines/reference/parserForOfStatement4.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 125f5623412..96439b2cf68 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10769,6 +10769,12 @@ module ts { Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic); } + if (variableList.declarations[0].initializer) { + var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? + Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer : + Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer; + return grammarErrorOnNode(variableList.declarations[0].name, diagnostic); + } } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index ab9097ae76e..17c0bec44a3 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -148,6 +148,8 @@ module ts { A_rest_element_cannot_have_an_initializer: { code: 1186, category: DiagnosticCategory.Error, key: "A rest element cannot have an initializer." }, A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." }, Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: { code: 1188, category: DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...of' statement." }, + The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: { code: 1189, category: DiagnosticCategory.Error, key: "The variable declaration of a 'for...in' statement cannot have an initializer." }, + The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: { code: 1190, category: DiagnosticCategory.Error, key: "The variable declaration of a 'for...of' statement cannot have an initializer." }, Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." }, Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." }, Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 6a5fb54f228..b0bf5945e8c 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -583,6 +583,14 @@ "category": "Error", "code": 1188 }, + "The variable declaration of a 'for...in' statement cannot have an initializer.": { + "category": "Error", + "code": 1189 + }, + "The variable declaration of a 'for...of' statement cannot have an initializer.": { + "category": "Error", + "code": 1190 + }, "Duplicate identifier '{0}'.": { "category": "Error", diff --git a/tests/baselines/reference/parserES5ForOfStatement20.errors.txt b/tests/baselines/reference/parserES5ForOfStatement20.errors.txt new file mode 100644 index 00000000000..4aee32394b6 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement20.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts(1,10): error TS1189: The variable declaration of a 'for...in' statement cannot have an initializer. + + +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts (1 errors) ==== + for (var of = 0 in of) { } + ~~ +!!! error TS1189: The variable declaration of a 'for...in' statement cannot have an initializer. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement20.types b/tests/baselines/reference/parserES5ForOfStatement20.types deleted file mode 100644 index 54df94516c3..00000000000 --- a/tests/baselines/reference/parserES5ForOfStatement20.types +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement20.ts === -for (var of = 0 in of) { } ->of : any ->of : any - diff --git a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt index 36c1894ed78..e2b38b56be5 100644 --- a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,10): error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (1 errors) ==== for (var a = 1 of X) { - ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~ +!!! error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForInStatement4.errors.txt b/tests/baselines/reference/parserForInStatement4.errors.txt index a4df2beaedb..91484260903 100644 --- a/tests/baselines/reference/parserForInStatement4.errors.txt +++ b/tests/baselines/reference/parserForInStatement4.errors.txt @@ -1,8 +1,11 @@ +tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement4.ts(1,10): error TS1189: The variable declaration of a 'for...in' statement cannot have an initializer. tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement4.ts(1,19): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement4.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement4.ts (2 errors) ==== for (var a = 1 in X) { + ~ +!!! error TS1189: The variable declaration of a 'for...in' statement cannot have an initializer. ~ !!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement20.errors.txt b/tests/baselines/reference/parserForOfStatement20.errors.txt new file mode 100644 index 00000000000..461f307f6b9 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement20.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts(1,10): error TS1189: The variable declaration of a 'for...in' statement cannot have an initializer. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts (1 errors) ==== + for (var of = 0 in of) { } + ~~ +!!! error TS1189: The variable declaration of a 'for...in' statement cannot have an initializer. \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement20.types b/tests/baselines/reference/parserForOfStatement20.types deleted file mode 100644 index de664ca3c0f..00000000000 --- a/tests/baselines/reference/parserForOfStatement20.types +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement20.ts === -for (var of = 0 in of) { } ->of : any ->of : any - diff --git a/tests/baselines/reference/parserForOfStatement4.errors.txt b/tests/baselines/reference/parserForOfStatement4.errors.txt new file mode 100644 index 00000000000..65b4bf342f2 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement4.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts(1,10): error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts (1 errors) ==== + for (var a = 1 of X) { + ~ +!!! error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. + } \ No newline at end of file From 7cb2a643503698d3da5469b01d1a8fcd67d2125f Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 17 Feb 2015 18:16:00 -0800 Subject: [PATCH 093/106] Disallow type annotation on a for-of variable --- src/compiler/checker.ts | 14 +++++++++----- src/compiler/diagnosticInformationMap.generated.ts | 1 + src/compiler/diagnosticMessages.json | 4 ++++ .../reference/parserES5ForOfStatement5.errors.txt | 6 +++--- .../reference/parserForInStatement7.errors.txt | 5 +---- .../reference/parserForOfStatement5.errors.txt | 8 ++++++++ 6 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 tests/baselines/reference/parserForOfStatement5.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 96439b2cf68..aeb2324fcbf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8467,9 +8467,6 @@ module ts { if (variableDeclarationList.declarations.length >= 1) { var decl = variableDeclarationList.declarations[0]; checkVariableDeclaration(decl); - if (decl.type) { - error(decl, Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation); - } } } else { @@ -10769,11 +10766,18 @@ module ts { Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic); } - if (variableList.declarations[0].initializer) { + var firstDeclaration = variableList.declarations[0]; + if (firstDeclaration.initializer) { var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer : Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer; - return grammarErrorOnNode(variableList.declarations[0].name, diagnostic); + return grammarErrorOnNode(firstDeclaration.name, diagnostic); + } + if (firstDeclaration.type) { + var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? + Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation : + Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation; + return grammarErrorOnNode(firstDeclaration, diagnostic); } } } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 17c0bec44a3..4d9ac1d91a7 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -317,6 +317,7 @@ module ts { let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2476, category: DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." }, Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2477, category: DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." }, For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "For-of statements are only available when targeting ECMAScript 6 or higher" }, + The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index b0bf5945e8c..65c73d3ccd4 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1260,6 +1260,10 @@ "category": "Error", "code": 2482 }, + "The left-hand side of a 'for...of' statement cannot use a type annotation.": { + "category": "Error", + "code": 2483 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt index 55c56d60aae..0e88ce6cf36 100644 --- a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,10): error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (1 errors) ==== for (var a: number of X) { - ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher + ~ +!!! error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForInStatement7.errors.txt b/tests/baselines/reference/parserForInStatement7.errors.txt index 397401003db..7c85ce3f795 100644 --- a/tests/baselines/reference/parserForInStatement7.errors.txt +++ b/tests/baselines/reference/parserForInStatement7.errors.txt @@ -1,12 +1,9 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement7.ts(1,10): error TS2404: The left-hand side of a 'for...in' statement cannot use a type annotation. tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement7.ts(1,25): error TS1091: Only a single variable declaration is allowed in a 'for...in' statement. tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement7.ts(1,43): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement7.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserForInStatement7.ts (2 errors) ==== for (var a: number = 1, b: string = "" in X) { - ~ -!!! error TS2404: The left-hand side of a 'for...in' statement cannot use a type annotation. ~ !!! error TS1091: Only a single variable declaration is allowed in a 'for...in' statement. ~ diff --git a/tests/baselines/reference/parserForOfStatement5.errors.txt b/tests/baselines/reference/parserForOfStatement5.errors.txt new file mode 100644 index 00000000000..13fd8739866 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement5.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts(1,10): error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts (1 errors) ==== + for (var a: number of X) { + ~ +!!! error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. + } \ No newline at end of file From 8558d642f3b82c7626634cc3098096c8a3609457 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 18 Feb 2015 11:14:58 -0800 Subject: [PATCH 094/106] Temporarily disallow for-of statements --- src/compiler/checker.ts | 2 ++ src/compiler/diagnosticInformationMap.generated.ts | 3 ++- src/compiler/diagnosticMessages.json | 6 +++++- .../reference/parserES5ForOfStatement1.d.errors.txt | 4 ++-- .../reference/parserES5ForOfStatement10.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement11.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement12.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement13.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement14.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement15.errors.txt | 4 ++-- .../reference/parserES5ForOfStatement16.errors.txt | 4 ++-- .../reference/parserES5ForOfStatement18.errors.txt | 4 ++-- .../reference/parserES5ForOfStatement2.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement21.errors.txt | 9 +++------ .../reference/parserES5ForOfStatement3.errors.txt | 6 +++--- .../reference/parserES5ForOfStatement4.errors.txt | 6 +++--- .../reference/parserES5ForOfStatement5.errors.txt | 6 +++--- .../reference/parserES5ForOfStatement6.errors.txt | 6 +++--- .../reference/parserES5ForOfStatement7.errors.txt | 6 +++--- .../reference/parserES5ForOfStatement8.errors.txt | 4 ++-- .../reference/parserES5ForOfStatement9.errors.txt | 9 +++------ .../reference/parserForOfStatement1.d.errors.txt | 4 ++-- .../reference/parserForOfStatement10.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement10.types | 5 ----- .../reference/parserForOfStatement11.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement11.types | 6 ------ .../reference/parserForOfStatement12.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement12.types | 6 ------ .../reference/parserForOfStatement13.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement13.types | 6 ------ .../reference/parserForOfStatement14.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement14.types | 6 ------ .../reference/parserForOfStatement15.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement15.types | 6 ------ .../reference/parserForOfStatement16.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement16.types | 6 ------ .../reference/parserForOfStatement18.errors.txt | 7 +++++++ tests/baselines/reference/parserForOfStatement18.types | 5 ----- .../baselines/reference/parserForOfStatement2.errors.txt | 6 +++--- .../reference/parserForOfStatement21.errors.txt | 6 +++--- .../baselines/reference/parserForOfStatement3.errors.txt | 6 +++--- .../baselines/reference/parserForOfStatement4.errors.txt | 6 +++--- .../baselines/reference/parserForOfStatement5.errors.txt | 6 +++--- .../baselines/reference/parserForOfStatement6.errors.txt | 6 +++--- .../baselines/reference/parserForOfStatement7.errors.txt | 6 +++--- .../baselines/reference/parserForOfStatement8.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement8.types | 5 ----- .../baselines/reference/parserForOfStatement9.errors.txt | 8 ++++++++ tests/baselines/reference/parserForOfStatement9.types | 5 ----- 49 files changed, 160 insertions(+), 154 deletions(-) create mode 100644 tests/baselines/reference/parserForOfStatement10.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement10.types create mode 100644 tests/baselines/reference/parserForOfStatement11.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement11.types create mode 100644 tests/baselines/reference/parserForOfStatement12.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement12.types create mode 100644 tests/baselines/reference/parserForOfStatement13.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement13.types create mode 100644 tests/baselines/reference/parserForOfStatement14.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement14.types create mode 100644 tests/baselines/reference/parserForOfStatement15.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement15.types create mode 100644 tests/baselines/reference/parserForOfStatement16.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement16.types create mode 100644 tests/baselines/reference/parserForOfStatement18.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement18.types create mode 100644 tests/baselines/reference/parserForOfStatement8.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement8.types create mode 100644 tests/baselines/reference/parserForOfStatement9.errors.txt delete mode 100644 tests/baselines/reference/parserForOfStatement9.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index aeb2324fcbf..37de87ea83b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10786,6 +10786,8 @@ module ts { } function checkGrammarForOfStatement(forOfStatement: ForOfStatement): boolean { + // Temporarily disallow for-of statements until type check work is complete. + return grammarErrorOnFirstToken(forOfStatement, Diagnostics.For_of_statements_are_not_currently_supported); if (checkGrammarForInOrForOfStatement(forOfStatement)) { return true; } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 4d9ac1d91a7..2fbe9b49457 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -316,7 +316,7 @@ module ts { Property_0_does_not_exist_on_const_enum_1: { code: 2475, category: DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." }, let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2476, category: DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." }, Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2477, category: DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." }, - For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "For-of statements are only available when targeting ECMAScript 6 or higher" }, + For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "For...of statements are only available when targeting ECMAScript 6 or higher." }, The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, @@ -463,5 +463,6 @@ module ts { yield_expressions_are_not_currently_supported: { code: 9000, category: DiagnosticCategory.Error, key: "'yield' expressions are not currently supported." }, Generators_are_not_currently_supported: { code: 9001, category: DiagnosticCategory.Error, key: "Generators are not currently supported." }, The_arguments_object_cannot_be_referenced_in_an_arrow_function_Consider_using_a_standard_function_expression: { code: 9002, category: DiagnosticCategory.Error, key: "The 'arguments' object cannot be referenced in an arrow function. Consider using a standard function expression." }, + For_of_statements_are_not_currently_supported: { code: 9003, category: DiagnosticCategory.Error, key: "For...of statements are not currently supported." }, }; } \ No newline at end of file diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 65c73d3ccd4..1b81d14ffda 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1256,7 +1256,7 @@ "category": "Error", "code": 2477 }, - "For-of statements are only available when targeting ECMAScript 6 or higher": { + "For...of statements are only available when targeting ECMAScript 6 or higher.": { "category": "Error", "code": 2482 }, @@ -1845,5 +1845,9 @@ "The 'arguments' object cannot be referenced in an arrow function. Consider using a standard function expression.": { "category": "Error", "code": 9002 + }, + "For...of statements are not currently supported.": { + "category": "Error", + "code": 9003 } } diff --git a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt index f3034cd2c27..b5117962a75 100644 --- a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS1036: Statements are not allowed in ambient contexts. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts (1 errors) ==== for (var i of e) { ~~~ -!!! error TS1036: Statements are not allowed in ambient contexts. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt index 7fdbe80e12e..7da7a0505e0 100644 --- a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,6): error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts (1 errors) ==== for (const v of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - ~~~~~ -!!! error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt index 146aff8f91b..f15beaa8f62 100644 --- a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,6): error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts (1 errors) ==== for (const [a, b] of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - ~~~~~ -!!! error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt index ea1ad1d8eb7..da8836c29d8 100644 --- a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,6): error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts (1 errors) ==== for (const {a, b} of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - ~~~~~ -!!! error TS1154: 'const' declarations are only available when targeting ECMAScript 6 and higher. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt index 27dc44f094a..1f181b16e75 100644 --- a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,6): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts (1 errors) ==== for (let {a, b} of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - ~~~ -!!! error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt index 9eba6e25c9a..a1d67e91bce 100644 --- a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,6): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts (1 errors) ==== for (let [a, b] of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - ~~~ -!!! error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt index 2f39244ecd5..9c879f7cec4 100644 --- a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts (1 errors) ==== for (var [a, b] of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt index 80a45c0f8b5..fb0fe1b59cc 100644 --- a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts (1 errors) ==== for (var {a, b} of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt index e07b516abf0..7ddd631f6ec 100644 --- a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts (1 errors) ==== for (var of of of) { } ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher \ No newline at end of file +!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt index 70bf84999f5..309b145b84a 100644 --- a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,9): error TS1123: Variable declaration list cannot be empty. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts (1 errors) ==== for (var of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - -!!! error TS1123: Variable declaration list cannot be empty. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt index 338d1e34b2f..9bd333c2592 100644 --- a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt @@ -1,10 +1,7 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,9): error TS1123: Variable declaration list cannot be empty. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts (1 errors) ==== for (var of of) { } ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - -!!! error TS1123: Variable declaration list cannot be empty. \ No newline at end of file +!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt index a976d9c0d54..78c0592f12d 100644 --- a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,13): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (1 errors) ==== for (var a, b of X) { - ~ -!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt index e2b38b56be5..d456dcd2d22 100644 --- a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,10): error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (1 errors) ==== for (var a = 1 of X) { - ~ -!!! error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt index 0e88ce6cf36..45070d754cc 100644 --- a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,10): error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (1 errors) ==== for (var a: number of X) { - ~ -!!! error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt index da76589190d..85f2ce11537 100644 --- a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,17): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { - ~ -!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt index ced399ca103..0dddea7adc6 100644 --- a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,25): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { - ~ -!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt index 739369e8f82..8707d03a135 100644 --- a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts (1 errors) ==== for (var v of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt index c03669fcb98..c41bc180a79 100644 --- a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt @@ -1,11 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,1): error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,6): error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,1): error TS9003: For...of statements are not currently supported. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts (1 errors) ==== for (let v of X) { ~~~ -!!! error TS2482: For-of statements are only available when targeting ECMAScript 6 or higher - ~~~ -!!! error TS1153: 'let' declarations are only available when targeting ECMAScript 6 and higher. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement1.d.errors.txt b/tests/baselines/reference/parserForOfStatement1.d.errors.txt index 3b1b2a65922..8961f8b7fbc 100644 --- a/tests/baselines/reference/parserForOfStatement1.d.errors.txt +++ b/tests/baselines/reference/parserForOfStatement1.d.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts(1,1): error TS1036: Statements are not allowed in ambient contexts. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts (1 errors) ==== for (var i of e) { ~~~ -!!! error TS1036: Statements are not allowed in ambient contexts. +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement10.errors.txt b/tests/baselines/reference/parserForOfStatement10.errors.txt new file mode 100644 index 00000000000..71dbd6b9a15 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement10.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts (1 errors) ==== + for (const v of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement10.types b/tests/baselines/reference/parserForOfStatement10.types deleted file mode 100644 index 1707fa934cb..00000000000 --- a/tests/baselines/reference/parserForOfStatement10.types +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts === -for (const v of X) { ->v : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement11.errors.txt b/tests/baselines/reference/parserForOfStatement11.errors.txt new file mode 100644 index 00000000000..9ed5ad72cf5 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement11.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts (1 errors) ==== + for (const [a, b] of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement11.types b/tests/baselines/reference/parserForOfStatement11.types deleted file mode 100644 index eebc0c6a864..00000000000 --- a/tests/baselines/reference/parserForOfStatement11.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts === -for (const [a, b] of X) { ->a : any ->b : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement12.errors.txt b/tests/baselines/reference/parserForOfStatement12.errors.txt new file mode 100644 index 00000000000..da4a3e9a36d --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement12.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts (1 errors) ==== + for (const {a, b} of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement12.types b/tests/baselines/reference/parserForOfStatement12.types deleted file mode 100644 index 51071059db1..00000000000 --- a/tests/baselines/reference/parserForOfStatement12.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts === -for (const {a, b} of X) { ->a : any ->b : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement13.errors.txt b/tests/baselines/reference/parserForOfStatement13.errors.txt new file mode 100644 index 00000000000..b01f4ecd52b --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement13.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts (1 errors) ==== + for (let {a, b} of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement13.types b/tests/baselines/reference/parserForOfStatement13.types deleted file mode 100644 index 22c7af5605c..00000000000 --- a/tests/baselines/reference/parserForOfStatement13.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts === -for (let {a, b} of X) { ->a : any ->b : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement14.errors.txt b/tests/baselines/reference/parserForOfStatement14.errors.txt new file mode 100644 index 00000000000..2a4b79e35f1 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement14.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts (1 errors) ==== + for (let [a, b] of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement14.types b/tests/baselines/reference/parserForOfStatement14.types deleted file mode 100644 index f255015bb15..00000000000 --- a/tests/baselines/reference/parserForOfStatement14.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts === -for (let [a, b] of X) { ->a : any ->b : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement15.errors.txt b/tests/baselines/reference/parserForOfStatement15.errors.txt new file mode 100644 index 00000000000..920cb21c6e1 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement15.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts (1 errors) ==== + for (var [a, b] of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement15.types b/tests/baselines/reference/parserForOfStatement15.types deleted file mode 100644 index bf6faf3478e..00000000000 --- a/tests/baselines/reference/parserForOfStatement15.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts === -for (var [a, b] of X) { ->a : any ->b : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement16.errors.txt b/tests/baselines/reference/parserForOfStatement16.errors.txt new file mode 100644 index 00000000000..b13c13168bd --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement16.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts (1 errors) ==== + for (var {a, b} of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement16.types b/tests/baselines/reference/parserForOfStatement16.types deleted file mode 100644 index 48476dfae0a..00000000000 --- a/tests/baselines/reference/parserForOfStatement16.types +++ /dev/null @@ -1,6 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts === -for (var {a, b} of X) { ->a : any ->b : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement18.errors.txt b/tests/baselines/reference/parserForOfStatement18.errors.txt new file mode 100644 index 00000000000..35f63cbd95c --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement18.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts (1 errors) ==== + for (var of of of) { } + ~~~ +!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement18.types b/tests/baselines/reference/parserForOfStatement18.types deleted file mode 100644 index 8e3b52ac877..00000000000 --- a/tests/baselines/reference/parserForOfStatement18.types +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts === -for (var of of of) { } ->of : any ->of : any - diff --git a/tests/baselines/reference/parserForOfStatement2.errors.txt b/tests/baselines/reference/parserForOfStatement2.errors.txt index 7229fe4196d..88bac913833 100644 --- a/tests/baselines/reference/parserForOfStatement2.errors.txt +++ b/tests/baselines/reference/parserForOfStatement2.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts(1,9): error TS1123: Variable declaration list cannot be empty. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts (1 errors) ==== for (var of X) { - -!!! error TS1123: Variable declaration list cannot be empty. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement21.errors.txt b/tests/baselines/reference/parserForOfStatement21.errors.txt index 9103e2fedee..091a5c116eb 100644 --- a/tests/baselines/reference/parserForOfStatement21.errors.txt +++ b/tests/baselines/reference/parserForOfStatement21.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts(1,9): error TS1123: Variable declaration list cannot be empty. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts (1 errors) ==== for (var of of) { } - -!!! error TS1123: Variable declaration list cannot be empty. \ No newline at end of file + ~~~ +!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement3.errors.txt b/tests/baselines/reference/parserForOfStatement3.errors.txt index 995ef4637c2..18127a69310 100644 --- a/tests/baselines/reference/parserForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,13): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts (1 errors) ==== for (var a, b of X) { - ~ -!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement4.errors.txt b/tests/baselines/reference/parserForOfStatement4.errors.txt index 65b4bf342f2..bee92e3035e 100644 --- a/tests/baselines/reference/parserForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserForOfStatement4.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts(1,10): error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts (1 errors) ==== for (var a = 1 of X) { - ~ -!!! error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement5.errors.txt b/tests/baselines/reference/parserForOfStatement5.errors.txt index 13fd8739866..a1cc609fe81 100644 --- a/tests/baselines/reference/parserForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserForOfStatement5.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts(1,10): error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts (1 errors) ==== for (var a: number of X) { - ~ -!!! error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement6.errors.txt b/tests/baselines/reference/parserForOfStatement6.errors.txt index 57d95361b65..477544babe9 100644 --- a/tests/baselines/reference/parserForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,17): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { - ~ -!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement7.errors.txt b/tests/baselines/reference/parserForOfStatement7.errors.txt index 07f93c263ec..c03d9451f5d 100644 --- a/tests/baselines/reference/parserForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,25): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,1): error TS9003: For...of statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { - ~ -!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~~~ +!!! error TS9003: For...of statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement8.errors.txt b/tests/baselines/reference/parserForOfStatement8.errors.txt new file mode 100644 index 00000000000..1f0e9215584 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement8.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts (1 errors) ==== + for (var v of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement8.types b/tests/baselines/reference/parserForOfStatement8.types deleted file mode 100644 index a4168caf262..00000000000 --- a/tests/baselines/reference/parserForOfStatement8.types +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts === -for (var v of X) { ->v : any ->X : unknown -} diff --git a/tests/baselines/reference/parserForOfStatement9.errors.txt b/tests/baselines/reference/parserForOfStatement9.errors.txt new file mode 100644 index 00000000000..18f0f41a2e9 --- /dev/null +++ b/tests/baselines/reference/parserForOfStatement9.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts(1,1): error TS9003: For...of statements are not currently supported. + + +==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts (1 errors) ==== + for (let v of X) { + ~~~ +!!! error TS9003: For...of statements are not currently supported. + } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement9.types b/tests/baselines/reference/parserForOfStatement9.types deleted file mode 100644 index 0285a3e4b76..00000000000 --- a/tests/baselines/reference/parserForOfStatement9.types +++ /dev/null @@ -1,5 +0,0 @@ -=== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts === -for (let v of X) { ->v : any ->X : unknown -} From 6c32a6aca8c098886b03edb7293ddbc2556206c5 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 18 Feb 2015 14:39:07 -0800 Subject: [PATCH 095/106] Address feedback --- src/compiler/checker.ts | 61 +++++++++---------- .../diagnosticInformationMap.generated.ts | 4 +- src/compiler/diagnosticMessages.json | 4 +- .../parserES5ForOfStatement1.d.errors.txt | 4 +- .../parserES5ForOfStatement10.errors.txt | 4 +- .../parserES5ForOfStatement11.errors.txt | 4 +- .../parserES5ForOfStatement12.errors.txt | 4 +- .../parserES5ForOfStatement13.errors.txt | 4 +- .../parserES5ForOfStatement14.errors.txt | 4 +- .../parserES5ForOfStatement15.errors.txt | 4 +- .../parserES5ForOfStatement16.errors.txt | 4 +- .../parserES5ForOfStatement18.errors.txt | 4 +- .../parserES5ForOfStatement2.errors.txt | 4 +- .../parserES5ForOfStatement21.errors.txt | 4 +- .../parserES5ForOfStatement3.errors.txt | 4 +- .../parserES5ForOfStatement4.errors.txt | 4 +- .../parserES5ForOfStatement5.errors.txt | 4 +- .../parserES5ForOfStatement6.errors.txt | 4 +- .../parserES5ForOfStatement7.errors.txt | 4 +- .../parserES5ForOfStatement8.errors.txt | 4 +- .../parserES5ForOfStatement9.errors.txt | 4 +- .../parserForOfStatement1.d.errors.txt | 4 +- .../parserForOfStatement10.errors.txt | 4 +- .../parserForOfStatement11.errors.txt | 4 +- .../parserForOfStatement12.errors.txt | 4 +- .../parserForOfStatement13.errors.txt | 4 +- .../parserForOfStatement14.errors.txt | 4 +- .../parserForOfStatement15.errors.txt | 4 +- .../parserForOfStatement16.errors.txt | 4 +- .../parserForOfStatement18.errors.txt | 4 +- .../parserForOfStatement2.errors.txt | 4 +- .../parserForOfStatement21.errors.txt | 4 +- .../parserForOfStatement3.errors.txt | 4 +- .../parserForOfStatement4.errors.txt | 4 +- .../parserForOfStatement5.errors.txt | 4 +- .../parserForOfStatement6.errors.txt | 4 +- .../parserForOfStatement7.errors.txt | 4 +- .../parserForOfStatement8.errors.txt | 4 +- .../parserForOfStatement9.errors.txt | 4 +- 39 files changed, 105 insertions(+), 108 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 37de87ea83b..e94a125faed 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8082,7 +8082,7 @@ module ts { function checkBlock(node: Block) { // Grammar checking for SyntaxKind.Block if (node.kind === SyntaxKind.Block) { - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); } forEach(node.statements, checkSourceElement); @@ -8396,14 +8396,14 @@ module ts { function checkExpressionStatement(node: ExpressionStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node) + checkGrammarStatementInAmbientContext(node) checkExpression(node.expression); } function checkIfStatement(node: IfStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); checkExpression(node.expression); checkSourceElement(node.thenStatement); @@ -8412,7 +8412,7 @@ module ts { function checkDoStatement(node: DoStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); checkSourceElement(node.statement); checkExpression(node.expression); @@ -8420,7 +8420,7 @@ module ts { function checkWhileStatement(node: WhileStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); checkExpression(node.expression); checkSourceElement(node.statement); @@ -8428,7 +8428,7 @@ module ts { function checkForStatement(node: ForStatement) { // Grammar checking - if (!checkGrammarForStatementInAmbientContext(node)) { + if (!checkGrammarStatementInAmbientContext(node)) { if (node.initializer && node.initializer.kind == SyntaxKind.VariableDeclarationList) { checkGrammarVariableDeclarationList(node.initializer); } @@ -8497,7 +8497,7 @@ module ts { function checkBreakOrContinueStatement(node: BreakOrContinueStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node); + checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node); // TODO: Check that target label is valid } @@ -8508,7 +8508,7 @@ module ts { function checkReturnStatement(node: ReturnStatement) { // Grammar checking - if (!checkGrammarForStatementInAmbientContext(node)) { + if (!checkGrammarStatementInAmbientContext(node)) { var functionBlock = getContainingFunction(node); if (!functionBlock) { grammarErrorOnFirstToken(node, Diagnostics.A_return_statement_can_only_be_used_within_a_function_body); @@ -8539,7 +8539,7 @@ module ts { function checkWithStatement(node: WithStatement) { // Grammar checking for withStatement - if (!checkGrammarForStatementInAmbientContext(node)) { + if (!checkGrammarStatementInAmbientContext(node)) { if (node.parserContextFlags & ParserContextFlags.StrictMode) { grammarErrorOnFirstToken(node, Diagnostics.with_statements_are_not_allowed_in_strict_mode); } @@ -8551,7 +8551,7 @@ module ts { function checkSwitchStatement(node: SwitchStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); var firstDefaultClause: CaseOrDefaultClause; var hasDuplicateDefaultClause = false; @@ -8588,7 +8588,7 @@ module ts { function checkLabeledStatement(node: LabeledStatement) { // Grammar checking - if (!checkGrammarForStatementInAmbientContext(node)) { + if (!checkGrammarStatementInAmbientContext(node)) { var current = node.parent; while (current) { if (isAnyFunction(current)) { @@ -8609,7 +8609,7 @@ module ts { function checkThrowStatement(node: ThrowStatement) { // Grammar checking - if (!checkGrammarForStatementInAmbientContext(node)) { + if (!checkGrammarStatementInAmbientContext(node)) { if (node.expression === undefined) { grammarErrorAfterFirstToken(node, Diagnostics.Line_break_not_permitted_here); } @@ -8622,7 +8622,7 @@ module ts { function checkTryStatement(node: TryStatement) { // Grammar checking - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); checkBlock(node.tryBlock); var catchClause = node.catchClause; @@ -9480,10 +9480,10 @@ module ts { case SyntaxKind.ExportAssignment: return checkExportAssignment(node); case SyntaxKind.EmptyStatement: - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); return; case SyntaxKind.DebuggerStatement: - checkGrammarForStatementInAmbientContext(node); + checkGrammarStatementInAmbientContext(node); return; } } @@ -10753,7 +10753,7 @@ module ts { } function checkGrammarForInOrForOfStatement(forInOrOfStatement: ForInStatement | ForOfStatement): boolean { - if (checkGrammarForStatementInAmbientContext(forInOrOfStatement)) { + if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) { return true; } @@ -10761,22 +10761,22 @@ module ts { var variableList = forInOrOfStatement.initializer; if (!checkGrammarVariableDeclarationList(variableList)) { if (variableList.declarations.length > 1) { - var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? - Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement : - Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; + var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement + ? Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement + : Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic); } var firstDeclaration = variableList.declarations[0]; if (firstDeclaration.initializer) { - var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? - Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer : - Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer; + var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement + ? Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer + : Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer; return grammarErrorOnNode(firstDeclaration.name, diagnostic); } if (firstDeclaration.type) { - var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement ? - Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation : - Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation; + var diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement + ? Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation + : Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation; return grammarErrorOnNode(firstDeclaration, diagnostic); } } @@ -10787,15 +10787,12 @@ module ts { function checkGrammarForOfStatement(forOfStatement: ForOfStatement): boolean { // Temporarily disallow for-of statements until type check work is complete. - return grammarErrorOnFirstToken(forOfStatement, Diagnostics.For_of_statements_are_not_currently_supported); - if (checkGrammarForInOrForOfStatement(forOfStatement)) { - return true; - } + return grammarErrorOnFirstToken(forOfStatement, Diagnostics.for_of_statements_are_not_currently_supported); if (languageVersion < ScriptTarget.ES6) { - return grammarErrorOnFirstToken(forOfStatement, Diagnostics.For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher); + return grammarErrorOnFirstToken(forOfStatement, Diagnostics.for_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher); } - return false; + return checkGrammarForInOrForOfStatement(forOfStatement); } function checkGrammarAccessor(accessor: MethodDeclaration): boolean { @@ -11235,7 +11232,7 @@ module ts { return isInAmbientContext(node) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node); } - function checkGrammarForStatementInAmbientContext(node: Node): boolean { + function checkGrammarStatementInAmbientContext(node: Node): boolean { if (isInAmbientContext(node)) { // An accessors is already reported about the ambient context if (isAccessor(node.parent.kind)) { diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 2fbe9b49457..db0058f64db 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -316,7 +316,7 @@ module ts { Property_0_does_not_exist_on_const_enum_1: { code: 2475, category: DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." }, let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2476, category: DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." }, Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2477, category: DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." }, - For_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "For...of statements are only available when targeting ECMAScript 6 or higher." }, + for_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "'for...of' statements are only available when targeting ECMAScript 6 or higher." }, The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, @@ -463,6 +463,6 @@ module ts { yield_expressions_are_not_currently_supported: { code: 9000, category: DiagnosticCategory.Error, key: "'yield' expressions are not currently supported." }, Generators_are_not_currently_supported: { code: 9001, category: DiagnosticCategory.Error, key: "Generators are not currently supported." }, The_arguments_object_cannot_be_referenced_in_an_arrow_function_Consider_using_a_standard_function_expression: { code: 9002, category: DiagnosticCategory.Error, key: "The 'arguments' object cannot be referenced in an arrow function. Consider using a standard function expression." }, - For_of_statements_are_not_currently_supported: { code: 9003, category: DiagnosticCategory.Error, key: "For...of statements are not currently supported." }, + for_of_statements_are_not_currently_supported: { code: 9003, category: DiagnosticCategory.Error, key: "'for...of' statements are not currently supported." }, }; } \ No newline at end of file diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 1b81d14ffda..0ba9c6729f3 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1256,7 +1256,7 @@ "category": "Error", "code": 2477 }, - "For...of statements are only available when targeting ECMAScript 6 or higher.": { + "'for...of' statements are only available when targeting ECMAScript 6 or higher.": { "category": "Error", "code": 2482 }, @@ -1846,7 +1846,7 @@ "category": "Error", "code": 9002 }, - "For...of statements are not currently supported.": { + "'for...of' statements are not currently supported.": { "category": "Error", "code": 9003 } diff --git a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt index b5117962a75..9c1a39b1f4a 100644 --- a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts (1 errors) ==== for (var i of e) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt index 7da7a0505e0..d7f411b1879 100644 --- a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts (1 errors) ==== for (const v of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt index f15beaa8f62..48805a336c7 100644 --- a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts (1 errors) ==== for (const [a, b] of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt index da8836c29d8..3b9f242b975 100644 --- a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts (1 errors) ==== for (const {a, b} of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt index 1f181b16e75..8b8c8ce0868 100644 --- a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts (1 errors) ==== for (let {a, b} of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt index a1d67e91bce..dc4db95270a 100644 --- a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts (1 errors) ==== for (let [a, b] of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt index 9c879f7cec4..07aa6dd5b37 100644 --- a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts (1 errors) ==== for (var [a, b] of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt index fb0fe1b59cc..15a3e4f7f0b 100644 --- a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts (1 errors) ==== for (var {a, b} of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt index 7ddd631f6ec..fc314e51012 100644 --- a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts (1 errors) ==== for (var of of of) { } ~~~ -!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file +!!! error TS9003: 'for...of' statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt index 309b145b84a..347ae29ddb8 100644 --- a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts (1 errors) ==== for (var of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt index 9bd333c2592..2ddbf4b5666 100644 --- a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts (1 errors) ==== for (var of of) { } ~~~ -!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file +!!! error TS9003: 'for...of' statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt index 78c0592f12d..553ca40aee0 100644 --- a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (1 errors) ==== for (var a, b of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt index d456dcd2d22..6a08c8942ed 100644 --- a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (1 errors) ==== for (var a = 1 of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt index 45070d754cc..212eae8ac10 100644 --- a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (1 errors) ==== for (var a: number of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt index 85f2ce11537..e331b66eb85 100644 --- a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt index 0dddea7adc6..5ba60c264eb 100644 --- a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt index 8707d03a135..3696bf11f8c 100644 --- a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts (1 errors) ==== for (var v of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt index c41bc180a79..6e2e9d05705 100644 --- a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts (1 errors) ==== for (let v of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement1.d.errors.txt b/tests/baselines/reference/parserForOfStatement1.d.errors.txt index 8961f8b7fbc..05af0a6f775 100644 --- a/tests/baselines/reference/parserForOfStatement1.d.errors.txt +++ b/tests/baselines/reference/parserForOfStatement1.d.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement1.d.ts (1 errors) ==== for (var i of e) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement10.errors.txt b/tests/baselines/reference/parserForOfStatement10.errors.txt index 71dbd6b9a15..570c319b51f 100644 --- a/tests/baselines/reference/parserForOfStatement10.errors.txt +++ b/tests/baselines/reference/parserForOfStatement10.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement10.ts (1 errors) ==== for (const v of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement11.errors.txt b/tests/baselines/reference/parserForOfStatement11.errors.txt index 9ed5ad72cf5..f253a2d4295 100644 --- a/tests/baselines/reference/parserForOfStatement11.errors.txt +++ b/tests/baselines/reference/parserForOfStatement11.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement11.ts (1 errors) ==== for (const [a, b] of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement12.errors.txt b/tests/baselines/reference/parserForOfStatement12.errors.txt index da4a3e9a36d..07ef4498984 100644 --- a/tests/baselines/reference/parserForOfStatement12.errors.txt +++ b/tests/baselines/reference/parserForOfStatement12.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement12.ts (1 errors) ==== for (const {a, b} of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement13.errors.txt b/tests/baselines/reference/parserForOfStatement13.errors.txt index b01f4ecd52b..6c10a7b0582 100644 --- a/tests/baselines/reference/parserForOfStatement13.errors.txt +++ b/tests/baselines/reference/parserForOfStatement13.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement13.ts (1 errors) ==== for (let {a, b} of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement14.errors.txt b/tests/baselines/reference/parserForOfStatement14.errors.txt index 2a4b79e35f1..209a39c0513 100644 --- a/tests/baselines/reference/parserForOfStatement14.errors.txt +++ b/tests/baselines/reference/parserForOfStatement14.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement14.ts (1 errors) ==== for (let [a, b] of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement15.errors.txt b/tests/baselines/reference/parserForOfStatement15.errors.txt index 920cb21c6e1..c5fd77af299 100644 --- a/tests/baselines/reference/parserForOfStatement15.errors.txt +++ b/tests/baselines/reference/parserForOfStatement15.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement15.ts (1 errors) ==== for (var [a, b] of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement16.errors.txt b/tests/baselines/reference/parserForOfStatement16.errors.txt index b13c13168bd..d169eef1256 100644 --- a/tests/baselines/reference/parserForOfStatement16.errors.txt +++ b/tests/baselines/reference/parserForOfStatement16.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement16.ts (1 errors) ==== for (var {a, b} of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement18.errors.txt b/tests/baselines/reference/parserForOfStatement18.errors.txt index 35f63cbd95c..9312af76fc1 100644 --- a/tests/baselines/reference/parserForOfStatement18.errors.txt +++ b/tests/baselines/reference/parserForOfStatement18.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement18.ts (1 errors) ==== for (var of of of) { } ~~~ -!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file +!!! error TS9003: 'for...of' statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement2.errors.txt b/tests/baselines/reference/parserForOfStatement2.errors.txt index 88bac913833..8e7da497308 100644 --- a/tests/baselines/reference/parserForOfStatement2.errors.txt +++ b/tests/baselines/reference/parserForOfStatement2.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement2.ts (1 errors) ==== for (var of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement21.errors.txt b/tests/baselines/reference/parserForOfStatement21.errors.txt index 091a5c116eb..dad48f415cd 100644 --- a/tests/baselines/reference/parserForOfStatement21.errors.txt +++ b/tests/baselines/reference/parserForOfStatement21.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement21.ts (1 errors) ==== for (var of of) { } ~~~ -!!! error TS9003: For...of statements are not currently supported. \ No newline at end of file +!!! error TS9003: 'for...of' statements are not currently supported. \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement3.errors.txt b/tests/baselines/reference/parserForOfStatement3.errors.txt index 18127a69310..83985f1a710 100644 --- a/tests/baselines/reference/parserForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement3.ts (1 errors) ==== for (var a, b of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement4.errors.txt b/tests/baselines/reference/parserForOfStatement4.errors.txt index bee92e3035e..94dd08ed597 100644 --- a/tests/baselines/reference/parserForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserForOfStatement4.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement4.ts (1 errors) ==== for (var a = 1 of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement5.errors.txt b/tests/baselines/reference/parserForOfStatement5.errors.txt index a1cc609fe81..6570f4a0755 100644 --- a/tests/baselines/reference/parserForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserForOfStatement5.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement5.ts (1 errors) ==== for (var a: number of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement6.errors.txt b/tests/baselines/reference/parserForOfStatement6.errors.txt index 477544babe9..6208749911f 100644 --- a/tests/baselines/reference/parserForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement7.errors.txt b/tests/baselines/reference/parserForOfStatement7.errors.txt index c03d9451f5d..1810daad5ee 100644 --- a/tests/baselines/reference/parserForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement8.errors.txt b/tests/baselines/reference/parserForOfStatement8.errors.txt index 1f0e9215584..8e2c41d0cef 100644 --- a/tests/baselines/reference/parserForOfStatement8.errors.txt +++ b/tests/baselines/reference/parserForOfStatement8.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement8.ts (1 errors) ==== for (var v of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file diff --git a/tests/baselines/reference/parserForOfStatement9.errors.txt b/tests/baselines/reference/parserForOfStatement9.errors.txt index 18f0f41a2e9..01fd729e9cd 100644 --- a/tests/baselines/reference/parserForOfStatement9.errors.txt +++ b/tests/baselines/reference/parserForOfStatement9.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts(1,1): error TS9003: For...of statements are not currently supported. +tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts(1,1): error TS9003: 'for...of' statements are not currently supported. ==== tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement9.ts (1 errors) ==== for (let v of X) { ~~~ -!!! error TS9003: For...of statements are not currently supported. +!!! error TS9003: 'for...of' statements are not currently supported. } \ No newline at end of file From 4b590836e7e16a2bb65f9c9e18d64956c1883904 Mon Sep 17 00:00:00 2001 From: steveluc Date: Wed, 18 Feb 2015 15:12:35 -0800 Subject: [PATCH 096/106] Split completions req/response pair into two messages "completions" and "completionEntryDetails". This mirrors the function of the LS API and increases performance of completion in large projects. --- src/server/client.ts | 31 +++++++++++++------------ src/server/protocol.d.ts | 43 +++++++++++++++++++++++++++------- src/server/session.ts | 50 +++++++++++++++++++++++++--------------- 3 files changed, 83 insertions(+), 41 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index d51777c2e99..a0b68de840e 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -1,5 +1,5 @@ /// - + module ts.server { export interface SessionClientHost extends LanguageServiceHost { @@ -172,7 +172,7 @@ module ts.server { documentation: [{ kind: "text", text: response.body.documentation }] }; } - + getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { var lineCol = this.positionToOneBasedLineCol(fileName, position); var args: protocol.CompletionsRequestArgs = { @@ -185,27 +185,28 @@ module ts.server { var request = this.processRequest(CommandNames.Completions, args); var response = this.processResponse(request); - return this.lastCompletionEntry = { + return { isMemberCompletion: false, isNewIdentifierLocation: false, - entries: response.body.map(entry => ({ - kind: entry.kind, - kindModifiers: entry.kindModifiers, - name: entry.name, - displayParts: entry.displayParts, - documentation: entry.documentation - })), + entries: response.body, fileName: fileName, position: position }; } - + getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails { - if (!this.lastCompletionEntry || this.lastCompletionEntry.fileName !== fileName || this.lastCompletionEntry.position !== position) { - this.getCompletionsAtPosition(fileName, position); - } + var lineCol = this.positionToOneBasedLineCol(fileName, position); + var args: protocol.CompletionDetailsRequestArgs = { + file: fileName, + line: lineCol.line, + col: lineCol.col, + entryNames: [entryName] + }; - return this.lastCompletionEntry.entries.filter(entry => entry.name === entryName)[0]; + var request = this.processRequest(CommandNames.CompletionDetails, args); + var response = this.processResponse(request); + Debug.assert(response.body.length == 1, "Unexpected length of completion details response body."); + return response.body[0]; } getNavigateToItems(searchTerm: string): NavigateToItem[] { diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index a446f0176ae..b07fb20d48d 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -471,6 +471,26 @@ declare module ts.server.protocol { arguments: CompletionsRequestArgs; } + /** + * Arguments for completion details request. + */ + export interface CompletionDetailsRequestArgs extends FileLocationRequestArgs { + /** + * Names of one or more entries for which to obtain details. + */ + entryNames: string[]; + } + + /** + * Completion entry details request; value of command field is + * "completionEntryDetails". Given a file location (file, line, + * col) and an array of completion entry names return more + * detailed information for each completion entry. + */ + export interface CompletionDetailsRequest extends FileLocationRequest { + arguments: CompletionDetailsRequestArgs; + } + /** * Part of a symbol description. */ @@ -489,35 +509,42 @@ declare module ts.server.protocol { /** * An item found in a completion response. */ - export interface CompletionItem { + export interface CompletionEntry { /** * The symbol's name. */ name: string; - /** * The symbol's kind (such as 'className' or 'parameterName'). */ kind: string; - /** * Optional modifiers for the kind (such as 'public'). */ - kindModifiers?: string; - + kindModifiers: string; + } + + /** + * Additional completion entry details, available on demand + */ + export interface CompletionEntryDetails extends CompletionEntry { /** * Display parts of the symbol (similar to quick info). */ - displayParts?: SymbolDisplayPart[]; + displayParts: SymbolDisplayPart[]; /** * Documentation strings for the symbol. */ - documentation?: SymbolDisplayPart[]; + documentation: SymbolDisplayPart[]; } export interface CompletionsResponse extends Response { - body?: CompletionItem[]; + body?: CompletionEntry[]; + } + + export interface CompletionDetailsResponse extends Response { + body?: CompletionEntryDetails[]; } /** diff --git a/src/server/session.ts b/src/server/session.ts index 1a0a8d98a90..bfcf82bce29 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -81,7 +81,7 @@ module ts.server { function formatDiag(fileName: string, project: Project, diag: ts.Diagnostic) { return { start: project.compilerService.host.positionToLineCol(fileName, diag.start), - end: project.compilerService.host.positionToLineCol(fileName, diag.start+diag.length), + end: project.compilerService.host.positionToLineCol(fileName, diag.start + diag.length), text: ts.flattenDiagnosticMessageText(diag.messageText, "\n") }; } @@ -104,6 +104,7 @@ module ts.server { export var Change = "change"; export var Close = "close"; export var Completions = "completions"; + export var CompletionDetails = "completionEntryDetails"; export var Definition = "definition"; export var Format = "format"; export var Formatonkey = "formatonkey"; @@ -486,8 +487,8 @@ module ts.server { }; }); } - - getCompletions(line: number, col: number, prefix: string, fileName: string): protocol.CompletionItem[] { + + getCompletions(line: number, col: number, prefix: string, fileName: string): protocol.CompletionEntry[] { if (!prefix) { prefix = ""; } @@ -505,27 +506,34 @@ module ts.server { throw Errors.NoContent; } - return completions.entries.reduce((result: ts.CompletionEntryDetails[], entry: ts.CompletionEntry) => { + return completions.entries.reduce((result: protocol.CompletionEntry[], entry: ts.CompletionEntry) => { if (completions.isMemberCompletion || entry.name.indexOf(prefix) == 0) { - var protoEntry = {}; - protoEntry.name = entry.name; - protoEntry.kind = entry.kind; - if (entry.kindModifiers && (entry.kindModifiers.length > 0)) { - protoEntry.kindModifiers = entry.kindModifiers; - } - var details = compilerService.languageService.getCompletionEntryDetails(file, position, entry.name); - if (details && (details.documentation) && (details.documentation.length > 0)) { - protoEntry.documentation = details.documentation; - } - if (details && (details.displayParts) && (details.displayParts.length > 0)) { - protoEntry.displayParts = details.displayParts; - } - result.push(protoEntry); + result.push(entry); } return result; }, []); } + getCompletionEntryDetails(line: number, col: number, + entryNames: string[], fileName: string): protocol.CompletionEntryDetails[] { + var file = ts.normalizePath(fileName); + var project = this.projectService.getProjectForFile(file); + if (!project) { + throw Errors.NoProject; + } + + var compilerService = project.compilerService; + var position = compilerService.host.lineColToPosition(file, line, col); + + return entryNames.reduce((accum: protocol.CompletionEntryDetails[], entryName: string) => { + var details = compilerService.languageService.getCompletionEntryDetails(file, position, entryName); + if (details) { + accum.push(details); + } + return accum; + }, []); + } + getDiagnostics(delay: number, fileNames: string[]) { var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => { fileName = ts.normalizePath(fileName); @@ -724,6 +732,12 @@ module ts.server { response = this.getCompletions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); break; } + case CommandNames.CompletionDetails: { + var completionDetailsArgs = request.arguments; + response = this.getCompletionEntryDetails(request.arguments.line, request.arguments.col, completionDetailsArgs.entryNames, + request.arguments.file); + break; + } case CommandNames.Geterr: { var geterrArgs = request.arguments; response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); From d364f6110e2f43393377c97b474e2dd69d8ae2c5 Mon Sep 17 00:00:00 2001 From: steveluc Date: Thu, 19 Feb 2015 12:56:53 -0800 Subject: [PATCH 097/106] Style fixes. --- src/server/client.ts | 1 - src/server/session.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index a0b68de840e..6185834a022 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -24,7 +24,6 @@ module ts.server { private fileMapping: ts.Map = {}; private lineMaps: ts.Map = {}; private messages: string[] = []; - private lastCompletionEntry: CompletionEntry; private lastRenameEntry: RenameEntry; constructor(private host: SessionClientHost) { diff --git a/src/server/session.ts b/src/server/session.ts index bfcf82bce29..19f6cd3645e 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -54,7 +54,6 @@ module ts.server { } function sortNavItems(items: ts.NavigateToItem[]) { - return items.sort((a, b) => { if (a.matchKind < b.matchKind) { return -1; From 246ff099863ed66fa8ef95ef213d2f920a951dfc Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 19 Feb 2015 13:52:50 -0800 Subject: [PATCH 098/106] Increase RWC timeout --- Jakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jakefile b/Jakefile index dc8070fd751..4e022f10652 100644 --- a/Jakefile +++ b/Jakefile @@ -542,7 +542,7 @@ task("runtests", ["tests", builtLocalDirectory], function() { } if (tests && tests.toLocaleLowerCase() === "rwc") { - testTimeout = 50000; + testTimeout = 100000; } colors = process.env.colors || process.env.color From 2b64e5048964637385ff51dd07711d211e917a08 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Thu, 19 Feb 2015 15:13:03 -0800 Subject: [PATCH 099/106] Add support for limiting the number of NavigateTo results that you get back. --- src/services/services.ts | 44 ++++++++++++------- src/services/shims.ts | 8 ++-- .../baselines/reference/APISample_compile.js | 2 +- .../reference/APISample_compile.types | 5 ++- tests/baselines/reference/APISample_linter.js | 2 +- .../reference/APISample_linter.types | 5 ++- .../reference/APISample_transform.js | 2 +- .../reference/APISample_transform.types | 5 ++- .../baselines/reference/APISample_watcher.js | 2 +- .../reference/APISample_watcher.types | 5 ++- 10 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 6bb1c3108d1..b22e58a26a8 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -900,7 +900,7 @@ module ts { getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[]; getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[]; - getNavigateToItems(searchValue: string): NavigateToItem[]; + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; getNavigationBarItems(fileName: string): NavigationBarItem[]; getOutliningSpans(fileName: string): OutliningSpan[]; @@ -1380,8 +1380,8 @@ module ts { enum MatchKind { none = 0, exact = 1, - substring = 2, - prefix = 3 + prefix = 2, + substring = 3, } /// Language Service @@ -4662,7 +4662,7 @@ module ts { } /// NavigateTo - function getNavigateToItems(searchValue: string): NavigateToItem[] { + function getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[] { synchronizeHostData(); // Split search value in terms array @@ -4671,7 +4671,7 @@ module ts { // default NavigateTo approach: if search term contains only lower-case chars - use case-insensitive search, otherwise switch to case-sensitive version var searchTerms = map(terms, t => ({ caseSensitive: hasAnyUpperCaseCharacter(t), term: t })); - var items: NavigateToItem[] = []; + var rawItems: { name: string; fileName: string; matchKind: MatchKind; declaration: Declaration }[] = []; // Search the declarations in all files and output matched NavigateToItem into array of NavigateToItem[] forEach(program.getSourceFiles(), sourceFile => { @@ -4685,22 +4685,32 @@ module ts { var name = (declaration.name).text; var matchKind = getMatchKind(searchTerms, name); if (matchKind !== MatchKind.none) { - var container = getContainerNode(declaration); - items.push({ - name: name, - kind: getNodeKind(declaration), - kindModifiers: getNodeModifiers(declaration), - matchKind: MatchKind[matchKind], - fileName: fileName, - textSpan: createTextSpanFromBounds(declaration.getStart(), declaration.getEnd()), - // TODO(jfreeman): What should be the containerName when the container has a computed name? - containerName: container && container.name ? (container.name).text : "", - containerKind: container && container.name ? getNodeKind(container) : "" - }); + rawItems.push({ name, fileName, matchKind, declaration }); } } }); + rawItems.sort((i1, i2) => i1.matchKind - i2.matchKind); + if (maxResultCount !== undefined) { + rawItems = rawItems.slice(0, maxResultCount); + } + + var items = map(rawItems, i => { + var declaration = i.declaration; + var container = getContainerNode(declaration); + return { + name: i.name, + kind: getNodeKind(declaration), + kindModifiers: getNodeModifiers(declaration), + matchKind: MatchKind[i.matchKind], + fileName: i.fileName, + textSpan: createTextSpanFromBounds(declaration.getStart(), declaration.getEnd()), + // TODO(jfreeman): What should be the containerName when the container has a computed name? + containerName: container && container.name ? (container.name).text : "", + containerKind: container && container.name ? getNodeKind(container) : "" + }; + }); + return items; function hasAnyUpperCaseCharacter(s: string): boolean { diff --git a/src/services/shims.ts b/src/services/shims.ts index 7b5b6d08cf4..01950772903 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -138,7 +138,7 @@ module ts { * Returns a JSON-encoded value of the type: * { name: string; kind: string; kindModifiers: string; containerName: string; containerKind: string; matchKind: string; fileName: string; textSpan: { start: number; length: number}; } [] = []; */ - getNavigateToItems(searchValue: string): string; + getNavigateToItems(searchValue: string, maxResultCount?: number): string; /** * Returns a JSON-encoded value of the type: @@ -628,11 +628,11 @@ module ts { /// NAVIGATE TO /** Return a list of symbols that are interesting to navigate to */ - public getNavigateToItems(searchValue: string): string { + public getNavigateToItems(searchValue: string, maxResultCount?: number): string { return this.forwardJSONCall( - "getNavigateToItems('" + searchValue + "')", + "getNavigateToItems('" + searchValue + "', " + maxResultCount+ ")", () => { - var items = this.languageService.getNavigateToItems(searchValue); + var items = this.languageService.getNavigateToItems(searchValue, maxResultCount); return items; }); } diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index 09c3bb32264..fa88b0c3534 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -1541,7 +1541,7 @@ declare module "typescript" { getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[]; getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[]; getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[]; - getNavigateToItems(searchValue: string): NavigateToItem[]; + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; getNavigationBarItems(fileName: string): NavigationBarItem[]; getOutliningSpans(fileName: string): OutliningSpan[]; getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[]; diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index 425e3b5a1ea..e98b7ade392 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -4986,9 +4986,10 @@ declare module "typescript" { >position : number >ReferenceEntry : ReferenceEntry - getNavigateToItems(searchValue: string): NavigateToItem[]; ->getNavigateToItems : (searchValue: string) => NavigateToItem[] + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; +>getNavigateToItems : (searchValue: string, maxResultCount?: number) => NavigateToItem[] >searchValue : string +>maxResultCount : number >NavigateToItem : NavigateToItem getNavigationBarItems(fileName: string): NavigationBarItem[]; diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 711a780d530..7a3622d9f88 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -1572,7 +1572,7 @@ declare module "typescript" { getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[]; getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[]; getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[]; - getNavigateToItems(searchValue: string): NavigateToItem[]; + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; getNavigationBarItems(fileName: string): NavigationBarItem[]; getOutliningSpans(fileName: string): OutliningSpan[]; getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[]; diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 42ef1b57179..036deb33857 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -5130,9 +5130,10 @@ declare module "typescript" { >position : number >ReferenceEntry : ReferenceEntry - getNavigateToItems(searchValue: string): NavigateToItem[]; ->getNavigateToItems : (searchValue: string) => NavigateToItem[] + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; +>getNavigateToItems : (searchValue: string, maxResultCount?: number) => NavigateToItem[] >searchValue : string +>maxResultCount : number >NavigateToItem : NavigateToItem getNavigationBarItems(fileName: string): NavigationBarItem[]; diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index ee382329e6b..41d1fec2d2d 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -1573,7 +1573,7 @@ declare module "typescript" { getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[]; getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[]; getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[]; - getNavigateToItems(searchValue: string): NavigateToItem[]; + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; getNavigationBarItems(fileName: string): NavigationBarItem[]; getOutliningSpans(fileName: string): OutliningSpan[]; getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[]; diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 6f5f366a4c5..6cb4a6cebce 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -5082,9 +5082,10 @@ declare module "typescript" { >position : number >ReferenceEntry : ReferenceEntry - getNavigateToItems(searchValue: string): NavigateToItem[]; ->getNavigateToItems : (searchValue: string) => NavigateToItem[] + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; +>getNavigateToItems : (searchValue: string, maxResultCount?: number) => NavigateToItem[] >searchValue : string +>maxResultCount : number >NavigateToItem : NavigateToItem getNavigationBarItems(fileName: string): NavigationBarItem[]; diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 0888faddac3..d59acaa858f 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -1610,7 +1610,7 @@ declare module "typescript" { getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[]; getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[]; getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[]; - getNavigateToItems(searchValue: string): NavigateToItem[]; + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; getNavigationBarItems(fileName: string): NavigationBarItem[]; getOutliningSpans(fileName: string): OutliningSpan[]; getTodoComments(fileName: string, descriptors: TodoCommentDescriptor[]): TodoComment[]; diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 402f8491be6..77235fb4188 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -5255,9 +5255,10 @@ declare module "typescript" { >position : number >ReferenceEntry : ReferenceEntry - getNavigateToItems(searchValue: string): NavigateToItem[]; ->getNavigateToItems : (searchValue: string) => NavigateToItem[] + getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[]; +>getNavigateToItems : (searchValue: string, maxResultCount?: number) => NavigateToItem[] >searchValue : string +>maxResultCount : number >NavigateToItem : NavigateToItem getNavigationBarItems(fileName: string): NavigationBarItem[]; From 0d09dd594830b85197efba0a90ee4087e82ba8fa Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 19 Feb 2015 16:43:28 -0800 Subject: [PATCH 100/106] Make LastToken point to OfKeyword --- src/compiler/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/types.ts b/src/compiler/types.ts index b396a0673aa..0133c83c422 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -142,7 +142,7 @@ module ts { StringKeyword, SymbolKeyword, TypeKeyword, - OfKeyword, + OfKeyword, // LastKeyword and LastToken // Parse tree nodes // Names @@ -269,7 +269,7 @@ module ts { FirstPunctuation = OpenBraceToken, LastPunctuation = CaretEqualsToken, FirstToken = Unknown, - LastToken = TypeKeyword, + LastToken = OfKeyword, FirstTriviaToken = SingleLineCommentTrivia, LastTriviaToken = ConflictMarkerTrivia, FirstLiteralToken = NumericLiteral, From 2928449bbeeb4f153dd4beac2fb9726af1ff131e Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 19 Feb 2015 16:43:45 -0800 Subject: [PATCH 101/106] Accept baselines --- tests/baselines/reference/APISample_compile.js | 2 +- tests/baselines/reference/APISample_compile.types | 2 +- tests/baselines/reference/APISample_linter.js | 2 +- tests/baselines/reference/APISample_linter.types | 2 +- tests/baselines/reference/APISample_transform.js | 2 +- tests/baselines/reference/APISample_transform.types | 2 +- tests/baselines/reference/APISample_watcher.js | 2 +- tests/baselines/reference/APISample_watcher.types | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index a1d695f5105..f951a955b29 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -285,7 +285,7 @@ declare module "typescript" { FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 121, + LastToken = 122, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index e2e75843311..7a1a306b989 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -871,7 +871,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 121, + LastToken = 122, >LastToken : SyntaxKind FirstTriviaToken = 2, diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index f7c81601bc8..9631a755165 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -316,7 +316,7 @@ declare module "typescript" { FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 121, + LastToken = 122, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 722fa806346..8caa6855e84 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -1015,7 +1015,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 121, + LastToken = 122, >LastToken : SyntaxKind FirstTriviaToken = 2, diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index daa00de9cb3..2ccf48a5e6c 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -317,7 +317,7 @@ declare module "typescript" { FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 121, + LastToken = 122, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 157691c6818..60ebae5472d 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -967,7 +967,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 121, + LastToken = 122, >LastToken : SyntaxKind FirstTriviaToken = 2, diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 177f08f381f..530f081c77a 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -354,7 +354,7 @@ declare module "typescript" { FirstPunctuation = 14, LastPunctuation = 63, FirstToken = 0, - LastToken = 121, + LastToken = 122, FirstTriviaToken = 2, LastTriviaToken = 6, FirstLiteralToken = 7, diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 1c153bfac39..ec48d879968 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -1140,7 +1140,7 @@ declare module "typescript" { FirstToken = 0, >FirstToken : SyntaxKind - LastToken = 121, + LastToken = 122, >LastToken : SyntaxKind FirstTriviaToken = 2, From bf436543b95ec40e8da56c36fe01a5d8404cbf43 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 19 Feb 2015 17:17:04 -0800 Subject: [PATCH 102/106] Add a test --- .../syntacticClassificationsForOfKeyword.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 tests/cases/fourslash/syntacticClassificationsForOfKeyword.ts diff --git a/tests/cases/fourslash/syntacticClassificationsForOfKeyword.ts b/tests/cases/fourslash/syntacticClassificationsForOfKeyword.ts new file mode 100644 index 00000000000..a7a8c704ce6 --- /dev/null +++ b/tests/cases/fourslash/syntacticClassificationsForOfKeyword.ts @@ -0,0 +1,16 @@ +/// + +//// for (var of of of) { } + +var c = classification; +verify.syntacticClassificationsAre( + c.keyword("for"), + c.punctuation("("), + c.keyword("var"), + c.text("of"), + c.keyword("of"), + c.text("of"), + c.punctuation(")"), + c.punctuation("{"), + c.punctuation("}") + ); \ No newline at end of file From 14d0810fdf6571e60cc09f0f66ae1c0b93548d6f Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 19 Feb 2015 22:37:06 -0800 Subject: [PATCH 103/106] added regression test for formatting multiline template literals --- .../formattingMultilineTemplateLiterals.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 tests/cases/fourslash/formattingMultilineTemplateLiterals.ts diff --git a/tests/cases/fourslash/formattingMultilineTemplateLiterals.ts b/tests/cases/fourslash/formattingMultilineTemplateLiterals.ts new file mode 100644 index 00000000000..37e6f5782e0 --- /dev/null +++ b/tests/cases/fourslash/formattingMultilineTemplateLiterals.ts @@ -0,0 +1,13 @@ +/// + +/////*1*/new Error(`Failed to expand glob: ${projectSpec.filesGlob} +/////*2*/ at projectPath : ${projectFile} +/////*3*/ with error: ${ex.message}`) + +format.document(); +goTo.marker("1"); +verify.currentLineContentIs("new Error(`Failed to expand glob: ${projectSpec.filesGlob}"); +goTo.marker("2"); +verify.currentLineContentIs(" at projectPath : ${projectFile}"); +goTo.marker("3"); +verify.currentLineContentIs(" with error: ${ex.message}`)"); \ No newline at end of file From 566e4fb2dd00f834ee119288f932280f0c2ffa7d Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 20 Feb 2015 11:58:50 -0800 Subject: [PATCH 104/106] Formatting around 'of' keyword --- src/services/formatting/rules.ts | 3 +++ src/services/formatting/tokenRange.ts | 2 +- tests/cases/fourslash/formattingForOfKeyword.ts | 8 ++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/formattingForOfKeyword.ts diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index bf7e3f3988a..b5470579787 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -464,6 +464,9 @@ module ts.formatting { // "in" keyword in for (var x in []) { } case SyntaxKind.ForInStatement: return context.currentTokenSpan.kind === SyntaxKind.InKeyword || context.nextTokenSpan.kind === SyntaxKind.InKeyword; + // Technically, "of" is not a binary operator, but format it the same way as "in" + case SyntaxKind.ForOfStatement: + return context.currentTokenSpan.kind === SyntaxKind.OfKeyword || context.nextTokenSpan.kind === SyntaxKind.OfKeyword; } return false; } diff --git a/src/services/formatting/tokenRange.ts b/src/services/formatting/tokenRange.ts index 6dace543eab..ff9cb91ce68 100644 --- a/src/services/formatting/tokenRange.ts +++ b/src/services/formatting/tokenRange.ts @@ -126,7 +126,7 @@ module ts.formatting { static AnyIncludingMultilineComments = TokenRange.FromTokens(TokenRange.Any.GetTokens().concat([SyntaxKind.MultiLineCommentTrivia])); static Keywords = TokenRange.FromRange(SyntaxKind.FirstKeyword, SyntaxKind.LastKeyword); static BinaryOperators = TokenRange.FromRange(SyntaxKind.FirstBinaryOperator, SyntaxKind.LastBinaryOperator); - static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword]); + static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword, SyntaxKind.OfKeyword]); static UnaryPrefixOperators = TokenRange.FromTokens([SyntaxKind.PlusPlusToken, SyntaxKind.MinusMinusToken, SyntaxKind.TildeToken, SyntaxKind.ExclamationToken]); static UnaryPrefixExpressions = TokenRange.FromTokens([SyntaxKind.NumericLiteral, SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.OpenBracketToken, SyntaxKind.OpenBraceToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]); static UnaryPreincrementExpressions = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]); diff --git a/tests/cases/fourslash/formattingForOfKeyword.ts b/tests/cases/fourslash/formattingForOfKeyword.ts new file mode 100644 index 00000000000..33b3d83c00f --- /dev/null +++ b/tests/cases/fourslash/formattingForOfKeyword.ts @@ -0,0 +1,8 @@ +/// + +/////**/for ([]of[]) { } + + +format.document(); +goTo.marker(); +verify.currentLineContentIs('for ([] of []) { }'); \ No newline at end of file From 580d0a6331e973f6bbd28017924001bd46207594 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 20 Feb 2015 12:15:37 -0800 Subject: [PATCH 105/106] More tests --- .../syntacticClassificationsForOfKeyword2.ts | 16 ++++++++++++++++ .../syntacticClassificationsForOfKeyword3.ts | 18 ++++++++++++++++++ tests/cases/unittests/services/colorization.ts | 15 +++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 tests/cases/fourslash/syntacticClassificationsForOfKeyword2.ts create mode 100644 tests/cases/fourslash/syntacticClassificationsForOfKeyword3.ts diff --git a/tests/cases/fourslash/syntacticClassificationsForOfKeyword2.ts b/tests/cases/fourslash/syntacticClassificationsForOfKeyword2.ts new file mode 100644 index 00000000000..30cfaea51e0 --- /dev/null +++ b/tests/cases/fourslash/syntacticClassificationsForOfKeyword2.ts @@ -0,0 +1,16 @@ +/// + +//// for (var of in of) { } + +var c = classification; +verify.syntacticClassificationsAre( + c.keyword("for"), + c.punctuation("("), + c.keyword("var"), + c.text("of"), + c.keyword("in"), + c.text("of"), + c.punctuation(")"), + c.punctuation("{"), + c.punctuation("}") + ); \ No newline at end of file diff --git a/tests/cases/fourslash/syntacticClassificationsForOfKeyword3.ts b/tests/cases/fourslash/syntacticClassificationsForOfKeyword3.ts new file mode 100644 index 00000000000..3af4733f3b2 --- /dev/null +++ b/tests/cases/fourslash/syntacticClassificationsForOfKeyword3.ts @@ -0,0 +1,18 @@ +/// + +//// for (var of; of; of) { } + +var c = classification; +verify.syntacticClassificationsAre( + c.keyword("for"), + c.punctuation("("), + c.keyword("var"), + c.text("of"), + c.punctuation(";"), + c.text("of"), + c.punctuation(";"), + c.text("of"), + c.punctuation(")"), + c.punctuation("{"), + c.punctuation("}") + ); \ No newline at end of file diff --git a/tests/cases/unittests/services/colorization.ts b/tests/cases/unittests/services/colorization.ts index 890ced3b891..6c685cdb174 100644 --- a/tests/cases/unittests/services/colorization.ts +++ b/tests/cases/unittests/services/colorization.ts @@ -430,5 +430,20 @@ class D { }\r\n\ comment(">>>>>>> Branch - a"), finalEndOfLineState(ts.EndOfLineState.Start)); }); + + it("'of' keyword", function () { + testLexicalClassification("for (var of of of) { }", + ts.EndOfLineState.Start, + keyword("for"), + punctuation("("), + keyword("var"), + keyword("of"), + keyword("of"), + keyword("of"), + punctuation(")"), + punctuation("{"), + punctuation("}"), + finalEndOfLineState(ts.EndOfLineState.Start)); + }); }); }); \ No newline at end of file From 4b271d2d2301225d318991a0153b2d842aeb2d91 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Fri, 20 Feb 2015 16:28:33 -0800 Subject: [PATCH 106/106] Address code review feedback. --- Jakefile | 1 + src/services/navigateTo.ts | 105 ++++++++++++++++++ src/services/services.ts | 211 ++++++++++--------------------------- 3 files changed, 164 insertions(+), 153 deletions(-) create mode 100644 src/services/navigateTo.ts diff --git a/Jakefile b/Jakefile index 7b17a83a579..acbc29b808e 100644 --- a/Jakefile +++ b/Jakefile @@ -65,6 +65,7 @@ var servicesSources = [ return path.join(compilerDirectory, f); }).concat([ "breakpoints.ts", + "navigateTo.ts", "navigationBar.ts", "outliningElementsCollector.ts", "services.ts", diff --git a/src/services/navigateTo.ts b/src/services/navigateTo.ts new file mode 100644 index 00000000000..059259eec9d --- /dev/null +++ b/src/services/navigateTo.ts @@ -0,0 +1,105 @@ +module ts.NavigateTo { + type RawNavigateToItem = { name: string; fileName: string; matchKind: MatchKind; declaration: Declaration }; + + enum MatchKind { + none = 0, + exact = 1, + substring = 2, + prefix = 3 + } + + export function getNavigateToItems(program: Program, cancellationToken: CancellationTokenObject, searchValue: string, maxResultCount: number): NavigateToItem[]{ + // Split search value in terms array + var terms = searchValue.split(" "); + + // default NavigateTo approach: if search term contains only lower-case chars - use case-insensitive search, otherwise switch to case-sensitive version + var searchTerms = map(terms, t => ({ caseSensitive: hasAnyUpperCaseCharacter(t), term: t })); + + var rawItems: RawNavigateToItem[] = []; + + // Search the declarations in all files and output matched NavigateToItem into array of NavigateToItem[] + forEach(program.getSourceFiles(), sourceFile => { + cancellationToken.throwIfCancellationRequested(); + + var fileName = sourceFile.fileName; + var declarations = sourceFile.getNamedDeclarations(); + for (var i = 0, n = declarations.length; i < n; i++) { + var declaration = declarations[i]; + // TODO(jfreeman): Skip this declaration if it has a computed name + var name = (declaration.name).text; + var matchKind = getMatchKind(searchTerms, name); + if (matchKind !== MatchKind.none) { + rawItems.push({ name, fileName, matchKind, declaration }); + } + } + }); + + rawItems.sort((i1, i2) => i1.matchKind - i2.matchKind); + if (maxResultCount !== undefined) { + rawItems = rawItems.slice(0, maxResultCount); + } + + var items = map(rawItems, createNavigateToItem); + + return items; + + function createNavigateToItem(rawItem: RawNavigateToItem): NavigateToItem { + var declaration = rawItem.declaration; + var container = getContainerNode(declaration); + return { + name: rawItem.name, + kind: getNodeKind(declaration), + kindModifiers: getNodeModifiers(declaration), + matchKind: MatchKind[rawItem.matchKind], + fileName: rawItem.fileName, + textSpan: createTextSpanFromBounds(declaration.getStart(), declaration.getEnd()), + // TODO(jfreeman): What should be the containerName when the container has a computed name? + containerName: container && container.name ? (container.name).text : "", + containerKind: container && container.name ? getNodeKind(container) : "" + }; + } + + function hasAnyUpperCaseCharacter(s: string): boolean { + for (var i = 0, n = s.length; i < n; i++) { + var c = s.charCodeAt(i); + if ((CharacterCodes.A <= c && c <= CharacterCodes.Z) || + (c >= CharacterCodes.maxAsciiCharacter && s.charAt(i).toLocaleLowerCase() !== s.charAt(i))) { + return true; + } + } + + return false; + } + + function getMatchKind(searchTerms: { caseSensitive: boolean; term: string }[], name: string): MatchKind { + var matchKind = MatchKind.none; + + if (name) { + for (var j = 0, n = searchTerms.length; j < n; j++) { + var searchTerm = searchTerms[j]; + var nameToSearch = searchTerm.caseSensitive ? name : name.toLocaleLowerCase(); + // in case of case-insensitive search searchTerm.term will already be lower-cased + var index = nameToSearch.indexOf(searchTerm.term); + if (index < 0) { + // Didn't match. + return MatchKind.none; + } + + var termKind = MatchKind.substring; + if (index === 0) { + // here we know that match occur at the beginning of the string. + // if search term and declName has the same length - we have an exact match, otherwise declName have longer length and this will be prefix match + termKind = name.length === searchTerm.term.length ? MatchKind.exact : MatchKind.prefix; + } + + // Update our match kind if we don't have one, or if this match is better. + if (matchKind === MatchKind.none || termKind < matchKind) { + matchKind = termKind; + } + } + } + + return matchKind; + } + } +} \ No newline at end of file diff --git a/src/services/services.ts b/src/services/services.ts index 76c2bd80984..7c77b8c5cd0 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2,6 +2,7 @@ /// /// +/// /// /// /// @@ -1378,13 +1379,6 @@ module ts { public static typeAlias = "type alias name"; } - enum MatchKind { - none = 0, - exact = 1, - prefix = 2, - substring = 3, - } - /// Language Service interface CompletionSession { @@ -1992,6 +1986,62 @@ module ts { }); } + /* @internal */ export function getContainerNode(node: Node): Node { + while (true) { + node = node.parent; + if (!node) { + return undefined; + } + switch (node.kind) { + case SyntaxKind.SourceFile: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.FunctionExpression: + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + case SyntaxKind.ClassDeclaration: + case SyntaxKind.InterfaceDeclaration: + case SyntaxKind.EnumDeclaration: + case SyntaxKind.ModuleDeclaration: + return node; + } + } + } + + /* @internal */ export function getNodeKind(node: Node): string { + switch (node.kind) { + case SyntaxKind.ModuleDeclaration: return ScriptElementKind.moduleElement; + case SyntaxKind.ClassDeclaration: return ScriptElementKind.classElement; + case SyntaxKind.InterfaceDeclaration: return ScriptElementKind.interfaceElement; + case SyntaxKind.TypeAliasDeclaration: return ScriptElementKind.typeElement; + case SyntaxKind.EnumDeclaration: return ScriptElementKind.enumElement; + case SyntaxKind.VariableDeclaration: + return isConst(node) + ? ScriptElementKind.constElement + : isLet(node) + ? ScriptElementKind.letElement + : ScriptElementKind.variableElement; + case SyntaxKind.FunctionDeclaration: return ScriptElementKind.functionElement; + case SyntaxKind.GetAccessor: return ScriptElementKind.memberGetAccessorElement; + case SyntaxKind.SetAccessor: return ScriptElementKind.memberSetAccessorElement; + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + return ScriptElementKind.memberFunctionElement; + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.PropertySignature: + return ScriptElementKind.memberVariableElement; + case SyntaxKind.IndexSignature: return ScriptElementKind.indexSignatureElement; + case SyntaxKind.ConstructSignature: return ScriptElementKind.constructSignatureElement; + case SyntaxKind.CallSignature: return ScriptElementKind.callSignatureElement; + case SyntaxKind.Constructor: return ScriptElementKind.constructorImplementationElement; + case SyntaxKind.TypeParameter: return ScriptElementKind.typeParameterElement; + case SyntaxKind.EnumMember: return ScriptElementKind.variableElement; + case SyntaxKind.Parameter: return (node.flags & NodeFlags.AccessibilityModifier) ? ScriptElementKind.memberVariableElement : ScriptElementKind.parameterElement; + } + return ScriptElementKind.unknown; + } + export function createLanguageService(host: LanguageServiceHost, documentRegistry: DocumentRegistry = createDocumentRegistry()): LanguageService { var syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); var ruleProvider: formatting.RulesProvider; @@ -2722,29 +2772,6 @@ module ts { } } - function getContainerNode(node: Node): Node { - while (true) { - node = node.parent; - if (!node) { - return undefined; - } - switch (node.kind) { - case SyntaxKind.SourceFile: - case SyntaxKind.MethodDeclaration: - case SyntaxKind.MethodSignature: - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.FunctionExpression: - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - case SyntaxKind.ClassDeclaration: - case SyntaxKind.InterfaceDeclaration: - case SyntaxKind.EnumDeclaration: - case SyntaxKind.ModuleDeclaration: - return node; - } - } - } - // TODO(drosen): use contextual SemanticMeaning. function getSymbolKind(symbol: Symbol, typeResolver: TypeChecker, location: Node): string { var flags = symbol.getFlags(); @@ -2831,39 +2858,6 @@ module ts { return ScriptElementKind.unknown; } - function getNodeKind(node: Node): string { - switch (node.kind) { - case SyntaxKind.ModuleDeclaration: return ScriptElementKind.moduleElement; - case SyntaxKind.ClassDeclaration: return ScriptElementKind.classElement; - case SyntaxKind.InterfaceDeclaration: return ScriptElementKind.interfaceElement; - case SyntaxKind.TypeAliasDeclaration: return ScriptElementKind.typeElement; - case SyntaxKind.EnumDeclaration: return ScriptElementKind.enumElement; - case SyntaxKind.VariableDeclaration: - return isConst(node) - ? ScriptElementKind.constElement - : isLet(node) - ? ScriptElementKind.letElement - : ScriptElementKind.variableElement; - case SyntaxKind.FunctionDeclaration: return ScriptElementKind.functionElement; - case SyntaxKind.GetAccessor: return ScriptElementKind.memberGetAccessorElement; - case SyntaxKind.SetAccessor: return ScriptElementKind.memberSetAccessorElement; - case SyntaxKind.MethodDeclaration: - case SyntaxKind.MethodSignature: - return ScriptElementKind.memberFunctionElement; - case SyntaxKind.PropertyDeclaration: - case SyntaxKind.PropertySignature: - return ScriptElementKind.memberVariableElement; - case SyntaxKind.IndexSignature: return ScriptElementKind.indexSignatureElement; - case SyntaxKind.ConstructSignature: return ScriptElementKind.constructSignatureElement; - case SyntaxKind.CallSignature: return ScriptElementKind.callSignatureElement; - case SyntaxKind.Constructor: return ScriptElementKind.constructorImplementationElement; - case SyntaxKind.TypeParameter: return ScriptElementKind.typeParameterElement; - case SyntaxKind.EnumMember: return ScriptElementKind.variableElement; - case SyntaxKind.Parameter: return (node.flags & NodeFlags.AccessibilityModifier) ? ScriptElementKind.memberVariableElement : ScriptElementKind.parameterElement; - } - return ScriptElementKind.unknown; - } - function getSymbolModifiers(symbol: Symbol): string { return symbol && symbol.declarations && symbol.declarations.length > 0 ? getNodeModifiers(symbol.declarations[0]) @@ -4666,96 +4660,7 @@ module ts { function getNavigateToItems(searchValue: string, maxResultCount?: number): NavigateToItem[] { synchronizeHostData(); - // Split search value in terms array - var terms = searchValue.split(" "); - - // default NavigateTo approach: if search term contains only lower-case chars - use case-insensitive search, otherwise switch to case-sensitive version - var searchTerms = map(terms, t => ({ caseSensitive: hasAnyUpperCaseCharacter(t), term: t })); - - var rawItems: { name: string; fileName: string; matchKind: MatchKind; declaration: Declaration }[] = []; - - // Search the declarations in all files and output matched NavigateToItem into array of NavigateToItem[] - forEach(program.getSourceFiles(), sourceFile => { - cancellationToken.throwIfCancellationRequested(); - - var fileName = sourceFile.fileName; - var declarations = sourceFile.getNamedDeclarations(); - for (var i = 0, n = declarations.length; i < n; i++) { - var declaration = declarations[i]; - // TODO(jfreeman): Skip this declaration if it has a computed name - var name = (declaration.name).text; - var matchKind = getMatchKind(searchTerms, name); - if (matchKind !== MatchKind.none) { - rawItems.push({ name, fileName, matchKind, declaration }); - } - } - }); - - rawItems.sort((i1, i2) => i1.matchKind - i2.matchKind); - if (maxResultCount !== undefined) { - rawItems = rawItems.slice(0, maxResultCount); - } - - var items = map(rawItems, i => { - var declaration = i.declaration; - var container = getContainerNode(declaration); - return { - name: i.name, - kind: getNodeKind(declaration), - kindModifiers: getNodeModifiers(declaration), - matchKind: MatchKind[i.matchKind], - fileName: i.fileName, - textSpan: createTextSpanFromBounds(declaration.getStart(), declaration.getEnd()), - // TODO(jfreeman): What should be the containerName when the container has a computed name? - containerName: container && container.name ? (container.name).text : "", - containerKind: container && container.name ? getNodeKind(container) : "" - }; - }); - - return items; - - function hasAnyUpperCaseCharacter(s: string): boolean { - for (var i = 0, n = s.length; i < n; i++) { - var c = s.charCodeAt(i); - if ((CharacterCodes.A <= c && c <= CharacterCodes.Z) || - (c >= CharacterCodes.maxAsciiCharacter && s.charAt(i).toLocaleLowerCase() !== s.charAt(i))) { - return true; - } - } - - return false; - } - - function getMatchKind(searchTerms: { caseSensitive: boolean; term: string }[], name: string): MatchKind { - var matchKind = MatchKind.none; - - if (name) { - for (var j = 0, n = searchTerms.length; j < n; j++) { - var searchTerm = searchTerms[j]; - var nameToSearch = searchTerm.caseSensitive ? name : name.toLocaleLowerCase(); - // in case of case-insensitive search searchTerm.term will already be lower-cased - var index = nameToSearch.indexOf(searchTerm.term); - if (index < 0) { - // Didn't match. - return MatchKind.none; - } - - var termKind = MatchKind.substring; - if (index === 0) { - // here we know that match occur at the beginning of the string. - // if search term and declName has the same length - we have an exact match, otherwise declName have longer length and this will be prefix match - termKind = name.length === searchTerm.term.length ? MatchKind.exact : MatchKind.prefix; - } - - // Update our match kind if we don't have one, or if this match is better. - if (matchKind === MatchKind.none || termKind < matchKind) { - matchKind = termKind; - } - } - } - - return matchKind; - } + return ts.NavigateTo.getNavigateToItems(program, cancellationToken, searchValue, maxResultCount); } function containErrors(diagnostics: Diagnostic[]): boolean {