📄

テキストファイルから列挙型を生成するソースジェネレーターを作ってみた

に公開

概要

  • テキストファイルから列挙型を生成する自作のC#向けソースジェレレーターのご紹介
  • ソースジェネレーターを作ってみて得た所感

自作ソースジェレレーターのご紹介

https://github.com/kamome283/ReadFileLinesEnumGenerator

https://www.nuget.org/packages/ReadFileLinesEnumGenerator

名前はReadFileLinesEnumGeneratorです. もう少し英語力があれば, もっとマシな名前をつけれたのではないかと思うところはあります.
機能としては, .csproj内でAdditionalFilesプロパティに指定された, 末尾が.enum.txtで終わるファイルを読み込み, その各行を列挙型の識別子として定義する列挙型を自動生成するものです.
以下はGitHubリポジトリのREADMEから引用したサンプルコードです. 使い方のイメージとして参考になればと思います.

<Project>
   
    <!-- Add a reference to the source generator project -->
    <ItemGroup>
       <PackageReference Include="ReadFileLinesEnumGenerator" Version="1.0.0">
            <!-- Enable this project as an analyzer to run the source generator -->
            <OutputItemType>Analyzer</OutputItemType>
            <!-- Include the analyzer output assembly -->
            <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
       </PackageReference>
    </ItemGroup>

    <!-- Specify additional files for the generator -->
    <ItemGroup>
        <AdditionalFiles Include="myEnum.enum.txt" />
    </ItemGroup>
   
</Project>
using ReadFileLinesEnumGenerator.Generated;

// The 'myEnum' type is automatically defined using the content of the "myEnum.enum.txt" file
// under the ReadFileLinesEnumGenerator.Generated namespace. 
// Each line in the file is converted into a valid identifier through minimal normalization.
myEnum selectedEnumValue = myEnum.A_0;

// An extension method is also provided to retrieve the original line.
string originalEnumValue = myEnum.A_0.ToStringValue();

更に気になる方がおられましたら, ぜひリポジトリの方も見ていただければとても嬉しく思います.

ソースジェネレーターを作ってみて得た所感

AI Assistant が役に立たない

最近のAI Assistant はとても便利で, C#でも ASP.NET Core を用いたプロジェクト内での提案やリファクタリングはごもっともと思わされることばかりで, AI すごいなぁと驚かされることばかりです.
一方で, ソースジェネレーターを作るというのは比較的マイナーな行為なのでしょうか. 自分にとって初めての試みなので, AI Assistant にソースジェネレーターの素案を作ってもらってそれを修正していこうと初めは考えていました. しかし, 古いバージョンのライブラリに準拠したコードを書き出したりと目論見は大きくハズレました.

役に立った資料

横着せずに公式の資料などを軽く読めば, 簡単なパッケージを作るには十分な知識を得られました.
以下はroslynリポジトリ内のドキュメントです. 公式の資料がしっかりしていて, それさえ読めば十分なあたりはさすがマイクロソフトだと感じました.

https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.md

https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.cookbook.md

日本語の資料でおすすめなのはneueccさんのブログ記事です. 簡単なイントロダクションだけでなくガッツリ開発されている方ならではのtipsもあり, とても参考になります. 初出は2022年の記事のようですが, 2024年の状況に対してしっかりと記事がアップデートされていて熱量がすごいなとなります.

https://neue.cc/2022/12/16_IncrementalSourceGenerator.html

Discussion