From a0683276d183f85a1302d52a3a2a6bbc60663d25 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sun, 11 Oct 2015 21:57:17 -0700 Subject: [PATCH] check functions in class expressions --- src/compiler/checker.ts | 1 + .../reference/functionsInClassExpressions.js | 25 +++++++++++++++ .../functionsInClassExpressions.symbols | 27 ++++++++++++++++ .../functionsInClassExpressions.types | 32 +++++++++++++++++++ .../compiler/functionsInClassExpressions.ts | 10 ++++++ 5 files changed, 95 insertions(+) create mode 100644 tests/baselines/reference/functionsInClassExpressions.js create mode 100644 tests/baselines/reference/functionsInClassExpressions.symbols create mode 100644 tests/baselines/reference/functionsInClassExpressions.types create mode 100644 tests/cases/compiler/functionsInClassExpressions.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d4ce6655a21..b65761eb80b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13897,6 +13897,7 @@ namespace ts { break; case SyntaxKind.ClassExpression: forEach((node).members, checkSourceElement); + forEachChild(node, checkFunctionAndClassExpressionBodies); break; case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: diff --git a/tests/baselines/reference/functionsInClassExpressions.js b/tests/baselines/reference/functionsInClassExpressions.js new file mode 100644 index 00000000000..debd8138831 --- /dev/null +++ b/tests/baselines/reference/functionsInClassExpressions.js @@ -0,0 +1,25 @@ +//// [functionsInClassExpressions.ts] +let Foo = class { + constructor() { + this.bar++; + } + bar = 0; + inc = () => { + this.bar++; + } + m() { return this.bar; } +} + +//// [functionsInClassExpressions.js] +var Foo = (function () { + function class_1() { + var _this = this; + this.bar = 0; + this.inc = function () { + _this.bar++; + }; + this.bar++; + } + class_1.prototype.m = function () { return this.bar; }; + return class_1; +})(); diff --git a/tests/baselines/reference/functionsInClassExpressions.symbols b/tests/baselines/reference/functionsInClassExpressions.symbols new file mode 100644 index 00000000000..a1da3a3175c --- /dev/null +++ b/tests/baselines/reference/functionsInClassExpressions.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/functionsInClassExpressions.ts === +let Foo = class { +>Foo : Symbol(Foo, Decl(functionsInClassExpressions.ts, 0, 3)) + + constructor() { + this.bar++; +>this.bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) +>this : Symbol((Anonymous class), Decl(functionsInClassExpressions.ts, 0, 9)) +>bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) + } + bar = 0; +>bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) + + inc = () => { +>inc : Symbol((Anonymous class).inc, Decl(functionsInClassExpressions.ts, 4, 12)) + + this.bar++; +>this.bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) +>this : Symbol((Anonymous class), Decl(functionsInClassExpressions.ts, 0, 9)) +>bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) + } + m() { return this.bar; } +>m : Symbol((Anonymous class).m, Decl(functionsInClassExpressions.ts, 7, 5)) +>this.bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) +>this : Symbol((Anonymous class), Decl(functionsInClassExpressions.ts, 0, 9)) +>bar : Symbol((Anonymous class).bar, Decl(functionsInClassExpressions.ts, 3, 5)) +} diff --git a/tests/baselines/reference/functionsInClassExpressions.types b/tests/baselines/reference/functionsInClassExpressions.types new file mode 100644 index 00000000000..ee4b5696cc1 --- /dev/null +++ b/tests/baselines/reference/functionsInClassExpressions.types @@ -0,0 +1,32 @@ +=== tests/cases/compiler/functionsInClassExpressions.ts === +let Foo = class { +>Foo : typeof (Anonymous class) +>class { constructor() { this.bar++; } bar = 0; inc = () => { this.bar++; } m() { return this.bar; }} : typeof (Anonymous class) + + constructor() { + this.bar++; +>this.bar++ : number +>this.bar : number +>this : this +>bar : number + } + bar = 0; +>bar : number +>0 : number + + inc = () => { +>inc : () => void +>() => { this.bar++; } : () => void + + this.bar++; +>this.bar++ : number +>this.bar : number +>this : this +>bar : number + } + m() { return this.bar; } +>m : () => number +>this.bar : number +>this : this +>bar : number +} diff --git a/tests/cases/compiler/functionsInClassExpressions.ts b/tests/cases/compiler/functionsInClassExpressions.ts new file mode 100644 index 00000000000..72e0bafd582 --- /dev/null +++ b/tests/cases/compiler/functionsInClassExpressions.ts @@ -0,0 +1,10 @@ +let Foo = class { + constructor() { + this.bar++; + } + bar = 0; + inc = () => { + this.bar++; + } + m() { return this.bar; } +} \ No newline at end of file