From c93f454549ab564f2ec0f00c0e71e428abae7cd4 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Fri, 20 Nov 2015 08:30:50 -0800 Subject: [PATCH 1/8] Implement #5173 Give more helpful error when trying to set default values on an interface --- src/compiler/diagnosticMessages.json | 6 +++++- src/compiler/parser.ts | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 5b70c70ae4b..03934153e4f 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -783,6 +783,10 @@ "category": "Error", "code": 1245 }, + "An interface property cannot have an initializer.": { + "category": "Error", + "code": 1246 + }, "'with' statements are not allowed in an async function block.": { "category": "Error", @@ -2418,7 +2422,7 @@ "Not all code paths return a value.": { "category": "Error", "code": 7030 - }, + }, "You cannot rename this element.": { "category": "Error", "code": 8000 diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 212594f7b7d..36819061696 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2230,6 +2230,7 @@ namespace ts { const fullStart = scanner.getStartPos(); const name = parsePropertyName(); const questionToken = parseOptionalToken(SyntaxKind.QuestionToken); + const modifiers = parseModifiers(); if (token === SyntaxKind.OpenParenToken || token === SyntaxKind.LessThanToken) { const method = createNode(SyntaxKind.MethodSignature, fullStart); @@ -2247,6 +2248,26 @@ namespace ts { property.name = name; property.questionToken = questionToken; property.type = parseTypeAnnotation(); + + // Although interfaces cannot not have initializers, we attempt to parse an initializer + // so we can report that an interface cannot have an initializer. + // + // For instance properties specifically, since they are evaluated inside the constructor, + // we do *not * want to parse yield expressions, so we specifically turn the yield context + // off. The grammar would look something like this: + // + // MemberVariableDeclaration[Yield]: + // AccessibilityModifier_opt PropertyName TypeAnnotation_opt Initialiser_opt[In]; + // AccessibilityModifier_opt static_opt PropertyName TypeAnnotation_opt Initialiser_opt[In, ?Yield]; + // + // The checker may still error in the static case to explicitly disallow the yield expression. + const initializer = modifiers && modifiers.flags & NodeFlags.Static + ? allowInAnd(parseNonParameterInitializer) + : doOutsideOfContext(ParserContextFlags.Yield | ParserContextFlags.DisallowIn, parseNonParameterInitializer); + if (initializer !== undefined) { + parseErrorAtCurrentToken(Diagnostics.An_interface_property_cannot_have_an_initializer); + } + parseTypeMemberSemicolon(); return finishNode(property); } From 40a2a2584d9dd0638e02b560009ae0744c882192 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Fri, 20 Nov 2015 13:31:17 -0800 Subject: [PATCH 2/8] Fix object type literal regression --- src/compiler/diagnosticMessages.json | 2 +- src/compiler/parser.ts | 18 ++---------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 03934153e4f..e5a5e832b4d 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -783,7 +783,7 @@ "category": "Error", "code": 1245 }, - "An interface property cannot have an initializer.": { + "An object type property cannot have an initializer.": { "category": "Error", "code": 1246 }, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 36819061696..0fb29f9d127 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2230,7 +2230,6 @@ namespace ts { const fullStart = scanner.getStartPos(); const name = parsePropertyName(); const questionToken = parseOptionalToken(SyntaxKind.QuestionToken); - const modifiers = parseModifiers(); if (token === SyntaxKind.OpenParenToken || token === SyntaxKind.LessThanToken) { const method = createNode(SyntaxKind.MethodSignature, fullStart); @@ -2251,21 +2250,8 @@ namespace ts { // Although interfaces cannot not have initializers, we attempt to parse an initializer // so we can report that an interface cannot have an initializer. - // - // For instance properties specifically, since they are evaluated inside the constructor, - // we do *not * want to parse yield expressions, so we specifically turn the yield context - // off. The grammar would look something like this: - // - // MemberVariableDeclaration[Yield]: - // AccessibilityModifier_opt PropertyName TypeAnnotation_opt Initialiser_opt[In]; - // AccessibilityModifier_opt static_opt PropertyName TypeAnnotation_opt Initialiser_opt[In, ?Yield]; - // - // The checker may still error in the static case to explicitly disallow the yield expression. - const initializer = modifiers && modifiers.flags & NodeFlags.Static - ? allowInAnd(parseNonParameterInitializer) - : doOutsideOfContext(ParserContextFlags.Yield | ParserContextFlags.DisallowIn, parseNonParameterInitializer); - if (initializer !== undefined) { - parseErrorAtCurrentToken(Diagnostics.An_interface_property_cannot_have_an_initializer); + if (token === SyntaxKind.EqualsToken && lookAhead(() => parseNonParameterInitializer()) !== undefined) { + parseErrorAtCurrentToken(Diagnostics.An_object_type_property_cannot_have_an_initializer); } parseTypeMemberSemicolon(); From 5b3d299412a0f133269adeacbb5e84972c74e37d Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Fri, 20 Nov 2015 13:33:58 -0800 Subject: [PATCH 3/8] Clarify comment --- src/compiler/parser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 0fb29f9d127..4a7ed6a7756 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2248,8 +2248,8 @@ namespace ts { property.questionToken = questionToken; property.type = parseTypeAnnotation(); - // Although interfaces cannot not have initializers, we attempt to parse an initializer - // so we can report that an interface cannot have an initializer. + // Although object type properties cannot not have initializers, we attempt to parse an initializer + // so we can report that an object type property cannot have an initializer. if (token === SyntaxKind.EqualsToken && lookAhead(() => parseNonParameterInitializer()) !== undefined) { parseErrorAtCurrentToken(Diagnostics.An_object_type_property_cannot_have_an_initializer); } From 068d10c6bb48d39ef78b2e0dc2119d04fc06eb0b Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Wed, 25 Nov 2015 14:31:46 -0800 Subject: [PATCH 4/8] Add tests for #5173 --- .../errorOnInitializerInObjectType.errors.txt | 17 +++++++++++++++++ .../reference/errorOnInitializerInObjectType.js | 12 ++++++++++++ .../compiler/errorOnInitializerInObjectType.ts | 7 +++++++ 3 files changed, 36 insertions(+) create mode 100644 tests/baselines/reference/errorOnInitializerInObjectType.errors.txt create mode 100644 tests/baselines/reference/errorOnInitializerInObjectType.js create mode 100644 tests/cases/compiler/errorOnInitializerInObjectType.ts diff --git a/tests/baselines/reference/errorOnInitializerInObjectType.errors.txt b/tests/baselines/reference/errorOnInitializerInObjectType.errors.txt new file mode 100644 index 00000000000..70cefb0e914 --- /dev/null +++ b/tests/baselines/reference/errorOnInitializerInObjectType.errors.txt @@ -0,0 +1,17 @@ +tests/cases/compiler/errorOnInitializerInObjectType.ts(2,17): error TS1246: An object type property cannot have an initializer. +tests/cases/compiler/errorOnInitializerInObjectType.ts(6,17): error TS1246: An object type property cannot have an initializer. + + +==== tests/cases/compiler/errorOnInitializerInObjectType.ts (2 errors) ==== + interface Foo { + bar: number = 5; + ~ +!!! error TS1246: An object type property cannot have an initializer. + } + + var Foo: { + bar: number = 5; + ~ +!!! error TS1246: An object type property cannot have an initializer. + }; + \ No newline at end of file diff --git a/tests/baselines/reference/errorOnInitializerInObjectType.js b/tests/baselines/reference/errorOnInitializerInObjectType.js new file mode 100644 index 00000000000..59e813fc75c --- /dev/null +++ b/tests/baselines/reference/errorOnInitializerInObjectType.js @@ -0,0 +1,12 @@ +//// [errorOnInitializerInObjectType.ts] +interface Foo { + bar: number = 5; +} + +var Foo: { + bar: number = 5; +}; + + +//// [errorOnInitializerInObjectType.js] +var Foo; diff --git a/tests/cases/compiler/errorOnInitializerInObjectType.ts b/tests/cases/compiler/errorOnInitializerInObjectType.ts new file mode 100644 index 00000000000..8c536d1a712 --- /dev/null +++ b/tests/cases/compiler/errorOnInitializerInObjectType.ts @@ -0,0 +1,7 @@ +interface Foo { + bar: number = 5; +} + +var Foo: { + bar: number = 5; +}; From 6c755c90db635d698449ad104a274b6eabaabd90 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Fri, 27 Nov 2015 18:11:28 -0800 Subject: [PATCH 5/8] Report property errors in the checker instead of the parser --- src/compiler/checker.ts | 30 ++++++++++++++++--- src/compiler/diagnosticMessages.json | 6 +++- src/compiler/parser.ts | 7 ++--- src/compiler/types.ts | 1 + ...nInitializerInInterfaceProperty.errors.txt | 10 +++++++ .../errorOnInitializerInInterfaceProperty.js | 7 +++++ .../errorOnInitializerInObjectType.errors.txt | 17 ----------- .../errorOnInitializerInObjectType.js | 12 -------- ...izerInObjectTypeLiteralProperty.errors.txt | 17 +++++++++++ ...nInitializerInObjectTypeLiteralProperty.js | 13 ++++++++ .../objectTypeLiteralSyntax2.errors.txt | 10 +++++-- .../errorOnInitializerInInterfaceProperty.ts | 3 ++ ...InitializerInObjectTypeLiteralProperty.ts} | 14 ++++----- 13 files changed, 100 insertions(+), 47 deletions(-) create mode 100644 tests/baselines/reference/errorOnInitializerInInterfaceProperty.errors.txt create mode 100644 tests/baselines/reference/errorOnInitializerInInterfaceProperty.js delete mode 100644 tests/baselines/reference/errorOnInitializerInObjectType.errors.txt delete mode 100644 tests/baselines/reference/errorOnInitializerInObjectType.js create mode 100644 tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt create mode 100644 tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.js create mode 100644 tests/cases/compiler/errorOnInitializerInInterfaceProperty.ts rename tests/cases/compiler/{errorOnInitializerInObjectType.ts => errorOnInitializerInObjectTypeLiteralProperty.ts} (73%) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1b6b31f9586..0b889a42045 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -532,7 +532,7 @@ namespace ts { } // Because of module/namespace merging, a module's exports are in scope, - // yet we never want to treat an export specifier as putting a member in scope. + // yet we never want to treat an export specifier as putting a member in scope. // Therefore, if the name we find is purely an export specifier, it is not actually considered in scope. // Two things to note about this: // 1. We have to check this without calling getSymbol. The problem with calling getSymbol @@ -11398,7 +11398,7 @@ namespace ts { // we can get here in two cases // 1. mixed static and instance class members // 2. something with the same name was defined before the set of overloads that prevents them from merging - // here we'll report error only for the first case since for second we should already report error in binder + // here we'll report error only for the first case since for second we should already report error in binder if (reportError) { const diagnostic = node.flags & NodeFlags.Static ? Diagnostics.Function_overload_must_be_static : Diagnostics.Function_overload_must_not_be_static; error(errorNode, diagnostic); @@ -12065,8 +12065,8 @@ namespace ts { const symbol = getSymbolOfNode(node); const localSymbol = node.localSymbol || symbol; - // Since the javascript won't do semantic analysis like typescript, - // if the javascript file comes before the typescript file and both contain same name functions, + // Since the javascript won't do semantic analysis like typescript, + // if the javascript file comes before the typescript file and both contain same name functions, // checkFunctionOrConstructorSymbol wouldn't be called if we didnt ignore javascript function. const firstDeclaration = forEach(localSymbol.declarations, // Get first non javascript function declaration @@ -15735,6 +15735,16 @@ namespace ts { } } + // Report an error if an interface property has an initializer + if (node.members) { + const members = >node.members; + for (const element of members) { + if (element.initializer) { + return grammarErrorOnFirstToken(element.initializer, Diagnostics.An_interface_property_cannot_have_an_initializer); + } + } + } + return false; } @@ -16085,6 +16095,18 @@ namespace ts { } } + if (node.type) { + const typeLiteralNode = node.type; + if (typeLiteralNode.members) { + for (const element of typeLiteralNode.members) { + const propertySignature = element; + if (propertySignature.initializer) { + return grammarErrorOnNode(propertySignature.initializer, Diagnostics.An_object_type_literal_property_cannot_have_an_initializer); + } + } + } + } + const checkLetConstNames = languageVersion >= ScriptTarget.ES6 && (isLet(node) || isConst(node)); // 1. LexicalDeclaration : LetOrConst BindingList ; diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e5a5e832b4d..e3ae2a6706c 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -783,10 +783,14 @@ "category": "Error", "code": 1245 }, - "An object type property cannot have an initializer.": { + "An interface property cannot have an initializer.": { "category": "Error", "code": 1246 }, + "An object type literal property cannot have an initializer.": { + "category": "Error", + "code": 1247 + }, "'with' statements are not allowed in an async function block.": { "category": "Error", diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 4a7ed6a7756..2c68ea66bab 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2249,10 +2249,9 @@ namespace ts { property.type = parseTypeAnnotation(); // Although object type properties cannot not have initializers, we attempt to parse an initializer - // so we can report that an object type property cannot have an initializer. - if (token === SyntaxKind.EqualsToken && lookAhead(() => parseNonParameterInitializer()) !== undefined) { - parseErrorAtCurrentToken(Diagnostics.An_object_type_property_cannot_have_an_initializer); - } + // so we can report in the checker that an interface property or object type literal property cannot + // have an initializer. + property.initializer = parseNonParameterInitializer(); parseTypeMemberSemicolon(); return finishNode(property); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9edd7654b6b..58250c9dc5e 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -586,6 +586,7 @@ namespace ts { name: PropertyName; // Declared property name questionToken?: Node; // Present on optional property type?: TypeNode; // Optional type annotation + initializer?: Expression; // Optional initializer } // @kind(SyntaxKind.PropertyDeclaration) diff --git a/tests/baselines/reference/errorOnInitializerInInterfaceProperty.errors.txt b/tests/baselines/reference/errorOnInitializerInInterfaceProperty.errors.txt new file mode 100644 index 00000000000..03e899e7c2d --- /dev/null +++ b/tests/baselines/reference/errorOnInitializerInInterfaceProperty.errors.txt @@ -0,0 +1,10 @@ +tests/cases/compiler/errorOnInitializerInInterfaceProperty.ts(2,19): error TS1246: An interface property cannot have an initializer. + + +==== tests/cases/compiler/errorOnInitializerInInterfaceProperty.ts (1 errors) ==== + interface Foo { + bar: number = 5; + ~ +!!! error TS1246: An interface property cannot have an initializer. + } + \ No newline at end of file diff --git a/tests/baselines/reference/errorOnInitializerInInterfaceProperty.js b/tests/baselines/reference/errorOnInitializerInInterfaceProperty.js new file mode 100644 index 00000000000..c40a3cfb43d --- /dev/null +++ b/tests/baselines/reference/errorOnInitializerInInterfaceProperty.js @@ -0,0 +1,7 @@ +//// [errorOnInitializerInInterfaceProperty.ts] +interface Foo { + bar: number = 5; +} + + +//// [errorOnInitializerInInterfaceProperty.js] diff --git a/tests/baselines/reference/errorOnInitializerInObjectType.errors.txt b/tests/baselines/reference/errorOnInitializerInObjectType.errors.txt deleted file mode 100644 index 70cefb0e914..00000000000 --- a/tests/baselines/reference/errorOnInitializerInObjectType.errors.txt +++ /dev/null @@ -1,17 +0,0 @@ -tests/cases/compiler/errorOnInitializerInObjectType.ts(2,17): error TS1246: An object type property cannot have an initializer. -tests/cases/compiler/errorOnInitializerInObjectType.ts(6,17): error TS1246: An object type property cannot have an initializer. - - -==== tests/cases/compiler/errorOnInitializerInObjectType.ts (2 errors) ==== - interface Foo { - bar: number = 5; - ~ -!!! error TS1246: An object type property cannot have an initializer. - } - - var Foo: { - bar: number = 5; - ~ -!!! error TS1246: An object type property cannot have an initializer. - }; - \ No newline at end of file diff --git a/tests/baselines/reference/errorOnInitializerInObjectType.js b/tests/baselines/reference/errorOnInitializerInObjectType.js deleted file mode 100644 index 59e813fc75c..00000000000 --- a/tests/baselines/reference/errorOnInitializerInObjectType.js +++ /dev/null @@ -1,12 +0,0 @@ -//// [errorOnInitializerInObjectType.ts] -interface Foo { - bar: number = 5; -} - -var Foo: { - bar: number = 5; -}; - - -//// [errorOnInitializerInObjectType.js] -var Foo; diff --git a/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt b/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt new file mode 100644 index 00000000000..d79cced45c7 --- /dev/null +++ b/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt @@ -0,0 +1,17 @@ +tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts(2,19): error TS1247: An object type literal property cannot have an initializer. +tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts(6,19): error TS1247: An object type literal property cannot have an initializer. + + +==== tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts (2 errors) ==== + var Foo: { + bar: number = 5; + ~ +!!! error TS1247: An object type literal property cannot have an initializer. + }; + + let Bar: { + bar: number = 5; + ~ +!!! error TS1247: An object type literal property cannot have an initializer. + }; + \ No newline at end of file diff --git a/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.js b/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.js new file mode 100644 index 00000000000..4dcc0b7dce6 --- /dev/null +++ b/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.js @@ -0,0 +1,13 @@ +//// [errorOnInitializerInObjectTypeLiteralProperty.ts] +var Foo: { + bar: number = 5; +}; + +let Bar: { + bar: number = 5; +}; + + +//// [errorOnInitializerInObjectTypeLiteralProperty.js] +var Foo; +var Bar; diff --git a/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt b/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt index 00442f4f87d..e4f923def58 100644 --- a/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt +++ b/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt @@ -1,7 +1,9 @@ -tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,22): error TS1005: ';' expected. +tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,22): error TS1005: '=' expected. +tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,22): error TS2304: Cannot find name 'bar'. +tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,25): error TS1005: ';' expected. -==== tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts (1 errors) ==== +==== tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts (3 errors) ==== var x: { foo: string, bar: string @@ -15,4 +17,8 @@ tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,2 var z: { foo: string bar: string } ~~~ +!!! error TS1005: '=' expected. + ~~~ +!!! error TS2304: Cannot find name 'bar'. + ~ !!! error TS1005: ';' expected. \ No newline at end of file diff --git a/tests/cases/compiler/errorOnInitializerInInterfaceProperty.ts b/tests/cases/compiler/errorOnInitializerInInterfaceProperty.ts new file mode 100644 index 00000000000..ac600103e72 --- /dev/null +++ b/tests/cases/compiler/errorOnInitializerInInterfaceProperty.ts @@ -0,0 +1,3 @@ +interface Foo { + bar: number = 5; +} diff --git a/tests/cases/compiler/errorOnInitializerInObjectType.ts b/tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts similarity index 73% rename from tests/cases/compiler/errorOnInitializerInObjectType.ts rename to tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts index 8c536d1a712..a02f8b0f709 100644 --- a/tests/cases/compiler/errorOnInitializerInObjectType.ts +++ b/tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts @@ -1,7 +1,7 @@ -interface Foo { - bar: number = 5; -} - -var Foo: { - bar: number = 5; -}; +var Foo: { + bar: number = 5; +}; + +let Bar: { + bar: number = 5; +}; From d9d67d90038270694696d4d77305582ffe64bae9 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Fri, 27 Nov 2015 22:17:35 -0800 Subject: [PATCH 6/8] Move initializer checks into checkGrammarProperty --- src/compiler/checker.ts | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0b889a42045..50189b03406 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15735,16 +15735,6 @@ namespace ts { } } - // Report an error if an interface property has an initializer - if (node.members) { - const members = >node.members; - for (const element of members) { - if (element.initializer) { - return grammarErrorOnFirstToken(element.initializer, Diagnostics.An_interface_property_cannot_have_an_initializer); - } - } - } - return false; } @@ -16095,18 +16085,6 @@ namespace ts { } } - if (node.type) { - const typeLiteralNode = node.type; - if (typeLiteralNode.members) { - for (const element of typeLiteralNode.members) { - const propertySignature = element; - if (propertySignature.initializer) { - return grammarErrorOnNode(propertySignature.initializer, Diagnostics.An_object_type_literal_property_cannot_have_an_initializer); - } - } - } - } - const checkLetConstNames = languageVersion >= ScriptTarget.ES6 && (isLet(node) || isConst(node)); // 1. LexicalDeclaration : LetOrConst BindingList ; @@ -16249,11 +16227,17 @@ namespace ts { if (checkGrammarForNonSymbolComputedProperty(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol)) { return true; } + if (node.initializer) { + return grammarErrorOnNode(node.initializer, Diagnostics.An_interface_property_cannot_have_an_initializer); + } } 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)) { return true; } + if (node.initializer) { + return grammarErrorOnNode(node.initializer, Diagnostics.An_object_type_literal_property_cannot_have_an_initializer); + } } if (isInAmbientContext(node) && node.initializer) { From e363c7582ba3f9d4871b0c57d9f25b9c7050cd22 Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Sat, 28 Nov 2015 17:24:34 -0800 Subject: [PATCH 7/8] Revert baseline changes to the objectTypeLiteralSyntax2 test --- src/compiler/parser.ts | 10 ++++++---- .../reference/objectTypeLiteralSyntax2.errors.txt | 10 ++-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 2c68ea66bab..f5261b62aec 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2248,10 +2248,12 @@ namespace ts { property.questionToken = questionToken; property.type = parseTypeAnnotation(); - // Although object type properties cannot not have initializers, we attempt to parse an initializer - // so we can report in the checker that an interface property or object type literal property cannot - // have an initializer. - property.initializer = parseNonParameterInitializer(); + if (token === SyntaxKind.EqualsToken) { + // Although object type properties cannot not have initializers, we attempt + // to parse an initializer so we can report in the checker that an interface + // property or object type literal property cannot have an initializer. + property.initializer = parseNonParameterInitializer(); + } parseTypeMemberSemicolon(); return finishNode(property); diff --git a/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt b/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt index e4f923def58..00442f4f87d 100644 --- a/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt +++ b/tests/baselines/reference/objectTypeLiteralSyntax2.errors.txt @@ -1,9 +1,7 @@ -tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,22): error TS1005: '=' expected. -tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,22): error TS2304: Cannot find name 'bar'. -tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,25): error TS1005: ';' expected. +tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,22): error TS1005: ';' expected. -==== tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts (3 errors) ==== +==== tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts (1 errors) ==== var x: { foo: string, bar: string @@ -17,8 +15,4 @@ tests/cases/conformance/types/objectTypeLiteral/objectTypeLiteralSyntax2.ts(12,2 var z: { foo: string bar: string } ~~~ -!!! error TS1005: '=' expected. - ~~~ -!!! error TS2304: Cannot find name 'bar'. - ~ !!! error TS1005: ';' expected. \ No newline at end of file From 144d24c2cb727b21ddcdfac0489a57a852cb2cae Mon Sep 17 00:00:00 2001 From: Nathan Yee Date: Mon, 30 Nov 2015 21:52:50 -0800 Subject: [PATCH 8/8] Change "object type literal" to "type literal" --- src/compiler/checker.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- src/compiler/parser.ts | 4 ++-- ...rorOnInitializerInObjectTypeLiteralProperty.errors.txt | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 50189b03406..6445f8b13de 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -16236,7 +16236,7 @@ namespace ts { return true; } if (node.initializer) { - return grammarErrorOnNode(node.initializer, Diagnostics.An_object_type_literal_property_cannot_have_an_initializer); + return grammarErrorOnNode(node.initializer, Diagnostics.A_type_literal_property_cannot_have_an_initializer); } } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e3ae2a6706c..cd2fa769536 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -787,7 +787,7 @@ "category": "Error", "code": 1246 }, - "An object type literal property cannot have an initializer.": { + "A type literal property cannot have an initializer.": { "category": "Error", "code": 1247 }, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index f5261b62aec..f4ac49a6b6f 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2249,9 +2249,9 @@ namespace ts { property.type = parseTypeAnnotation(); if (token === SyntaxKind.EqualsToken) { - // Although object type properties cannot not have initializers, we attempt + // Although type literal properties cannot not have initializers, we attempt // to parse an initializer so we can report in the checker that an interface - // property or object type literal property cannot have an initializer. + // property or type literal property cannot have an initializer. property.initializer = parseNonParameterInitializer(); } diff --git a/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt b/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt index d79cced45c7..f6d10b92b2d 100644 --- a/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt +++ b/tests/baselines/reference/errorOnInitializerInObjectTypeLiteralProperty.errors.txt @@ -1,17 +1,17 @@ -tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts(2,19): error TS1247: An object type literal property cannot have an initializer. -tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts(6,19): error TS1247: An object type literal property cannot have an initializer. +tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts(2,19): error TS1247: A type literal property cannot have an initializer. +tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts(6,19): error TS1247: A type literal property cannot have an initializer. ==== tests/cases/compiler/errorOnInitializerInObjectTypeLiteralProperty.ts (2 errors) ==== var Foo: { bar: number = 5; ~ -!!! error TS1247: An object type literal property cannot have an initializer. +!!! error TS1247: A type literal property cannot have an initializer. }; let Bar: { bar: number = 5; ~ -!!! error TS1247: An object type literal property cannot have an initializer. +!!! error TS1247: A type literal property cannot have an initializer. }; \ No newline at end of file