From 2014057904abaa2c38c9af21adda9f8dae519883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Tue, 13 Nov 2018 19:38:42 +0800 Subject: [PATCH 1/3] fix name lookup change again --- src/compiler/checker.ts | 6 +++- ...ctionLikeInParameterInitializer.errors.txt | 12 +++---- ...functionLikeInParameterInitializer.symbols | 3 -- .../functionLikeInParameterInitializer.types | 26 +++++++------- ...InitializersForwardReferencing1.errors.txt | 11 +++--- ...arameterInitializersForwardReferencing1.js | 12 +++++++ ...terInitializersForwardReferencing1.symbols | 17 ++++++++- ...meterInitializersForwardReferencing1.types | 35 ++++++++++++++----- ...ializersForwardReferencing1_es6.errors.txt | 6 ++++ ...eterInitializersForwardReferencing1_es6.js | 11 ++++++ ...nitializersForwardReferencing1_es6.symbols | 15 ++++++++ ...rInitializersForwardReferencing1_es6.types | 19 ++++++++++ ...arameterInitializersForwardReferencing1.ts | 6 ++++ ...eterInitializersForwardReferencing1_es6.ts | 6 ++++ 14 files changed, 149 insertions(+), 36 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 081ed5b6e67bb..5beff35c62a9f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1262,7 +1262,11 @@ 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) && + if (findAncestor(originalLocation, isFunctionLikeDeclaration) !== functionLocation && + functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos) { + useResult = false + } + else if (compilerOptions.target && compilerOptions.target >= ScriptTarget.ES2015 && isParameter(lastLocation) && functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end) { useResult = false; } diff --git a/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt b/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt index b6ae78623b8d6..7620ee916c6fb 100644 --- a/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt +++ b/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/functionLikeInParameterInitializer.ts(2,34): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. -tests/cases/compiler/functionLikeInParameterInitializer.ts(6,44): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. -tests/cases/compiler/functionLikeInParameterInitializer.ts(11,50): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. +tests/cases/compiler/functionLikeInParameterInitializer.ts(2,34): error TS2304: Cannot find name 'foo'. +tests/cases/compiler/functionLikeInParameterInitializer.ts(6,44): error TS2304: Cannot find name 'foo'. +tests/cases/compiler/functionLikeInParameterInitializer.ts(11,50): error TS2304: Cannot find name 'foo'. tests/cases/compiler/functionLikeInParameterInitializer.ts(16,41): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. @@ -8,20 +8,20 @@ tests/cases/compiler/functionLikeInParameterInitializer.ts(16,41): error TS2373: // error export function bar(func = () => foo) { ~~~ -!!! error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. +!!! error TS2304: Cannot find name 'foo'. let foo = "in"; } // error export function baz1(func = { f() { return foo } }) { ~~~ -!!! error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. +!!! error TS2304: Cannot find name 'foo'. let foo = "in"; } // error export function baz2(func = function () { return foo }) { ~~~ -!!! error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. +!!! error TS2304: Cannot find name 'foo'. let foo = "in"; } diff --git a/tests/baselines/reference/functionLikeInParameterInitializer.symbols b/tests/baselines/reference/functionLikeInParameterInitializer.symbols index 0b7eae489de63..80bb5425bc3ab 100644 --- a/tests/baselines/reference/functionLikeInParameterInitializer.symbols +++ b/tests/baselines/reference/functionLikeInParameterInitializer.symbols @@ -3,7 +3,6 @@ export function bar(func = () => foo) { >bar : Symbol(bar, Decl(functionLikeInParameterInitializer.ts, 0, 0)) >func : Symbol(func, Decl(functionLikeInParameterInitializer.ts, 1, 20)) ->foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 2, 7)) let foo = "in"; >foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 2, 7)) @@ -13,7 +12,6 @@ export function baz1(func = { f() { return foo } }) { >baz1 : Symbol(baz1, Decl(functionLikeInParameterInitializer.ts, 3, 1)) >func : Symbol(func, Decl(functionLikeInParameterInitializer.ts, 5, 21)) >f : Symbol(f, Decl(functionLikeInParameterInitializer.ts, 5, 29)) ->foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 6, 7)) let foo = "in"; >foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 6, 7)) @@ -23,7 +21,6 @@ export function baz1(func = { f() { return foo } }) { export function baz2(func = function () { return foo }) { >baz2 : Symbol(baz2, Decl(functionLikeInParameterInitializer.ts, 7, 1)) >func : Symbol(func, Decl(functionLikeInParameterInitializer.ts, 10, 21)) ->foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 11, 7)) let foo = "in"; >foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 11, 7)) diff --git a/tests/baselines/reference/functionLikeInParameterInitializer.types b/tests/baselines/reference/functionLikeInParameterInitializer.types index 29510843c7da8..ca6919036cafa 100644 --- a/tests/baselines/reference/functionLikeInParameterInitializer.types +++ b/tests/baselines/reference/functionLikeInParameterInitializer.types @@ -1,10 +1,10 @@ === tests/cases/compiler/functionLikeInParameterInitializer.ts === // error export function bar(func = () => foo) { ->bar : (func?: () => string) => void ->func : () => string ->() => foo : () => string ->foo : string +>bar : (func?: () => any) => void +>func : () => any +>() => foo : () => any +>foo : any let foo = "in"; >foo : string @@ -12,11 +12,11 @@ export function bar(func = () => foo) { } // error export function baz1(func = { f() { return foo } }) { ->baz1 : (func?: { f(): string; }) => void ->func : { f(): string; } ->{ f() { return foo } } : { f(): string; } ->f : () => string ->foo : string +>baz1 : (func?: { f(): any; }) => void +>func : { f(): any; } +>{ f() { return foo } } : { f(): any; } +>f : () => any +>foo : any let foo = "in"; >foo : string @@ -25,10 +25,10 @@ export function baz1(func = { f() { return foo } }) { // error export function baz2(func = function () { return foo }) { ->baz2 : (func?: () => string) => void ->func : () => string ->function () { return foo } : () => string ->foo : string +>baz2 : (func?: () => any) => void +>func : () => any +>function () { return foo } : () => any +>foo : any let foo = "in"; >foo : string diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt b/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt index 73f4f27d08b48..e6f9517519835 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt @@ -1,12 +1,11 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(3,20): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. -tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(8,27): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(13,20): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. 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 (6 errors) ==== +==== tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts (5 errors) ==== let foo: string = ""; function f1 (bar = foo) { // unexpected compiler error; works at runtime @@ -17,8 +16,6 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(29 } function f2 (bar = (baz = foo) => baz) { // unexpected compiler error; works at runtime - ~~~ -!!! error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. var foo: number = 2; return bar(); // returns 1 } @@ -57,4 +54,10 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(29 } 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.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..91349daf39d1c 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols @@ -18,7 +18,7 @@ function f2 (bar = (baz = foo) => baz) { // unexpected compiler error; works at >f2 : Symbol(f2, Decl(parameterInitializersForwardReferencing1.ts, 5, 1)) >bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1.ts, 7, 13)) >baz : Symbol(baz, Decl(parameterInitializersForwardReferencing1.ts, 7, 20)) ->foo : Symbol(foo, Decl(parameterInitializersForwardReferencing1.ts, 8, 7)) +>foo : Symbol(foo, Decl(parameterInitializersForwardReferencing1.ts, 0, 3)) >baz : Symbol(baz, Decl(parameterInitializersForwardReferencing1.ts, 7, 20)) var foo: number = 2; @@ -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, 38, 3)) + + 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..0a113262c26cf 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.types +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.types @@ -17,20 +17,20 @@ function f1 (bar = foo) { // unexpected compiler error; works at runtime } function f2 (bar = (baz = foo) => baz) { // unexpected compiler error; works at runtime ->f2 : (bar?: (baz?: number) => number) => number ->bar : (baz?: number) => number ->(baz = foo) => baz : (baz?: number) => number ->baz : number ->foo : number ->baz : number +>f2 : (bar?: (baz?: string) => string) => string +>bar : (baz?: string) => string +>(baz = foo) => baz : (baz?: string) => string +>baz : string +>foo : string +>baz : string var foo: number = 2; >foo : number >2 : 2 return bar(); // returns 1 ->bar() : number ->bar : (baz?: number) => number +>bar() : string +>bar : (baz?: string) => string } function f3 (bar = foo, foo = 2) { // correct compiler error, error at runtime @@ -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(); +} From 31dda8863f23e9b54c28cc0903e2b54b73e073a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Tue, 13 Nov 2018 19:54:07 +0800 Subject: [PATCH 2/3] refactor condition --- src/compiler/checker.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5beff35c62a9f..f027ec4fa6b98 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1262,13 +1262,13 @@ namespace ts { if (meaning & result.flags & SymbolFlags.Variable) { // expression inside parameter will lookup as normal variable scope when targeting es2015+ const functionLocation = location; - if (findAncestor(originalLocation, isFunctionLikeDeclaration) !== functionLocation && - functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos) { - useResult = false - } - else if (compilerOptions.target && compilerOptions.target >= ScriptTarget.ES2015 && isParameter(lastLocation) && - functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end) { - useResult = false; + if (functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end) { + if (findAncestor(originalLocation, isFunctionLikeDeclaration) !== functionLocation) { + useResult = false + } + else if (compilerOptions.target && compilerOptions.target >= ScriptTarget.ES2015 && isParameter(lastLocation)) { + useResult = false; + } } else if (result.flags & SymbolFlags.FunctionScopedVariable) { // parameters are visible only inside function body, parameter list and return type From 0f21db3341f44094f64077444c7bb182c348de9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E7=92=90?= Date: Tue, 13 Nov 2018 20:27:13 +0800 Subject: [PATCH 3/3] fix break change --- src/compiler/checker.ts | 11 +++----- ...ctionLikeInParameterInitializer.errors.txt | 12 ++++----- ...functionLikeInParameterInitializer.symbols | 3 +++ .../functionLikeInParameterInitializer.types | 26 +++++++++---------- ...InitializersForwardReferencing1.errors.txt | 8 +++++- ...terInitializersForwardReferencing1.symbols | 4 +-- ...meterInitializersForwardReferencing1.types | 16 ++++++------ 7 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f027ec4fa6b98..c2d47a3595576 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1262,13 +1262,10 @@ namespace ts { if (meaning & result.flags & SymbolFlags.Variable) { // expression inside parameter will lookup as normal variable scope when targeting es2015+ const functionLocation = location; - if (functionLocation.body && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end) { - if (findAncestor(originalLocation, isFunctionLikeDeclaration) !== functionLocation) { - useResult = false - } - else if (compilerOptions.target && compilerOptions.target >= ScriptTarget.ES2015 && isParameter(lastLocation)) { - useResult = false; - } + 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) { // parameters are visible only inside function body, parameter list and return type diff --git a/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt b/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt index 7620ee916c6fb..b6ae78623b8d6 100644 --- a/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt +++ b/tests/baselines/reference/functionLikeInParameterInitializer.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/functionLikeInParameterInitializer.ts(2,34): error TS2304: Cannot find name 'foo'. -tests/cases/compiler/functionLikeInParameterInitializer.ts(6,44): error TS2304: Cannot find name 'foo'. -tests/cases/compiler/functionLikeInParameterInitializer.ts(11,50): error TS2304: Cannot find name 'foo'. +tests/cases/compiler/functionLikeInParameterInitializer.ts(2,34): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. +tests/cases/compiler/functionLikeInParameterInitializer.ts(6,44): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. +tests/cases/compiler/functionLikeInParameterInitializer.ts(11,50): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. tests/cases/compiler/functionLikeInParameterInitializer.ts(16,41): error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. @@ -8,20 +8,20 @@ tests/cases/compiler/functionLikeInParameterInitializer.ts(16,41): error TS2373: // error export function bar(func = () => foo) { ~~~ -!!! error TS2304: Cannot find name 'foo'. +!!! error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. let foo = "in"; } // error export function baz1(func = { f() { return foo } }) { ~~~ -!!! error TS2304: Cannot find name 'foo'. +!!! error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. let foo = "in"; } // error export function baz2(func = function () { return foo }) { ~~~ -!!! error TS2304: Cannot find name 'foo'. +!!! error TS2373: Initializer of parameter 'func' cannot reference identifier 'foo' declared after it. let foo = "in"; } diff --git a/tests/baselines/reference/functionLikeInParameterInitializer.symbols b/tests/baselines/reference/functionLikeInParameterInitializer.symbols index 80bb5425bc3ab..0b7eae489de63 100644 --- a/tests/baselines/reference/functionLikeInParameterInitializer.symbols +++ b/tests/baselines/reference/functionLikeInParameterInitializer.symbols @@ -3,6 +3,7 @@ export function bar(func = () => foo) { >bar : Symbol(bar, Decl(functionLikeInParameterInitializer.ts, 0, 0)) >func : Symbol(func, Decl(functionLikeInParameterInitializer.ts, 1, 20)) +>foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 2, 7)) let foo = "in"; >foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 2, 7)) @@ -12,6 +13,7 @@ export function baz1(func = { f() { return foo } }) { >baz1 : Symbol(baz1, Decl(functionLikeInParameterInitializer.ts, 3, 1)) >func : Symbol(func, Decl(functionLikeInParameterInitializer.ts, 5, 21)) >f : Symbol(f, Decl(functionLikeInParameterInitializer.ts, 5, 29)) +>foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 6, 7)) let foo = "in"; >foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 6, 7)) @@ -21,6 +23,7 @@ export function baz1(func = { f() { return foo } }) { export function baz2(func = function () { return foo }) { >baz2 : Symbol(baz2, Decl(functionLikeInParameterInitializer.ts, 7, 1)) >func : Symbol(func, Decl(functionLikeInParameterInitializer.ts, 10, 21)) +>foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 11, 7)) let foo = "in"; >foo : Symbol(foo, Decl(functionLikeInParameterInitializer.ts, 11, 7)) diff --git a/tests/baselines/reference/functionLikeInParameterInitializer.types b/tests/baselines/reference/functionLikeInParameterInitializer.types index ca6919036cafa..29510843c7da8 100644 --- a/tests/baselines/reference/functionLikeInParameterInitializer.types +++ b/tests/baselines/reference/functionLikeInParameterInitializer.types @@ -1,10 +1,10 @@ === tests/cases/compiler/functionLikeInParameterInitializer.ts === // error export function bar(func = () => foo) { ->bar : (func?: () => any) => void ->func : () => any ->() => foo : () => any ->foo : any +>bar : (func?: () => string) => void +>func : () => string +>() => foo : () => string +>foo : string let foo = "in"; >foo : string @@ -12,11 +12,11 @@ export function bar(func = () => foo) { } // error export function baz1(func = { f() { return foo } }) { ->baz1 : (func?: { f(): any; }) => void ->func : { f(): any; } ->{ f() { return foo } } : { f(): any; } ->f : () => any ->foo : any +>baz1 : (func?: { f(): string; }) => void +>func : { f(): string; } +>{ f() { return foo } } : { f(): string; } +>f : () => string +>foo : string let foo = "in"; >foo : string @@ -25,10 +25,10 @@ export function baz1(func = { f() { return foo } }) { // error export function baz2(func = function () { return foo }) { ->baz2 : (func?: () => any) => void ->func : () => any ->function () { return foo } : () => any ->foo : any +>baz2 : (func?: () => string) => void +>func : () => string +>function () { return foo } : () => string +>foo : string let foo = "in"; >foo : string diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt b/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt index e6f9517519835..cb2ffeb2957e2 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.errors.txt @@ -1,11 +1,13 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(3,20): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. +tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(8,27): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(13,20): error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. 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 (5 errors) ==== +==== tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts (7 errors) ==== let foo: string = ""; function f1 (bar = foo) { // unexpected compiler error; works at runtime @@ -16,6 +18,8 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(29 } function f2 (bar = (baz = foo) => baz) { // unexpected compiler error; works at runtime + ~~~ +!!! error TS2373: Initializer of parameter 'bar' cannot reference identifier 'foo' declared after it. var foo: number = 2; return bar(); // returns 1 } @@ -57,6 +61,8 @@ tests/cases/conformance/functions/parameterInitializersForwardReferencing1.ts(29 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(); } diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols b/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols index 91349daf39d1c..fe9468caa9e93 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.symbols @@ -18,7 +18,7 @@ function f2 (bar = (baz = foo) => baz) { // unexpected compiler error; works at >f2 : Symbol(f2, Decl(parameterInitializersForwardReferencing1.ts, 5, 1)) >bar : Symbol(bar, Decl(parameterInitializersForwardReferencing1.ts, 7, 13)) >baz : Symbol(baz, Decl(parameterInitializersForwardReferencing1.ts, 7, 20)) ->foo : Symbol(foo, Decl(parameterInitializersForwardReferencing1.ts, 0, 3)) +>foo : Symbol(foo, Decl(parameterInitializersForwardReferencing1.ts, 8, 7)) >baz : Symbol(baz, Decl(parameterInitializersForwardReferencing1.ts, 7, 20)) var foo: number = 2; @@ -96,7 +96,7 @@ let bazzzz = 2; 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, 38, 3)) +>bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1.ts, 40, 7)) var bazzzz = 1; >bazzzz : Symbol(bazzzz, Decl(parameterInitializersForwardReferencing1.ts, 40, 7)) diff --git a/tests/baselines/reference/parameterInitializersForwardReferencing1.types b/tests/baselines/reference/parameterInitializersForwardReferencing1.types index 0a113262c26cf..5dcf847297c7c 100644 --- a/tests/baselines/reference/parameterInitializersForwardReferencing1.types +++ b/tests/baselines/reference/parameterInitializersForwardReferencing1.types @@ -17,20 +17,20 @@ function f1 (bar = foo) { // unexpected compiler error; works at runtime } function f2 (bar = (baz = foo) => baz) { // unexpected compiler error; works at runtime ->f2 : (bar?: (baz?: string) => string) => string ->bar : (baz?: string) => string ->(baz = foo) => baz : (baz?: string) => string ->baz : string ->foo : string ->baz : string +>f2 : (bar?: (baz?: number) => number) => number +>bar : (baz?: number) => number +>(baz = foo) => baz : (baz?: number) => number +>baz : number +>foo : number +>baz : number var foo: number = 2; >foo : number >2 : 2 return bar(); // returns 1 ->bar() : string ->bar : (baz?: string) => string +>bar() : number +>bar : (baz?: number) => number } function f3 (bar = foo, foo = 2) { // correct compiler error, error at runtime