diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 081ed5b6e67bb..c2d47a3595576 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1262,8 +1262,9 @@ namespace ts { if (meaning & result.flags & SymbolFlags.Variable) { // expression inside parameter will lookup as normal variable scope when targeting es2015+ const functionLocation = location; - if (compilerOptions.target && compilerOptions.target >= ScriptTarget.ES2015 && isParameter(lastLocation) && - functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end) { + if (compilerOptions.target && compilerOptions.target >= ScriptTarget.ES2015 && + functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end && + ((findAncestor(originalLocation, isFunctionLikeDeclaration) !== functionLocation) || isParameter(lastLocation))) { useResult = false; } else if (result.flags & SymbolFlags.FunctionScopedVariable) { diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt b/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt index 73f4f27d08b48..cb2ffeb2957e2 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt @@ -4,9 +4,10 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(13 tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(21,18): error TS2372: Parameter 'a' cannot be referenced in its initializer. tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(25,22): error TS2372: Parameter 'async' cannot be referenced in its initializer. tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(29,15): error TS2448: Block-scoped variable 'foo' used before its declaration. +tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(40,25): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'bazzzz' declared after it. -==== tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts (6 errors) ==== +==== tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts (7 errors) ==== let foo: string = ""; function f1 (bar = foo) { // unexpected compiler error; works at runtime @@ -57,4 +58,12 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(29 } function f8(foo1: string, bar = foo1) { } + + let bazzzz = 2; + function f9(bar = () => bazzzz) { + ~~~~~~ +!!! error TS2373: Initializer of parameter 'bar' cannot reference identifier 'bazzzz' declared after it. + var bazzzz = 1; + return bar(); + } \ No newline at end of file diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.js b/tests/baselines/reference/parameterInitializersForwardReferencing1.js index bd2b62e42169f..5ea2be44f48bc 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.js +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.js @@ -36,6 +36,12 @@ class Foo { } function f8(foo1: string, bar = foo1) { } + +let bazzzz = 2; +function f9(bar = () => bazzzz) { + var bazzzz = 1; + return bar(); +} //// [parameterInitializersForwardReferencing1.js] @@ -86,3 +92,9 @@ var Foo = /** @class */ (function () { function f8(foo1, bar) { if (bar === void 0) { bar = foo1; } } +var bazzzz = 2; +function f9(bar) { + if (bar === void 0) { bar = function () { return bazzzz; }; } + var bazzzz = 1; + return bar(); +} diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols b/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols index 74b00fe04b82b..fe9468caa9e93 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols @@ -90,3 +90,18 @@ function f8(foo1: string, bar = foo1) { } >bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1.ts, 36, 25)) >foo1 : Symbol(foo1, Decl(parameterInitializersForwardReferencing1.ts, 36, 12)) +let bazzzz = 2; +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1.ts, 38, 3)) + +function f9(bar = () => bazzzz) { +>f9 : Symbol(f9, Decl(parameterInitializersForwardReferencing1.ts, 38, 15)) +>bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1.ts, 39, 12)) +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1.ts, 40, 7)) + + var bazzzz = 1; +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1.ts, 40, 7)) + + return bar(); +>bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1.ts, 39, 12)) +} + diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.types b/tests/baselines/reference/parameterInitializersForwardReferencing1.types index 2b80bfe87e06a..5dcf847297c7c 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.types +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.types @@ -98,3 +98,22 @@ function f8(foo1: string, bar = foo1) { } >bar : string >foo1 : string +let bazzzz = 2; +>bazzzz : number +>2 : 2 + +function f9(bar = () => bazzzz) { +>f9 : (bar?: () => number) => number +>bar : () => number +>() => bazzzz : () => number +>bazzzz : number + + var bazzzz = 1; +>bazzzz : number +>1 : 1 + + return bar(); +>bar() : number +>bar : () => number +} + diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.errors.txt b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.errors.txt index c65f327161ebe..213a611c6627f 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.errors.txt +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.errors.txt @@ -50,4 +50,10 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1_es6.t } function f8(foo1: string, bar = foo1) { } + + let bazzzz = 2; + function f9(bar = () => bazzzz) { + var bazzzz = 1; + return bar(); + } \ No newline at end of file diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.js b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.js index ecabb8ceba9f6..f33d171d0085c 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.js +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.js @@ -36,6 +36,12 @@ class Foo { } function f8(foo1: string, bar = foo1) { } + +let bazzzz = 2; +function f9(bar = () => bazzzz) { + var bazzzz = 1; + return bar(); +} //// [parameterInitializersForwardReferencing1_es6.js] @@ -70,3 +76,8 @@ class Foo { } } function f8(foo1, bar = foo1) { } +let bazzzz = 2; +function f9(bar = () => bazzzz) { + var bazzzz = 1; + return bar(); +} diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.symbols b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.symbols index dcd204beb7b0a..0ee9611c754bc 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.symbols +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.symbols @@ -90,3 +90,18 @@ function f8(foo1: string, bar = foo1) { } >bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1_es6.ts, 36, 25)) >foo1 : Symbol(foo1, Decl(parameterInitializersForwardReferencing1_es6.ts, 36, 12)) +let bazzzz = 2; +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1_es6.ts, 38, 3)) + +function f9(bar = () => bazzzz) { +>f9 : Symbol(f9, Decl(parameterInitializersForwardReferencing1_es6.ts, 38, 15)) +>bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1_es6.ts, 39, 12)) +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1_es6.ts, 38, 3)) + + var bazzzz = 1; +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1_es6.ts, 40, 7)) + + return bar(); +>bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1_es6.ts, 39, 12)) +} + diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.types b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.types index 8fc5d84ae8efc..98d664566a5f2 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.types +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1_es6.types @@ -98,3 +98,22 @@ function f8(foo1: string, bar = foo1) { } >bar : string >foo1 : string +let bazzzz = 2; +>bazzzz : number +>2 : 2 + +function f9(bar = () => bazzzz) { +>f9 : (bar?: () => number) => number +>bar : () => number +>() => bazzzz : () => number +>bazzzz : number + + var bazzzz = 1; +>bazzzz : number +>1 : 1 + + return bar(); +>bar() : number +>bar : () => number +} + diff --git a/tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts b/tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts index a3b88150f4f37..c43b994e61c49 100644 --- a/tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts +++ b/tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts @@ -35,3 +35,9 @@ class Foo { } function f8(foo1: string, bar = foo1) { } + +let bazzzz = 2; +function f9(bar = () => bazzzz) { + var bazzzz = 1; + return bar(); +} diff --git a/tests/cases/conformance/functions/parameterInitializersForwardReferencing1_es6.ts b/tests/cases/conformance/functions/parameterInitializersForwardReferencing1_es6.ts index f83eb2dd34ec6..d5650727b9245 100644 --- a/tests/cases/conformance/functions/parameterInitializersForwardReferencing1_es6.ts +++ b/tests/cases/conformance/functions/parameterInitializersForwardReferencing1_es6.ts @@ -37,3 +37,9 @@ class Foo { } function f8(foo1: string, bar = foo1) { } + +let bazzzz = 2; +function f9(bar = () => bazzzz) { + var bazzzz = 1; + return bar(); +}