From 8aaa05990fbd7cd90b1c953b26a190e4d013d4cd Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 9 Jan 2019 13:25:22 -0800 Subject: [PATCH] Fix crash --- src/compiler/transformers/ts.ts | 1 + ...decoratorWithNegativeLiteralTypeNoCrash.js | 28 +++++++++++++++++++ ...atorWithNegativeLiteralTypeNoCrash.symbols | 15 ++++++++++ ...oratorWithNegativeLiteralTypeNoCrash.types | 19 +++++++++++++ ...decoratorWithNegativeLiteralTypeNoCrash.ts | 8 ++++++ 5 files changed, 71 insertions(+) create mode 100644 tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.js create mode 100644 tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.symbols create mode 100644 tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.types create mode 100644 tests/cases/compiler/decoratorWithNegativeLiteralTypeNoCrash.ts diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 700c0c8af2579..a22c6df8d0671 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -1898,6 +1898,7 @@ namespace ts { case SyntaxKind.StringLiteral: return createIdentifier("String"); + case SyntaxKind.PrefixUnaryExpression: case SyntaxKind.NumericLiteral: return createIdentifier("Number"); diff --git a/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.js b/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.js new file mode 100644 index 0000000000000..57b548cdf99d9 --- /dev/null +++ b/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.js @@ -0,0 +1,28 @@ +//// [decoratorWithNegativeLiteralTypeNoCrash.ts] +class A { + @decorator + public field1: -1 = -1; +} +function decorator(target: any, field: any) {} + +//// [decoratorWithNegativeLiteralTypeNoCrash.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); +}; +var A = /** @class */ (function () { + function A() { + this.field1 = -1; + } + __decorate([ + decorator, + __metadata("design:type", Number) + ], A.prototype, "field1", void 0); + return A; +}()); +function decorator(target, field) { } diff --git a/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.symbols b/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.symbols new file mode 100644 index 0000000000000..e89854249a013 --- /dev/null +++ b/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.symbols @@ -0,0 +1,15 @@ +=== tests/cases/compiler/decoratorWithNegativeLiteralTypeNoCrash.ts === +class A { +>A : Symbol(A, Decl(decoratorWithNegativeLiteralTypeNoCrash.ts, 0, 0)) + + @decorator +>decorator : Symbol(decorator, Decl(decoratorWithNegativeLiteralTypeNoCrash.ts, 3, 1)) + + public field1: -1 = -1; +>field1 : Symbol(A.field1, Decl(decoratorWithNegativeLiteralTypeNoCrash.ts, 0, 9)) +} +function decorator(target: any, field: any) {} +>decorator : Symbol(decorator, Decl(decoratorWithNegativeLiteralTypeNoCrash.ts, 3, 1)) +>target : Symbol(target, Decl(decoratorWithNegativeLiteralTypeNoCrash.ts, 4, 19)) +>field : Symbol(field, Decl(decoratorWithNegativeLiteralTypeNoCrash.ts, 4, 31)) + diff --git a/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.types b/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.types new file mode 100644 index 0000000000000..45f4ff0345181 --- /dev/null +++ b/tests/baselines/reference/decoratorWithNegativeLiteralTypeNoCrash.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/decoratorWithNegativeLiteralTypeNoCrash.ts === +class A { +>A : A + + @decorator +>decorator : (target: any, field: any) => void + + public field1: -1 = -1; +>field1 : -1 +>-1 : -1 +>1 : 1 +>-1 : -1 +>1 : 1 +} +function decorator(target: any, field: any) {} +>decorator : (target: any, field: any) => void +>target : any +>field : any + diff --git a/tests/cases/compiler/decoratorWithNegativeLiteralTypeNoCrash.ts b/tests/cases/compiler/decoratorWithNegativeLiteralTypeNoCrash.ts new file mode 100644 index 0000000000000..720b68a7c1655 --- /dev/null +++ b/tests/cases/compiler/decoratorWithNegativeLiteralTypeNoCrash.ts @@ -0,0 +1,8 @@ +// @target: es5 +// @experimentalDecorators: true +// @emitDecoratorMetadata: true +class A { + @decorator + public field1: -1 = -1; +} +function decorator(target: any, field: any) {} \ No newline at end of file