Example #1
0
        /// <summary>
        ///   Maps all C++ types to C#
        /// </summary>
        /// <param name="cppModule">The C++ module to parse.</param>
        /// <param name="configFile">The config file to use to transform the C++ module into C# assemblies.</param>
        /// <param name="checkFilesPath">The path for the check files.</param>
        public (CsSolution solution, IEnumerable <DefineExtensionRule> consumerExtensions) Transform(CppModule cppModule, ConfigFile configFile, string checkFilesPath)
        {
            Init(configFile.ConfigFilesLoaded);

            var checkFileNodes = CheckIfUpdated(configFile.ConfigFilesLoaded, checkFilesPath);

            var moduleToTransform = MapModule(cppModule, configFile.ConfigFilesLoaded.Where(cfg => cfg.ProcessMappings));


            var selectedCSharpType = new List <CsBase>();

            // Prepare transform by defining/registering all types to process
            selectedCSharpType.AddRange(PrepareTransform(moduleToTransform, EnumTransform));
            selectedCSharpType.AddRange(PrepareTransform(moduleToTransform, StructTransform));
            selectedCSharpType.AddRange(PrepareTransform(moduleToTransform, InterfaceTransform));
            selectedCSharpType.AddRange(PrepareTransform <CppFunction, CsFunction>(moduleToTransform, FunctionTransform));

            // Transform all types
            Logger.Progress(65, "Transforming enums...");
            ProcessTransform(EnumTransform, selectedCSharpType.OfType <CsEnum>());
            Logger.Progress(70, "Transforming structs...");
            ProcessTransform(StructTransform, selectedCSharpType.OfType <CsStruct>());
            Logger.Progress(75, "Transforming interfaces...");
            ProcessTransform(InterfaceTransform, selectedCSharpType.OfType <CsInterface>());
            Logger.Progress(80, "Transforming functions...");
            ProcessTransform(FunctionTransform, selectedCSharpType.OfType <CsFunction>());

            var solution = new CsSolution();

            foreach (CsAssembly cSharpAssembly in assemblyManager.Assemblies)
            {
                foreach (var ns in cSharpAssembly.Namespaces)
                {
                    foreach (var cSharpFunctionGroup in ns.Classes)
                    {
                        constantManager.AttachConstants(cSharpFunctionGroup);
                    }
                }
                solution.Add(cSharpAssembly);

                if (checkFileNodes.TryGetValue(cSharpAssembly.Name, out var node))
                {
                    cSharpAssembly.NeedsToBeUpdated = node.NeedsToBeUpdated;
                }
            }

            return(solution, configFile.ConfigFilesLoaded.SelectMany(file => file.Extension.OfType <DefineExtensionRule>()));
        }
        /// <summary>
        ///   Maps all C++ types to C#
        /// </summary>
        /// <param name="cppModule">The C++ module to parse.</param>
        /// <param name="configFile">The config file to use to transform the C++ module into C# assemblies.</param>
        /// <param name="checkFilesPath">The path for the check files.</param>
        public (CsAssembly assembly, IEnumerable <DefineExtensionRule> consumerExtensions) Transform(CppModule cppModule, ConfigFile configFile, string checkFilesPath)
        {
            Init(configFile.ConfigFilesLoaded);

            var checkFileNodes = CheckIfUpdated(configFile.ConfigFilesLoaded, checkFilesPath);

            var moduleToTransform = MapModule(cppModule, configFile.ConfigFilesLoaded.Where(cfg => cfg.ProcessMappings));


            var selectedCSharpType = new List <CsBase>();

            // Prepare transform by defining/registering all types to process
            selectedCSharpType.AddRange(PrepareTransform(moduleToTransform, EnumTransform));
            selectedCSharpType.AddRange(PrepareTransform(moduleToTransform, StructTransform));
            selectedCSharpType.AddRange(PrepareTransform(moduleToTransform, InterfaceTransform));
            selectedCSharpType.AddRange(PrepareTransform <CppFunction, CsFunction>(moduleToTransform, FunctionTransform));

            // Transform all types
            Logger.Progress(65, "Transforming enums...");
            ProcessTransform(EnumTransform, selectedCSharpType.OfType <CsEnum>());
            Logger.Progress(70, "Transforming structs...");
            ProcessTransform(StructTransform, selectedCSharpType.OfType <CsStruct>());
            Logger.Progress(75, "Transforming interfaces...");
            ProcessTransform(InterfaceTransform, selectedCSharpType.OfType <CsInterface>());
            Logger.Progress(80, "Transforming functions...");
            ProcessTransform(FunctionTransform, selectedCSharpType.OfType <CsFunction>());

            var asm = new CsAssembly
            {
                Interop = interopManager
            };

            foreach (var ns in namespaceRegistry.Namespaces)
            {
                foreach (var group in ns.Classes)
                {
                    constantManager.AttachConstants(group);
                }
                asm.Add(ns);
            }

            return(asm, configFile.ConfigFilesLoaded.SelectMany(file => file.Extension.OfType <DefineExtensionRule>()));
        }