public virtual void GenerateCode(LDtkWorld ldtkJson, LdtkGeneratorContext ctx, ICodeOutput output) { List <CompilationUnitFragment> fragments = new List <CompilationUnitFragment>(); foreach (EnumDefinition ed in ldtkJson.Defs.Enums) { fragments.Add(GenerateEnum(ed, ctx)); } foreach (EntityDefinition ed in ldtkJson.Defs.Entities) { ClassCompilationUnit entity = GenerateEntity(ed, ctx); fragments.Add(entity); if (ctx.CodeCustomizer != null) { ctx.CodeCustomizer.CustomizeEntity(entity, ed, ctx); } } ClassCompilationUnit level = GenerateLevel(ldtkJson, ctx); fragments.Add(level); if (ctx.CodeCustomizer != null) { ctx.CodeCustomizer.CustomizeLevel(level, ldtkJson, ctx); } output.OutputCode(fragments, ctx); }
public void OutputCode(List <CompilationUnitFragment> fragments, LdtkGeneratorContext ctx) { Directory.CreateDirectory(OutputDir); foreach (CompilationUnitFragment fragment in fragments) { CompilationUnit cuFile = new CompilationUnit() { ClassNamespace = ctx.CodeSettings.Namespace, Name = fragment.Name }; cuFile.Fragments.Add(fragment); CompilationUnitSource source = new(ctx.CodeSettings); cuFile.Render(source); if (PrintFragments) { Console.WriteLine("Generating -> " + fragment.Name + ".cs"); } string filePath = OutputDir + "/" + fragment.Name + ".cs"; File.WriteAllText(filePath, source.GetSourceCode()); } }
private static void Run(Options options) { string outputDirectory = Path.GetDirectoryName(Path.GetFullPath(options.Output)); Directory.CreateDirectory(outputDirectory); string[] files = Directory.GetFiles(outputDirectory); for (int i = 0; i < files.Length; i++) { File.Delete(files[i]); } LdtkTypeConverter typeConverter = new LdtkTypeConverter() { PointAsVector2 = options.PointAsVector2 }; LdtkGeneratorContext ctx = new LdtkGeneratorContext() { LevelClassName = options.LevelClassName, TypeConverter = typeConverter }; ctx.CodeSettings.Namespace = options.Namespace; ICodeOutput output; if (options.SingleFile) { SingleFileOutput singleFileOutput = new SingleFileOutput() { OutputDir = outputDirectory, Filename = Path.GetFileNameWithoutExtension(options.Input) }; output = singleFileOutput; } else { MultiFileOutput multiFileOutput = new MultiFileOutput() { PrintFragments = true, OutputDir = outputDirectory, }; output = multiFileOutput; } LDtkWorld ldtkWorld = JsonSerializer.Deserialize <LDtkWorld>(File.ReadAllText(options.Input), LDtkWorld.SerializeOptions); LdtkCodeGenerator cg = new LdtkCodeGenerator(); cg.GenerateCode(ldtkWorld, ctx, output); }
public virtual ClassCompilationUnit GenerateLevel(LDtkWorld ldtkJson, LdtkGeneratorContext ctx) { ClassCompilationUnit levelClass = new ClassCompilationUnit() { Name = ctx.LevelClassName }; foreach (FieldDefinition fd in ldtkJson.Defs.LevelFields) { levelClass.Fields.Add(ctx.TypeConverter.ToCompilationUnitField(fd, ctx)); } return(levelClass); }
public virtual ClassCompilationUnit GenerateEntity(EntityDefinition ed, LdtkGeneratorContext ctx) { ClassCompilationUnit classFragment = new ClassCompilationUnit() { Name = ed.Identifier }; foreach (FieldDefinition fd in ed.FieldDefs) { classFragment.Fields.Add(ctx.TypeConverter.ToCompilationUnitField(fd, ctx)); } return(classFragment); }
public virtual EnumCompilationUnit GenerateEnum(EnumDefinition enumDefinition, LdtkGeneratorContext ctx) { EnumCompilationUnit enumFragment = new EnumCompilationUnit() { Name = enumDefinition.Identifier }; foreach (EnumValueDefinition evd in enumDefinition.Values) { enumFragment.Literals.Add(evd.Id); } return(enumFragment); }
static void Main(string[] args) { string text = File.ReadAllText("Entities.ldtk"); LdtkJson ldtkJson = LdtkJson.FromJson(text); LdtkGeneratorContext ctx = new LdtkGeneratorContext(); ctx.TypeConverter = new LdtkTypeConverter(); ctx.CodeSettings.Namespace = "MyNamespace.Test"; SingleFileOutput fOut = new SingleFileOutput(); fOut.OutputDir = "src-gen"; fOut.Filename = "MyFileCode.cs"; LdtkCodeGenerator cg = new LdtkCodeGenerator(); cg.GenerateCode(ldtkJson, ctx, fOut); }
public void OutputCode(List <CompilationUnitFragment> fragments, LdtkGeneratorContext ctx) { Directory.CreateDirectory(OutputDir); CompilationUnit cu = new CompilationUnit() { Name = Filename, ClassNamespace = ctx.CodeSettings.Namespace, Fragments = fragments }; CompilationUnitSource source = new(ctx.CodeSettings); cu.Render(source); string filePath = OutputDir + "/" + Filename; File.WriteAllText(filePath, source.GetSourceCode()); }
public CompilationUnitField ToCompilationUnitField(ldtk.FieldDefinition fieldDefinition, LdtkGeneratorContext ctx) { CompilationUnitField field = new CompilationUnitField(); field.Name = fieldDefinition.Identifier; field.Type = GetDeclaringTypeFor(fieldDefinition, ctx); field.Visibility = CompilationUnitField.FieldVisibility.Public; if (fieldDefinition.IsArray) { field.RequiredImport = GetArrayImport(); } return(field); }
public virtual string GetDeclaringTypeFor(ldtk.FieldDefinition fieldDefinition, LdtkGeneratorContext ctx) { string baseType = fieldDefinition.Type; if (fieldDefinition.IsArray) { baseType = baseType.Substring(6, baseType.Length - 7); } string declType = GetCSharpTypeFor(baseType); if (fieldDefinition.IsArray) { declType += "[]"; } return(declType); }
public virtual void CustomizeEntity(ClassCompilationUnit entity, EntityDefinition ed, LdtkGeneratorContext ctx) { entity.BaseClass = "ILDtkEntity"; entity.Fields.Add(new CompilationUnitField("Uid", "long")); entity.Fields.Add(new CompilationUnitField("Identifier", "string")); entity.Fields.Add(new CompilationUnitField("Size", "Vector2")); entity.Fields.Add(new CompilationUnitField("Position", "Vector2")); entity.Fields.Add(new CompilationUnitField("Pivot", "Vector2")); entity.Fields.Add(new CompilationUnitField("Tile", "Rectangle")); entity.Fields.Add(new CompilationUnitField("EditorVisualColor", "Color")); }
public virtual void CustomizeLevel(ClassCompilationUnit level, LDtkWorld ldtkJson, LdtkGeneratorContext ctx) { }
public virtual void CustomizeEntity(CompilationUnitClass entity, ldtk.EntityDefinition ed, LdtkGeneratorContext ctx) { entity.Fields.Add(new CompilationUnitField("Uid", "long")); entity.Fields.Add(new CompilationUnitField("Identifier", "string")); entity.Fields.Add(new CompilationUnitField("Width", "float")); entity.Fields.Add(new CompilationUnitField("Height", "float")); entity.Fields.Add(new CompilationUnitField("Position", "float[]")); entity.Fields.Add(new CompilationUnitField("Pivot", "float[]")); }
public virtual void CustomizeLevel(CompilationUnitClass level, ldtk.LdtkJson ldtkJson, LdtkGeneratorContext ctx) { level.Fields.Add(new CompilationUnitField("Uid", "long")); level.Fields.Add(new CompilationUnitField("Identifier", "string")); level.Fields.Add(new CompilationUnitField("WorldCoords", "float[]")); level.Fields.Add(new CompilationUnitField("Width", "float")); level.Fields.Add(new CompilationUnitField("Height", "float")); level.Fields.Add(new CompilationUnitField("Entities", "object[]")); }