Skip to content

Commit 4f37555

Browse files
authored
Fix crash in decorator metadata calculation when serializing template literal type nodes (microsoft#39481)
1 parent 62b4377 commit 4f37555

File tree

5 files changed

+68
-0
lines changed

5 files changed

+68
-0
lines changed

src/compiler/transformers/ts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,7 @@ namespace ts {
15311531
case SyntaxKind.LiteralType:
15321532
switch ((<LiteralTypeNode>node).literal.kind) {
15331533
case SyntaxKind.StringLiteral:
1534+
case SyntaxKind.NoSubstitutionTemplateLiteral:
15341535
return factory.createIdentifier("String");
15351536

15361537
case SyntaxKind.PrefixUnaryExpression:
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//// [templateLiteralsAndDecoratorMetadata.ts]
2+
declare var format: any;
3+
export class Greeter {
4+
@format("Hello, %s")
5+
greeting: `boss` | `employee` = `employee`; //template literals on this line cause the issue
6+
}
7+
8+
//// [templateLiteralsAndDecoratorMetadata.js]
9+
"use strict";
10+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
11+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
12+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
13+
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;
14+
return c > 3 && r && Object.defineProperty(target, key, r), r;
15+
};
16+
var __metadata = (this && this.__metadata) || function (k, v) {
17+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
18+
};
19+
exports.__esModule = true;
20+
exports.Greeter = void 0;
21+
var Greeter = /** @class */ (function () {
22+
function Greeter() {
23+
this.greeting = "employee"; //template literals on this line cause the issue
24+
}
25+
__decorate([
26+
format("Hello, %s"),
27+
__metadata("design:type", String)
28+
], Greeter.prototype, "greeting");
29+
return Greeter;
30+
}());
31+
exports.Greeter = Greeter;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/compiler/templateLiteralsAndDecoratorMetadata.ts ===
2+
declare var format: any;
3+
>format : Symbol(format, Decl(templateLiteralsAndDecoratorMetadata.ts, 0, 11))
4+
5+
export class Greeter {
6+
>Greeter : Symbol(Greeter, Decl(templateLiteralsAndDecoratorMetadata.ts, 0, 24))
7+
8+
@format("Hello, %s")
9+
>format : Symbol(format, Decl(templateLiteralsAndDecoratorMetadata.ts, 0, 11))
10+
11+
greeting: `boss` | `employee` = `employee`; //template literals on this line cause the issue
12+
>greeting : Symbol(Greeter.greeting, Decl(templateLiteralsAndDecoratorMetadata.ts, 1, 22))
13+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
=== tests/cases/compiler/templateLiteralsAndDecoratorMetadata.ts ===
2+
declare var format: any;
3+
>format : any
4+
5+
export class Greeter {
6+
>Greeter : Greeter
7+
8+
@format("Hello, %s")
9+
>format("Hello, %s") : any
10+
>format : any
11+
>"Hello, %s" : "Hello, %s"
12+
13+
greeting: `boss` | `employee` = `employee`; //template literals on this line cause the issue
14+
>greeting : "boss" | "employee"
15+
>`employee` : "employee"
16+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// @experimentalDecorators: true
2+
// @emitDecoratorMetadata: true
3+
declare var format: any;
4+
export class Greeter {
5+
@format("Hello, %s")
6+
greeting: `boss` | `employee` = `employee`; //template literals on this line cause the issue
7+
}

0 commit comments

Comments
 (0)