From 4cb867bee8b6ee10b6c66820e884ffbee7b05ae1 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 24 Oct 2019 13:04:13 -0700 Subject: [PATCH] Fix regression in mixin emit by removing unneeded line of code --- src/compiler/checker.ts | 2 - .../anonClassDeclarationEmitIsAnon.js | 50 +++++++++++++++++++ .../anonClassDeclarationEmitIsAnon.symbols | 24 +++++++++ .../anonClassDeclarationEmitIsAnon.types | 27 ++++++++++ .../anonClassDeclarationEmitIsAnon.ts | 14 ++++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/anonClassDeclarationEmitIsAnon.js create mode 100644 tests/baselines/reference/anonClassDeclarationEmitIsAnon.symbols create mode 100644 tests/baselines/reference/anonClassDeclarationEmitIsAnon.types create mode 100644 tests/cases/compiler/anonClassDeclarationEmitIsAnon.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ed3057895fa..85ee12637ee 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4087,8 +4087,6 @@ namespace ts { else if (context.flags & NodeBuilderFlags.WriteClassExpressionAsTypeLiteral && type.symbol.valueDeclaration && isClassLike(type.symbol.valueDeclaration) && - // Use `import` types for refs to other scopes, only anonymize something defined in the same scope - findAncestor(type.symbol.valueDeclaration, d => d === getSourceFileOfNode(context.enclosingDeclaration)) && !isValueSymbolAccessible(type.symbol, context.enclosingDeclaration) ) { return createAnonymousTypeNode(type); diff --git a/tests/baselines/reference/anonClassDeclarationEmitIsAnon.js b/tests/baselines/reference/anonClassDeclarationEmitIsAnon.js new file mode 100644 index 00000000000..74e76125e99 --- /dev/null +++ b/tests/baselines/reference/anonClassDeclarationEmitIsAnon.js @@ -0,0 +1,50 @@ +//// [tests/cases/compiler/anonClassDeclarationEmitIsAnon.ts] //// + +//// [wrapClass.ts] +export function wrapClass(param: any) { + return class Wrapped { + foo() { + return param; + } + } +} + +//// [index.ts] +import { wrapClass } from "./wrapClass"; + +export default wrapClass(0); + +//// [wrapClass.js] +"use strict"; +exports.__esModule = true; +function wrapClass(param) { + return /** @class */ (function () { + function Wrapped() { + } + Wrapped.prototype.foo = function () { + return param; + }; + return Wrapped; + }()); +} +exports.wrapClass = wrapClass; +//// [index.js] +"use strict"; +exports.__esModule = true; +var wrapClass_1 = require("./wrapClass"); +exports["default"] = wrapClass_1.wrapClass(0); + + +//// [wrapClass.d.ts] +export declare function wrapClass(param: any): { + new (): { + foo(): any; + }; +}; +//// [index.d.ts] +declare const _default: { + new (): { + foo(): any; + }; +}; +export default _default; diff --git a/tests/baselines/reference/anonClassDeclarationEmitIsAnon.symbols b/tests/baselines/reference/anonClassDeclarationEmitIsAnon.symbols new file mode 100644 index 00000000000..9d18177ee40 --- /dev/null +++ b/tests/baselines/reference/anonClassDeclarationEmitIsAnon.symbols @@ -0,0 +1,24 @@ +=== tests/cases/compiler/wrapClass.ts === +export function wrapClass(param: any) { +>wrapClass : Symbol(wrapClass, Decl(wrapClass.ts, 0, 0)) +>param : Symbol(param, Decl(wrapClass.ts, 0, 26)) + + return class Wrapped { +>Wrapped : Symbol(Wrapped, Decl(wrapClass.ts, 1, 10)) + + foo() { +>foo : Symbol(Wrapped.foo, Decl(wrapClass.ts, 1, 26)) + + return param; +>param : Symbol(param, Decl(wrapClass.ts, 0, 26)) + } + } +} + +=== tests/cases/compiler/index.ts === +import { wrapClass } from "./wrapClass"; +>wrapClass : Symbol(wrapClass, Decl(index.ts, 0, 8)) + +export default wrapClass(0); +>wrapClass : Symbol(wrapClass, Decl(index.ts, 0, 8)) + diff --git a/tests/baselines/reference/anonClassDeclarationEmitIsAnon.types b/tests/baselines/reference/anonClassDeclarationEmitIsAnon.types new file mode 100644 index 00000000000..929e3ece921 --- /dev/null +++ b/tests/baselines/reference/anonClassDeclarationEmitIsAnon.types @@ -0,0 +1,27 @@ +=== tests/cases/compiler/wrapClass.ts === +export function wrapClass(param: any) { +>wrapClass : (param: any) => typeof Wrapped +>param : any + + return class Wrapped { +>class Wrapped { foo() { return param; } } : typeof Wrapped +>Wrapped : typeof Wrapped + + foo() { +>foo : () => any + + return param; +>param : any + } + } +} + +=== tests/cases/compiler/index.ts === +import { wrapClass } from "./wrapClass"; +>wrapClass : (param: any) => typeof Wrapped + +export default wrapClass(0); +>wrapClass(0) : typeof Wrapped +>wrapClass : (param: any) => typeof Wrapped +>0 : 0 + diff --git a/tests/cases/compiler/anonClassDeclarationEmitIsAnon.ts b/tests/cases/compiler/anonClassDeclarationEmitIsAnon.ts new file mode 100644 index 00000000000..4952ca4bb26 --- /dev/null +++ b/tests/cases/compiler/anonClassDeclarationEmitIsAnon.ts @@ -0,0 +1,14 @@ +// @declaration: true +// @filename: wrapClass.ts +export function wrapClass(param: any) { + return class Wrapped { + foo() { + return param; + } + } +} + +// @filename: index.ts +import { wrapClass } from "./wrapClass"; + +export default wrapClass(0); \ No newline at end of file