/** * GitWand v2.6 — Rejeu de refactorings (expérimental) * * Rejoue les refactorings sur le résultat du merge textuel pour produire * la sortie finale RefMerge. * * ## Rôle dans le pipeline RefMerge * * ``` * merged' (résultat du merge textuel sur les branches inversées) * │ * ↓ replayRefactorings(merged', refs_ours ∪ refs_theirs) * │ * merged (sortie finale — nomenclature de la branche qui a renommé) * ``` * * ## Stratégie de rejeu * * Quand ours et theirs ont tous deux renommé le même symbole (ex: `x` → `y` * des deux côtés), le rejeu est simple : appliquer une fois. * * Quand ours et theirs ont renommé différemment (ex: ours `x` → `y`, * theirs `x` → `z`), c'est un conflit de renommage réel. Le pipeline * RefMerge préfère le renommage de **ours** dans ce cas (comportement * analogue à `prefer-ours` pour les renommages). Le conflit résiduel est * tracé dans le `DecisionTrace` par l'orchestrateur. * * ## Algorithme * * Pour chaque `Refactoring` dans la liste (dédupliquée) : * - `rename-local` : remplacer `oldName` → `newName` dans la portée * - `rename-top-level` : remplacer `oldName` → `newName` dans tout le texte * - `move-method` : no-op (déjà géré par le merge structurel) * * ## Garanties * - Retourne les lignes inchangées si la liste est vide. * - Retourne les lignes inchangées en cas d'erreur (safe by default). * - Zéro import Node.js — compatible browser, Node.js, Tauri WebView. */ import type { Refactoring } from "../types.js"; /** * Déduplique et fusionne deux listes de refactorings (ours + theirs). * * Règles : * 1. Si ours et theirs ont le même `(kind, oldName, newName)` → garder une copie. * 2. Si ours et theirs ont renommé le même `oldName` différemment → * préférer ours (comportement `prefer-ours` pour les renommages). * 3. Les refactorings sans conflit des deux côtés sont tous inclus. * 4. Les `move-method` sont inclus sans déduplication (clé = `oldName + sourceClass`). * * @returns Liste déduplicée, avec les refactorings ours prioritaires en cas de conflit. */ export declare function mergeRefactorings(oursRefs: Refactoring[], theirsRefs: Refactoring[]): Refactoring[]; /** * Rejoue une liste de refactorings sur les lignes du résultat de merge. * * Applique les refactorings dans leur ordre naturel (premier détecté = * premier rejoué), ce qui est l'inverse de l'ordre d'inversion. * Cette symétrie garantit que `replay(invert(branch, refs), refs) ≈ branch` * à isomorphisme de merge près. * * @param mergedLines - Lignes du résultat du merge textuel (base inversée) * @param refactorings - Liste des refactorings à rejouer (déjà déduplicée) * @returns Lignes avec les refactorings réappliqués, prêtes comme sortie finale * * @example * ```ts * const refs = mergeRefactorings(oursRefs, theirsRefs); * const finalLines = replayRefactorings(mergedLines, refs); * // finalLines utilise la nomenclature finale (post-refactoring) * ``` */ export declare function replayRefactorings(mergedLines: string[], refactorings: Refactoring[]): string[]; //# sourceMappingURL=replay.d.ts.map