kazurayam / vba-callgraph

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

プロシージャーの参照と、Objectのプロパティの参照と、見分けられない? #15

Closed kazurayam closed 3 months ago

kazurayam commented 3 months ago

https://github.com/kazurayam/VBAProcedureUsageAnalyzer/blob/0.1.3/lib/src/test/java/com/kazurayam/vba/FindUsagesAppTest.java を実行すると puファイルができてその中にこう書いてる

Backboneライブラリ.DicSortModule o-- Cashbook現金出納帳のためのVBAライブラリ.CashList : Count
Backboneライブラリ.DicSortModule o-- Cashbook現金出納帳のためのVBAライブラリ.Cashbook : Count

参照している、というふうに読めるがどうなのか?実はこのような参照関係は実際には存在しない。私の書いたプログラムが間違えているのだ。

DicSortModuleのソースコードにはこう書いてある

Public Sub DicSort(ByRef dic As Object)
    ...
    Dim dicSize As Long: dicSize = dic.Count

でえええ!困ったなあ。

プロシージャーの呼び出しとObjectのプロパティの参照と、構文的に見分けることができない、というVB言語のカスな性質のせいだ。どうにもならない気がする。

kazurayam commented 3 months ago

Java言語ならメソッド呼び出しなら必ずメソッド名に続けて(を書くことになっている。プロパティの参照なら(がないはずだ。だからメソッド呼び出しとプロパティ参照を字句的パターン照合によって見分けることができる。

いっぽう、VBではプロシージャーの呼び出しとObjectのプロパティの参照とを字句的なパターンによって見分けることができない。字句的なパターンマッチングでは力不足だ。

   Dim dicSize As Long: dicSize = dic.Count

この1行において Count という字句がプロシジャの呼び出しではなくdic変数のプロパティ参照である、と見分けなければならない。ANTLRとかの言語解析の手法を持ち込む必要がある。

kazurayam commented 3 months ago

ずるい手を思いついた。Optionsクラスをこういうふうに変更した。

public class Options {

    public static Options KAZURAYAM =
            new Options.Builder()
                    .excludeModule(ModuleToBeExcluded.プロシージャー一覧を作る.getPattern())
                    .excludeModule(ModuleToBeExcluded.プロシージャ一覧を作る.getPattern())
                    .excludeModule(ModuleToBeExcluded.プロシジャ一覧を作る.getPattern())
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシージャー一覧を作る")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシージャ一覧を作る")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシジャ一覧を作る")

                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "KzCls")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "ToString")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "Count")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "Items")
                    .build();

KzCls, ToString, Count, Items ーーー これらRefereeプロシジャをignoreする。するとdiagramの中で矢印線がグッと少なくなった。クラス図のノイズが少なくなった。わたしkazurayamはこれらのプロシジャのことを覚えておこう、うっかり削除したりしないように気をつけよう。

diagram-16918242220069966672

kazurayam commented 3 months ago

もういいと思う