public FunctionCollection Process(EnumProcessor enum_processor, DocProcessor doc_processor, DelegateCollection delegates, EnumCollection enums, string apiname, string apiversion) { Console.WriteLine("Processing delegates."); var nav = new XPathDocument(Overrides).CreateNavigator(); foreach (var version in apiversion.Split('|')) { // Translate each delegate: // 1st using the <replace> elements in overrides.xml // 2nd using the hardcoded rules in FuncProcessor (e.g. char* -> string) foreach (var signatures in delegates.Values) { foreach (var d in signatures) { var replace = GetFuncOverride(nav, d, apiname, apiversion); TranslateExtension(d); TranslateReturnType(d, replace, nav, enum_processor, enums, apiname, version); TranslateParameters(d, replace, nav, enum_processor, enums, apiname, version); TranslateAttributes(d, replace, nav, apiname, version); } } // Create overloads for backwards compatibility, // by resolving <overload> elements var overload_list = new List<Delegate>(); foreach (var d in delegates.Values.Select(v => v.First())) { var overload_elements = GetFuncOverload(nav, d, apiname, apiversion); foreach (XPathNavigator overload_element in overload_elements) { var overload = new Delegate(d); TranslateReturnType(overload, overload_element, nav, enum_processor, enums, apiname, version); TranslateParameters(overload, overload_element, nav, enum_processor, enums, apiname, version); TranslateAttributes(overload, overload_element, nav, apiname, version); overload_list.Add(overload); } } foreach (var overload in overload_list) { delegates.Add(overload); } } Console.WriteLine("Generating wrappers."); var wrappers = CreateWrappers(delegates, enums); Console.WriteLine("Generating convenience overloads."); wrappers.AddRange(CreateConvenienceOverloads(wrappers)); Console.WriteLine("Generating CLS compliant overloads."); wrappers = CreateCLSCompliantWrappers(wrappers, enums); Console.WriteLine("Removing non-CLS compliant duplicates."); wrappers = MarkCLSCompliance(wrappers); Console.WriteLine("Removing overloaded delegates."); RemoveOverloadedDelegates(delegates, wrappers); Console.WriteLine("Generating address table."); GenerateAddressTable(delegates); Console.WriteLine("Generating documentation."); GenerateDocumentation(wrappers, enum_processor, doc_processor); return wrappers; }
void WriteDocumentation(BindStreamWriter sw, Function f) { if (docfiles == null) { docfiles = new Dictionary<string, string>(); foreach (string file in Directory.GetFiles(Settings.DocPath)) { docfiles.Add(Path.GetFileName(file), file); } } string docfile = null; try { docfile = Settings.FunctionPrefix + f.WrappedDelegate.Name + ".xml"; if (!docfiles.ContainsKey(docfile)) docfile = Settings.FunctionPrefix + f.TrimmedName + ".xml"; if (!docfiles.ContainsKey(docfile)) docfile = Settings.FunctionPrefix + f.TrimmedName.TrimEnd(numbers) + ".xml"; string doc = null; if (docfiles.ContainsKey(docfile)) { if (processor == null) processor = new DocProcessor(Path.Combine(Settings.DocPath, Settings.DocFile)); doc = processor.ProcessFile(docfiles[docfile]); } if (doc == null) { doc = "/// <summary></summary>"; } int summary_start = doc.IndexOf("<summary>") + "<summary>".Length; string warning = "[deprecated: v{0}]"; string category = "[requires: {0}]"; if (f.Deprecated) { warning = String.Format(warning, f.DeprecatedVersion); doc = doc.Insert(summary_start, warning); } if (f.Extension != "Core" && !String.IsNullOrEmpty(f.Category)) { category = String.Format(category, f.Category); doc = doc.Insert(summary_start, category); } else if (!String.IsNullOrEmpty(f.Version)) { if (f.Category.StartsWith("VERSION")) category = String.Format(category, "v" + f.Version); else category = String.Format(category, "v" + f.Version + " and " + f.Category); doc = doc.Insert(summary_start, category); } sw.WriteLine(doc); } catch (Exception e) { Console.WriteLine("[Warning] Error processing file {0}: {1}", docfile, e.ToString()); } }
void GenerateDocumentation(FunctionCollection wrappers, EnumProcessor enum_processor, DocProcessor doc_processor) { foreach (var list in wrappers) { foreach (var f in list.Value) { f.Documentation = doc_processor.Process(f, enum_processor); } } }
void WriteDocumentation(BindStreamWriter sw, Function f) { if (docfiles == null) { docfiles = new Dictionary <string, string>(); foreach (string file in Directory.GetFiles(Settings.DocPath)) { docfiles.Add(Path.GetFileName(file), file); } } string docfile = null; try { docfile = Settings.FunctionPrefix + f.WrappedDelegate.Name + ".xml"; if (!docfiles.ContainsKey(docfile)) { docfile = Settings.FunctionPrefix + f.TrimmedName + ".xml"; } if (!docfiles.ContainsKey(docfile)) { docfile = Settings.FunctionPrefix + f.TrimmedName.TrimEnd(numbers) + ".xml"; } string doc = null; if (docfiles.ContainsKey(docfile)) { if (processor == null) { processor = new DocProcessor(Path.Combine(Settings.DocPath, Settings.DocFile)); } doc = processor.ProcessFile(docfiles[docfile]); } if (doc == null) { doc = "/// <summary></summary>"; } int summary_start = doc.IndexOf("<summary>") + "<summary>".Length; string warning = "[deprecated: v{0}]"; string category = "[requires: {0}]"; if (f.Deprecated) { warning = String.Format(warning, f.DeprecatedVersion); doc = doc.Insert(summary_start, warning); } if (f.Extension != "Core" && !String.IsNullOrEmpty(f.Category)) { category = String.Format(category, f.Category); doc = doc.Insert(summary_start, category); } else if (!String.IsNullOrEmpty(f.Version)) { if (f.Category.StartsWith("VERSION")) { category = String.Format(category, "v" + f.Version); } else { category = String.Format(category, "v" + f.Version + " and " + f.Category); } doc = doc.Insert(summary_start, category); } sw.WriteLine(doc); } catch (Exception e) { Console.WriteLine("[Warning] Error processing file {0}: {1}", docfile, e.ToString()); } }