@@ -3052,73 +3052,36 @@ namespace ts {
3052
3052
3053
3053
function createNodeBuilder() {
3054
3054
return {
3055
- typeToTypeNode: (type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3056
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3057
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3058
- const resultingNode = typeToTypeNodeHelper(type, context);
3059
- const result = context.encounteredError ? undefined : resultingNode;
3060
- return result;
3061
- },
3062
- indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3063
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3064
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3065
- const resultingNode = indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, context);
3066
- const result = context.encounteredError ? undefined : resultingNode;
3067
- return result!; // TODO: GH#18217
3068
- },
3069
- signatureToSignatureDeclaration: (signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3070
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3071
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3072
- const resultingNode = signatureToSignatureDeclarationHelper(signature, kind, context);
3073
- const result = context.encounteredError ? undefined : resultingNode;
3074
- return result;
3075
- },
3076
- symbolToEntityName: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3077
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3078
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3079
- const resultingNode = symbolToName(symbol, context, meaning, /*expectsIdentifier*/ false);
3080
- const result = context.encounteredError ? undefined : resultingNode;
3081
- return result;
3082
- },
3083
- symbolToExpression: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3084
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3085
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3086
- const resultingNode = symbolToExpression(symbol, context, meaning);
3087
- const result = context.encounteredError ? undefined : resultingNode;
3088
- return result;
3089
- },
3090
- symbolToTypeParameterDeclarations: (symbol: Symbol, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3091
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3092
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3093
- const resultingNode = typeParametersToTypeParameterDeclarations(symbol, context);
3094
- const result = context.encounteredError ? undefined : resultingNode;
3095
- return result;
3096
- },
3097
- symbolToParameterDeclaration: (symbol: Symbol, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3098
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3099
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3100
- const resultingNode = symbolToParameterDeclaration(symbol, context);
3101
- const result = context.encounteredError ? undefined : resultingNode;
3102
- return result;
3103
- },
3104
- typeParameterToDeclaration: (parameter: TypeParameter, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => {
3105
- Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3106
- const context = createNodeBuilderContext(enclosingDeclaration, flags, tracker);
3107
- const resultingNode = typeParameterToDeclaration(parameter, context);
3108
- const result = context.encounteredError ? undefined : resultingNode;
3109
- return result;
3110
- },
3055
+ typeToTypeNode: (type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3056
+ withContext(enclosingDeclaration, flags, tracker, context => typeToTypeNodeHelper(type, context)),
3057
+ indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3058
+ withContext(enclosingDeclaration, flags, tracker, context => indexInfoToIndexSignatureDeclarationHelper(indexInfo, kind, context))!, // TODO: GH#18217
3059
+ signatureToSignatureDeclaration: (signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3060
+ withContext(enclosingDeclaration, flags, tracker, context => signatureToSignatureDeclarationHelper(signature, kind, context)),
3061
+ symbolToEntityName: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3062
+ withContext(enclosingDeclaration, flags, tracker, context => symbolToName(symbol, context, meaning, /*expectsIdentifier*/ false)),
3063
+ symbolToExpression: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3064
+ withContext(enclosingDeclaration, flags, tracker, context => symbolToExpression(symbol, context, meaning)),
3065
+ symbolToTypeParameterDeclarations: (symbol: Symbol, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3066
+ withContext(enclosingDeclaration, flags, tracker, context => typeParametersToTypeParameterDeclarations(symbol, context)),
3067
+ symbolToParameterDeclaration: (symbol: Symbol, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3068
+ withContext(enclosingDeclaration, flags, tracker, context => symbolToParameterDeclaration(symbol, context)),
3069
+ typeParameterToDeclaration: (parameter: TypeParameter, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
3070
+ withContext(enclosingDeclaration, flags, tracker, context => typeParameterToDeclaration(parameter, context)),
3111
3071
};
3112
3072
3113
- function createNodeBuilderContext(enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker: SymbolTracker | undefined): NodeBuilderContext {
3114
- return {
3073
+ function withContext<T>(enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker: SymbolTracker | undefined, cb: (context: NodeBuilderContext) => T): T | undefined {
3074
+ Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
3075
+ const context: NodeBuilderContext = {
3115
3076
enclosingDeclaration,
3116
3077
flags: flags || NodeBuilderFlags.None,
3117
3078
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop },
3118
3079
encounteredError: false,
3119
3080
visitedSymbols: undefined,
3120
3081
inferTypeParameters: undefined
3121
3082
};
3083
+ const resultingNode = cb(context);
3084
+ return context.encounteredError ? undefined : resultingNode;
3122
3085
}
3123
3086
3124
3087
function typeToTypeNodeHelper(type: Type, context: NodeBuilderContext): TypeNode {
0 commit comments