Skip to content

Commit

Permalink
Accept new baselines
Browse files Browse the repository at this point in the history
  • Loading branch information
ahejlsberg committed Jan 8, 2024
1 parent 5aff92b commit e0ccb0d
Show file tree
Hide file tree
Showing 6 changed files with 472 additions and 60 deletions.
2 changes: 1 addition & 1 deletion tests/baselines/reference/enumIndexer.types
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,5 @@ var x = _arr.map(o => MyEnumType[o.key] === enumValue); // these are not same ty
>o.key : string
>o : { key: string; }
>key : string
>enumValue : MyEnumType.foo
>enumValue : MyEnumType

56 changes: 48 additions & 8 deletions tests/baselines/reference/narrowingPastLastAssignment.errors.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
narrowingPastLastAssignment.ts(67,9): error TS7034: Variable 'x' implicitly has type 'any' in some locations where its type cannot be determined.
narrowingPastLastAssignment.ts(69,20): error TS7005: Variable 'x' implicitly has an 'any' type.
narrowingPastLastAssignment.ts(88,9): error TS7034: Variable 'x' implicitly has type 'any' in some locations where its type cannot be determined.
narrowingPastLastAssignment.ts(90,20): error TS7005: Variable 'x' implicitly has an 'any' type.


==== narrowingPastLastAssignment.ts (2 errors) ====
Expand Down Expand Up @@ -66,6 +66,27 @@ narrowingPastLastAssignment.ts(69,20): error TS7005: Variable 'x' implicitly has
action(() => { x /* number */ });
}

function f5a(cond: boolean) {
if (cond) {
let x: number | undefined;
x = 1;
action(() => { x /* number */ });
}
else {
let x: number | undefined;
x = 2;
action(() => { x /* number */ });
}
}

function f5b() {
for (let x = 0; x < 10; x++) {
if (x === 1 || x === 2) {
action(() => { x /* 1 | 2 */ })
}
}
}

// Implicit any variables have a known type following last assignment

function f6() {
Expand All @@ -92,6 +113,23 @@ narrowingPastLastAssignment.ts(69,20): error TS7005: Variable 'x' implicitly has
}
}

// Narrowings are not preserved for global variables

let g: string | number;
g = "abc";
action(() => { g /* string | number */ });

// Narrowings are not preserved for exported namespace members

namespace Foo {
export let x: string | number;
x = "abc";
action(() => { x /* string | number */ });
let y: string | number;
y = "abc";
action(() => { y /* string */ });
}

// Repros from #35124

function f10() {
Expand All @@ -113,11 +151,13 @@ narrowingPastLastAssignment.ts(69,20): error TS7005: Variable 'x' implicitly has

// Repro from #52104

const fooMap: Map<string,Array<number>> = new Map()
const values = [1, 2, 3, 4, 5];
let foo = fooMap.get("a");
if (foo == null) {
foo = [];
function f12() {
const fooMap: Map<string,Array<number>> = new Map()
const values = [1, 2, 3, 4, 5];
let foo = fooMap.get("a");
if (foo == null) {
foo = [];
}
values.forEach(v => foo.push(v));
}
values.forEach(v => foo.push(v));

179 changes: 135 additions & 44 deletions tests/baselines/reference/narrowingPastLastAssignment.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -152,123 +152,214 @@ function f5(x: string | number, cond: () => boolean) {
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 51, 12))
}

function f5a(cond: boolean) {
>f5a : Symbol(f5a, Decl(narrowingPastLastAssignment.ts, 61, 1))
>cond : Symbol(cond, Decl(narrowingPastLastAssignment.ts, 63, 13))

if (cond) {
>cond : Symbol(cond, Decl(narrowingPastLastAssignment.ts, 63, 13))

let x: number | undefined;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 65, 11))

x = 1;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 65, 11))

action(() => { x /* number */ });
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 65, 11))
}
else {
let x: number | undefined;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 70, 11))

x = 2;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 70, 11))

action(() => { x /* number */ });
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 70, 11))
}
}

function f5b() {
>f5b : Symbol(f5b, Decl(narrowingPastLastAssignment.ts, 74, 1))

for (let x = 0; x < 10; x++) {
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 77, 12))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 77, 12))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 77, 12))

if (x === 1 || x === 2) {
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 77, 12))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 77, 12))

action(() => { x /* 1 | 2 */ })
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 77, 12))
}
}
}

// Implicit any variables have a known type following last assignment

function f6() {
>f6 : Symbol(f6, Decl(narrowingPastLastAssignment.ts, 61, 1))
>f6 : Symbol(f6, Decl(narrowingPastLastAssignment.ts, 82, 1))

let x;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 66, 7))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 87, 7))

x = "abc";
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 66, 7))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 87, 7))

action(() => { x }); // Error
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 66, 7))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 87, 7))

x = 42;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 66, 7))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 87, 7))

action(() => { x /* number */ });
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 66, 7))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 87, 7))
}

// Narrowings on catch variables are preserved past last assignment

function f7() {
>f7 : Symbol(f7, Decl(narrowingPastLastAssignment.ts, 71, 1))
>f7 : Symbol(f7, Decl(narrowingPastLastAssignment.ts, 92, 1))

try {
}
catch (e) {
>e : Symbol(e, Decl(narrowingPastLastAssignment.ts, 78, 11))
>e : Symbol(e, Decl(narrowingPastLastAssignment.ts, 99, 11))

if (e instanceof Error) {
>e : Symbol(e, Decl(narrowingPastLastAssignment.ts, 78, 11))
>e : Symbol(e, Decl(narrowingPastLastAssignment.ts, 99, 11))
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --))

let f = () => { e /* Error */ }
>f : Symbol(f, Decl(narrowingPastLastAssignment.ts, 80, 15))
>e : Symbol(e, Decl(narrowingPastLastAssignment.ts, 78, 11))
>f : Symbol(f, Decl(narrowingPastLastAssignment.ts, 101, 15))
>e : Symbol(e, Decl(narrowingPastLastAssignment.ts, 99, 11))
}
}
}

// Narrowings are not preserved for global variables

let g: string | number;
>g : Symbol(g, Decl(narrowingPastLastAssignment.ts, 108, 3))

g = "abc";
>g : Symbol(g, Decl(narrowingPastLastAssignment.ts, 108, 3))

action(() => { g /* string | number */ });
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>g : Symbol(g, Decl(narrowingPastLastAssignment.ts, 108, 3))

// Narrowings are not preserved for exported namespace members

namespace Foo {
>Foo : Symbol(Foo, Decl(narrowingPastLastAssignment.ts, 110, 42))

export let x: string | number;
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 115, 14))

x = "abc";
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 115, 14))

action(() => { x /* string | number */ });
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>x : Symbol(x, Decl(narrowingPastLastAssignment.ts, 115, 14))

let y: string | number;
>y : Symbol(y, Decl(narrowingPastLastAssignment.ts, 118, 7))

y = "abc";
>y : Symbol(y, Decl(narrowingPastLastAssignment.ts, 118, 7))

action(() => { y /* string */ });
>action : Symbol(action, Decl(narrowingPastLastAssignment.ts, 0, 0))
>y : Symbol(y, Decl(narrowingPastLastAssignment.ts, 118, 7))
}

// Repros from #35124

function f10() {
>f10 : Symbol(f10, Decl(narrowingPastLastAssignment.ts, 83, 1))
>f10 : Symbol(f10, Decl(narrowingPastLastAssignment.ts, 121, 1))

let i: number | undefined;
>i : Symbol(i, Decl(narrowingPastLastAssignment.ts, 88, 7))
>i : Symbol(i, Decl(narrowingPastLastAssignment.ts, 126, 7))

i = 0;
>i : Symbol(i, Decl(narrowingPastLastAssignment.ts, 88, 7))
>i : Symbol(i, Decl(narrowingPastLastAssignment.ts, 126, 7))

return (k: number) => k === i + 1;
>k : Symbol(k, Decl(narrowingPastLastAssignment.ts, 90, 12))
>k : Symbol(k, Decl(narrowingPastLastAssignment.ts, 90, 12))
>i : Symbol(i, Decl(narrowingPastLastAssignment.ts, 88, 7))
>k : Symbol(k, Decl(narrowingPastLastAssignment.ts, 128, 12))
>k : Symbol(k, Decl(narrowingPastLastAssignment.ts, 128, 12))
>i : Symbol(i, Decl(narrowingPastLastAssignment.ts, 126, 7))
}

function makeAdder(n?: number) {
>makeAdder : Symbol(makeAdder, Decl(narrowingPastLastAssignment.ts, 91, 1))
>n : Symbol(n, Decl(narrowingPastLastAssignment.ts, 93, 19))
>makeAdder : Symbol(makeAdder, Decl(narrowingPastLastAssignment.ts, 129, 1))
>n : Symbol(n, Decl(narrowingPastLastAssignment.ts, 131, 19))

n ??= 0;
>n : Symbol(n, Decl(narrowingPastLastAssignment.ts, 93, 19))
>n : Symbol(n, Decl(narrowingPastLastAssignment.ts, 131, 19))

return (m: number) => n + m;
>m : Symbol(m, Decl(narrowingPastLastAssignment.ts, 95, 12))
>n : Symbol(n, Decl(narrowingPastLastAssignment.ts, 93, 19))
>m : Symbol(m, Decl(narrowingPastLastAssignment.ts, 95, 12))
>m : Symbol(m, Decl(narrowingPastLastAssignment.ts, 133, 12))
>n : Symbol(n, Decl(narrowingPastLastAssignment.ts, 131, 19))
>m : Symbol(m, Decl(narrowingPastLastAssignment.ts, 133, 12))
}

function f11() {
>f11 : Symbol(f11, Decl(narrowingPastLastAssignment.ts, 96, 1))
>f11 : Symbol(f11, Decl(narrowingPastLastAssignment.ts, 134, 1))

let r;
>r : Symbol(r, Decl(narrowingPastLastAssignment.ts, 99, 7))
>r : Symbol(r, Decl(narrowingPastLastAssignment.ts, 137, 7))

r = "b";
>r : Symbol(r, Decl(narrowingPastLastAssignment.ts, 99, 7))
>r : Symbol(r, Decl(narrowingPastLastAssignment.ts, 137, 7))

() => r;
>r : Symbol(r, Decl(narrowingPastLastAssignment.ts, 99, 7))
>r : Symbol(r, Decl(narrowingPastLastAssignment.ts, 137, 7))
}

// Repro from #52104

const fooMap: Map<string,Array<number>> = new Map()
>fooMap : Symbol(fooMap, Decl(narrowingPastLastAssignment.ts, 106, 5))
function f12() {
>f12 : Symbol(f12, Decl(narrowingPastLastAssignment.ts, 140, 1))

const fooMap: Map<string,Array<number>> = new Map()
>fooMap : Symbol(fooMap, Decl(narrowingPastLastAssignment.ts, 145, 9))
>Map : Symbol(Map, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --) ... and 4 more)
>Map : Symbol(Map, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))

const values = [1, 2, 3, 4, 5];
>values : Symbol(values, Decl(narrowingPastLastAssignment.ts, 107, 5))
const values = [1, 2, 3, 4, 5];
>values : Symbol(values, Decl(narrowingPastLastAssignment.ts, 146, 9))

let foo = fooMap.get("a");
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 108, 3))
let foo = fooMap.get("a");
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 147, 7))
>fooMap.get : Symbol(Map.get, Decl(lib.es2015.collection.d.ts, --, --))
>fooMap : Symbol(fooMap, Decl(narrowingPastLastAssignment.ts, 106, 5))
>fooMap : Symbol(fooMap, Decl(narrowingPastLastAssignment.ts, 145, 9))
>get : Symbol(Map.get, Decl(lib.es2015.collection.d.ts, --, --))

if (foo == null) {
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 108, 3))
if (foo == null) {
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 147, 7))

foo = [];
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 108, 3))
}
values.forEach(v => foo.push(v));
foo = [];
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 147, 7))
}
values.forEach(v => foo.push(v));
>values.forEach : Symbol(Array.forEach, Decl(lib.es5.d.ts, --, --))
>values : Symbol(values, Decl(narrowingPastLastAssignment.ts, 107, 5))
>values : Symbol(values, Decl(narrowingPastLastAssignment.ts, 146, 9))
>forEach : Symbol(Array.forEach, Decl(lib.es5.d.ts, --, --))
>v : Symbol(v, Decl(narrowingPastLastAssignment.ts, 112, 15))
>v : Symbol(v, Decl(narrowingPastLastAssignment.ts, 151, 19))
>foo.push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 108, 3))
>foo : Symbol(foo, Decl(narrowingPastLastAssignment.ts, 147, 7))
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
>v : Symbol(v, Decl(narrowingPastLastAssignment.ts, 112, 15))
>v : Symbol(v, Decl(narrowingPastLastAssignment.ts, 151, 19))
}

0 comments on commit e0ccb0d

Please sign in to comment.