やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#プロジェクトにNullable要素を追加するツール(再帰版)

 コマンド引数に-rフラグを追加した。

成果物

コード

Program.cs

using System;
using System.IO; // Directory.EnumerateFiles
using System.Collections.Generic; // IEnumerable<>
using System.Xml.Linq; // XDocument
using System.Xml; // XmlWriter 
using System.Text; // StringBuilder

namespace CSharpProjectNullabler
{
    class Program
    {
        static void Main(string[] args)
        {
            if (ShowHelp(args)) return;
            foreach (string path in GetProjectFiles(args)) {
                var xml = CreateNullableXDocument(path);
                using (var writer = CreateOmitXmlDeclarationWriter(path)) { xml.Save(writer); }
            }
        }
        static bool ShowHelp(string[] args)
        {
            if (0 < args.Length && "-r" != args[0]) {
                Console.WriteLine(@".csprojファイルに<Nullable>enable</Nullable>を設定する。<Nullable>が既存なら何もしない。引数-rで再帰的に処理する。");
                return true;
            } else { return false; }
        }
        static IEnumerable<string> GetProjectFiles(string[] args)
        {
            if (0 < args.Length && "-r" == args[0]) {
                return Directory.EnumerateFiles(System.Environment.CurrentDirectory, "*.csproj", SearchOption.AllDirectories);
            } else {
                return Directory.EnumerateFiles(System.Environment.CurrentDirectory, "*.csproj");
            }
        }
        static XmlWriter CreateOmitXmlDeclarationWriter(string path)
        {
            XmlWriterSettings xws = new XmlWriterSettings();  
            xws.OmitXmlDeclaration = true; // XML宣言を出力しない
            xws.Indent = true;  
            return XmlWriter.Create(path, xws);
        }
        static XDocument CreateNullableXDocument(string path)
        {
            XDocument xml = XDocument.Load(path);
            XElement project = xml.Element("Project");
            XElement propertyGroup = project.Element("PropertyGroup");
            XElement? nullable = propertyGroup.Element("Nullable");
            if (null == nullable) { propertyGroup.Add(new XElement("Nullable", "enable")); }
            return xml;
        }
    }
}

所感

 コードが一気に汚くなった。

 ほんの少し追加しただけなのだが、異なる処理内容を分離せずにぶち込んでいるせいで汚い。かといって、これしきの機能に対して引数パーサを導入するのも大げさ。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux