AwesomeRunner/Assets/Scripts/Editor/PoolCodeGenerator.cs
2022-09-12 22:23:18 +03:00

71 lines
2.8 KiB
C#

using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.IO;
using System;
using System.Collections.Generic;
public class PoolCodeGenerator
{
private CodeCompileUnit targetUnit;
private string targetClassName;
private string poolNameSpaceName;
private CodeTypeDeclaration targetClass;
private string outputFilePath;
public Type generatedClassType { get; private set; }
public PoolCodeGenerator(string outputFilePath, string targetClassName, string poolNameSpaceName, string pooledObjectClassName,Type pooledObjectClassType)
{
this.targetClassName = targetClassName;
this.poolNameSpaceName = poolNameSpaceName;
this.outputFilePath = outputFilePath;
targetUnit = new CodeCompileUnit();
//TODO: MAKE NAMESPACE OPTIONAL
CodeNamespace poolNamespace = new CodeNamespace(poolNameSpaceName);
targetClass = new CodeTypeDeclaration();
targetClass.IsClass = true;
targetClass.Name = this.targetClassName;
targetClass.TypeAttributes =
TypeAttributes.Public| TypeAttributes.Sealed;
Type t = Type.GetType(pooledObjectClassName);
//Assembly assem = poolingObjectType.Assembly;
//string poolName = $"{target.name}Pool";
//Type poolType = assem.GetType($"{targetClassName}");
var typeHierarchy = pooledObjectClassType.GetClassHierarchy();
var linkedTypeHierarchy = new LinkedList<Type>(typeHierarchy);
Type baseClass = null;
Type baseClassChild = null;
foreach (var type in typeHierarchy)
{
if (type.ToString() == "UnityEngine.MonoBehaviour")
{
var baseNode = linkedTypeHierarchy.Find(type);
baseClass = baseNode.Previous.Value;
var baseNodeChild = linkedTypeHierarchy.Find(baseClass);
baseClassChild = baseNodeChild.Previous.Value;
}
}
//poolNamespace.Types.Add(targetClass);
targetClass.Name = baseClassChild.ToString() + "Pool";
this.outputFilePath = outputFilePath + targetClass.Name + ".cs";
poolNamespace.Types.Add(targetClass);
targetUnit.Namespaces.Add(poolNamespace);
targetClass.BaseTypes.Add(new CodeTypeReference("BasePool",new CodeTypeReference(baseClassChild.ToString())));//Add("BasePool");
generatedClassType = baseClassChild;
}
public void GenerateCSharpCode()
{
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CodeGeneratorOptions options = new CodeGeneratorOptions();
options.BracingStyle = "C";
using (StreamWriter sourceWriter = new StreamWriter(outputFilePath,false))
{
provider.GenerateCodeFromCompileUnit(
targetUnit, sourceWriter, options);
}
}
}