Closed kazurayam closed 3 months ago
会費納入状況チェック.Environment o-- Backboneライブラリ.Test_DocTransformer : Test
この行が表示されてしまうのは何故か?
出発点になるのは参照される側のプロシージャーである。すなわち
package Backboneライブラリ {
stereotype Test_DocTransformer {
{method} Test
}
プロシージャ名 Test
を手掛かりとして、他のVBAソースコードの中をスキャンする。Indexerクラスがそれをやる。Indexerの125行目
VBASource moduleSource = module.getVBASource();
// let's scan the VBASource to see if it mentions the referee
List<VBASourceLine> linesFound = moduleSource.find(referee.getProcedureName());
VBASource
クラスのfind
メソッドが文字列を走査している。
public List<VBASourceLine> find(String pattern) {
Pattern ptn = Pattern.compile(escapeAsRegex(pattern));
List<VBASourceLine> linesFound = new ArrayList<>();
cache();
for (int i = 0; i < code.size(); i++) {
String line = code.get(i);
Matcher m = ptn.matcher(line);
if (m.find()) {
VBASourceLine vbaSourceLine = new VBASourceLine(i, line);
vbaSourceLine.setMatcher(m);
vbaSourceLine.setFound(true);
linesFound.add(vbaSourceLine);
}
}
return linesFound;
}
Refereeのモジュール名をパターンとして真っ正直に操作している。
さて、[会費納入状況チェック.Environment]()モジュールのVBAソースコードがどうなっているだろうか。"Test"という文字が見つかるだろうか?
ああ、ありました。"Test"が。
Sub Test_mbGetPathOfAoganCashbook()
とか
Sub Test_mbGetPathOfAoganMembers()
とか。
どうしよう。
少し正規表現を捻ろうか?
/Test/
ではなくて
/Test\s*(/
とすればこの例については解消できる。つまり参照されるがわのプロシージャーの名前がKzResolveExternalFilePathだとして、参照する側のコードにはきっと(が後ろにくっついているはず、と条件を付加する。具体例を挙げるならEnvironment .basの中にこう書いている。
mbGetPathOfAoganCashbook = KzResolveExternalFilePath(ThisWorkbook, "現金出納帳ファイルのパス", "B2")
ところがVBA言語ではプロシージャー名の後に(が後続していなくても、プロシージャ〜の呼び出しとして正しい、ということになっている。例えばEnvironmentの中にこう書いてる
Call KzCls
あるいは
Call KzCls 'イミディエイトウインドウを消す
とも書く。
これを妥当なものとして受け入れることができなければならない。
正規表現を複雑化すれば対処できる。やってみよう。
v0.1.4 で対処した。
結果、こうなった。
...
Member会員名簿のためのVBAライブラリ.プロシージャ一覧を作る o-- 会費納入状況チェック.プロシージャー一覧を作る : プロシージャー一覧を作る
会費納入状況チェック.Environment o-- Backboneライブラリ.KzUtil : KzCls
会費納入状況チェック.Environment o-- Backboneライブラリ.KzUtil : KzResolveExternalFilePath
会費納入状況チェック.プロシージャー一覧を作る o-- Backboneライブラリ.KzMetaprogramming : KzProcedureList
...
見ての通り
会費納入状況チェック.Environment o-- Backboneライブラリ.Test_DocTransformer : Test
この1行が出力されなくなった。
v0.1.3の https://github.com/kazurayam/VBAProcedureUsageAnalyzer/blob/0.1.3/lib/src/test/java/com/kazurayam/vba/FindUsagesAppTest.java を実行したらpuファイルが生成された。その一部がこうなっている。
386行目あたり
この3行のうち上の2行は妥当だ。しかし3行目の
これは間違っている。この行は出力されるべきでない。