[Swift] CommandPlugin で クラス図を作る(swift-syntax/Hatch を使ったCommandPlugin のブラッシュアップ)

SwiftPackageManagerEyeCatch

     
⌛️ 2 min.
Swift Package で Command Plugin を作っていきます。
最終的には、Swift のコードをパースして、mermaid の classDiagram を出力するのがゴールです。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS14.3 Beta
  • Xcode 15.2
  • iOS 17.2
  • Swift 5.9

作りたい Plugin

指定した Package/Project のクラス構造を mermaid 形式で出力するプラグインを作ってみます。

全体の予定

全体のステップは、以下の予定です。

mermaid 向け微調整

Swift では、モジュール内などの nest した型は、XXX.YYY と書けたりしますが、mermaid は、理解できずエラーになってしまっていました。

ということで、XXX.YYY は、XXX_YYY という表現に変更することで対応しようと思います。

Hatch では、シンボル名は、InheritingSymbol の name に保持されていますが、XXX.YYY というような文字列になっています。

使用する時に、. を _ に置き換えるようにします。

具体的には、extension Hatch.Symbol で定義した mermaidString を以下のように修正しました。

extension Hatch.Symbol {
    func mermaidString() -> String {
        guard let namedSymbol = self as? Hatch.InheritingSymbol else { return "unsupported type" }
        let mermaidName = namedSymbol.name.replacingOccurrences(of: ".", with: "_")
        return """
               class \(mermaidName) {
                \(self.swiftTypeName())>>
               }
               
               """
    }
}

extension をサポート

これまでは struct/class/enum/actor/protocol のみをサポートしていました。

Hatch は、上記以外に、typealias, enum case, extension をサポートしています。

ここでは、extension のサポートを追加してみます。

Hatch.Extension も InheritingSymbol に conform していますので、以下のように 出力する型名判定に extension を追加するだけでサポートできるようになります。

extension Hatch.Symbol {
    func swiftTypeName() -> String {
        switch self {
        case is Hatch.Struct: return "struct"
        case is Hatch.Class: return "class"
        case is Hatch.Enum: return "enum"
        case is Hatch.Actor: return "actor"
        case is Hatch.ProtocolType: return "protocol"
        case is Hatch.Extension: return "extension"
        default:
            return "UnsupportedType"
        }
    }
}

実行してみる

実行すると以下のような動作になります。

出力されたファイルは以下です。

classDiagram
%% Actor.swift
class Actor1 {
 >
}
%% Class.swift
class Class1 {
 >
}
%% CommandPluginExample.swift
class CommandPluginExample {
 >
}
class CommandPluginExample {
 >
}
%% CommandPluginExampleLib.swift
class CommandPluginExampleLib {
 >
}
class Hatch_Symbol {
 >
}
%% CommandPluginExampleLibParserTests.swift
class CommandPluginExampleLibParserTests {
 >
}
%% Enum.swift
class Enum1 {
 >
}
%% Package.swift
%% Protocol.swift
class Protocol1 {
 >
}
%% Struct.swift
class Struct1 {
 >
}
%% UnderstandingTests.swift
class UnderstandingTests {
 >
}
%% swiftymermaid.swift
class SwiftyMermaid {
 >
}

大きな違いはありませんが、Hatch.Symbol が Hatch_Symbol と置き換えられていて、さらに “UnsupportedType” となっていた annotation が “extension” になり、きちんと認識できていることがわかります。

mermaid で表示すると以下のようになります。

CommandPluginResultFinal

まとめ

swift-syntax/Hatch を使用する CommandPlugin を作ってきました。

swift-syntax/Hatch を使用する CommandPlugin を作りかた
  • CommandPlugin に直接実装せずに、CLIコマンド/ライブラリ化すると開発しやすい

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です