Merge pull request #4509 from Microsoft/noDedupeTupleTypes

Fix stack overflow with recursive tuple types
This commit is contained in:
Anders Hejlsberg
2015-08-27 16:25:25 -07:00
9 changed files with 209 additions and 1 deletions
+1 -1
View File
@@ -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;