@@ -61,7 +61,7 @@ namespace ts {
61
61
const noImplicitThis = compilerOptions.noImplicitThis === undefined ? compilerOptions.strict : compilerOptions.noImplicitThis;
62
62
63
63
const emitResolver = createResolver();
64
- let nodeBuilderCache: NodeBuilder | undefined ;
64
+ const nodeBuilder = getNodeBuilder() ;
65
65
66
66
const undefinedSymbol = createSymbol(SymbolFlags.Property, "undefined");
67
67
undefinedSymbol.declarations = [];
@@ -107,9 +107,9 @@ namespace ts {
107
107
getParameterType: getTypeAtPosition,
108
108
getReturnTypeOfSignature,
109
109
getNonNullableType,
110
- typeToTypeNode: getNodeBuilder() .typeToTypeNode,
111
- indexInfoToIndexSignatureDeclaration: getNodeBuilder() .indexInfoToIndexSignatureDeclaration,
112
- signatureToSignatureDeclaration: getNodeBuilder() .signatureToSignatureDeclaration,
110
+ typeToTypeNode: nodeBuilder .typeToTypeNode,
111
+ indexInfoToIndexSignatureDeclaration: nodeBuilder .indexInfoToIndexSignatureDeclaration,
112
+ signatureToSignatureDeclaration: nodeBuilder .signatureToSignatureDeclaration,
113
113
getSymbolsInScope: (location, meaning) => {
114
114
location = getParseTreeNode(location);
115
115
return location ? getSymbolsInScope(location, meaning) : [];
@@ -2203,43 +2203,36 @@ namespace ts {
2203
2203
}
2204
2204
2205
2205
function getNodeBuilder(): NodeBuilder {
2206
- if (nodeBuilderCache) {
2207
- return nodeBuilderCache;
2208
- }
2209
2206
2210
2207
let encounteredError = false;
2211
2208
2212
- nodeBuilderCache = {
2213
- typeToTypeNode,
2214
- indexInfoToIndexSignatureDeclaration,
2215
- signatureToSignatureDeclaration
2209
+ return {
2210
+ typeToTypeNode: (type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => {
2211
+ Debug.assert(encounteredError === false, "Nested call into nodeBuilder are forbidden.");
2212
+ encounteredError = false;
2213
+ const resultingNode = typeToTypeNodeHelper(type, enclosingDeclaration, flags);
2214
+ const result = encounteredError ? undefined : resultingNode;
2215
+ encounteredError = false;
2216
+ return result;
2217
+ },
2218
+ indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => {
2219
+ Debug.assert(encounteredError === false, "Nested call into nodeBuilder are forbidden.");
2220
+ encounteredError = false;
2221
+ const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, enclosingDeclaration, flags)
2222
+ const result = encounteredError ? undefined : resultingNode;
2223
+ encounteredError = false;
2224
+ return result;
2225
+ },
2226
+ signatureToSignatureDeclaration: (signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => {
2227
+ Debug.assert(encounteredError === false, "Nested call into nodeBuilder are forbidden.");
2228
+ encounteredError = false;
2229
+ const resultingNode = signatureToSignatureDeclarationHelper(signature, kind, enclosingDeclaration, flags);
2230
+ const result = encounteredError ? undefined : resultingNode;
2231
+ encounteredError = false;
2232
+ return result;
2233
+ }
2216
2234
};
2217
2235
2218
- return nodeBuilderCache;
2219
-
2220
- function typeToTypeNode(type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): TypeNode {
2221
- const helper = () => typeToTypeNodeHelper(type, enclosingDeclaration, flags);
2222
- return callHelperWithErrorHandling(helper);
2223
- }
2224
-
2225
- function indexInfoToIndexSignatureDeclaration(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): IndexSignatureDeclaration {
2226
- const helper = () => indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, enclosingDeclaration, flags);
2227
- return callHelperWithErrorHandling(helper);
2228
- }
2229
-
2230
- function signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags): SignatureDeclaration {
2231
- const helper = () => signatureToSignatureDeclarationHelper(signature, kind, enclosingDeclaration, flags);
2232
- return callHelperWithErrorHandling(helper);
2233
- }
2234
-
2235
- function callHelperWithErrorHandling<T extends Node>(nodeBuilderHelper: () => T): T | undefined {
2236
- const encounteredErrorCache = encounteredError;
2237
- const resultingNode = nodeBuilderHelper();
2238
- const result = encounteredError ? undefined : resultingNode;
2239
- encounteredError = encounteredErrorCache;
2240
- return result;
2241
- }
2242
-
2243
2236
function typeToTypeNodeHelper(type: Type, enclosingDeclaration: Node, flags: NodeBuilderFlags): TypeNode {
2244
2237
let inObjectTypeLiteral = false;
2245
2238
let checkAlias = true;
@@ -2597,13 +2590,12 @@ namespace ts {
2597
2590
2598
2591
const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => typeParameterToDeclaration(parameter, enclosingDeclaration, flags));
2599
2592
const parameters = signature.parameters.map(parameter => symbolToParameterDeclaration(parameter, enclosingDeclaration, flags));
2600
- const type = typeToTypeNodeExceptAny(getReturnTypeOfSignature(signature));
2593
+ const returnTypeNode = typeToTypeNodeExceptAny(getReturnTypeOfSignature(signature));
2601
2594
2602
- return createSignatureDeclaration(kind, typeParameters, parameters, type );
2595
+ return createSignatureDeclaration(kind, typeParameters, parameters, returnTypeNode );
2603
2596
2604
2597
function typeToTypeNodeExceptAny(type: Type): TypeNode | undefined {
2605
- // Note, this call will *not* mark encounteredError.
2606
- const typeNode = typeToTypeNode(type, enclosingDeclaration);
2598
+ const typeNode = type && typeToTypeNodeHelper(type, enclosingDeclaration, flags);
2607
2599
return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
2608
2600
}
2609
2601
}
0 commit comments