public void Emit() { var descriptor = GetTypeIIDDescriptor(Type.Generator, originalType); var iidName = "IID_" + Regex.Replace(originalType.FullName.Substring(Type.Namespace.Length + 1), @"[\.`<>,]", "_").TrimEnd('_'); var guid = Utility.GuidUtility.Create(Namespace, descriptor); var guidStr = Regex.Replace(guid.ToString("X"), @"[\{\}]", ""); var dependsOnAssemblies = new List <string>(ForeignAssemblyDependencies.GroupBy(t => t.Module.Assembly.Name.Name).Select(g => g.Key)); var features = new FeatureConditions(dependsOnAssemblies); Module.Append($@" { features.GetAttribute() }RT_PINTERFACE!{{ for { Name } => [{ guidStr }] as { iidName } }}"); }
private void WriteModuleTreeMultiFile(Module mod, DirectoryInfo directory, StreamWriter file, string path = null, AssemblyDefinition asm = null) { if (mod.IsEmpty) { return; } const string IMPORTS = "use crate::prelude::*;"; string name = mod.Name.ToLower(); string newPath = path == null ? mod.Name : (path + "." + mod.Name); bool isNewAssembly = (asm != mod.Assembly); if (isNewAssembly && mod.Assembly.Name.Name != "Windows.Foundation") { var featureCond = new FeatureConditions(new string[] { mod.Assembly.Name.Name }).GetAttribute().TrimEnd(); file.Write(featureCond); file.Write(" "); } if (isNewAssembly || path == null || mod.ContainsMoreThanOneAssembly) { // write module to separate file file.WriteLine($"pub mod { name }; // { newPath }"); DirectoryInfo childDir; StreamWriter childFile; if (mod.ContainsMoreThanOneAssembly) { childDir = directory.CreateSubdirectory(name); childFile = new StreamWriter(Path.Combine(childDir.FullName, "mod.rs")); } else { childDir = directory; childFile = new StreamWriter(Path.Combine(childDir.FullName, name + ".rs")); } var text = mod.Text.ToString(); if (!string.IsNullOrWhiteSpace(text)) { childFile.Write(IMPORTS); childFile.WriteLine(text); } foreach (var child in mod.Children.Values) { WriteModuleTreeMultiFile(child, childDir, childFile, newPath, mod.Assembly); } childFile.Close(); } else { // write module inline file.WriteLine($"pub mod { name } {{ // { newPath }"); var text = mod.Text.ToString(); if (!string.IsNullOrWhiteSpace(text)) { file.Write(IMPORTS); file.WriteLine(text); } foreach (var child in mod.Children.Values) { WriteModuleTreeMultiFile(child, directory, file, newPath, mod.Assembly); } file.WriteLine($"}} // { newPath }"); } }