Merge pull request #5996 from RyanCavanaugh/fix5994
Disallow modifiers in object literal property assignment
This commit is contained in:
commit
383cbf06c4
8 changed files with 71 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
19
tests/baselines/reference/modifiersInObjectLiterals.js
Normal file
19
tests/baselines/reference/modifiersInObjectLiterals.js
Normal 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;
|
|
@ -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.
|
|
@ -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.
|
||||
~~~
|
||||
|
|
|
@ -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.
|
||||
};
|
8
tests/cases/compiler/modifiersInObjectLiterals.ts
Normal file
8
tests/cases/compiler/modifiersInObjectLiterals.ts
Normal 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
|
Loading…
Reference in a new issue