TYPersonal2 で配布されてるアプリケーションで、VBプロジェクトの構成を見ることができる。
関数の呼び出し関係がツリービューで表示されるので、他人の書いたプロジェクトで流れを把握したときなんかに便利。
・・・のだけど、例えば
Private Sub Hoge()
.
.
MsgBox("Hoge() でエラーが発生しました")
End Sub
みたいなコードがあると、Hoge()→Hoge() と再帰呼び出しを行ってると判断されて、ツリービューが無駄に深くなってしまう。(つまり、文字列判定を行っていないのだ)
今回のプロジェクトでは、「エラー処理の際は関数名を出力する」という決まりごとがあるようで、すべての関数で上記のように無駄な解析が行われてしまう。
こうなると解析には数十分かかるわ、完成したツリーも可読性が悪いわで使い物にならない。
幸いこのアプリケーションはソースも配布されてるので、ちょっといじってみました。
とりあえず、解析前に文字列部分をカットしてしまえばいいはずなので、そういう関数を作成。
'******************************************************************************
'機能:文字列のカット
'引数:ソース
'戻り値:
'******************************************************************************
Private Function CutString(ByVal o_Source As Variant) As String
Dim intFrom As Long
Dim intTo As Long
'元の値で初期化
CutString = o_Source
'文字列の開始位置を取得
intFrom = InStr(1, o_Source, """")
Do While intFrom > 0
'文字列の終端を取得
intTo = InStr(intFrom + 1, o_Source, """")
If intTo <= 0 Then
'対応してない→コメント内部と判断
'MsgBox ("見なかったことに")
Exit Function
End If
'終端と思いきや実は違う場合
Do While Mid(o_Source, intTo + 1, 1) = """"
'再度終端の検索
intTo = InStr(intTo + 2, o_Source, """")
If intTo <= 0 Then
'対応してない→コメント内部と判断
'MsgBox ("見なかったことに")
Exit Function
End If
Loop
'文字列部分のカット
o_Source = Mid(o_Source, 1, intFrom - 1) & Mid(o_Source, intTo + 1)
intFrom = InStr(1, o_Source, """")
Loop
CutString = o_Source
End Function
VB って文字列中に改行入れれないから処理楽でいいですね。
もっとスマートに書けそうな気もするけど、とりあえずそれは置いといて。
StrBuf = CutComment(StrBuf)
ってな呼び出しをしてる部分があるので、その直前に
StrBuf = CutString(StrBuf)
を入れる。
これで解析時間が数秒に短縮されました。大満足。