Skip to content

Commit cdb7bc9

Browse files
Prevent the converter from looping anonymous return types, see #107
1 parent a8324d1 commit cdb7bc9

File tree

4 files changed

+127
-43
lines changed

4 files changed

+127
-43
lines changed

bin/typedoc.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,10 @@ declare module td.converter {
818818
* The names of the children of the scope before inheritance has been started.
819819
*/
820820
inherited: string[];
821+
/**
822+
* A list of parent nodes that have been passed to the visit function.
823+
*/
824+
visitStack: ts.Node[];
821825
/**
822826
* Next free symbol id used by [[getSymbolID]].
823827
*/

bin/typedoc.js

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,7 @@ var td;
16741674
this.fileNames = fileNames;
16751675
this.checker = checker;
16761676
this.program = program;
1677+
this.visitStack = [];
16771678
var project = new td.models.ProjectReflection(this.getOptions().name);
16781679
this.project = project;
16791680
this.scope = project;
@@ -2293,6 +2294,12 @@ var td;
22932294
* @return The resulting reflection or NULL.
22942295
*/
22952296
function visit(context, node) {
2297+
if (context.visitStack.indexOf(node) != -1) {
2298+
return null;
2299+
}
2300+
var oldVisitStack = context.visitStack;
2301+
context.visitStack = oldVisitStack.slice();
2302+
context.visitStack.push(node);
22962303
if (context.getOptions().verbose) {
22972304
var file = ts.getSourceFileOfNode(node);
22982305
var pos = ts.getLineAndCharacterOfPosition(file, node.pos);
@@ -2303,59 +2310,79 @@ var td;
23032310
context.getLogger().verbose('Visiting node of kind %s in %s (%s:%s)', node.kind.toString(), file.fileName, pos.line.toString(), pos.character.toString());
23042311
}
23052312
}
2313+
var result;
23062314
switch (node.kind) {
23072315
case 227 /* SourceFile */:
2308-
return visitSourceFile(context, node);
2316+
result = visitSourceFile(context, node);
2317+
break;
23092318
case 174 /* ClassExpression */:
23102319
case 201 /* ClassDeclaration */:
2311-
return visitClassDeclaration(context, node);
2320+
result = visitClassDeclaration(context, node);
2321+
break;
23122322
case 202 /* InterfaceDeclaration */:
2313-
return visitInterfaceDeclaration(context, node);
2323+
result = visitInterfaceDeclaration(context, node);
2324+
break;
23142325
case 205 /* ModuleDeclaration */:
2315-
return visitModuleDeclaration(context, node);
2326+
result = visitModuleDeclaration(context, node);
2327+
break;
23162328
case 180 /* VariableStatement */:
2317-
return visitVariableStatement(context, node);
2329+
result = visitVariableStatement(context, node);
2330+
break;
23182331
case 131 /* PropertySignature */:
23192332
case 132 /* PropertyDeclaration */:
23202333
case 224 /* PropertyAssignment */:
23212334
case 225 /* ShorthandPropertyAssignment */:
23222335
case 198 /* VariableDeclaration */:
23232336
case 152 /* BindingElement */:
2324-
return visitVariableDeclaration(context, node);
2337+
result = visitVariableDeclaration(context, node);
2338+
break;
23252339
case 204 /* EnumDeclaration */:
2326-
return visitEnumDeclaration(context, node);
2340+
result = visitEnumDeclaration(context, node);
2341+
break;
23272342
case 226 /* EnumMember */:
2328-
return visitEnumMember(context, node);
2343+
result = visitEnumMember(context, node);
2344+
break;
23292345
case 135 /* Constructor */:
23302346
case 139 /* ConstructSignature */:
2331-
return visitConstructor(context, node);
2347+
result = visitConstructor(context, node);
2348+
break;
23322349
case 133 /* MethodSignature */:
23332350
case 134 /* MethodDeclaration */:
23342351
case 200 /* FunctionDeclaration */:
2335-
return visitFunctionDeclaration(context, node);
2352+
result = visitFunctionDeclaration(context, node);
2353+
break;
23362354
case 136 /* GetAccessor */:
2337-
return visitGetAccessorDeclaration(context, node);
2355+
result = visitGetAccessorDeclaration(context, node);
2356+
break;
23382357
case 137 /* SetAccessor */:
2339-
return visitSetAccessorDeclaration(context, node);
2358+
result = visitSetAccessorDeclaration(context, node);
2359+
break;
23402360
case 138 /* CallSignature */:
23412361
case 142 /* FunctionType */:
2342-
return visitCallSignatureDeclaration(context, node);
2362+
result = visitCallSignatureDeclaration(context, node);
2363+
break;
23432364
case 140 /* IndexSignature */:
2344-
return visitIndexSignatureDeclaration(context, node);
2365+
result = visitIndexSignatureDeclaration(context, node);
2366+
break;
23452367
case 179 /* Block */:
23462368
case 206 /* ModuleBlock */:
2347-
return visitBlock(context, node);
2369+
result = visitBlock(context, node);
2370+
break;
23482371
case 154 /* ObjectLiteralExpression */:
2349-
return visitObjectLiteral(context, node);
2372+
result = visitObjectLiteral(context, node);
2373+
break;
23502374
case 145 /* TypeLiteral */:
2351-
return visitTypeLiteral(context, node);
2375+
result = visitTypeLiteral(context, node);
2376+
break;
23522377
case 214 /* ExportAssignment */:
2353-
return visitExportAssignment(context, node);
2378+
result = visitExportAssignment(context, node);
2379+
break;
23542380
case 203 /* TypeAliasDeclaration */:
2355-
return visitTypeAliasDeclaration(context, node);
2356-
default:
2357-
return null;
2381+
result = visitTypeAliasDeclaration(context, node);
2382+
break;
23582383
}
2384+
context.visitStack = oldVisitStack;
2385+
return result;
23592386
}
23602387
converter.visit = visit;
23612388
function visitBlock(context, node) {

src/td/converter/Context.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ module td.converter
7575
*/
7676
inherited:string[];
7777

78+
/**
79+
* A list of parent nodes that have been passed to the visit function.
80+
*/
81+
visitStack:ts.Node[];
82+
7883
/**
7984
* Next free symbol id used by [[getSymbolID]].
8085
*/
@@ -99,6 +104,7 @@ module td.converter
99104
this.fileNames = fileNames;
100105
this.checker = checker;
101106
this.program = program;
107+
this.visitStack = [];
102108

103109
var project = new models.ProjectReflection(this.getOptions().name);
104110
this.project = project;

src/td/converter/converters/convertNode.ts

Lines changed: 69 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ module td.converter
4343
* @return The resulting reflection or NULL.
4444
*/
4545
export function visit(context:Context, node:ts.Node):models.Reflection {
46+
if (context.visitStack.indexOf(node) != -1) {
47+
return null;
48+
}
49+
50+
var oldVisitStack = context.visitStack;
51+
context.visitStack = oldVisitStack.slice();
52+
context.visitStack.push(node);
53+
4654
if (context.getOptions().verbose) {
4755
var file = ts.getSourceFileOfNode(node);
4856
var pos = ts.getLineAndCharacterOfPosition(file, node.pos);
@@ -61,59 +69,98 @@ module td.converter
6169
}
6270
}
6371

72+
var result:models.Reflection;
6473
switch (node.kind) {
6574
case ts.SyntaxKind.SourceFile:
66-
return visitSourceFile(context, <ts.SourceFile>node);
75+
result = visitSourceFile(context, <ts.SourceFile>node);
76+
break;
77+
6778
case ts.SyntaxKind.ClassExpression:
6879
case ts.SyntaxKind.ClassDeclaration:
69-
return visitClassDeclaration(context, <ts.ClassDeclaration>node);
80+
result = visitClassDeclaration(context, <ts.ClassDeclaration>node);
81+
break;
82+
7083
case ts.SyntaxKind.InterfaceDeclaration:
71-
return visitInterfaceDeclaration(context, <ts.InterfaceDeclaration>node);
84+
result = visitInterfaceDeclaration(context, <ts.InterfaceDeclaration>node);
85+
break;
86+
7287
case ts.SyntaxKind.ModuleDeclaration:
73-
return visitModuleDeclaration(context, <ts.ModuleDeclaration>node);
88+
result = visitModuleDeclaration(context, <ts.ModuleDeclaration>node);
89+
break;
90+
7491
case ts.SyntaxKind.VariableStatement:
75-
return visitVariableStatement(context, <ts.VariableStatement>node);
92+
result = visitVariableStatement(context, <ts.VariableStatement>node);
93+
break;
94+
7695
case ts.SyntaxKind.PropertySignature:
7796
case ts.SyntaxKind.PropertyDeclaration:
7897
case ts.SyntaxKind.PropertyAssignment:
7998
case ts.SyntaxKind.ShorthandPropertyAssignment:
8099
case ts.SyntaxKind.VariableDeclaration:
81-
case ts.SyntaxKind.BindingElement:
82-
return visitVariableDeclaration(context, <ts.VariableDeclaration>node);
100+
case ts.SyntaxKind.BindingElement:
101+
result = visitVariableDeclaration(context, <ts.VariableDeclaration>node);
102+
break;
103+
83104
case ts.SyntaxKind.EnumDeclaration:
84-
return visitEnumDeclaration(context, <ts.EnumDeclaration>node);
105+
result = visitEnumDeclaration(context, <ts.EnumDeclaration>node);
106+
break;
107+
85108
case ts.SyntaxKind.EnumMember:
86-
return visitEnumMember(context, <ts.EnumMember>node);
109+
result = visitEnumMember(context, <ts.EnumMember>node);
110+
break;
111+
87112
case ts.SyntaxKind.Constructor:
88113
case ts.SyntaxKind.ConstructSignature:
89-
return visitConstructor(context, <ts.ConstructorDeclaration>node);
114+
result = visitConstructor(context, <ts.ConstructorDeclaration>node);
115+
break;
116+
90117
case ts.SyntaxKind.MethodSignature:
91118
case ts.SyntaxKind.MethodDeclaration:
92119
case ts.SyntaxKind.FunctionDeclaration:
93-
return visitFunctionDeclaration(context, <ts.MethodDeclaration>node);
120+
result = visitFunctionDeclaration(context, <ts.MethodDeclaration>node);
121+
break;
122+
94123
case ts.SyntaxKind.GetAccessor:
95-
return visitGetAccessorDeclaration(context, <ts.SignatureDeclaration>node);
124+
result = visitGetAccessorDeclaration(context, <ts.SignatureDeclaration>node);
125+
break;
126+
96127
case ts.SyntaxKind.SetAccessor:
97-
return visitSetAccessorDeclaration(context, <ts.SignatureDeclaration>node);
128+
result = visitSetAccessorDeclaration(context, <ts.SignatureDeclaration>node);
129+
break;
130+
98131
case ts.SyntaxKind.CallSignature:
99132
case ts.SyntaxKind.FunctionType:
100-
return visitCallSignatureDeclaration(context, <ts.SignatureDeclaration>node);
133+
result = visitCallSignatureDeclaration(context, <ts.SignatureDeclaration>node);
134+
break;
135+
101136
case ts.SyntaxKind.IndexSignature:
102-
return visitIndexSignatureDeclaration(context, <ts.SignatureDeclaration>node);
137+
result = visitIndexSignatureDeclaration(context, <ts.SignatureDeclaration>node);
138+
break;
139+
103140
case ts.SyntaxKind.Block:
104141
case ts.SyntaxKind.ModuleBlock:
105-
return visitBlock(context, <ts.Block>node);
142+
result = visitBlock(context, <ts.Block>node);
143+
break;
144+
106145
case ts.SyntaxKind.ObjectLiteralExpression:
107-
return visitObjectLiteral(context, <ts.ObjectLiteralExpression>node);
146+
result = visitObjectLiteral(context, <ts.ObjectLiteralExpression>node);
147+
break;
148+
108149
case ts.SyntaxKind.TypeLiteral:
109-
return visitTypeLiteral(context, <ts.TypeLiteralNode>node);
150+
result = visitTypeLiteral(context, <ts.TypeLiteralNode>node);
151+
break;
152+
110153
case ts.SyntaxKind.ExportAssignment:
111-
return visitExportAssignment(context, <ts.ExportAssignment>node);
154+
result = visitExportAssignment(context, <ts.ExportAssignment>node);
155+
break;
156+
112157
case ts.SyntaxKind.TypeAliasDeclaration:
113-
return visitTypeAliasDeclaration(context, <ts.TypeAliasDeclaration>node);
114-
default:
115-
return null;
158+
result = visitTypeAliasDeclaration(context, <ts.TypeAliasDeclaration>node);
159+
break;
116160
}
161+
162+
context.visitStack = oldVisitStack;
163+
return result;
117164
}
118165

119166

0 commit comments

Comments
 (0)