diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 0b508151064c4..135d73a04b63e 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1648,15 +1648,15 @@ namespace ts { } function parseSemicolonAfterPropertyName(name: PropertyName, type: TypeNode | undefined, initializer: Expression | undefined) { - switch (token()) { - case SyntaxKind.AtToken: - parseErrorAtCurrentToken(Diagnostics.Decorators_must_precede_the_name_and_all_keywords_of_property_declarations); - return; + if (token() === SyntaxKind.AtToken && !scanner.hasPrecedingLineBreak()) { + parseErrorAtCurrentToken(Diagnostics.Decorators_must_precede_the_name_and_all_keywords_of_property_declarations); + return; + } - case SyntaxKind.OpenParenToken: - parseErrorAtCurrentToken(Diagnostics.Cannot_start_a_function_call_in_a_type_annotation); - nextToken(); - return; + if (token() === SyntaxKind.OpenParenToken) { + parseErrorAtCurrentToken(Diagnostics.Cannot_start_a_function_call_in_a_type_annotation); + nextToken(); + return; } if (type && !canParseSemicolon()) { diff --git a/tests/baselines/reference/decoratorOnClassMethod14.js b/tests/baselines/reference/decoratorOnClassMethod14.js new file mode 100644 index 0000000000000..b01818b52eff8 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod14.js @@ -0,0 +1,38 @@ +//// [decoratorOnClassMethod14.ts] +declare var decorator: any; + +class Foo { + private prop = () => { + return 0; + } + @decorator + foo() { + return 0; + } +} + + +//// [decoratorOnClassMethod14.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Foo { + prop = () => { + return 0; + }; + foo() { + return 0; + } +} +__decorate([ + decorator, + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], Foo.prototype, "foo", null); diff --git a/tests/baselines/reference/decoratorOnClassMethod14.symbols b/tests/baselines/reference/decoratorOnClassMethod14.symbols new file mode 100644 index 0000000000000..3fb6ca0504fc2 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod14.symbols @@ -0,0 +1,22 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts === +declare var decorator: any; +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod14.ts, 0, 11)) + +class Foo { +>Foo : Symbol(Foo, Decl(decoratorOnClassMethod14.ts, 0, 27)) + + private prop = () => { +>prop : Symbol(Foo.prop, Decl(decoratorOnClassMethod14.ts, 2, 11)) + + return 0; + } + @decorator +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod14.ts, 0, 11)) + + foo() { +>foo : Symbol(Foo.foo, Decl(decoratorOnClassMethod14.ts, 5, 5)) + + return 0; + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod14.types b/tests/baselines/reference/decoratorOnClassMethod14.types new file mode 100644 index 0000000000000..dbc294c048307 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod14.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts === +declare var decorator: any; +>decorator : any + +class Foo { +>Foo : Foo + + private prop = () => { +>prop : () => number +>() => { return 0; } : () => number + + return 0; +>0 : 0 + } + @decorator +>decorator : any + + foo() { +>foo : () => number + + return 0; +>0 : 0 + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod15.js b/tests/baselines/reference/decoratorOnClassMethod15.js new file mode 100644 index 0000000000000..6ae6946dca93c --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod15.js @@ -0,0 +1,34 @@ +//// [decoratorOnClassMethod15.ts] +declare var decorator: any; + +class Foo { + private prop = 1 + @decorator + foo() { + return 0; + } +} + + +//// [decoratorOnClassMethod15.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Foo { + prop = 1; + foo() { + return 0; + } +} +__decorate([ + decorator, + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], Foo.prototype, "foo", null); diff --git a/tests/baselines/reference/decoratorOnClassMethod15.symbols b/tests/baselines/reference/decoratorOnClassMethod15.symbols new file mode 100644 index 0000000000000..ff5bee0e1afa5 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod15.symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts === +declare var decorator: any; +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod15.ts, 0, 11)) + +class Foo { +>Foo : Symbol(Foo, Decl(decoratorOnClassMethod15.ts, 0, 27)) + + private prop = 1 +>prop : Symbol(Foo.prop, Decl(decoratorOnClassMethod15.ts, 2, 11)) + + @decorator +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod15.ts, 0, 11)) + + foo() { +>foo : Symbol(Foo.foo, Decl(decoratorOnClassMethod15.ts, 3, 20)) + + return 0; + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod15.types b/tests/baselines/reference/decoratorOnClassMethod15.types new file mode 100644 index 0000000000000..6ce05fa080816 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod15.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts === +declare var decorator: any; +>decorator : any + +class Foo { +>Foo : Foo + + private prop = 1 +>prop : number +>1 : 1 + + @decorator +>decorator : any + + foo() { +>foo : () => number + + return 0; +>0 : 0 + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod16.js b/tests/baselines/reference/decoratorOnClassMethod16.js new file mode 100644 index 0000000000000..944aff5db3a38 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod16.js @@ -0,0 +1,34 @@ +//// [decoratorOnClassMethod16.ts] +declare var decorator: any; + +class Foo { + private prop + @decorator + foo() { + return 0; + } +} + + +//// [decoratorOnClassMethod16.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Foo { + prop; + foo() { + return 0; + } +} +__decorate([ + decorator, + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], Foo.prototype, "foo", null); diff --git a/tests/baselines/reference/decoratorOnClassMethod16.symbols b/tests/baselines/reference/decoratorOnClassMethod16.symbols new file mode 100644 index 0000000000000..bde6fb61f98c6 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod16.symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts === +declare var decorator: any; +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod16.ts, 0, 11)) + +class Foo { +>Foo : Symbol(Foo, Decl(decoratorOnClassMethod16.ts, 0, 27)) + + private prop +>prop : Symbol(Foo.prop, Decl(decoratorOnClassMethod16.ts, 2, 11)) + + @decorator +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod16.ts, 0, 11)) + + foo() { +>foo : Symbol(Foo.foo, Decl(decoratorOnClassMethod16.ts, 3, 16)) + + return 0; + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod16.types b/tests/baselines/reference/decoratorOnClassMethod16.types new file mode 100644 index 0000000000000..2bed0efa29711 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod16.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts === +declare var decorator: any; +>decorator : any + +class Foo { +>Foo : Foo + + private prop +>prop : any + + @decorator +>decorator : any + + foo() { +>foo : () => number + + return 0; +>0 : 0 + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod17.errors.txt b/tests/baselines/reference/decoratorOnClassMethod17.errors.txt new file mode 100644 index 0000000000000..5cf1f28601074 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod17.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts(4,18): error TS1436: Decorators must precede the name and all keywords of property declarations. + + +==== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts (1 errors) ==== + declare var decorator: any; + + class Foo { + private prop @decorator + ~ +!!! error TS1436: Decorators must precede the name and all keywords of property declarations. + foo() { + return 0; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/decoratorOnClassMethod17.js b/tests/baselines/reference/decoratorOnClassMethod17.js new file mode 100644 index 0000000000000..0217bace87928 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod17.js @@ -0,0 +1,33 @@ +//// [decoratorOnClassMethod17.ts] +declare var decorator: any; + +class Foo { + private prop @decorator + foo() { + return 0; + } +} + + +//// [decoratorOnClassMethod17.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Foo { + prop; + foo() { + return 0; + } +} +__decorate([ + decorator, + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], Foo.prototype, "foo", null); diff --git a/tests/baselines/reference/decoratorOnClassMethod17.symbols b/tests/baselines/reference/decoratorOnClassMethod17.symbols new file mode 100644 index 0000000000000..b2b4d125c63bd --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod17.symbols @@ -0,0 +1,18 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts === +declare var decorator: any; +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod17.ts, 0, 11)) + +class Foo { +>Foo : Symbol(Foo, Decl(decoratorOnClassMethod17.ts, 0, 27)) + + private prop @decorator +>prop : Symbol(Foo.prop, Decl(decoratorOnClassMethod17.ts, 2, 11)) +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod17.ts, 0, 11)) + + foo() { +>foo : Symbol(Foo.foo, Decl(decoratorOnClassMethod17.ts, 3, 16)) + + return 0; + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod17.types b/tests/baselines/reference/decoratorOnClassMethod17.types new file mode 100644 index 0000000000000..1a6ea05a92eb2 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod17.types @@ -0,0 +1,19 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts === +declare var decorator: any; +>decorator : any + +class Foo { +>Foo : Foo + + private prop @decorator +>prop : any +>decorator : any + + foo() { +>foo : () => number + + return 0; +>0 : 0 + } +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod18.js b/tests/baselines/reference/decoratorOnClassMethod18.js new file mode 100644 index 0000000000000..8ffe677bc5cc0 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod18.js @@ -0,0 +1,29 @@ +//// [decoratorOnClassMethod18.ts] +declare var decorator: any; + +class Foo { + p1 + + @decorator() + p2; +} + + +//// [decoratorOnClassMethod18.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +class Foo { + p1; + p2; +} +__decorate([ + decorator(), + __metadata("design:type", Object) +], Foo.prototype, "p2", void 0); diff --git a/tests/baselines/reference/decoratorOnClassMethod18.symbols b/tests/baselines/reference/decoratorOnClassMethod18.symbols new file mode 100644 index 0000000000000..f76e6dcc24394 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod18.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts === +declare var decorator: any; +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod18.ts, 0, 11)) + +class Foo { +>Foo : Symbol(Foo, Decl(decoratorOnClassMethod18.ts, 0, 27)) + + p1 +>p1 : Symbol(Foo.p1, Decl(decoratorOnClassMethod18.ts, 2, 11)) + + @decorator() +>decorator : Symbol(decorator, Decl(decoratorOnClassMethod18.ts, 0, 11)) + + p2; +>p2 : Symbol(Foo.p2, Decl(decoratorOnClassMethod18.ts, 3, 6)) +} + diff --git a/tests/baselines/reference/decoratorOnClassMethod18.types b/tests/baselines/reference/decoratorOnClassMethod18.types new file mode 100644 index 0000000000000..caed1b106317f --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod18.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts === +declare var decorator: any; +>decorator : any + +class Foo { +>Foo : Foo + + p1 +>p1 : any + + @decorator() +>decorator() : any +>decorator : any + + p2; +>p2 : any +} + diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts new file mode 100644 index 0000000000000..18f3df79bce0a --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts @@ -0,0 +1,14 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop = () => { + return 0; + } + @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts new file mode 100644 index 0000000000000..70f86b1bbe334 --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts @@ -0,0 +1,12 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop = 1 + @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts new file mode 100644 index 0000000000000..400d4fbe5a80a --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts @@ -0,0 +1,12 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop + @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts new file mode 100644 index 0000000000000..1aa25d7f3292c --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts @@ -0,0 +1,11 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + private prop @decorator + foo() { + return 0; + } +} diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts new file mode 100644 index 0000000000000..9417c44c5bac4 --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts @@ -0,0 +1,11 @@ +// @target: esnext +// @experimentaldecorators: true +// @emitdecoratormetadata: true +declare var decorator: any; + +class Foo { + p1 + + @decorator() + p2; +}