68 lines
2.4 KiB
C#
68 lines
2.4 KiB
C#
|
using System.CodeDom;
|
||
|
using System.CodeDom.Compiler;
|
||
|
using System.IO;
|
||
|
using System.Linq;
|
||
|
using RobocraftX.Common;
|
||
|
|
||
|
namespace CodeGenerator
|
||
|
{
|
||
|
public class BlockClassGenerator
|
||
|
{
|
||
|
public void Generate(string name, string group)
|
||
|
{
|
||
|
if (group is null)
|
||
|
{
|
||
|
group = GetGroup(name) + "_BLOCK_GROUP";
|
||
|
if (typeof(CommonExclusiveGroups).GetFields().All(field => field.Name != group))
|
||
|
group = GetGroup(name) + "_BLOCK_BUILD_GROUP";
|
||
|
}
|
||
|
|
||
|
var codeUnit = new CodeCompileUnit();
|
||
|
var ns = new CodeNamespace("TechbloxModdingAPI.Blocks");
|
||
|
ns.Imports.Add(new CodeNamespaceImport("RobocraftX.Common"));
|
||
|
ns.Imports.Add(new CodeNamespaceImport("Svelto.ECS"));
|
||
|
var cl = new CodeTypeDeclaration(name);
|
||
|
cl.Members.Add(new CodeConstructor
|
||
|
{
|
||
|
Parameters = {new CodeParameterDeclarationExpression("EGID", "egid")},
|
||
|
Comments = { new CodeCommentStatement($"{name} constructor", true)}
|
||
|
});
|
||
|
cl.Members.Add(new CodeConstructor
|
||
|
{
|
||
|
Parameters =
|
||
|
{
|
||
|
new CodeParameterDeclarationExpression(typeof(uint), "id")
|
||
|
},
|
||
|
Comments = {new CodeCommentStatement($"{name} constructor", true)},
|
||
|
BaseConstructorArgs =
|
||
|
{
|
||
|
new CodeObjectCreateExpression("EGID", new CodeVariableReferenceExpression("id"),
|
||
|
new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("CommonExclusiveGroups"),
|
||
|
group))
|
||
|
}
|
||
|
});
|
||
|
ns.Types.Add(cl);
|
||
|
codeUnit.Namespaces.Add(ns);
|
||
|
|
||
|
var provider = CodeDomProvider.CreateProvider("CSharp");
|
||
|
using (var sw = new StreamWriter($"{name}.cs"))
|
||
|
{
|
||
|
provider.GenerateCodeFromCompileUnit(codeUnit, sw, new CodeGeneratorOptions {BracingStyle = "C"});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static string GetGroup(string name)
|
||
|
{
|
||
|
var ret = "";
|
||
|
foreach (var ch in name)
|
||
|
{
|
||
|
if (char.IsUpper(ch) && ret.Length > 0)
|
||
|
ret += "_" + ch;
|
||
|
else
|
||
|
ret += char.ToUpper(ch);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
}
|
||
|
}
|