|
- 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;
- }
- }
- }
|