@@ -61,7 +61,7 @@ namespace ts {
6161 const noImplicitThis = compilerOptions.noImplicitThis === undefined ? compilerOptions.strict : compilerOptions.noImplicitThis;
6262
6363 const emitResolver = createResolver();
64- let nodeBuilderCache: NodeBuilder | undefined ;
64+ const nodeBuilder = getNodeBuilder() ;
6565
6666 const undefinedSymbol = createSymbol(SymbolFlags.Property, "undefined");
6767 undefinedSymbol.declarations = [];
@@ -107,9 +107,9 @@ namespace ts {
107107 getParameterType: getTypeAtPosition,
108108 getReturnTypeOfSignature,
109109 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,
113113 getSymbolsInScope: (location, meaning) => {
114114 location = getParseTreeNode(location);
115115 return location ? getSymbolsInScope(location, meaning) : [];
@@ -2203,43 +2203,36 @@ namespace ts {
22032203 }
22042204
22052205 function getNodeBuilder(): NodeBuilder {
2206- if (nodeBuilderCache) {
2207- return nodeBuilderCache;
2208- }
22092206
22102207 let encounteredError = false;
22112208
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+ }
22162234 };
22172235
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-
22432236 function typeToTypeNodeHelper(type: Type, enclosingDeclaration: Node, flags: NodeBuilderFlags): TypeNode {
22442237 let inObjectTypeLiteral = false;
22452238 let checkAlias = true;
@@ -2597,13 +2590,12 @@ namespace ts {
25972590
25982591 const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => typeParameterToDeclaration(parameter, enclosingDeclaration, flags));
25992592 const parameters = signature.parameters.map(parameter => symbolToParameterDeclaration(parameter, enclosingDeclaration, flags));
2600- const type = typeToTypeNodeExceptAny(getReturnTypeOfSignature(signature));
2593+ const returnTypeNode = typeToTypeNodeExceptAny(getReturnTypeOfSignature(signature));
26012594
2602- return createSignatureDeclaration(kind, typeParameters, parameters, type );
2595+ return createSignatureDeclaration(kind, typeParameters, parameters, returnTypeNode );
26032596
26042597 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);
26072599 return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
26082600 }
26092601 }
0 commit comments