From 42b18cb01cff1fd6aff686d1bf15c2c5c37b72d4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Nov 2026 23:30:22 +0000 Subject: [PATCH 1/4] Initial plan From ccf93179fe04eb2cb6194c420942030f5232a138 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Nov 2026 23:47:51 +0000 Subject: [PATCH 2/4] Add default-parameter body-function scope regression baselines Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- ...faultParameterBodyFunctionScope.errors.txt | 52 ++++++++++ .../defaultParameterBodyFunctionScope.js | 60 ++++++++++++ .../defaultParameterBodyFunctionScope.symbols | 82 ++++++++++++++++ .../defaultParameterBodyFunctionScope.types | 97 +++++++++++++++++++ .../defaultParameterBodyFunctionScope.ts | 33 +++++++ 5 files changed, 324 insertions(+) create mode 100644 tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt create mode 100644 tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.js create mode 100644 tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types create mode 100644 tsc/testdata/tests/cases/compiler/defaultParameterBodyFunctionScope.ts diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt new file mode 100644 index 0000000000000..fe2029aa6ea6a --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt @@ -0,0 +1,52 @@ +defaultParameterBodyFunctionScope.ts(3,30): error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. +defaultParameterBodyFunctionScope.ts(3,37): error TS2339: Property 'root' does not exist on type '() => void'. +defaultParameterBodyFunctionScope.ts(9,50): error TS2339: Property 'root' does not exist on type '() => void'. +defaultParameterBodyFunctionScope.ts(14,44): error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. +defaultParameterBodyFunctionScope.ts(14,51): error TS2339: Property 'root' does not exist on type '() => void'. +defaultParameterBodyFunctionScope.ts(19,37): error TS2373: Parameter 'value' cannot reference identifier 'missing' declared after it. + + +==== defaultParameterBodyFunctionScope.ts (6 errors) ==== + const styles = { root: "outer" }; + + export function read(value = styles.root) { + ~~~~~~ +!!! error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. + ~~~~ +!!! error TS2339: Property 'root' does not exist on type '() => void'. + function styles() {} + styles(); + return value; + } + + export function readClosure(value = () => styles.root) { + ~~~~ +!!! error TS2339: Property 'root' does not exist on type '() => void'. + function styles() {} + return value(); + } + + export function readDestructured({ value = styles.root } = {}) { + ~~~~~~ +!!! error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. + ~~~~ +!!! error TS2339: Property 'root' does not exist on type '() => void'. + function styles() {} + return value; + } + + export function readMissing(value = missing) { + ~~~~~~~ +!!! error TS2373: Parameter 'value' cannot reference identifier 'missing' declared after it. + function missing() {} + return value; + } + + export function readParameter(styles = { root: "parameter" }, value = styles.root) { + return value; + } + + export const readNamed = function named(value = named) { + return value; + }; + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.js b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.js new file mode 100644 index 0000000000000..41ae37b313a23 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.js @@ -0,0 +1,60 @@ +//// [tests/cases/compiler/defaultParameterBodyFunctionScope.ts] //// + +//// [defaultParameterBodyFunctionScope.ts] +const styles = { root: "outer" }; + +export function read(value = styles.root) { + function styles() {} + styles(); + return value; +} + +export function readClosure(value = () => styles.root) { + function styles() {} + return value(); +} + +export function readDestructured({ value = styles.root } = {}) { + function styles() {} + return value; +} + +export function readMissing(value = missing) { + function missing() {} + return value; +} + +export function readParameter(styles = { root: "parameter" }, value = styles.root) { + return value; +} + +export const readNamed = function named(value = named) { + return value; +}; + + +//// [defaultParameterBodyFunctionScope.js] +const styles = { root: "outer" }; +export function read(value = styles.root) { + function styles() { } + styles(); + return value; +} +export function readClosure(value = () => styles.root) { + function styles() { } + return value(); +} +export function readDestructured({ value = styles.root } = {}) { + function styles() { } + return value; +} +export function readMissing(value = missing) { + function missing() { } + return value; +} +export function readParameter(styles = { root: "parameter" }, value = styles.root) { + return value; +} +export const readNamed = function named(value = named) { + return value; +}; diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols new file mode 100644 index 0000000000000..84469ae8e0389 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols @@ -0,0 +1,82 @@ +//// [tests/cases/compiler/defaultParameterBodyFunctionScope.ts] //// + +=== defaultParameterBodyFunctionScope.ts === +const styles = { root: "outer" }; +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 0, 5)) +>root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) + +export function read(value = styles.root) { +>read : Symbol(read, Decl(defaultParameterBodyFunctionScope.ts, 0, 33)) +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 2, 21)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 2, 43)) + + function styles() {} +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 2, 43)) + + styles(); +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 2, 43)) + + return value; +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 2, 21)) +} + +export function readClosure(value = () => styles.root) { +>readClosure : Symbol(readClosure, Decl(defaultParameterBodyFunctionScope.ts, 6, 1)) +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 8, 28)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 8, 56)) + + function styles() {} +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 8, 56)) + + return value(); +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 8, 28)) +} + +export function readDestructured({ value = styles.root } = {}) { +>readDestructured : Symbol(readDestructured, Decl(defaultParameterBodyFunctionScope.ts, 11, 1)) +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 13, 34)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 13, 64)) + + function styles() {} +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 13, 64)) + + return value; +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 13, 34)) +} + +export function readMissing(value = missing) { +>readMissing : Symbol(readMissing, Decl(defaultParameterBodyFunctionScope.ts, 16, 1)) +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 18, 28)) +>missing : Symbol(missing, Decl(defaultParameterBodyFunctionScope.ts, 18, 46)) + + function missing() {} +>missing : Symbol(missing, Decl(defaultParameterBodyFunctionScope.ts, 18, 46)) + + return value; +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 18, 28)) +} + +export function readParameter(styles = { root: "parameter" }, value = styles.root) { +>readParameter : Symbol(readParameter, Decl(defaultParameterBodyFunctionScope.ts, 21, 1)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 23, 30)) +>root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 23, 40)) +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 23, 61)) +>styles.root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 23, 40)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 23, 30)) +>root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 23, 40)) + + return value; +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 23, 61)) +} + +export const readNamed = function named(value = named) { +>readNamed : Symbol(readNamed, Decl(defaultParameterBodyFunctionScope.ts, 27, 12)) +>named : Symbol(named, Decl(defaultParameterBodyFunctionScope.ts, 27, 24)) +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 27, 40)) +>named : Symbol(named, Decl(defaultParameterBodyFunctionScope.ts, 27, 24)) + + return value; +>value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 27, 40)) + +}; + diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types new file mode 100644 index 0000000000000..18b02c69e2913 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types @@ -0,0 +1,97 @@ +//// [tests/cases/compiler/defaultParameterBodyFunctionScope.ts] //// + +=== defaultParameterBodyFunctionScope.ts === +const styles = { root: "outer" }; +>styles : { root: string; } +>{ root: "outer" } : { root: string; } +>root : string +>"outer" : "outer" + +export function read(value = styles.root) { +>read : (value?: any) => any +>value : any +>styles.root : any +>styles : () => void +>root : any + + function styles() {} +>styles : () => void + + styles(); +>styles() : void +>styles : () => void + + return value; +>value : any +} + +export function readClosure(value = () => styles.root) { +>readClosure : (value?: () => any) => any +>value : () => any +>() => styles.root : () => any +>styles.root : any +>styles : () => void +>root : any + + function styles() {} +>styles : () => void + + return value(); +>value() : any +>value : () => any +} + +export function readDestructured({ value = styles.root } = {}) { +>readDestructured : ({ value }?: { value?: any; }) => any +>value : any +>styles.root : any +>styles : () => void +>root : any +>{} : {} + + function styles() {} +>styles : () => void + + return value; +>value : any +} + +export function readMissing(value = missing) { +>readMissing : (value?: () => void) => () => void +>value : () => void +>missing : () => void + + function missing() {} +>missing : () => void + + return value; +>value : () => void +} + +export function readParameter(styles = { root: "parameter" }, value = styles.root) { +>readParameter : (styles?: { root: string; }, value?: string) => string +>styles : { root: string; } +>{ root: "parameter" } : { root: string; } +>root : string +>"parameter" : "parameter" +>value : string +>styles.root : string +>styles : { root: string; } +>root : string + + return value; +>value : string +} + +export const readNamed = function named(value = named) { +>readNamed : (value?: typeof readNamed) => typeof readNamed +>function named(value = named) { return value;} : (value?: typeof readNamed) => typeof readNamed +>named : (value?: typeof readNamed) => typeof readNamed +>value : (value?: typeof readNamed) => typeof readNamed +>named : (value?: typeof readNamed) => typeof readNamed + + return value; +>value : (value?: typeof readNamed) => typeof readNamed + +}; + diff --git a/tsc/testdata/tests/cases/compiler/defaultParameterBodyFunctionScope.ts b/tsc/testdata/tests/cases/compiler/defaultParameterBodyFunctionScope.ts new file mode 100644 index 0000000000000..30cc64616d933 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/defaultParameterBodyFunctionScope.ts @@ -0,0 +1,33 @@ +// @target: esnext +// @strict: true + +const styles = { root: "outer" }; + +export function read(value = styles.root) { + function styles() {} + styles(); + return value; +} + +export function readClosure(value = () => styles.root) { + function styles() {} + return value(); +} + +export function readDestructured({ value = styles.root } = {}) { + function styles() {} + return value; +} + +export function readMissing(value = missing) { + function missing() {} + return value; +} + +export function readParameter(styles = { root: "parameter" }, value = styles.root) { + return value; +} + +export const readNamed = function named(value = named) { + return value; +}; From 44bc8f8016c8fd13394f681e45228e55f91ff636 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Nov 2026 23:52:02 +0000 Subject: [PATCH 3/4] Exclude body functions from parameter-initializer scope Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- tsc/internal/binder/nameresolver.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsc/internal/binder/nameresolver.go b/tsc/internal/binder/nameresolver.go index 4d0db524946cb..8c69fe1553bfd 100644 --- a/tsc/internal/binder/nameresolver.go +++ b/tsc/internal/binder/nameresolver.go @@ -74,8 +74,8 @@ loop: lastLocation.Kind == ast.KindJSDocReturnTag || lastLocation.Kind == ast.KindTypeParameter) } - if meaning&result.Flags()&ast.SymbolFlagsVariable != 0 { - // expression inside parameter will lookup as normal variable scope when targeting es2015+ + if meaning&result.Flags()&(ast.SymbolFlagsVariable|ast.SymbolFlagsFunction) != 0 { + // Expressions inside parameters use the outer scope for declarations in the function body. if r.useOuterVariableScopeInParameter(result, location, lastLocation) { useResult = false } else if result.Flags()&ast.SymbolFlagsFunctionScopedVariable != 0 { From ca4737c7137cd4a3a5e407a8e0e6eb9e57febcac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Nov 2026 23:58:39 +0000 Subject: [PATCH 4/4] Update parameter-initializer binding baselines Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- ...faultParameterBodyFunctionScope.errors.txt | 21 ++------ .../defaultParameterBodyFunctionScope.symbols | 13 +++-- .../defaultParameterBodyFunctionScope.types | 48 +++++++++---------- 3 files changed, 36 insertions(+), 46 deletions(-) diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt index fe2029aa6ea6a..6f55fb08303b0 100644 --- a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.errors.txt @@ -1,43 +1,28 @@ -defaultParameterBodyFunctionScope.ts(3,30): error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. -defaultParameterBodyFunctionScope.ts(3,37): error TS2339: Property 'root' does not exist on type '() => void'. -defaultParameterBodyFunctionScope.ts(9,50): error TS2339: Property 'root' does not exist on type '() => void'. -defaultParameterBodyFunctionScope.ts(14,44): error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. -defaultParameterBodyFunctionScope.ts(14,51): error TS2339: Property 'root' does not exist on type '() => void'. -defaultParameterBodyFunctionScope.ts(19,37): error TS2373: Parameter 'value' cannot reference identifier 'missing' declared after it. +defaultParameterBodyFunctionScope.ts(19,37): error TS2304: Cannot find name 'missing'. -==== defaultParameterBodyFunctionScope.ts (6 errors) ==== +==== defaultParameterBodyFunctionScope.ts (1 errors) ==== const styles = { root: "outer" }; export function read(value = styles.root) { - ~~~~~~ -!!! error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. - ~~~~ -!!! error TS2339: Property 'root' does not exist on type '() => void'. function styles() {} styles(); return value; } export function readClosure(value = () => styles.root) { - ~~~~ -!!! error TS2339: Property 'root' does not exist on type '() => void'. function styles() {} return value(); } export function readDestructured({ value = styles.root } = {}) { - ~~~~~~ -!!! error TS2373: Parameter 'value' cannot reference identifier 'styles' declared after it. - ~~~~ -!!! error TS2339: Property 'root' does not exist on type '() => void'. function styles() {} return value; } export function readMissing(value = missing) { ~~~~~~~ -!!! error TS2373: Parameter 'value' cannot reference identifier 'missing' declared after it. +!!! error TS2304: Cannot find name 'missing'. function missing() {} return value; } diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols index 84469ae8e0389..c2eceabe5a1ec 100644 --- a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.symbols @@ -8,7 +8,9 @@ const styles = { root: "outer" }; export function read(value = styles.root) { >read : Symbol(read, Decl(defaultParameterBodyFunctionScope.ts, 0, 33)) >value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 2, 21)) ->styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 2, 43)) +>styles.root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 0, 5)) +>root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) function styles() {} >styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 2, 43)) @@ -23,7 +25,9 @@ export function read(value = styles.root) { export function readClosure(value = () => styles.root) { >readClosure : Symbol(readClosure, Decl(defaultParameterBodyFunctionScope.ts, 6, 1)) >value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 8, 28)) ->styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 8, 56)) +>styles.root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 0, 5)) +>root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) function styles() {} >styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 8, 56)) @@ -35,7 +39,9 @@ export function readClosure(value = () => styles.root) { export function readDestructured({ value = styles.root } = {}) { >readDestructured : Symbol(readDestructured, Decl(defaultParameterBodyFunctionScope.ts, 11, 1)) >value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 13, 34)) ->styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 13, 64)) +>styles.root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) +>styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 0, 5)) +>root : Symbol(root, Decl(defaultParameterBodyFunctionScope.ts, 0, 16)) function styles() {} >styles : Symbol(styles, Decl(defaultParameterBodyFunctionScope.ts, 13, 64)) @@ -47,7 +53,6 @@ export function readDestructured({ value = styles.root } = {}) { export function readMissing(value = missing) { >readMissing : Symbol(readMissing, Decl(defaultParameterBodyFunctionScope.ts, 16, 1)) >value : Symbol(value, Decl(defaultParameterBodyFunctionScope.ts, 18, 28)) ->missing : Symbol(missing, Decl(defaultParameterBodyFunctionScope.ts, 18, 46)) function missing() {} >missing : Symbol(missing, Decl(defaultParameterBodyFunctionScope.ts, 18, 46)) diff --git a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types index 18b02c69e2913..0b64b83ba538b 100644 --- a/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types +++ b/tsc/testdata/baselines/reference/compiler/defaultParameterBodyFunctionScope.types @@ -8,11 +8,11 @@ const styles = { root: "outer" }; >"outer" : "outer" export function read(value = styles.root) { ->read : (value?: any) => any ->value : any ->styles.root : any ->styles : () => void ->root : any +>read : (value?: string) => string +>value : string +>styles.root : string +>styles : { root: string; } +>root : string function styles() {} >styles : () => void @@ -22,50 +22,50 @@ export function read(value = styles.root) { >styles : () => void return value; ->value : any +>value : string } export function readClosure(value = () => styles.root) { ->readClosure : (value?: () => any) => any ->value : () => any ->() => styles.root : () => any ->styles.root : any ->styles : () => void ->root : any +>readClosure : (value?: () => string) => string +>value : () => string +>() => styles.root : () => string +>styles.root : string +>styles : { root: string; } +>root : string function styles() {} >styles : () => void return value(); ->value() : any ->value : () => any +>value() : string +>value : () => string } export function readDestructured({ value = styles.root } = {}) { ->readDestructured : ({ value }?: { value?: any; }) => any ->value : any ->styles.root : any ->styles : () => void ->root : any +>readDestructured : ({ value }?: { value?: string | undefined; }) => string +>value : string +>styles.root : string +>styles : { root: string; } +>root : string >{} : {} function styles() {} >styles : () => void return value; ->value : any +>value : string } export function readMissing(value = missing) { ->readMissing : (value?: () => void) => () => void ->value : () => void ->missing : () => void +>readMissing : (value?: any) => any +>value : any +>missing : any function missing() {} >missing : () => void return value; ->value : () => void +>value : any } export function readParameter(styles = { root: "parameter" }, value = styles.root) {