問題は次のとおりです。
Java には大規模なコードベース (数十のパッケージに数百のファイル) があり、各クラス定義でキーワード strictfp を追加および削除する機能が必要です。この置換を実行するには、sed または awk のいずれかを使用する予定です。ただし、コメントなどで「クラス」という言葉が置き換えられることは避けたいと思います。誰でもこれに対する解決策を考えることができますか?
このようなタスクでは、最初に、ディレクトリツリー内のすべてのファイルが実際に正しい設定*.class
になっている(または持っていない)ことを確認する小さなプログラムを作成することをお勧めします。strictfp
次に、ソースコードの変更の問題を解決するために何を選択しても、コンパイラの後でチェッカーを実行して、正しいことを実行したことを確認できます。
これは実際には、特定の問題に適用されるTDDにすぎません。
Javaパーサーなしでこれを100%正しくすることを確実にする方法はありません。しかし、以下は十分に近いかもしれません:
sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file
エスケープは正しく行われたと思いますが、これはWindowsマシンから作成しており、テストしていません。
'public / private / protected'の後に'class'が続くコメントがある場合、上記はトリップします。
完全なキャッチオールとして、いいえ、そのための正規表現はありません。クラスの理論的な構築を説明するには、基本的にJavaインタープリター(または少なくともパーサー)を作成する必要があります。そうは言っても、単語クラスが行の最初の非空白ビットである場合、またはその前に行の最初の非空白ビットであるアクセス修飾子が付いている場合は、本当に安全です。
私は2つの可能性を考えることができます:
これらのどちらも非常に満足のいくものではありません。前者は実際に書くのが非常に難しく、後者は正しく理解するのが難しいです。
私のアドバイスは、REを見つけて、ソースコードのローカルコピーでそれを緩め、すべての変更を調べることです。エラーで行われた変更が何であれ、REを微調整して再試行してください。
次に、コーディング標準を導入し、すべての不適合定義を徐々に変更して正しくします。
strictfp と strictfp なしの間を行ったり来たりする必要があるため、ビルド プロセスの一部として .class ファイルを変更することをお勧めします。次に、この選択をビルド オプションにして、ソース ファイルを頻繁に変更せずに切り替えることができます。
コードのフォーマットはどのくらい標準的ですか? たとえば、で終わる行{
や次の行がどこで始まる{
かなどで「クラス」を探すことができますか?
人々に知らせるために、Javassist のほうがはるかに使いやすく、私の目的には完全に適しているため、最終的に BCEL の代わりに Javassist を使用することにしました。http://csg.is.titech.ac.jp/~chiba/javassist . 興味のある方のために説明すると、コードは次のようになります。
import javassist.*;
ClassPool cp = new ClassPool();
CtClass someClass = cp.get("SomeClass");
someClass.setModifiers(Modifier.STRICT);