From 01dff2440d92cb494a2c672f242d2dadc86a3f14 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Sep 2026 03:10:52 +0000 Subject: [PATCH 1/2] Initial plan From 011b6cf73c2b5df602d0dec93f45f9629403e996 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Sep 2026 03:29:19 +0000 Subject: [PATCH 2/2] Model Intl.Collator#compare as readonly bound function property Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- tsc/internal/bundled/libs/lib.es5.d.ts | 2 +- .../compiler/intlCollatorCompare.errors.txt | 19 ++++++ .../reference/compiler/intlCollatorCompare.js | 27 ++++++++ .../compiler/intlCollatorCompare.symbols | 43 +++++++++++++ .../compiler/intlCollatorCompare.types | 62 +++++++++++++++++++ .../cases/compiler/intlCollatorCompare.ts | 15 +++++ 6 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 tsc/testdata/baselines/reference/compiler/intlCollatorCompare.errors.txt create mode 100644 tsc/testdata/baselines/reference/compiler/intlCollatorCompare.js create mode 100644 tsc/testdata/baselines/reference/compiler/intlCollatorCompare.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/intlCollatorCompare.types create mode 100644 tsc/testdata/tests/cases/compiler/intlCollatorCompare.ts diff --git a/tsc/internal/bundled/libs/lib.es5.d.ts b/tsc/internal/bundled/libs/lib.es5.d.ts index e394111cb0e6c..ec4d8eaaa25e6 100644 --- a/tsc/internal/bundled/libs/lib.es5.d.ts +++ b/tsc/internal/bundled/libs/lib.es5.d.ts @@ -4435,7 +4435,7 @@ declare namespace Intl { } interface Collator { - compare(x: string, y: string): number; + readonly compare: (this: void, x: string, y: string) => number; resolvedOptions(): ResolvedCollatorOptions; } diff --git a/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.errors.txt b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.errors.txt new file mode 100644 index 0000000000000..9ab6ef7477587 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.errors.txt @@ -0,0 +1,19 @@ +intlCollatorCompare.ts(12,10): error TS2540: Cannot assign to 'compare' because it is a read-only property. + + +==== intlCollatorCompare.ts (1 errors) ==== + const collator = new Intl.Collator("en"); + + const compare = collator.compare; + compare("a", "b"); + + ["b", "a"].sort(collator.compare); + ["b", "a"].sort(compare); + + collator.compare("a", "b"); + + // error: compare is readonly + collator.compare = (x: string, y: string) => 0; + ~~~~~~~ +!!! error TS2540: Cannot assign to 'compare' because it is a read-only property. + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.js b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.js new file mode 100644 index 0000000000000..de353420f6337 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/intlCollatorCompare.ts] //// + +//// [intlCollatorCompare.ts] +const collator = new Intl.Collator("en"); + +const compare = collator.compare; +compare("a", "b"); + +["b", "a"].sort(collator.compare); +["b", "a"].sort(compare); + +collator.compare("a", "b"); + +// error: compare is readonly +collator.compare = (x: string, y: string) => 0; + + +//// [intlCollatorCompare.js] +"use strict"; +const collator = new Intl.Collator("en"); +const compare = collator.compare; +compare("a", "b"); +["b", "a"].sort(collator.compare); +["b", "a"].sort(compare); +collator.compare("a", "b"); +// error: compare is readonly +collator.compare = (x, y) => 0; diff --git a/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.symbols b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.symbols new file mode 100644 index 0000000000000..73f7719e09880 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.symbols @@ -0,0 +1,43 @@ +//// [tests/cases/compiler/intlCollatorCompare.ts] //// + +=== intlCollatorCompare.ts === +const collator = new Intl.Collator("en"); +>collator : Symbol(collator, Decl(intlCollatorCompare.ts, 0, 5)) +>Intl.Collator : Symbol(Intl.Collator, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>Intl : Symbol(Intl, Decl(lib.es5.d.ts, --, --)) +>Collator : Symbol(Intl.Collator, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + +const compare = collator.compare; +>compare : Symbol(compare, Decl(intlCollatorCompare.ts, 2, 5)) +>collator.compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) +>collator : Symbol(collator, Decl(intlCollatorCompare.ts, 0, 5)) +>compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) + +compare("a", "b"); +>compare : Symbol(compare, Decl(intlCollatorCompare.ts, 2, 5)) + +["b", "a"].sort(collator.compare); +>["b", "a"].sort : Symbol(Array.sort, Decl(lib.es5.d.ts, --, --)) +>sort : Symbol(Array.sort, Decl(lib.es5.d.ts, --, --)) +>collator.compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) +>collator : Symbol(collator, Decl(intlCollatorCompare.ts, 0, 5)) +>compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) + +["b", "a"].sort(compare); +>["b", "a"].sort : Symbol(Array.sort, Decl(lib.es5.d.ts, --, --)) +>sort : Symbol(Array.sort, Decl(lib.es5.d.ts, --, --)) +>compare : Symbol(compare, Decl(intlCollatorCompare.ts, 2, 5)) + +collator.compare("a", "b"); +>collator.compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) +>collator : Symbol(collator, Decl(intlCollatorCompare.ts, 0, 5)) +>compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) + +// error: compare is readonly +collator.compare = (x: string, y: string) => 0; +>collator.compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) +>collator : Symbol(collator, Decl(intlCollatorCompare.ts, 0, 5)) +>compare : Symbol(Intl.Collator.compare, Decl(lib.es5.d.ts, --, --)) +>x : Symbol(x, Decl(intlCollatorCompare.ts, 11, 20)) +>y : Symbol(y, Decl(intlCollatorCompare.ts, 11, 30)) + diff --git a/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.types b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.types new file mode 100644 index 0000000000000..a6a3228a0dbb5 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/intlCollatorCompare.types @@ -0,0 +1,62 @@ +//// [tests/cases/compiler/intlCollatorCompare.ts] //// + +=== intlCollatorCompare.ts === +const collator = new Intl.Collator("en"); +>collator : Intl.Collator +>new Intl.Collator("en") : Intl.Collator +>Intl.Collator : Intl.CollatorConstructor +>Intl : typeof Intl +>Collator : Intl.CollatorConstructor +>"en" : "en" + +const compare = collator.compare; +>compare : (this: void, x: string, y: string) => number +>collator.compare : (this: void, x: string, y: string) => number +>collator : Intl.Collator +>compare : (this: void, x: string, y: string) => number + +compare("a", "b"); +>compare("a", "b") : number +>compare : (this: void, x: string, y: string) => number +>"a" : "a" +>"b" : "b" + +["b", "a"].sort(collator.compare); +>["b", "a"].sort(collator.compare) : string[] +>["b", "a"].sort : (compareFn?: ((a: string, b: string) => number) | undefined) => string[] +>["b", "a"] : string[] +>"b" : "b" +>"a" : "a" +>sort : (compareFn?: ((a: string, b: string) => number) | undefined) => string[] +>collator.compare : (this: void, x: string, y: string) => number +>collator : Intl.Collator +>compare : (this: void, x: string, y: string) => number + +["b", "a"].sort(compare); +>["b", "a"].sort(compare) : string[] +>["b", "a"].sort : (compareFn?: ((a: string, b: string) => number) | undefined) => string[] +>["b", "a"] : string[] +>"b" : "b" +>"a" : "a" +>sort : (compareFn?: ((a: string, b: string) => number) | undefined) => string[] +>compare : (this: void, x: string, y: string) => number + +collator.compare("a", "b"); +>collator.compare("a", "b") : number +>collator.compare : (this: void, x: string, y: string) => number +>collator : Intl.Collator +>compare : (this: void, x: string, y: string) => number +>"a" : "a" +>"b" : "b" + +// error: compare is readonly +collator.compare = (x: string, y: string) => 0; +>collator.compare = (x: string, y: string) => 0 : (x: string, y: string) => number +>collator.compare : any +>collator : Intl.Collator +>compare : any +>(x: string, y: string) => 0 : (x: string, y: string) => number +>x : string +>y : string +>0 : 0 + diff --git a/tsc/testdata/tests/cases/compiler/intlCollatorCompare.ts b/tsc/testdata/tests/cases/compiler/intlCollatorCompare.ts new file mode 100644 index 0000000000000..77679b1f25802 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/intlCollatorCompare.ts @@ -0,0 +1,15 @@ +// @strict: true +// @target: es2015 + +const collator = new Intl.Collator("en"); + +const compare = collator.compare; +compare("a", "b"); + +["b", "a"].sort(collator.compare); +["b", "a"].sort(compare); + +collator.compare("a", "b"); + +// error: compare is readonly +collator.compare = (x: string, y: string) => 0;