Files
aibis-dream/Assets/Shapes/Scripts/Editor/Utils/Codegen/CodeWriter.cs
T
2025-05-07 15:07:44 +08:00

92 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
namespace Shapes {
internal class CodeWriter {
List<string> code = new List<string>();
public int indentLevel = 0;
public void Append( string s ) {
if( s.Contains( '\n' ) )
Append( s.Split( '\n' ) );
else
code.Add( s == "" ? "" : new string( '\t', indentLevel ) + s );
}
public void Append( IEnumerable<string> lines ) {
foreach( string s in lines )
Append( s );
}
public void AppendHeader() {
Append( ShapesInfo.FILE_HEADER_COMMENT_A );
Append( ShapesInfo.FILE_HEADER_COMMENT_B );
}
public void Spacer() => Append( "" );
public void Using( string s ) => Append( $"using {s};" );
public void Comment( string s ) => Append( $"// {s}" );
public CodeScope Scope( string s ) => new CodeScope( s, this );
public MainScope MainScope( Type generatorType, params string[] usings ) => new MainScope( usings, generatorType.Name, this );
public void WriteTo( string path ) {
if( ShapesIO.TryMakeAssetsEditable( path ) ) {
File.WriteAllLines( path, code );
AssetDatabase.Refresh(); // reload scripts
}
}
public override string ToString() => string.Join( "\n", code );
}
internal class MainScope : IDisposable {
readonly CodeWriter writer;
public MainScope( string[] usings, string generatorName, CodeWriter writer ) {
this.writer = writer;
usings.ForEach( writer.Using );
writer.Spacer();
writer.AppendHeader();
writer.Comment( "this file is auto-generated by " + generatorName );
writer.Append( $"namespace {nameof(Shapes)} {{" );
writer.indentLevel++;
}
public void Dispose() {
writer.Spacer();
writer.indentLevel--;
writer.Append( "}" );
}
}
internal class CodeScope : IDisposable {
readonly CodeWriter writer;
public CodeScope( string s, CodeWriter writer ) {
this.writer = writer;
writer.Append( $"{s} {{" );
writer.indentLevel++;
}
public void Dispose() {
writer.indentLevel--;
writer.Append( "}" );
}
}
}