From af228b598b982f6e24bf2e7daf02e553827a5817 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 3 Dec 2014 11:43:32 -0800 Subject: [PATCH] Don't emit __extends if one is already in scope --- src/compiler/checker.ts | 2 +- tests/baselines/reference/__extends.js | 20 ++++++++++++ tests/baselines/reference/__extends.types | 11 +++++++ tests/baselines/reference/__extendsAmbient.js | 19 +++++++++++ .../reference/__extendsAmbient.types | 11 +++++++ tests/baselines/reference/__extendsModule.js | 32 +++++++++++++++++++ .../baselines/reference/__extendsModule.types | 16 ++++++++++ .../baselines/reference/__extendsMultifile.js | 25 +++++++++++++++ .../reference/__extendsMultifile.types | 13 ++++++++ tests/cases/compiler/__extends.ts | 4 +++ tests/cases/compiler/__extendsAmbient.ts | 4 +++ tests/cases/compiler/__extendsModule.ts | 7 ++++ tests/cases/compiler/__extendsMultifile.ts | 7 ++++ 13 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/__extends.js create mode 100644 tests/baselines/reference/__extends.types create mode 100644 tests/baselines/reference/__extendsAmbient.js create mode 100644 tests/baselines/reference/__extendsAmbient.types create mode 100644 tests/baselines/reference/__extendsModule.js create mode 100644 tests/baselines/reference/__extendsModule.types create mode 100644 tests/baselines/reference/__extendsMultifile.js create mode 100644 tests/baselines/reference/__extendsMultifile.types create mode 100644 tests/cases/compiler/__extends.ts create mode 100644 tests/cases/compiler/__extendsAmbient.ts create mode 100644 tests/cases/compiler/__extendsModule.ts create mode 100644 tests/cases/compiler/__extendsMultifile.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0e428b4a4e06a..d93f8ff17cfa2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7886,7 +7886,7 @@ module ts { var staticType = getTypeOfSymbol(symbol); var baseTypeNode = getClassBaseTypeNode(node); if (baseTypeNode) { - emitExtends = emitExtends || !isInAmbientContext(node); + emitExtends = emitExtends || !(isInAmbientContext(node) || resolveName(node.parent, escapeIdentifier('__extends'), SymbolFlags.Value, undefined, undefined)); checkTypeReference(baseTypeNode); } if (type.baseTypes.length) { diff --git a/tests/baselines/reference/__extends.js b/tests/baselines/reference/__extends.js new file mode 100644 index 0000000000000..bf91f95142ffb --- /dev/null +++ b/tests/baselines/reference/__extends.js @@ -0,0 +1,20 @@ +//// [__extends.ts] +var __extends; + +class A { } +class B extends A { } + +//// [__extends.js] +var __extends; +var A = (function () { + function A() { + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.apply(this, arguments); + } + return B; +})(A); diff --git a/tests/baselines/reference/__extends.types b/tests/baselines/reference/__extends.types new file mode 100644 index 0000000000000..82ec1ff84118c --- /dev/null +++ b/tests/baselines/reference/__extends.types @@ -0,0 +1,11 @@ +=== tests/cases/compiler/__extends.ts === +var __extends; +>__extends : any + +class A { } +>A : A + +class B extends A { } +>B : B +>A : A + diff --git a/tests/baselines/reference/__extendsAmbient.js b/tests/baselines/reference/__extendsAmbient.js new file mode 100644 index 0000000000000..8de8c45bd2903 --- /dev/null +++ b/tests/baselines/reference/__extendsAmbient.js @@ -0,0 +1,19 @@ +//// [__extendsAmbient.ts] +declare var __extends; + +class A { } +class B extends A { } + +//// [__extendsAmbient.js] +var A = (function () { + function A() { + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.apply(this, arguments); + } + return B; +})(A); diff --git a/tests/baselines/reference/__extendsAmbient.types b/tests/baselines/reference/__extendsAmbient.types new file mode 100644 index 0000000000000..73fbb4355ebd7 --- /dev/null +++ b/tests/baselines/reference/__extendsAmbient.types @@ -0,0 +1,11 @@ +=== tests/cases/compiler/__extendsAmbient.ts === +declare var __extends; +>__extends : any + +class A { } +>A : A + +class B extends A { } +>B : B +>A : A + diff --git a/tests/baselines/reference/__extendsModule.js b/tests/baselines/reference/__extendsModule.js new file mode 100644 index 0000000000000..dc25a4244c607 --- /dev/null +++ b/tests/baselines/reference/__extendsModule.js @@ -0,0 +1,32 @@ +//// [__extendsModule.ts] + +module M { + export var __extends; +} + +class A { } +class B extends A { } + +//// [__extendsModule.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var M; +(function (M) { + M.__extends; +})(M || (M = {})); +var A = (function () { + function A() { + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.apply(this, arguments); + } + return B; +})(A); diff --git a/tests/baselines/reference/__extendsModule.types b/tests/baselines/reference/__extendsModule.types new file mode 100644 index 0000000000000..76a3236d6ab3d --- /dev/null +++ b/tests/baselines/reference/__extendsModule.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/__extendsModule.ts === + +module M { +>M : typeof M + + export var __extends; +>__extends : any +} + +class A { } +>A : A + +class B extends A { } +>B : B +>A : A + diff --git a/tests/baselines/reference/__extendsMultifile.js b/tests/baselines/reference/__extendsMultifile.js new file mode 100644 index 0000000000000..e89076c60ce3f --- /dev/null +++ b/tests/baselines/reference/__extendsMultifile.js @@ -0,0 +1,25 @@ +//// [tests/cases/compiler/__extendsMultifile.ts] //// + +//// [foo.ts] + +declare var __extends; + +//// [bar.ts] +class A { } +class B extends A { } + + +//// [foo.js] +//// [bar.js] +var A = (function () { + function A() { + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.apply(this, arguments); + } + return B; +})(A); diff --git a/tests/baselines/reference/__extendsMultifile.types b/tests/baselines/reference/__extendsMultifile.types new file mode 100644 index 0000000000000..ee48d0e280a56 --- /dev/null +++ b/tests/baselines/reference/__extendsMultifile.types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/foo.ts === + +declare var __extends; +>__extends : any + +=== tests/cases/compiler/bar.ts === +class A { } +>A : A + +class B extends A { } +>B : B +>A : A + diff --git a/tests/cases/compiler/__extends.ts b/tests/cases/compiler/__extends.ts new file mode 100644 index 0000000000000..820a4ba27286c --- /dev/null +++ b/tests/cases/compiler/__extends.ts @@ -0,0 +1,4 @@ +var __extends; + +class A { } +class B extends A { } \ No newline at end of file diff --git a/tests/cases/compiler/__extendsAmbient.ts b/tests/cases/compiler/__extendsAmbient.ts new file mode 100644 index 0000000000000..9774c111521d4 --- /dev/null +++ b/tests/cases/compiler/__extendsAmbient.ts @@ -0,0 +1,4 @@ +declare var __extends; + +class A { } +class B extends A { } \ No newline at end of file diff --git a/tests/cases/compiler/__extendsModule.ts b/tests/cases/compiler/__extendsModule.ts new file mode 100644 index 0000000000000..c5d46a91af65c --- /dev/null +++ b/tests/cases/compiler/__extendsModule.ts @@ -0,0 +1,7 @@ + +module M { + export var __extends; +} + +class A { } +class B extends A { } \ No newline at end of file diff --git a/tests/cases/compiler/__extendsMultifile.ts b/tests/cases/compiler/__extendsMultifile.ts new file mode 100644 index 0000000000000..d05d5ed7e0307 --- /dev/null +++ b/tests/cases/compiler/__extendsMultifile.ts @@ -0,0 +1,7 @@ + +// @Filename: foo.ts +declare var __extends; + +// @Filename: bar.ts +class A { } +class B extends A { }