Unione sensibile al contesto?

Esiste uno strumento di diff / merge per i linguaggi di programmazione, che funziona in modo sintattico (come XML Diff Tool), facendo più di un confronto riga per riga (e facoltativamente ignorando gli spazi bianchi).

Mi interessa un programma che segua effettivamente la syntax e i delimitatori del linguaggio, suggerendo modifiche senza interrompere la correttezza sintattica, o istruzioni di raggruppamento separate su più righe. Il comportamento di esempio potrebbe essere:

* dopo aver trovato un if(){ che introduce un livello di nidificazione aggiuntivo raggruppa automaticamente la parentesi di chiusura } diverse righe sotto con esso.)

* Mantieni insieme gli elementi di syntax corrispondenti, evita stupidità come rimuovere un blocco che tende a creare:

  int function_A() { int ret; ret = something; ret += something_else; 

  return ret; } int function_B() { if(valid) { int ret; ret = something; ret += something_else; 

  return ret; } 

  else return -1; } 

Personalmente, mi piacerebbe trovare software in grado di gestire la syntax C ++, ma anche conoscere le soluzioni per altre lingue sarebbe interessante.

Beyond Compare fa un po ‘di quello che stai chiedendo. Non mantiene la correttezza sintattica o confronta i blocchi di lingua alla volta, ma può fare quanto segue:

  • Qualche comprensione della syntax del linguaggio, quindi può fare l’evidenziazione della syntax dei file confrontati, e può anche riconoscere e ignorare facoltativamente le differenze non importanti (come i commenti, inclusi i commenti multilinea).
  • Supporto per l’utilizzo di programmi di conversione esterni per il caricamento e il salvataggio dei dati. Immediatamente, supporta l’utilizzo di questo per ottimizzare XML e HTML prima di confrontarlo. È ansible impostare Rientro GNU per standardizzare la syntax prima di confrontare due file C.
  • Pesi delle linee opzionali per consentire di assegnare un peso maggiore alla corrispondenza, ad esempio, le parentesi graffe di chiusura. Non ho provato questa funzione.
  • Sostituzioni, da ignorare per una singola sessione ogni luogo in cui old_variable_name sulla sinistra è stato sostituito con new_variable_name sulla destra.

È di gran lunga il miglior strumento di diff-and-merge che ho usato. È anche multipiattaforma, economica ($ 30 per gli standard, $ 50 per i professionisti), e ha un periodo di valutazione molto generoso, quindi vale la pena provare.

Unione Semantica .
Lingue supportate, dal sito web:

Abbiamo iniziato con C # e Vb.net, quindi aggiunto Java. Ora C è già supportato e quindi ci concentreremo su C ++, Objective-C e JavaScript, a seconda del tuo feedback

Mentre KDiff3 non confronta gli elementi di syntax in un contesto grammaticale, ha una granularità più alta di “l’intera riga modificata”, e evidenzierà esattamente quali parti all’interno di una linea viene cambiata.

E nella mia esperienza ha un ottimo algoritmo per rilevare i cambiamenti. Dato il tuo esempio sopra, confronta correttamente function_A e function_B out of the box:

Confronto tra la funzione_A e la funzione_B

E anche così, se l’algoritmo non riesce a corrispondere a ciò che si desidera, ad esempio come il seguente:

Confronto tra vecchia e nuova funzione_A

puoi sempre eseguire l’override manualmente posizionando i segni di sincronizzazione dove vuoi che esegua il confronto.

Alternativa 1:

Confronto tra vecchia e nuova funzione_A con sync1

Alternativa 2:

Confronto tra vecchia e nuova funzione_A con sync2

Sembra che ti interesserebbe l’algoritmo di Patience Diff di Bram Cohen (creatore di BitTorrent) (che è usato nel sistema di controllo della versione di bazaar).

Vedi Il problema di diff è stato risolto e in particolare i vantaggi di Patience Diff :

Estratto dal secondo link:

Un altro vantaggio della diff di pazienza è che spesso non corrisponde a linee che semplicemente non dovrebbero corrispondere. Ad esempio, se hai completamente riscritto una sezione di codice, non dovrebbe corrispondere alle righe vuote in ogni versione, come mostra questo esempio . Infine, c’è questo esempio:

  void func1() { x += 1 } +void functhreehalves() { + x += 1.5 +} + void func2() { x += 2 } 

Che è semplice e ovvio, ma frequentemente algoritmi diff lo interpreteranno in questo modo:

  void func1() { x += 1 +} + +void functhreehalves() { + x += 1.5 } void func2() { x += 2 } 

Guarda i nostri strumenti SmartDifferencer .

Gli SmartDifferencers sono specifici della lingua, guidati da parser di lingua di qualità di produzione, costruiscono AST e confrontano gli alberi. Ciò li rende completamente indipendenti dal layout del testo e dai commenti intermedi; notevolmente, sono immuni ai cambiamenti nel testo dei letterali (radix, sposta punto decimale + esponente di cambiamento, sequenze di escape diverse) se il valore reale rappresentato dal letterale non è diverso. Il risultato viene riportato in termini di syntax della lingua e azioni di modifica plausibili (spostamento, copia, inserimento, eliminazione, rinominare-identificatore-entro-blocco).

Esistono versioni per C #, Java, C ++, Python e una varietà di altre lingue. Ci sono esempi di ognuno di questi sul sito.

Uno SmartDifferencer esiste per C, ma l’analisi dei file C senza la riga di comando del compilatore completo a volte è problematica, quindi a volte fallisce e si deve ricorrere a strumenti di confronto più primitivi, come diff. Stiamo lavorando per migliorare questa situazione.

Per favore guarda Confronta ++ .

Può fare confronti strutturati e linguistici per C / C ++, Java, C #, Javascript, CSS, … e, facoltativamente, ignorare commenti, pure formattati, spazi bianchi e cambi maiuscole e avere capacità uniche di allineare sezioni mosse come la funzione C ++ , Spazio dei nomi Java, metodo C #, selettore CSS, …

Se si utilizza eclipse, l’editor di confronto integrato fornisce diff / merge di syntax, almeno per Java. Seleziona “Confronta struttura aperta automaticamente” sotto le preferenze “Generale / Confronta / Patch”, quindi scegli “Confronta struttura Java” nell’editor di confronto.

Guarda https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools in particolare la colonna Confronto strutturato.

Attualmente ci sono solo due strumenti che capiscono la struttura linguistica.

  • Compare ++ (Funziona alla grande per C ++)
  • Pretty Diff (Strumento di confronto del codice in lingua per diversi linguaggi basati sul Web. Inoltre abbellisce, riduce e alcune altre cose ..)

Sfortunatamente molti strumenti hanno questa colonna ancora vuota.