C++Builder 2009用ユニット参照関係修復スクリプト

フォームを使用していないユニット*1をコードエディタで表示すると、コードエディタ下側のタブに「コード」と「履歴」しか表示されない場合があるので、それを解消するRubyスクリプト

require "rexml/document"

doc = REXML::Document.new($<)

doc.elements.each("/Project/ItemGroup/CppCompile") { |node|
  source = node.attributes["Include"]
  if node.elements["DependentOn"] == nil && source =~ /\.cpp$/ then
    header = source.sub(/\.cpp$/, ".h")
    elm = node.add_element("DependentOn")
    elm.text = header
  end
}

doc.write($stdout)

プロジェクトファイル(*.cbproj)をこのスクリプトで変更すると、コードエディタの下部のタブに「FooBar.cpp」、「FooBar.h」、「履歴」と表示されて、タブの切替でソースファイルとヘッダファイルの表示を切り替えられるようになります。それでも表示されない場合は、ヘッダファイルのインクルードガードを以下のようにします。
例:FooBar.cppとFooBar.hの場合。

#ifndef FooBarH
#define FooBarH
(中略)
#endif

インクルードガードの#ifndef/#define文をユニット名+大文字"H"にすると、ソースコードに対応するヘッダファイルとして認識してくれる。

追記1:
出力時に"doc.write($stdout, 4)"って感じでXMLファイルを整形して出力しようとすると、REXMLがこけるのは何とかしてくれ。('A`)
追記2:
TXMLDocumentって、XPathが使えないのか・・・。(´・ω・`)ショボーン ヘビーに使うときは、libxmlとかXercesを使えってことね。

*1:*.cppと*.hの組み合わせ