diff --git a/tests/baselines/reference/narrowingByDiscriminantInLoop.js b/tests/baselines/reference/narrowingByDiscriminantInLoop.js new file mode 100644 index 00000000000..b58357cff5b --- /dev/null +++ b/tests/baselines/reference/narrowingByDiscriminantInLoop.js @@ -0,0 +1,82 @@ +//// [narrowingByDiscriminantInLoop.ts] +// Repro from #9977 + +type IDLMemberTypes = OperationMemberType | ConstantMemberType; + +interface IDLTypeDescription { + origin: string; +} + +interface InterfaceType { + members: IDLMemberTypes[]; +} + +interface OperationMemberType { + type: "operation"; + idlType: IDLTypeDescription | null; +} + +interface ConstantMemberType { + type: "const"; + idlType: string; +} + +function insertInterface(callbackType: InterfaceType) { + for (const memberType of callbackType.members) { + if (memberType.type === "const") { + memberType.idlType; // string + } + else if (memberType.type === "operation") { + memberType.idlType.origin; // string + (memberType.idlType as IDLTypeDescription); + } + } +} + +function insertInterface2(callbackType: InterfaceType) { + for (const memberType of callbackType.members) { + if (memberType.type === "operation") { + memberType.idlType.origin; // string + } + } +} + +function foo(memberType: IDLMemberTypes) { + if (memberType.type === "const") { + memberType.idlType; // string + } + else if (memberType.type === "operation") { + memberType.idlType.origin; // string + } +} + +//// [narrowingByDiscriminantInLoop.js] +// Repro from #9977 +function insertInterface(callbackType) { + for (var _i = 0, _a = callbackType.members; _i < _a.length; _i++) { + var memberType = _a[_i]; + if (memberType.type === "const") { + memberType.idlType; // string + } + else if (memberType.type === "operation") { + memberType.idlType.origin; // string + memberType.idlType; + } + } +} +function insertInterface2(callbackType) { + for (var _i = 0, _a = callbackType.members; _i < _a.length; _i++) { + var memberType = _a[_i]; + if (memberType.type === "operation") { + memberType.idlType.origin; // string + } + } +} +function foo(memberType) { + if (memberType.type === "const") { + memberType.idlType; // string + } + else if (memberType.type === "operation") { + memberType.idlType.origin; // string + } +} diff --git a/tests/baselines/reference/narrowingByDiscriminantInLoop.symbols b/tests/baselines/reference/narrowingByDiscriminantInLoop.symbols new file mode 100644 index 00000000000..30cd87f3c2b --- /dev/null +++ b/tests/baselines/reference/narrowingByDiscriminantInLoop.symbols @@ -0,0 +1,140 @@ +=== tests/cases/compiler/narrowingByDiscriminantInLoop.ts === +// Repro from #9977 + +type IDLMemberTypes = OperationMemberType | ConstantMemberType; +>IDLMemberTypes : Symbol(IDLMemberTypes, Decl(narrowingByDiscriminantInLoop.ts, 0, 0)) +>OperationMemberType : Symbol(OperationMemberType, Decl(narrowingByDiscriminantInLoop.ts, 10, 1)) +>ConstantMemberType : Symbol(ConstantMemberType, Decl(narrowingByDiscriminantInLoop.ts, 15, 1)) + +interface IDLTypeDescription { +>IDLTypeDescription : Symbol(IDLTypeDescription, Decl(narrowingByDiscriminantInLoop.ts, 2, 63)) + + origin: string; +>origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) +} + +interface InterfaceType { +>InterfaceType : Symbol(InterfaceType, Decl(narrowingByDiscriminantInLoop.ts, 6, 1)) + + members: IDLMemberTypes[]; +>members : Symbol(InterfaceType.members, Decl(narrowingByDiscriminantInLoop.ts, 8, 25)) +>IDLMemberTypes : Symbol(IDLMemberTypes, Decl(narrowingByDiscriminantInLoop.ts, 0, 0)) +} + +interface OperationMemberType { +>OperationMemberType : Symbol(OperationMemberType, Decl(narrowingByDiscriminantInLoop.ts, 10, 1)) + + type: "operation"; +>type : Symbol(OperationMemberType.type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31)) + + idlType: IDLTypeDescription | null; +>idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>IDLTypeDescription : Symbol(IDLTypeDescription, Decl(narrowingByDiscriminantInLoop.ts, 2, 63)) +} + +interface ConstantMemberType { +>ConstantMemberType : Symbol(ConstantMemberType, Decl(narrowingByDiscriminantInLoop.ts, 15, 1)) + + type: "const"; +>type : Symbol(ConstantMemberType.type, Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) + + idlType: string; +>idlType : Symbol(ConstantMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 18, 18)) +} + +function insertInterface(callbackType: InterfaceType) { +>insertInterface : Symbol(insertInterface, Decl(narrowingByDiscriminantInLoop.ts, 20, 1)) +>callbackType : Symbol(callbackType, Decl(narrowingByDiscriminantInLoop.ts, 22, 25)) +>InterfaceType : Symbol(InterfaceType, Decl(narrowingByDiscriminantInLoop.ts, 6, 1)) + + for (const memberType of callbackType.members) { +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 23, 14)) +>callbackType.members : Symbol(InterfaceType.members, Decl(narrowingByDiscriminantInLoop.ts, 8, 25)) +>callbackType : Symbol(callbackType, Decl(narrowingByDiscriminantInLoop.ts, 22, 25)) +>members : Symbol(InterfaceType.members, Decl(narrowingByDiscriminantInLoop.ts, 8, 25)) + + if (memberType.type === "const") { +>memberType.type : Symbol(type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31), Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 23, 14)) +>type : Symbol(type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31), Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) + + memberType.idlType; // string +>memberType.idlType : Symbol(ConstantMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 18, 18)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 23, 14)) +>idlType : Symbol(ConstantMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 18, 18)) + } + else if (memberType.type === "operation") { +>memberType.type : Symbol(OperationMemberType.type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 23, 14)) +>type : Symbol(OperationMemberType.type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31)) + + memberType.idlType.origin; // string +>memberType.idlType.origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) +>memberType.idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 23, 14)) +>idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) + + (memberType.idlType as IDLTypeDescription); +>memberType.idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 23, 14)) +>idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>IDLTypeDescription : Symbol(IDLTypeDescription, Decl(narrowingByDiscriminantInLoop.ts, 2, 63)) + } + } +} + +function insertInterface2(callbackType: InterfaceType) { +>insertInterface2 : Symbol(insertInterface2, Decl(narrowingByDiscriminantInLoop.ts, 32, 1)) +>callbackType : Symbol(callbackType, Decl(narrowingByDiscriminantInLoop.ts, 34, 26)) +>InterfaceType : Symbol(InterfaceType, Decl(narrowingByDiscriminantInLoop.ts, 6, 1)) + + for (const memberType of callbackType.members) { +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 35, 14)) +>callbackType.members : Symbol(InterfaceType.members, Decl(narrowingByDiscriminantInLoop.ts, 8, 25)) +>callbackType : Symbol(callbackType, Decl(narrowingByDiscriminantInLoop.ts, 34, 26)) +>members : Symbol(InterfaceType.members, Decl(narrowingByDiscriminantInLoop.ts, 8, 25)) + + if (memberType.type === "operation") { +>memberType.type : Symbol(type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31), Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 35, 14)) +>type : Symbol(type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31), Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) + + memberType.idlType.origin; // string +>memberType.idlType.origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) +>memberType.idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 35, 14)) +>idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) + } + } +} + +function foo(memberType: IDLMemberTypes) { +>foo : Symbol(foo, Decl(narrowingByDiscriminantInLoop.ts, 40, 1)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 42, 13)) +>IDLMemberTypes : Symbol(IDLMemberTypes, Decl(narrowingByDiscriminantInLoop.ts, 0, 0)) + + if (memberType.type === "const") { +>memberType.type : Symbol(type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31), Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 42, 13)) +>type : Symbol(type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31), Decl(narrowingByDiscriminantInLoop.ts, 17, 30)) + + memberType.idlType; // string +>memberType.idlType : Symbol(ConstantMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 18, 18)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 42, 13)) +>idlType : Symbol(ConstantMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 18, 18)) + } + else if (memberType.type === "operation") { +>memberType.type : Symbol(OperationMemberType.type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 42, 13)) +>type : Symbol(OperationMemberType.type, Decl(narrowingByDiscriminantInLoop.ts, 12, 31)) + + memberType.idlType.origin; // string +>memberType.idlType.origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) +>memberType.idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>memberType : Symbol(memberType, Decl(narrowingByDiscriminantInLoop.ts, 42, 13)) +>idlType : Symbol(OperationMemberType.idlType, Decl(narrowingByDiscriminantInLoop.ts, 13, 22)) +>origin : Symbol(IDLTypeDescription.origin, Decl(narrowingByDiscriminantInLoop.ts, 4, 30)) + } +} diff --git a/tests/baselines/reference/narrowingByDiscriminantInLoop.types b/tests/baselines/reference/narrowingByDiscriminantInLoop.types new file mode 100644 index 00000000000..db8cb502a13 --- /dev/null +++ b/tests/baselines/reference/narrowingByDiscriminantInLoop.types @@ -0,0 +1,153 @@ +=== tests/cases/compiler/narrowingByDiscriminantInLoop.ts === +// Repro from #9977 + +type IDLMemberTypes = OperationMemberType | ConstantMemberType; +>IDLMemberTypes : IDLMemberTypes +>OperationMemberType : OperationMemberType +>ConstantMemberType : ConstantMemberType + +interface IDLTypeDescription { +>IDLTypeDescription : IDLTypeDescription + + origin: string; +>origin : string +} + +interface InterfaceType { +>InterfaceType : InterfaceType + + members: IDLMemberTypes[]; +>members : IDLMemberTypes[] +>IDLMemberTypes : IDLMemberTypes +} + +interface OperationMemberType { +>OperationMemberType : OperationMemberType + + type: "operation"; +>type : "operation" + + idlType: IDLTypeDescription | null; +>idlType : IDLTypeDescription +>IDLTypeDescription : IDLTypeDescription +>null : null +} + +interface ConstantMemberType { +>ConstantMemberType : ConstantMemberType + + type: "const"; +>type : "const" + + idlType: string; +>idlType : string +} + +function insertInterface(callbackType: InterfaceType) { +>insertInterface : (callbackType: InterfaceType) => void +>callbackType : InterfaceType +>InterfaceType : InterfaceType + + for (const memberType of callbackType.members) { +>memberType : IDLMemberTypes +>callbackType.members : IDLMemberTypes[] +>callbackType : InterfaceType +>members : IDLMemberTypes[] + + if (memberType.type === "const") { +>memberType.type === "const" : boolean +>memberType.type : "operation" | "const" +>memberType : IDLMemberTypes +>type : "operation" | "const" +>"const" : "const" + + memberType.idlType; // string +>memberType.idlType : string +>memberType : ConstantMemberType +>idlType : string + } + else if (memberType.type === "operation") { +>memberType.type === "operation" : boolean +>memberType.type : "operation" +>memberType : OperationMemberType +>type : "operation" +>"operation" : "operation" + + memberType.idlType.origin; // string +>memberType.idlType.origin : string +>memberType.idlType : IDLTypeDescription +>memberType : OperationMemberType +>idlType : IDLTypeDescription +>origin : string + + (memberType.idlType as IDLTypeDescription); +>(memberType.idlType as IDLTypeDescription) : IDLTypeDescription +>memberType.idlType as IDLTypeDescription : IDLTypeDescription +>memberType.idlType : IDLTypeDescription +>memberType : OperationMemberType +>idlType : IDLTypeDescription +>IDLTypeDescription : IDLTypeDescription + } + } +} + +function insertInterface2(callbackType: InterfaceType) { +>insertInterface2 : (callbackType: InterfaceType) => void +>callbackType : InterfaceType +>InterfaceType : InterfaceType + + for (const memberType of callbackType.members) { +>memberType : IDLMemberTypes +>callbackType.members : IDLMemberTypes[] +>callbackType : InterfaceType +>members : IDLMemberTypes[] + + if (memberType.type === "operation") { +>memberType.type === "operation" : boolean +>memberType.type : "operation" | "const" +>memberType : IDLMemberTypes +>type : "operation" | "const" +>"operation" : "operation" + + memberType.idlType.origin; // string +>memberType.idlType.origin : string +>memberType.idlType : IDLTypeDescription +>memberType : OperationMemberType +>idlType : IDLTypeDescription +>origin : string + } + } +} + +function foo(memberType: IDLMemberTypes) { +>foo : (memberType: IDLMemberTypes) => void +>memberType : IDLMemberTypes +>IDLMemberTypes : IDLMemberTypes + + if (memberType.type === "const") { +>memberType.type === "const" : boolean +>memberType.type : "operation" | "const" +>memberType : IDLMemberTypes +>type : "operation" | "const" +>"const" : "const" + + memberType.idlType; // string +>memberType.idlType : string +>memberType : ConstantMemberType +>idlType : string + } + else if (memberType.type === "operation") { +>memberType.type === "operation" : boolean +>memberType.type : "operation" +>memberType : OperationMemberType +>type : "operation" +>"operation" : "operation" + + memberType.idlType.origin; // string +>memberType.idlType.origin : string +>memberType.idlType : IDLTypeDescription +>memberType : OperationMemberType +>idlType : IDLTypeDescription +>origin : string + } +} diff --git a/tests/cases/compiler/narrowingByDiscriminantInLoop.ts b/tests/cases/compiler/narrowingByDiscriminantInLoop.ts new file mode 100644 index 00000000000..d9519c57a62 --- /dev/null +++ b/tests/cases/compiler/narrowingByDiscriminantInLoop.ts @@ -0,0 +1,50 @@ +// Repro from #9977 + +type IDLMemberTypes = OperationMemberType | ConstantMemberType; + +interface IDLTypeDescription { + origin: string; +} + +interface InterfaceType { + members: IDLMemberTypes[]; +} + +interface OperationMemberType { + type: "operation"; + idlType: IDLTypeDescription | null; +} + +interface ConstantMemberType { + type: "const"; + idlType: string; +} + +function insertInterface(callbackType: InterfaceType) { + for (const memberType of callbackType.members) { + if (memberType.type === "const") { + memberType.idlType; // string + } + else if (memberType.type === "operation") { + memberType.idlType.origin; // string + (memberType.idlType as IDLTypeDescription); + } + } +} + +function insertInterface2(callbackType: InterfaceType) { + for (const memberType of callbackType.members) { + if (memberType.type === "operation") { + memberType.idlType.origin; // string + } + } +} + +function foo(memberType: IDLMemberTypes) { + if (memberType.type === "const") { + memberType.idlType; // string + } + else if (memberType.type === "operation") { + memberType.idlType.origin; // string + } +} \ No newline at end of file