public void Parse(SrcMap srcMap) { srcMap.headers.ForEach(x => Parse(x)); srcMap.globalNamespace = new LexNamespace(); foreach (var header in srcMap.headers) CopyNamespace(header.globalNamespace, srcMap.globalNamespace); BindUsingNamespaces(srcMap.globalNamespace); ProcessTypedefs(srcMap.globalNamespace); srcMap.allClasses = GetAllClasses(srcMap.globalNamespace); foreach (var cls in srcMap.allClasses) { if (cls.parentLexSection != null && cls.parentLexSection.GetType() == typeof(LexClass) && (cls.parentLexSection as LexClass).isTemplate) cls.isTemplate = true; } Console.Write("Starting specializing templates... " + DateTime.Now + "\n"); SpecializeTemplates(srcMap); foreach (var cls in srcMap.allClasses) { foreach (var baseCls in cls.baseClasses) { baseCls.lexClass = cls.parentLexSection.FindLexSection(baseCls.className) as LexClass; } } BindComments(srcMap.globalNamespace); }
public void Generate(string outputPath, string directoriesCut, SrcMap map) { this.directoriesCut = directoriesCut; iobjectClass = map.allClasses.Find(x => x.name == "::IObject"); reflectableClasses = map.allClasses.FindAll(x => { return(x.IsBasedOn(iobjectClass) && !x.isTemplate && !x.isTypedef); }).ToList(); GenerateHeader(outputPath); GenerateSource(outputPath); }
public void Generate(string outputPath, string directoriesCut, SrcMap map) { this.directoriesCut = directoriesCut; iobjectClass = map.allClasses.Find(x => x.name == "::IObject"); reflectableClasses = map.allClasses.FindAll(x => { return x.IsBasedOn(iobjectClass) && !x.isTemplate && !x.isTypedef; }).ToList(); GenerateHeader(outputPath); GenerateSource(outputPath); }
void SpecializeTemplates(SrcMap srcMap) { List <LexClass> newClasses = new List <LexClass>(); foreach (var cls in srcMap.allClasses) { if (!cls.isTemplate) { continue; } if (cls.shortName[cls.shortName.Length - 1] == '>') { continue; } List <string> specializations = new List <string>(); foreach (var src in srcMap.headers) { SearchSpecializations(specializations, src, cls); } /*foreach (var src in srcMap.sources) * SearchSpecializations(specializations, src, cls);*/ //Console.Write("Found " + specializations.Count() + " specializations for " + cls.name + "\n"); foreach (var spec in specializations) { LexClass newClass = cls.Clone(); newClass.shortName += "<" + spec + ">"; newClass.isTemplate = false; SpecializeClassName(newClass, spec, cls.shortName, newClasses, srcMap.allClasses); cls.parentLexSection.classes.Add(newClass); cls.parentLexSection.childSections.Add(newClass); } } newClasses.ForEach(x => srcMap.allClasses.Add(x)); }
public void Parse(SrcMap srcMap) { srcMap.headers.ForEach(x => Parse(x)); srcMap.globalNamespace = new LexNamespace(); foreach (var header in srcMap.headers) { CopyNamespace(header.globalNamespace, srcMap.globalNamespace); } BindUsingNamespaces(srcMap.globalNamespace); ProcessTypedefs(srcMap.globalNamespace); srcMap.allClasses = GetAllClasses(srcMap.globalNamespace); foreach (var cls in srcMap.allClasses) { if (cls.parentLexSection != null && cls.parentLexSection.GetType() == typeof(LexClass) && (cls.parentLexSection as LexClass).isTemplate) { cls.isTemplate = true; } } Console.Write("Starting specializing templates... " + DateTime.Now + "\n"); SpecializeTemplates(srcMap); foreach (var cls in srcMap.allClasses) { foreach (var baseCls in cls.baseClasses) { baseCls.lexClass = cls.parentLexSection.FindLexSection(baseCls.className) as LexClass; } } BindComments(srcMap.globalNamespace); }
void SpecializeTemplates(SrcMap srcMap) { List<LexClass> newClasses = new List<LexClass>(); foreach (var cls in srcMap.allClasses) { if (!cls.isTemplate) continue; if (cls.shortName[cls.shortName.Length - 1] == '>') continue; List<string> specializations = new List<string>(); foreach (var src in srcMap.headers) SearchSpecializations(specializations, src, cls); /*foreach (var src in srcMap.sources) SearchSpecializations(specializations, src, cls);*/ //Console.Write("Found " + specializations.Count() + " specializations for " + cls.name + "\n"); foreach (var spec in specializations) { LexClass newClass = cls.Clone(); newClass.shortName += "<" + spec + ">"; newClass.isTemplate = false; SpecializeClassName(newClass, spec, cls.shortName, newClasses, srcMap.allClasses); cls.parentLexSection.classes.Add(newClass); cls.parentLexSection.childSections.Add(newClass); } } newClasses.ForEach(x => srcMap.allClasses.Add(x)); }
static void Main(string[] args) { DateTime beginTime = DateTime.Now; Console.Write("Starting ... " + beginTime + "\n"); bool debug = false; SrcMap data = new SrcMap(); CppLexParser parser = new CppLexParser(); string output = args[0]; for (int i = 1; i < args.Length; i++) { foreach (var file in Directory.EnumerateFiles(args[i], "*.*", SearchOption.AllDirectories)) { if (file.EndsWith(".h")) { SourceFile header = new SourceFile(); header.location = file; header.data = File.ReadAllText(file); data.headers.Add(header); } else if (file.EndsWith(".cpp")) { SourceFile header = new SourceFile(); header.location = file; header.data = File.ReadAllText(file); data.sources.Add(header); } } } parser.Parse(data); Console.Write("Parsing done\n"); if (debug) { foreach (var cls in data.allClasses) { Console.Write("class: " + cls.name + ": "); cls.baseClasses.ForEach(x => Console.Write(x.type + " " + x.className + " (" + (x.lexClass != null).ToString() + ")")); if (cls.isTemplate) Console.Write(" TEMPLATE!!!"); Console.Write("\n"); } // var iobjectClass = data.allClasses.Find(x => x.name == "o2::IObject"); // var reflectableClasses = data.allClasses.FindAll(x => x.IsBasedOn(iobjectClass) && !x.isTemplate).ToList(); // reflectableClasses.ForEach(x => PrintClass(x, "")); // using (var writer = new System.IO.StreamWriter("map.xml")) // { // var serializer = new XmlSerializer(data.GetType()); // serializer.Serialize(writer, data); // writer.Flush(); // } } CppReflectionGenerator reflGenerator = new CppReflectionGenerator(); reflGenerator.Generate(output, "", data); Console.Write("Complete! " + (DateTime.Now - beginTime).ToString()); }
static void Main(string[] args) { DateTime beginTime = DateTime.Now; Console.Write("Starting ... " + beginTime + "\n"); bool debug = false; SrcMap data = new SrcMap(); CppLexParser parser = new CppLexParser(); string output = args[0]; for (int i = 1; i < args.Length; i++) { foreach (var file in Directory.EnumerateFiles(args[i], "*.*", SearchOption.AllDirectories)) { if (file.EndsWith(".h")) { SourceFile header = new SourceFile(); header.location = file; header.data = File.ReadAllText(file); data.headers.Add(header); } else if (file.EndsWith(".cpp")) { SourceFile header = new SourceFile(); header.location = file; header.data = File.ReadAllText(file); data.sources.Add(header); } } } parser.Parse(data); Console.Write("Parsing done\n"); if (debug) { foreach (var cls in data.allClasses) { Console.Write("class: " + cls.name + ": "); cls.baseClasses.ForEach(x => Console.Write(x.type + " " + x.className + " (" + (x.lexClass != null).ToString() + ")")); if (cls.isTemplate) { Console.Write(" TEMPLATE!!!"); } Console.Write("\n"); } // var iobjectClass = data.allClasses.Find(x => x.name == "o2::IObject"); // var reflectableClasses = data.allClasses.FindAll(x => x.IsBasedOn(iobjectClass) && !x.isTemplate).ToList(); // reflectableClasses.ForEach(x => PrintClass(x, "")); // using (var writer = new System.IO.StreamWriter("map.xml")) // { // var serializer = new XmlSerializer(data.GetType()); // serializer.Serialize(writer, data); // writer.Flush(); // } } CppReflectionGenerator reflGenerator = new CppReflectionGenerator(); reflGenerator.Generate(output, "", data); Console.Write("Complete! " + (DateTime.Now - beginTime).ToString()); }