Skip to content

Commit 5421812

Browse files
author
Arthur Ozga
committed
build builder
1 parent 82bd05b commit 5421812

File tree

1 file changed

+32
-40
lines changed

1 file changed

+32
-40
lines changed

src/compiler/checker.ts

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)