2024年1月コールグラフ自動生成ツールの今

この記事はC#実装者および、設計者向けの内容です。

結論

DoxygenとGraphvizの合わせ技が楽。

有料のですと色々と選択肢は多い?(古いのですとPGRelief、う~ん・・・。)

コールグラフとは?

以下のような、図です。Moduleの呼び出し元が一発で分かります。また、使われないルート等一発でわかります。IDEでの単位Moduleに対して探査することで追えるには終えるのですが、場合によって複雑すぎて迷子になったりします。

Graphvizによるコールグラフ

無料で使えるコールグラフ自動生成ツール

Doxygen

上記サイトに詳細な手順があります。そちらを参考にしてください。

以下、簡易手順です。

  1. doxygenをダウンロードする
  2. graphvizのセットアップを行う
  3. doxygenの設定を行う。
  4. Run
  5. Index.htmlにアクセス

Roslynの用意

上記サイトに詳細な手順がありますが、今回IDEを使用するにあたり、必要部分だけを抜粋。

以下のコードを実装します。

C#
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

public class CallGraphWalker : CSharpSyntaxWalker
{
    private readonly SemanticModel semanticModel;

    public CallGraphWalker(SemanticModel semanticModel)
    {
        this.semanticModel = semanticModel;
    }

    public override void VisitInvocationExpression(InvocationExpressionSyntax node)
    {
        var calleeMethodSymbol = semanticModel.GetSymbolInfo(node).Symbol as IMethodSymbol;
        string callerMethodID = ExtractCallerID(semanticModel, node);
        string calleeMethodID = calleeMethodSymbol.ToDisplayString();

        Console.WriteLine("\\t\\\"{0}\\\" -> \\\"{1}\\\";", callerMethodID, calleeMethodID);

        base.VisitInvocationExpression(node);
    }

    private static string ExtractCallerID(SemanticModel semanticModel, SyntaxNode node)
    {
        while (node != null)
        {
            if (node is MethodDeclarationSyntax methodDeclarationNode)
            {
                var methodSymbol = semanticModel.GetDeclaredSymbol(methodDeclarationNode);
                return methodSymbol.ToDisplayString();
            }

            node = node.Parent;
        }

        throw new ArgumentException("Could not find caller method ID.");
    }
}

その後、上記処理を用いて、

該当ファイルを読み込ませて、先ほどのクラスにパースさせて・・・Dotを作成してそれを・・・。いや、面倒くさすぎる!他にも設定等々をコードで書けば幸せになれますが、メンテ誰がするの!?(メンテナンスフリーな実装出来ますが、ルール制定も必要・・・。)

ということで、参考サイト様の内容がこちら

RoslynによるDot生成

Doxygen vs Roslyn

正直Doxygenです。GUIで楽々設定(これが罠だったりしますが)Graphvizが優秀で、画像に対してリンク生成および、拡大縮小までできます。(ただし、生成物はでかい!)

一方Roslynはセキュリティが厳しい環境ですと選択肢として有りと考えています。また、Roslyn事態は、コールグラフはおまけで、分析や成型等々がメインなので、これから?なのかもしれません。

そもそも必要?

ここ最近制作された物であれば、必要ないのかもしれませ。
pythonのおかげである程度のサンプルは、イディオム/定石/デザインパターン付きとなりました。
簡素なライブラリ群があり、メモリ管理なんて概念は不要(不要ではない。)となっていますので、
簡素なAPI作成が主流です。
AIもそれに徐々に対応してきています。(とはいえ、時々外してくるので、イディオム/定石/デザインパターンを知らないとAIは使いこなせません。)

コメント

タイトルとURLをコピーしました