Merge pull request #5996 from RyanCavanaugh/fix5994

Disallow modifiers in object literal property assignment
This commit is contained in:
Ryan Cavanaugh 2015-12-08 17:40:50 -08:00
commit 383cbf06c4
8 changed files with 71 additions and 3 deletions

View file

@ -15999,6 +15999,13 @@ namespace ts {
return grammarErrorOnNode((<ShorthandPropertyAssignment>prop).equalsToken, Diagnostics.can_only_be_used_in_an_object_literal_property_inside_a_destructuring_assignment);
}
// Modifiers are never allowed on properties except for 'async' on a method declaration
forEach(prop.modifiers, mod => {
if (mod.kind !== SyntaxKind.AsyncKeyword || prop.kind !== SyntaxKind.MethodDeclaration) {
grammarErrorOnNode(mod, Diagnostics._0_modifier_cannot_be_used_here, getTextOfNode(mod));
}
});
// ECMA-262 11.1.5 Object Initialiser
// If previous is not undefined then throw a SyntaxError exception if any of the following conditions are true
// a.This production is contained in strict code and IsDataDescriptor(previous) is true and

View file

@ -3981,6 +3981,7 @@ namespace ts {
}
else {
const propertyAssignment = <PropertyAssignment>createNode(SyntaxKind.PropertyAssignment, fullStart);
propertyAssignment.modifiers = modifiers;
propertyAssignment.name = propertyName;
propertyAssignment.questionToken = questionToken;
parseExpected(SyntaxKind.ColonToken);

View file

@ -0,0 +1,24 @@
tests/cases/compiler/modifiersInObjectLiterals.ts(2,2): error TS1042: 'public' modifier cannot be used here.
tests/cases/compiler/modifiersInObjectLiterals.ts(3,2): error TS1042: 'private' modifier cannot be used here.
tests/cases/compiler/modifiersInObjectLiterals.ts(4,2): error TS1042: 'protected' modifier cannot be used here.
tests/cases/compiler/modifiersInObjectLiterals.ts(5,2): error TS1042: 'abstract' modifier cannot be used here.
==== tests/cases/compiler/modifiersInObjectLiterals.ts (4 errors) ====
let data = {
public foo: 'hey',
~~~~~~
!!! error TS1042: 'public' modifier cannot be used here.
private bar: 'nay',
~~~~~~~
!!! error TS1042: 'private' modifier cannot be used here.
protected baz: 'oh my',
~~~~~~~~~
!!! error TS1042: 'protected' modifier cannot be used here.
abstract noWay: 'yes'
~~~~~~~~
!!! error TS1042: 'abstract' modifier cannot be used here.
};
data.foo + data.bar + data.baz + data.noWay

View file

@ -0,0 +1,19 @@
//// [modifiersInObjectLiterals.ts]
let data = {
public foo: 'hey',
private bar: 'nay',
protected baz: 'oh my',
abstract noWay: 'yes'
};
data.foo + data.bar + data.baz + data.noWay
//// [modifiersInObjectLiterals.js]
var data = {
foo: 'hey',
bar: 'nay',
baz: 'oh my',
noWay: 'yes'
};
data.foo + data.bar + data.baz + data.noWay;

View file

@ -1,7 +1,10 @@
tests/cases/compiler/objectLiteralMemberWithModifiers1.ts(1,11): error TS1042: 'public' modifier cannot be used here.
tests/cases/compiler/objectLiteralMemberWithModifiers1.ts(1,11): error TS1184: Modifiers cannot appear here.
==== tests/cases/compiler/objectLiteralMemberWithModifiers1.ts (1 errors) ====
==== tests/cases/compiler/objectLiteralMemberWithModifiers1.ts (2 errors) ====
var v = { public foo() { } }
~~~~~~
!!! error TS1042: 'public' modifier cannot be used here.
~~~~~~
!!! error TS1184: Modifiers cannot appear here.

View file

@ -1,9 +1,12 @@
tests/cases/compiler/objectLiteralMemberWithModifiers2.ts(1,11): error TS1042: 'public' modifier cannot be used here.
tests/cases/compiler/objectLiteralMemberWithModifiers2.ts(1,22): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher.
tests/cases/compiler/objectLiteralMemberWithModifiers2.ts(1,22): error TS2378: A 'get' accessor must return a value.
==== tests/cases/compiler/objectLiteralMemberWithModifiers2.ts (2 errors) ====
==== tests/cases/compiler/objectLiteralMemberWithModifiers2.ts (3 errors) ====
var v = { public get foo() { } }
~~~~~~
!!! error TS1042: 'public' modifier cannot be used here.
~~~
!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher.
~~~

View file

@ -1,9 +1,12 @@
tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts(2,3): error TS1042: 'public' modifier cannot be used here.
tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts(2,14): error TS2378: A 'get' accessor must return a value.
==== tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts (1 errors) ====
==== tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts (2 errors) ====
var v = {
public get foo() { }
~~~~~~
!!! error TS1042: 'public' modifier cannot be used here.
~~~
!!! error TS2378: A 'get' accessor must return a value.
};

View file

@ -0,0 +1,8 @@
let data = {
public foo: 'hey',
private bar: 'nay',
protected baz: 'oh my',
abstract noWay: 'yes'
};
data.foo + data.bar + data.baz + data.noWay