Example #1
0
        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 } }}");
        }
Example #2
0
        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 }");
            }
        }