From 403df45678ee4077e8bb54f5945e48c578e6c07f Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Fri, 6 Jul 2018 15:18:03 -0700 Subject: [PATCH] Rework entity name decorator metadata fallback emit to not throw at runtime (#25421) * Rework entity name decorator metadata fallback emit to not throw at runtime * Remove trailing whitespace --- src/compiler/transformers/ts.ts | 83 ++++++++++--------- ...oratorMetadataNoLibIsolatedModulesTypes.js | 2 +- ...dataWithImportDeclarationNameCollision4.js | 2 +- ...dataWithImportDeclarationNameCollision7.js | 2 +- ...adataUnresolvedTypeObjectInEmit.errors.txt | 22 +++++ ...ratorMetadataUnresolvedTypeObjectInEmit.js | 43 ++++++++++ ...MetadataUnresolvedTypeObjectInEmit.symbols | 29 +++++++ ...orMetadataUnresolvedTypeObjectInEmit.types | 31 +++++++ .../amd/main.js | 2 +- .../node/main.js | 2 +- .../amd/main.js | 2 +- .../node/main.js | 2 +- .../emitDecoratorMetadataSystemJS/amd/main.js | 2 +- .../node/main.js | 2 +- .../amd/main.js | 2 +- .../node/main.js | 2 +- .../amd/main.js | 2 +- .../node/main.js | 2 +- ...ata when transpile with CommonJS option.js | 2 +- ...spile with CommonJS option.oldTranspile.js | 2 +- ...adata when transpile with System option.js | 2 +- ...anspile with System option.oldTranspile.js | 2 +- ... with emit decorators and emit metadata.js | 2 +- ...corators and emit metadata.oldTranspile.js | 2 +- ...ratorMetadataUnresolvedTypeObjectInEmit.ts | 15 ++++ 25 files changed, 202 insertions(+), 59 deletions(-) create mode 100644 tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.errors.txt create mode 100644 tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.js create mode 100644 tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.symbols create mode 100644 tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.types create mode 100644 tests/cases/compiler/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.ts diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 4a696c6d130..2bebe6c7101 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -1982,18 +1982,16 @@ namespace ts { const kind = resolver.getTypeReferenceSerializationKind(node.typeName, currentNameScope || currentLexicalScope); switch (kind) { case TypeReferenceSerializationKind.Unknown: - const serialized = serializeEntityNameAsExpression(node.typeName, /*useFallback*/ true); + const serialized = serializeEntityNameAsExpressionFallback(node.typeName); const temp = createTempVariable(hoistVariableDeclaration); - return createLogicalOr( - createLogicalAnd( - createTypeCheck(createAssignment(temp, serialized), "function"), - temp - ), + return createConditional( + createTypeCheck(createAssignment(temp, serialized), "function"), + temp, createIdentifier("Object") ); case TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue: - return serializeEntityNameAsExpression(node.typeName, /*useFallback*/ false); + return serializeEntityNameAsExpression(node.typeName); case TypeReferenceSerializationKind.VoidNullableOrNeverType: return createVoidZero(); @@ -2028,14 +2026,46 @@ namespace ts { } } + function createCheckedValue(left: Expression, right: Expression) { + return createLogicalAnd( + createStrictInequality(createTypeOf(left), createLiteral("undefined")), + right + ); + } + + /** + * Serializes an entity name which may not exist at runtime, but whose access shouldn't throw + * + * @param node The entity name to serialize. + */ + function serializeEntityNameAsExpressionFallback(node: EntityName): BinaryExpression { + if (node.kind === SyntaxKind.Identifier) { + // A -> typeof A !== undefined && A + const copied = serializeEntityNameAsExpression(node); + return createCheckedValue(copied, copied); + } + if (node.left.kind === SyntaxKind.Identifier) { + // A.B -> typeof A !== undefined && A.B + return createCheckedValue(serializeEntityNameAsExpression(node.left), serializeEntityNameAsExpression(node)); + } + // A.B.C -> typeof A !== undefined && (_a = A.B) !== void 0 && _a.C + const left = serializeEntityNameAsExpressionFallback(node.left); + const temp = createTempVariable(hoistVariableDeclaration); + return createLogicalAnd( + createLogicalAnd( + left.left, + createStrictInequality(createAssignment(temp, left.right), createVoidZero()) + ), + createPropertyAccess(temp, node.right) + ); + } + /** * Serializes an entity name as an expression for decorator type metadata. * * @param node The entity name to serialize. - * @param useFallback A value indicating whether to use logical operators to test for the - * entity name at runtime. */ - function serializeEntityNameAsExpression(node: EntityName, useFallback: boolean): SerializedEntityNameAsExpression { + function serializeEntityNameAsExpression(node: EntityName): SerializedEntityNameAsExpression { switch (node.kind) { case SyntaxKind.Identifier: // Create a clone of the name with a new parent, and treat it as if it were @@ -2044,20 +2074,11 @@ namespace ts { name.flags &= ~NodeFlags.Synthesized; name.original = undefined; name.parent = getParseTreeNode(currentLexicalScope); // ensure the parent is set to a parse tree node. - if (useFallback) { - return createLogicalAnd( - createStrictInequality( - createTypeOf(name), - createLiteral("undefined") - ), - name - ); - } return name; case SyntaxKind.QualifiedName: - return serializeQualifiedNameAsExpression(node, useFallback); + return serializeQualifiedNameAsExpression(node); } } @@ -2068,26 +2089,8 @@ namespace ts { * @param useFallback A value indicating whether to use logical operators to test for the * qualified name at runtime. */ - function serializeQualifiedNameAsExpression(node: QualifiedName, useFallback: boolean): PropertyAccessExpression { - let left: SerializedEntityNameAsExpression; - if (node.left.kind === SyntaxKind.Identifier) { - left = serializeEntityNameAsExpression(node.left, useFallback); - } - else if (useFallback) { - const temp = createTempVariable(hoistVariableDeclaration); - left = createLogicalAnd( - createAssignment( - temp, - serializeEntityNameAsExpression(node.left, /*useFallback*/ true) - ), - temp - ); - } - else { - left = serializeEntityNameAsExpression(node.left, /*useFallback*/ false); - } - - return createPropertyAccess(left, node.right); + function serializeQualifiedNameAsExpression(node: QualifiedName): SerializedEntityNameAsExpression { + return createPropertyAccess(serializeEntityNameAsExpression(node.left), node.right); } /** diff --git a/tests/baselines/reference/decoratorMetadataNoLibIsolatedModulesTypes.js b/tests/baselines/reference/decoratorMetadataNoLibIsolatedModulesTypes.js index d3c8f420666..00d0a831c93 100644 --- a/tests/baselines/reference/decoratorMetadataNoLibIsolatedModulesTypes.js +++ b/tests/baselines/reference/decoratorMetadataNoLibIsolatedModulesTypes.js @@ -23,7 +23,7 @@ var B = /** @class */ (function () { var _a; __decorate([ Decorate, - __metadata("design:type", typeof (_a = typeof Map !== "undefined" && Map) === "function" && _a || Object) + __metadata("design:type", typeof (_a = typeof Map !== "undefined" && Map) === "function" ? _a : Object) ], B.prototype, "member"); return B; }()); diff --git a/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision4.js b/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision4.js index a20ff821148..7d2bf07862d 100644 --- a/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision4.js +++ b/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision4.js @@ -49,7 +49,7 @@ var MyClass = /** @class */ (function () { var _a; MyClass = __decorate([ someDecorator, - __metadata("design:paramtypes", [typeof (_a = (typeof db_1.default !== "undefined" && db_1.default).db) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof db_1.default !== "undefined" && db_1.default.db) === "function" ? _a : Object]) ], MyClass); return MyClass; }()); diff --git a/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision7.js b/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision7.js index 7acbff2beb7..b58f48d0341 100644 --- a/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision7.js +++ b/tests/baselines/reference/decoratorMetadataWithImportDeclarationNameCollision7.js @@ -49,7 +49,7 @@ var MyClass = /** @class */ (function () { var _a; MyClass = __decorate([ someDecorator, - __metadata("design:paramtypes", [typeof (_a = (typeof db_1.default !== "undefined" && db_1.default).db) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof db_1.default !== "undefined" && db_1.default.db) === "function" ? _a : Object]) ], MyClass); return MyClass; }()); diff --git a/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.errors.txt b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.errors.txt new file mode 100644 index 00000000000..556885b52a3 --- /dev/null +++ b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.errors.txt @@ -0,0 +1,22 @@ +tests/cases/compiler/usage.ts(2,8): error TS2304: Cannot find name 'decorate'. +tests/cases/compiler/usage.ts(2,31): error TS2694: Namespace 'A.B.C.D' has no exported member 'E'. + + +==== tests/cases/compiler/types.d.ts (0 errors) ==== + declare namespace A { + export namespace B { + export namespace C { + export namespace D { + } + } + } + } +==== tests/cases/compiler/usage.ts (2 errors) ==== + class Foo { + f(@decorate user: A.B.C.D.E): void {} + ~~~~~~~~ +!!! error TS2304: Cannot find name 'decorate'. + ~ +!!! error TS2694: Namespace 'A.B.C.D' has no exported member 'E'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.js b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.js new file mode 100644 index 00000000000..062cc483570 --- /dev/null +++ b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.js @@ -0,0 +1,43 @@ +//// [tests/cases/compiler/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.ts] //// + +//// [types.d.ts] +declare namespace A { + export namespace B { + export namespace C { + export namespace D { + } + } + } +} +//// [usage.ts] +class Foo { + f(@decorate user: A.B.C.D.E): void {} +} + + +//// [usage.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 __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var Foo = /** @class */ (function () { + function Foo() { + } + Foo.prototype.f = function (user) { }; + var _a, _b, _c, _d; + __decorate([ + __param(0, decorate), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof A !== "undefined" && (_a = A.B) !== void 0 && (_b = _a.C) !== void 0 && (_c = _b.D) !== void 0 && _c.E) === "function" ? _d : Object]), + __metadata("design:returntype", void 0) + ], Foo.prototype, "f"); + return Foo; +}()); diff --git a/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.symbols b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.symbols new file mode 100644 index 00000000000..0076ba5871c --- /dev/null +++ b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.symbols @@ -0,0 +1,29 @@ +=== tests/cases/compiler/types.d.ts === +declare namespace A { +>A : Symbol(A, Decl(types.d.ts, 0, 0)) + + export namespace B { +>B : Symbol(B, Decl(types.d.ts, 0, 21)) + + export namespace C { +>C : Symbol(C, Decl(types.d.ts, 1, 24)) + + export namespace D { +>D : Symbol(D, Decl(types.d.ts, 2, 28)) + } + } + } +} +=== tests/cases/compiler/usage.ts === +class Foo { +>Foo : Symbol(Foo, Decl(usage.ts, 0, 0)) + + f(@decorate user: A.B.C.D.E): void {} +>f : Symbol(Foo.f, Decl(usage.ts, 0, 11)) +>user : Symbol(user, Decl(usage.ts, 1, 6)) +>A : Symbol(A, Decl(types.d.ts, 0, 0)) +>B : Symbol(A.B, Decl(types.d.ts, 0, 21)) +>C : Symbol(A.B.C, Decl(types.d.ts, 1, 24)) +>D : Symbol(A.B.C.D, Decl(types.d.ts, 2, 28)) +} + diff --git a/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.types b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.types new file mode 100644 index 00000000000..22be4d18018 --- /dev/null +++ b/tests/baselines/reference/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.types @@ -0,0 +1,31 @@ +=== tests/cases/compiler/types.d.ts === +declare namespace A { +>A : any + + export namespace B { +>B : any + + export namespace C { +>C : any + + export namespace D { +>D : any + } + } + } +} +=== tests/cases/compiler/usage.ts === +class Foo { +>Foo : Foo + + f(@decorate user: A.B.C.D.E): void {} +>f : (user: any) => void +>decorate : any +>user : any +>A : any +>B : any +>C : any +>D : any +>E : No type information available! +} + diff --git a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/amd/main.js b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/amd/main.js index 74c4caf097d..f6fd3b354c4 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/amd/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/amd/main.js @@ -17,7 +17,7 @@ define(["require", "exports", "angular2/core"], function (require, exports, ng) var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/node/main.js b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/node/main.js index 53af24a916f..3ca4c09edf8 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/node/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModules/node/main.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/amd/main.js b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/amd/main.js index 74c4caf097d..f6fd3b354c4 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/amd/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/amd/main.js @@ -17,7 +17,7 @@ define(["require", "exports", "angular2/core"], function (require, exports, ng) var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/node/main.js b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/node/main.js index 53af24a916f..3ca4c09edf8 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/node/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataCommonJSISolatedModulesNoResolve/node/main.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/amd/main.js b/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/amd/main.js index 74c4caf097d..f6fd3b354c4 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/amd/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/amd/main.js @@ -17,7 +17,7 @@ define(["require", "exports", "angular2/core"], function (require, exports, ng) var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/node/main.js b/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/node/main.js index 53af24a916f..3ca4c09edf8 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/node/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataSystemJS/node/main.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/amd/main.js b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/amd/main.js index 74c4caf097d..f6fd3b354c4 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/amd/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/amd/main.js @@ -17,7 +17,7 @@ define(["require", "exports", "angular2/core"], function (require, exports, ng) var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/node/main.js b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/node/main.js index 53af24a916f..3ca4c09edf8 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/node/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModules/node/main.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/amd/main.js b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/amd/main.js index 74c4caf097d..f6fd3b354c4 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/amd/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/amd/main.js @@ -17,7 +17,7 @@ define(["require", "exports", "angular2/core"], function (require, exports, ng) var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/node/main.js b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/node/main.js index 53af24a916f..3ca4c09edf8 100644 --- a/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/node/main.js +++ b/tests/baselines/reference/project/emitDecoratorMetadataSystemJSISolatedModulesNoResolve/node/main.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ foo, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.js b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.js index 140ee34db4f..cbdee94b59f 100644 --- a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.js +++ b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ fooexport, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.oldTranspile.js b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.oldTranspile.js index 140ee34db4f..cbdee94b59f 100644 --- a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.oldTranspile.js +++ b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with CommonJS option.oldTranspile.js @@ -17,7 +17,7 @@ var MyClass1 = /** @class */ (function () { var _a; MyClass1 = __decorate([ fooexport, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.js b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.js index ff5c79971ca..bfe85714bf6 100644 --- a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.js +++ b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.js @@ -25,7 +25,7 @@ System.register(["angular2/core"], function (exports_1, context_1) { var _a; MyClass1 = __decorate([ fooexport, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.oldTranspile.js b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.oldTranspile.js index ff5c79971ca..bfe85714bf6 100644 --- a/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.oldTranspile.js +++ b/tests/baselines/reference/transpile/Correctly serialize metadata when transpile with System option.oldTranspile.js @@ -25,7 +25,7 @@ System.register(["angular2/core"], function (exports_1, context_1) { var _a; MyClass1 = __decorate([ fooexport, - __metadata("design:paramtypes", [typeof (_a = (typeof ng !== "undefined" && ng).ElementRef) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof ng !== "undefined" && ng.ElementRef) === "function" ? _a : Object]) ], MyClass1); return MyClass1; }()); diff --git a/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.js b/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.js index 388bdf1a66c..1d12cb158a5 100644 --- a/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.js +++ b/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.js @@ -12,7 +12,7 @@ var MyClass = /** @class */ (function () { var _a; MyClass = __decorate([ someDecorator, - __metadata("design:paramtypes", [typeof (_a = typeof db_1.db !== "undefined" && db_1.db) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof db_1.db !== "undefined" && db_1.db) === "function" ? _a : Object]) ], MyClass); return MyClass; }()); diff --git a/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.oldTranspile.js b/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.oldTranspile.js index 388bdf1a66c..1d12cb158a5 100644 --- a/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.oldTranspile.js +++ b/tests/baselines/reference/transpile/Transpile with emit decorators and emit metadata.oldTranspile.js @@ -12,7 +12,7 @@ var MyClass = /** @class */ (function () { var _a; MyClass = __decorate([ someDecorator, - __metadata("design:paramtypes", [typeof (_a = typeof db_1.db !== "undefined" && db_1.db) === "function" && _a || Object]) + __metadata("design:paramtypes", [typeof (_a = typeof db_1.db !== "undefined" && db_1.db) === "function" ? _a : Object]) ], MyClass); return MyClass; }()); diff --git a/tests/cases/compiler/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.ts b/tests/cases/compiler/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.ts new file mode 100644 index 00000000000..8133a3b3ab1 --- /dev/null +++ b/tests/cases/compiler/experimentalDecoratorMetadataUnresolvedTypeObjectInEmit.ts @@ -0,0 +1,15 @@ +// @experimentalDecorators: true +// @emitDecoratorMetadata: true +// @filename: types.d.ts +declare namespace A { + export namespace B { + export namespace C { + export namespace D { + } + } + } +} +// @filename: usage.ts +class Foo { + f(@decorate user: A.B.C.D.E): void {} +}