mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge pull request #4509 from Microsoft/noDedupeTupleTypes
Fix stack overflow with recursive tuple types
This commit is contained in:
@@ -3119,7 +3119,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
function resolveTupleTypeMembers(type: TupleType) {
|
||||
let arrayType = resolveStructuredTypeMembers(createArrayType(getUnionType(type.elementTypes)));
|
||||
let arrayType = resolveStructuredTypeMembers(createArrayType(getUnionType(type.elementTypes, /*noDeduplication*/ true)));
|
||||
let members = createTupleTypeMemberSymbols(type.elementTypes);
|
||||
addInheritedMembers(members, arrayType.properties);
|
||||
setObjectTypeMembers(type, members, arrayType.callSignatures, arrayType.constructSignatures, arrayType.stringIndexType, arrayType.numberIndexType);
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
//// [recursiveTupleTypes1.ts]
|
||||
interface Tree1 {
|
||||
children: [Tree1, Tree2];
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
children: [Tree2, Tree1];
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
let tree2: Tree2;
|
||||
tree1 = tree2;
|
||||
tree2 = tree1;
|
||||
|
||||
|
||||
//// [recursiveTupleTypes1.js]
|
||||
var tree1;
|
||||
var tree2;
|
||||
tree1 = tree2;
|
||||
tree2 = tree1;
|
||||
@@ -0,0 +1,35 @@
|
||||
=== tests/cases/compiler/recursiveTupleTypes1.ts ===
|
||||
interface Tree1 {
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes1.ts, 0, 0))
|
||||
|
||||
children: [Tree1, Tree2];
|
||||
>children : Symbol(children, Decl(recursiveTupleTypes1.ts, 0, 17))
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes1.ts, 0, 0))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes1.ts, 2, 1))
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes1.ts, 2, 1))
|
||||
|
||||
children: [Tree2, Tree1];
|
||||
>children : Symbol(children, Decl(recursiveTupleTypes1.ts, 4, 17))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes1.ts, 2, 1))
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes1.ts, 0, 0))
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
>tree1 : Symbol(tree1, Decl(recursiveTupleTypes1.ts, 8, 3))
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes1.ts, 0, 0))
|
||||
|
||||
let tree2: Tree2;
|
||||
>tree2 : Symbol(tree2, Decl(recursiveTupleTypes1.ts, 9, 3))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes1.ts, 2, 1))
|
||||
|
||||
tree1 = tree2;
|
||||
>tree1 : Symbol(tree1, Decl(recursiveTupleTypes1.ts, 8, 3))
|
||||
>tree2 : Symbol(tree2, Decl(recursiveTupleTypes1.ts, 9, 3))
|
||||
|
||||
tree2 = tree1;
|
||||
>tree2 : Symbol(tree2, Decl(recursiveTupleTypes1.ts, 9, 3))
|
||||
>tree1 : Symbol(tree1, Decl(recursiveTupleTypes1.ts, 8, 3))
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
=== tests/cases/compiler/recursiveTupleTypes1.ts ===
|
||||
interface Tree1 {
|
||||
>Tree1 : Tree1
|
||||
|
||||
children: [Tree1, Tree2];
|
||||
>children : [Tree1, Tree2]
|
||||
>Tree1 : Tree1
|
||||
>Tree2 : Tree2
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
>Tree2 : Tree2
|
||||
|
||||
children: [Tree2, Tree1];
|
||||
>children : [Tree2, Tree1]
|
||||
>Tree2 : Tree2
|
||||
>Tree1 : Tree1
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
>tree1 : Tree1
|
||||
>Tree1 : Tree1
|
||||
|
||||
let tree2: Tree2;
|
||||
>tree2 : Tree2
|
||||
>Tree2 : Tree2
|
||||
|
||||
tree1 = tree2;
|
||||
>tree1 = tree2 : Tree2
|
||||
>tree1 : Tree1
|
||||
>tree2 : Tree2
|
||||
|
||||
tree2 = tree1;
|
||||
>tree2 = tree1 : Tree1
|
||||
>tree2 : Tree2
|
||||
>tree1 : Tree1
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
//// [recursiveTupleTypes2.ts]
|
||||
interface Tree1 {
|
||||
children: [Tree1, Tree2];
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
children: [Tree2, Tree2];
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
let tree2: Tree2;
|
||||
tree1 = tree2;
|
||||
tree2 = tree1;
|
||||
|
||||
|
||||
//// [recursiveTupleTypes2.js]
|
||||
var tree1;
|
||||
var tree2;
|
||||
tree1 = tree2;
|
||||
tree2 = tree1;
|
||||
@@ -0,0 +1,35 @@
|
||||
=== tests/cases/compiler/recursiveTupleTypes2.ts ===
|
||||
interface Tree1 {
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes2.ts, 0, 0))
|
||||
|
||||
children: [Tree1, Tree2];
|
||||
>children : Symbol(children, Decl(recursiveTupleTypes2.ts, 0, 17))
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes2.ts, 0, 0))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes2.ts, 2, 1))
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes2.ts, 2, 1))
|
||||
|
||||
children: [Tree2, Tree2];
|
||||
>children : Symbol(children, Decl(recursiveTupleTypes2.ts, 4, 17))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes2.ts, 2, 1))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes2.ts, 2, 1))
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
>tree1 : Symbol(tree1, Decl(recursiveTupleTypes2.ts, 8, 3))
|
||||
>Tree1 : Symbol(Tree1, Decl(recursiveTupleTypes2.ts, 0, 0))
|
||||
|
||||
let tree2: Tree2;
|
||||
>tree2 : Symbol(tree2, Decl(recursiveTupleTypes2.ts, 9, 3))
|
||||
>Tree2 : Symbol(Tree2, Decl(recursiveTupleTypes2.ts, 2, 1))
|
||||
|
||||
tree1 = tree2;
|
||||
>tree1 : Symbol(tree1, Decl(recursiveTupleTypes2.ts, 8, 3))
|
||||
>tree2 : Symbol(tree2, Decl(recursiveTupleTypes2.ts, 9, 3))
|
||||
|
||||
tree2 = tree1;
|
||||
>tree2 : Symbol(tree2, Decl(recursiveTupleTypes2.ts, 9, 3))
|
||||
>tree1 : Symbol(tree1, Decl(recursiveTupleTypes2.ts, 8, 3))
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
=== tests/cases/compiler/recursiveTupleTypes2.ts ===
|
||||
interface Tree1 {
|
||||
>Tree1 : Tree1
|
||||
|
||||
children: [Tree1, Tree2];
|
||||
>children : [Tree1, Tree2]
|
||||
>Tree1 : Tree1
|
||||
>Tree2 : Tree2
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
>Tree2 : Tree2
|
||||
|
||||
children: [Tree2, Tree2];
|
||||
>children : [Tree2, Tree2]
|
||||
>Tree2 : Tree2
|
||||
>Tree2 : Tree2
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
>tree1 : Tree1
|
||||
>Tree1 : Tree1
|
||||
|
||||
let tree2: Tree2;
|
||||
>tree2 : Tree2
|
||||
>Tree2 : Tree2
|
||||
|
||||
tree1 = tree2;
|
||||
>tree1 = tree2 : Tree2
|
||||
>tree1 : Tree1
|
||||
>tree2 : Tree2
|
||||
|
||||
tree2 = tree1;
|
||||
>tree2 = tree1 : Tree1
|
||||
>tree2 : Tree2
|
||||
>tree1 : Tree1
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
interface Tree1 {
|
||||
children: [Tree1, Tree2];
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
children: [Tree2, Tree1];
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
let tree2: Tree2;
|
||||
tree1 = tree2;
|
||||
tree2 = tree1;
|
||||
@@ -0,0 +1,12 @@
|
||||
interface Tree1 {
|
||||
children: [Tree1, Tree2];
|
||||
}
|
||||
|
||||
interface Tree2 {
|
||||
children: [Tree2, Tree2];
|
||||
}
|
||||
|
||||
let tree1: Tree1;
|
||||
let tree2: Tree2;
|
||||
tree1 = tree2;
|
||||
tree2 = tree1;
|
||||
Reference in New Issue
Block a user