テキストの代わりに AST を使用して 2 つの C++ ファイルを比較できる無料の diff ユーティリティはありますか?
私が考えていたのは次のようなものです:
- 両方のファイルを AST に変換します
- AST を C++ コードとしてレンダリングします (これにより、インデントが正規化されます)。
- これら2つの間の通常の差分を実行します
- また、行われた単純なリファクタリングを検出してみてください (たとえば、メンバーの追加/削除/名前変更)。
テキストの代わりに AST を使用して 2 つの C++ ファイルを比較できる無料の diff ユーティリティはありますか?
私が考えていたのは次のようなものです:
[他の回答者の 1 人から商用ツールの名前を投稿するよう依頼されました。]
Semantic Designs の SmartDifferencer ツールは C++ を解析し、AST に基づいて差異を計算します。レイアウトの書式設定は重要ではありません。パーサーは完全な C++11 パーサーです。「構造化」されている限り、ほとんどのプリプロセッサ ディレクティブを展開することなく、ほとんどのソース ファイルを解析できます。C++ プリプロセッサの使用は、通常、C ほど乱暴ではありません。
他の言語用のバージョンの SmartDifferencer があります。
[情報開示: 私は Semantic Designs の CTO です]
あなたの問題に対する2つの代替解決策を考えることができます:
グループで使用するコーディング スタイルについて話し合い、それを守ります。チーム メンバーのさまざまな個人的なコーディング スタイルの間で妥協点を見つける必要がある場合があります。
ソース管理を使用している場合は、コミット時にすべてのフォーマットを削除し、チェックアウト時にコードのフォーマットをカスタマイズするフックを追加します。これには多少の手間がかかりますが、チーム メンバーは独自の書式設定スタイルを使用できます。もちろん、これは変数の命名やその他の非フォーマット コード スタイル要素における意見の相違を解決するものではありません。
AStyle を介してコードを渡して、差分を実行する前にインデント/間隔/フォーマットを正規化できます。これはリファクタリングには何もしませんが、正直なところ、これを適切に行うには完全な前処理/コンパイル パスが必要です。