Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
150 lines (131 sloc) 4.19 KB
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".h" #>
<#@ assembly name="System" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ assembly name="PATH_TO_REFERENCE_DLL.dll" #>
<#
bool useQTTypes = true;
List<Type> ccs = new List<Type>()
{
typeof(namespace.CLASS1),
typeof(namespace.CLASS2),
typeof(namespace.CLASS3)
};
GetPropertiesAll(ccs, useQTTypes);
#>
<#+
private void GetPropertiesAll(List<Type> ccs, bool useQTTypes)
{
foreach(Type cc in ccs)
{
//GetProperties<cc>(useQTTypes);
GetProperties(ccs, cc,useQTTypes);
}
}
private void GetProperties(List<Type> ccs, Type t, bool useQTTypes)
{
string objectName = t.Name;
WriteLine("//");
WriteLine("// Copyright © " + DateTime.Now.ToString("yyyy") +", Cihan T. (Generate Date: [" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:00") +"])");
WriteLine("//");
WriteLine("#ifndef " + objectName.ToUpper() + "_H");
WriteLine("#define " + objectName.ToUpper() + "_H");
WriteLine("#include <property.h>");
if(useQTTypes)
{
WriteLine("#include <QtCore>");
}
if(t.IsClass || t.IsInterface)
GenerateClass(ccs, t, objectName, useQTTypes);
else if(t.IsEnum)
GenerateFromEnum(t, objectName, useQTTypes);
WriteLine("#endif // " + objectName.ToUpper() + "_H\r\n");
SaveOutput(objectName + ".h");
}
private void GenerateClass(List<Type> ccs,Type t, string objectName, bool useQTTypes)
{
GenerateIncludes(ccs, t, objectName, useQTTypes);
var properties = t.GetProperties().ToList();
WriteLine("class " + objectName);
WriteLine("{");
WriteLine("public:");
WriteLine("\t" + objectName + "();");
foreach(var p in properties){
WriteLine("\tproperty<" + getAsQtProperty(p, useQTTypes) + "> " + p.Name + ";");
}
WriteLine("};");
}
private void GenerateIncludes(List<Type> ccs,Type t, string objectName, bool useQTTypes)
{
var properties = t.GetProperties().ToList();
foreach(var p in properties){
bool contains = ccs.Any(cc => cc.Name == p.PropertyType.Name);
if(contains)
WriteLine("#include <" + p.PropertyType.Name + ".h>");
}
}
private void GenerateFromEnum(Type t, string objectName, bool useQTTypes)
{
FieldInfo[] memberInfos = t.GetFields(BindingFlags.Public | BindingFlags.Static);
WriteLine("enum class " + objectName + "");
WriteLine("{");
for(int i = 0; i < memberInfos.Length; i++){
Write("\t" + memberInfos[i].Name + " = " + memberInfos[i].GetRawConstantValue().ToString());
if(i < memberInfos.Length - 1)
Write(",");
Write("\r\n");
}
WriteLine("};");
}
private string getAsQtProperty(PropertyInfo p, bool useQTTypes)
{
switch(p.PropertyType.Name){
case "String":
return useQTTypes?"QString":"string";
case "Int32":
return "int";
case "Decimal":
return "float";
case "Double":
return "float";
case "Char":
return "char";
case "Byte":
return "char";
case "DateTime":
return useQTTypes?"QDateTime":"DateTime";
case "Boolean":
return useQTTypes?"bool":"BOOL";
case "List`1":
return useQTTypes?"QList<" + getListTypes(p, useQTTypes) +">":"vector<>";
case "Dictionary`2":
return useQTTypes?"QMap<" + getDictionaryTypes(p, useQTTypes) + ">":"map<"+ getDictionaryTypes(p, useQTTypes) +">";
default:
return p.PropertyType.Name;
}
}
private string getDictionaryTypes(System.Reflection.PropertyInfo p, bool useQTTypes)
{
return string.Empty;
/*
return string.Join( ", ", p.GetGenericArguments()[0].Select(c => c.GetType().Name).ToList());
*/
}
private string getListTypes(System.Reflection.PropertyInfo p, bool useQTTypes)
{
var a = p.GetType().GetGenericArguments().FirstOrDefault();
if(a != null) return a.Name;
else return useQTTypes?"QObject":"object";
}
void SaveOutput(string outputFileName)
{
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}
#>