Expose 'updateModifiers' in public NodeFactory API (#56194)

This commit is contained in:
Ron Buckton 2023-10-23 20:37:57 -04:00 committed by GitHub
parent d9d027d0c4
commit e5e7cbba79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 31 additions and 17 deletions

View File

@ -8816,12 +8816,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
function addExportModifier(node: Extract<HasModifiers, Statement>) {
const flags = (getEffectiveModifierFlags(node) | ModifierFlags.Export) & ~ModifierFlags.Ambient;
return factory.updateModifiers(node, flags);
return factory.replaceModifiers(node, flags);
}
function removeExportModifier(node: Extract<HasModifiers, Statement>) {
const flags = getEffectiveModifierFlags(node) & ~ModifierFlags.Export;
return factory.updateModifiers(node, flags);
return factory.replaceModifiers(node, flags);
}
function visitSymbolTable(symbolTable: SymbolTable, suppressNewPrivateContext?: boolean, propertyAsAlias?: boolean) {
@ -9120,7 +9120,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
newModifierFlags |= ModifierFlags.Default;
}
if (newModifierFlags) {
node = factory.updateModifiers(node, newModifierFlags | getEffectiveModifierFlags(node));
node = factory.replaceModifiers(node, newModifierFlags | getEffectiveModifierFlags(node));
}
}
results.push(node);

View File

@ -1178,8 +1178,8 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
ensureUseStrict,
liftToBlock,
mergeLexicalEnvironment,
updateModifiers,
updateModifierLike,
replaceModifiers,
replaceDecoratorsAndModifiers,
};
forEach(nodeFactoryPatchers, fn => fn(factory));
@ -7100,8 +7100,8 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
return statements;
}
function updateModifiers<T extends HasModifiers>(node: T, modifiers: readonly Modifier[] | ModifierFlags): T;
function updateModifiers(node: HasModifiers, modifiers: readonly Modifier[] | ModifierFlags) {
function replaceModifiers<T extends HasModifiers>(node: T, modifiers: readonly Modifier[] | ModifierFlags): T;
function replaceModifiers(node: HasModifiers, modifiers: readonly Modifier[] | ModifierFlags) {
let modifierArray;
if (typeof modifiers === "number") {
modifierArray = createModifiersFromModifierFlags(modifiers);
@ -7137,8 +7137,8 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
Debug.assertNever(node);
}
function updateModifierLike<T extends HasModifiers & HasDecorators>(node: T, modifiers: readonly ModifierLike[]): T;
function updateModifierLike(node: HasModifiers & HasDecorators, modifierArray: readonly ModifierLike[]) {
function replaceDecoratorsAndModifiers<T extends HasModifiers & HasDecorators>(node: T, modifiers: readonly ModifierLike[]): T;
function replaceDecoratorsAndModifiers(node: HasModifiers & HasDecorators, modifierArray: readonly ModifierLike[]) {
return isParameter(node) ? updateParameterDeclaration(node, modifierArray, node.dotDotDotToken, node.name, node.questionToken, node.type, node.initializer) :
isPropertyDeclaration(node) ? updatePropertyDeclaration(node, modifierArray, node.name, node.questionToken ?? node.exclamationToken, node.type, node.initializer) :
isMethodDeclaration(node) ? updateMethodDeclaration(node, modifierArray, node.asteriskToken, node.name, node.questionToken, node.typeParameters, node.parameters, node.type, node.body) :

View File

@ -1436,7 +1436,7 @@ export function transformDeclarations(context: TransformationContext) {
}
const modifiers = factory.createModifiersFromModifierFlags(getEffectiveModifierFlags(statement) & (ModifierFlags.All ^ ModifierFlags.Export));
return factory.updateModifiers(statement, modifiers);
return factory.replaceModifiers(statement, modifiers);
}
function updateModuleDeclarationAndKeyword(
@ -1566,7 +1566,7 @@ export function transformDeclarations(context: TransformationContext) {
return factory.createVariableStatement(isNonContextualKeywordName ? undefined : [factory.createToken(SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([varDecl]));
});
if (!exportMappings.length) {
declarations = mapDefined(declarations, declaration => factory.updateModifiers(declaration, ModifierFlags.None));
declarations = mapDefined(declarations, declaration => factory.replaceModifiers(declaration, ModifierFlags.None));
}
else {
declarations.push(factory.createExportDeclaration(

View File

@ -9072,8 +9072,14 @@ export interface NodeFactory {
* @internal
*/
cloneNode<T extends Node | undefined>(node: T): T;
/** @internal */ updateModifiers<T extends HasModifiers>(node: T, modifiers: readonly Modifier[] | ModifierFlags | undefined): T;
/** @internal */ updateModifierLike<T extends HasModifiers & HasDecorators>(node: T, modifierLike: readonly ModifierLike[] | undefined): T;
/**
* Updates a node that may contain modifiers, replacing only the modifiers of the node.
*/
replaceModifiers<T extends HasModifiers>(node: T, modifiers: readonly Modifier[] | ModifierFlags | undefined): T;
/**
* Updates a node that may contain decorators or modifiers, replacing only the decorators and modifiers of the node.
*/
replaceDecoratorsAndModifiers<T extends HasModifiers & HasDecorators>(node: T, modifiers: readonly ModifierLike[] | undefined): T;
}
/** @internal */

View File

@ -87,7 +87,7 @@ function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: Source
}
}
fixedDeclarations?.add(getNodeId(insertionSite));
const cloneWithModifier = factory.updateModifiers(
const cloneWithModifier = factory.replaceModifiers(
getSynthesizedDeepClone(insertionSite, /*includeTrivia*/ true),
factory.createNodeArray(factory.createModifiersFromModifierFlags(getSyntacticModifierFlags(insertionSite) | ModifierFlags.Async)),
);

View File

@ -1988,7 +1988,7 @@ function getEntryForMemberCompletion(
// and we need to make sure the modifiers are uniform for all nodes/signatures.
modifiers = node.modifierFlagsCache | requiredModifiers;
}
node = factory.updateModifiers(node, modifiers);
node = factory.replaceModifiers(node, modifiers);
completionNodes.push(node);
},
body,
@ -2018,12 +2018,12 @@ function getEntryForMemberCompletion(
modifiers &= ~ModifierFlags.Public;
}
modifiers |= allowedAndPresent;
completionNodes = completionNodes.map(node => factory.updateModifiers(node, modifiers));
completionNodes = completionNodes.map(node => factory.replaceModifiers(node, modifiers));
// Add back the decorators that were already present.
if (presentDecorators?.length) {
const lastNode = completionNodes[completionNodes.length - 1];
if (canHaveDecorators(lastNode)) {
completionNodes[completionNodes.length - 1] = factory.updateModifierLike(lastNode, (presentDecorators as ModifierLike[]).concat(getModifiers(lastNode) || []));
completionNodes[completionNodes.length - 1] = factory.replaceDecoratorsAndModifiers(lastNode, (presentDecorators as ModifierLike[]).concat(getModifiers(lastNode) || []));
}
}

View File

@ -8386,6 +8386,14 @@ declare namespace ts {
createExportDefault(expression: Expression): ExportAssignment;
createExternalModuleExport(exportName: Identifier): ExportDeclaration;
restoreOuterExpressions(outerExpression: Expression | undefined, innerExpression: Expression, kinds?: OuterExpressionKinds): Expression;
/**
* Updates a node that may contain modifiers, replacing only the modifiers of the node.
*/
replaceModifiers<T extends HasModifiers>(node: T, modifiers: readonly Modifier[] | ModifierFlags | undefined): T;
/**
* Updates a node that may contain decorators or modifiers, replacing only the decorators and modifiers of the node.
*/
replaceDecoratorsAndModifiers<T extends HasModifiers & HasDecorators>(node: T, modifiers: readonly ModifierLike[] | undefined): T;
}
interface CoreTransformationContext {
readonly factory: NodeFactory;