kazurayam / vba-callgraph

Generating a Call Graph for Excel VBA workbooks
https://kazurayam.github.io/VBACallGraph/
Apache License 2.0
0 stars 0 forks source link

Cashbookの中のAccountクラスに矢印が一つもないのはおかしい #39

Closed kazurayam closed 1 month ago

kazurayam commented 1 month ago

v0.1.17でこうだ

image

AccountクラスはCashbookの中でも重要なクラスであることは明らか。なのに矢印がない。これは不都合だ。


AccountクラスのAccoutNameはSubでもFunctionでもなくProperty Getだ。

image

現状、矢印を構築するための処理がSubまたはFunctionを対象としていて、Property Getを考慮していないのだろう。だからAccountクラスに矢印が一つもつかない。

kazurayam commented 1 month ago

AccountクラスモジュールのAccountNameプロパティを参照しているReferrerのコードを具体的に見てみた。

InntelliJ IDEAのFind Usage機能を使って src/test/fixture/hubディレクトリの中をスキャンしてみた。スキャン結果を見るとAccountNameプロパティはたくさん参照されている。ただしAccount.clsファイルを除外して考えよう。AccountsFinderクラスモジュールが参照していた。AccountsFinderのソースコードを見てみよう。76行目。

        Set dic2(k) = cSel_.SelectCashList(acc.accType, acc.AccountName, acc.SubAccountName, _
                                           ofReportingUnit, positiveLike)

AccountNameの直前にドット . がある。オブジェクトのプロパティを参照するのだからドットが必須であることはわかる。これがどうやら鍵であるように思われる。


2024・9・1を AccountsFinderクラスをCashbookTransformerに改称した

kazurayam commented 1 month ago

com.kazurayam.vba.puml.ProcedureNamePatternManagerList<Pattern> createPatterns(String) メソッドの ソースを検討した。

createPatternsメソッドの引数として "AccoutName" が与えられたとき、どんなPatternのリストが返されるか?試してみた。こうだ。

AccountName\(|AccountName\s*'|AccountName\s*$

この正規表現が

        Set dic2(k) = cSel_.SelectCashList(acc.accType, acc.AccountName, acc.SubAccountName, _
                                           ofReportingUnit, positiveLike)

というINPUTにmatchするだろうか?検討しよう。

この正規表現は3つの正規表現を | で合体させている。3つそれぞれを検討しよう。

AccountName\(

この正規表現は AccountNameの直後に左カッコ ( がある場合にだけマッチする。VBAではSubやFunctionを呼び出すときに1つ以上のパラメータがある場合に左カッコが必要という構文規則がある。前出のINPUTにはマッチしない。

AccountName\s*'

この正規表現は AccountNameに続いてシングルクオート ' がある場合だけマッチする。VBAでシングルクオートはコメントの始まりを意味する。この正規表現は前出のINPUTにはマッチしない。

AccountName\s*$

この正規表現は AccountName の後に行の末尾まで何にも文字が無い場合にマッチする。この正規表現は前出のINPUTにはマッチしない。

というわけで、現状では、ProcedureNamePatternManagerのcreatePatternsメソッドが作るListは前出のINPUTにマッチしない。

だからクラス図の中でCashbookのAccountクラスについて矢印が一つもつかない。これが理由だ。

createPatternsメソッドを直せばAccountクラスに矢印をつけることができるはずだ。やってみよう。

kazurayam commented 1 month ago

createPatternsメソッドがどういう正規表現を生成すればいいのか?

\.?AccountName\W+|\.?AccountName\W*\s*'|\.?AccountName\W*\s*$

でどうだ?

すなわち、

kazurayam commented 1 month ago

対策した。変更点は2つ。

第一に、ProcedureNamePatternManagerのcreatePatternsメソッドを修正して、上記のような参照関係を拾えるようにした。

第二に、FindUsageAppを修正した。ModuleAがModuleAを参照する関係があったら、それについて矢印を描かないようにした。

その前提としてIndexerのxrefメソッドも変更した。v0.1.17では「ModuleAがModuleAを参照する場合をスキップする」というケースをxrefメソッドの中で考慮したつもりだったが、デバッグしてみると、そのコードが間違いの元だった。

kazurayam commented 1 month ago

v0.1.18を出した。 https://github.com/kazurayam/VBAProcedureUsageAnalyzer/blob/0.1.18/lib/src/test/java/com/kazurayam/vba/puml/FindUsageAppGrandTest.java を実行すると下記のpumlと画像が得られた。

test_writeDiagram_Options_KAZURAYAM.puml.txt

test_writeDiagram_Options_KAZURAYAM

ちなみにv0.1.17は下記のような画像を出力していた。

0.1.17

すごく変化した。こういうものなんだろう。

kazurayam commented 1 month ago

v0.1.18が生成した画像を眺めて思うのは、画像が妙にゴチャゴチャと複雑だということ。画像がゴチャゴチャして不快だからなぜこうなんだと疑問を覚える。疑問を覚えて画像を眺めると、ゴミであるモジュール(標準モジュールないしクラスモジュール)がいくつか混じっていることに気が付く。ゴミを掃除して気持ち良くしたい、と思う。絵が動機づけしてくれる。

kazurayam commented 1 month ago

v0.1.18が生成したPosterを紙に印刷しよう、コンビニのプリンターで。

kazurayam commented 1 month ago

40 の問題に遭遇した。pdfの1ページの縦横サイズがA2のサイズよりも大きかったため、セブンイレブンのネットプリントサービスに拒否された。

ポスターpdfがA2よりも小さくなるようにパラメータを修正した。それでネットプリントが可能になった。

A4の紙9枚に印刷した。紙の印刷物は十分役立つものだった。