public StructTransform(NamingRulesManager namingRules, NamespaceRegistry namespaceRegistry, MarshalledElementFactory factory, Ioc ioc) : base(namingRules, ioc) { this.namespaceRegistry = namespaceRegistry; this.factory = factory; factory.RequestStructProcessing += Process; }
public MethodTransform(NamingRulesManager namingRules, GroupRegistry groupRegistry, MarshalledElementFactory factory, IInteropSignatureTransform interopSignatureTransform, Ioc ioc) : base(namingRules, ioc) { this.groupRegistry = groupRegistry; this.factory = factory; signatureTransform = interopSignatureTransform; }
public void ShortNamingRules() { var manager = new NamingRulesManager(); manager.AddShortNameRule("DESC", "Description"); Assert.Equal("ShaderDescription", manager.Rename(new CppModel.CppElement { Name = "SHADER_DESC" })); }
public void LongerRuleTakesPrecedent() { var manager = new NamingRulesManager(); manager.AddShortNameRule("INFO", "Information"); manager.AddShortNameRule("INFORMATION", "Information"); Assert.Equal("RawDeviceInformation", manager.Rename(new CppStruct("RAW_DEVICE_INFO"))); Assert.Equal("RawDeviceInformation", manager.Rename(new CppStruct("RAW_DEVICE_INFORMATION"))); }
private (IDocumentationLinker doc, CsSolution solution) ExecuteMappings(CppModule group, ConfigFile consumerConfig) { var docLinker = new DocumentationLinker(); var typeRegistry = new TypeRegistry(Logger, docLinker); var namingRules = new NamingRulesManager(); var assemblyManager = new AssemblyManager(); // Run the main mapping process var transformer = new TransformManager( GlobalNamespace, namingRules, Logger, typeRegistry, docLinker, new ConstantManager(namingRules, docLinker), assemblyManager) { ForceGenerator = _isAssemblyNew }; var(solution, defines) = transformer.Transform(group, Config, IntermediateOutputPath); consumerConfig.Extension = new List <ExtensionBaseRule>(defines); var(bindings, generatedDefines) = transformer.GenerateTypeBindingsForConsumers(); consumerConfig.Bindings.AddRange(bindings); consumerConfig.Extension.AddRange(generatedDefines); consumerConfig.Mappings.AddRange( docLinker.GetAllDocLinks().Select( link => new MappingRule { DocItem = link.cppName, MappingNameFinal = link.cSharpName })); if (Logger.HasErrors) { Logger.Fatal("Executing mapping rules failed"); } PrintStatistics(assemblyManager); DumpRenames(transformer); return(docLinker, solution); }
private TransformManager CreateTransformer() { var docLinker = new DocumentationLinker(); var typeRegistry = new TypeRegistry(Logger, docLinker); var namingRules = new NamingRulesManager(); // Run the main mapping process return(new TransformManager( new GlobalNamespaceProvider(), namingRules, Logger, typeRegistry, docLinker, new ConstantManager(namingRules, docLinker) )); }
private TransformManager CreateTransformer() { var docLinker = new DocumentationLinker(); var typeRegistry = new TypeRegistry(Logger, docLinker); var namingRules = new NamingRulesManager(); // Run the main mapping process var transformer = new TransformManager( new GlobalNamespaceProvider("SharpGen.Runtime"), namingRules, Logger, typeRegistry, docLinker, new ConstantManager(namingRules, docLinker)) { ForceGenerator = true }; return(transformer); }
public EnumTransform(NamingRulesManager namingRules, NamespaceRegistry namespaceRegistry, Ioc ioc) : base(namingRules, ioc) { this.namespaceRegistry = namespaceRegistry; }
protected override bool Execute(ConfigFile config) { var group = SharpGen.CppModel.CppModule.Read(CppModule.ItemSpec); config.ExpandDynamicVariables(SharpGenLogger, group); var docLinker = new DocumentationLinker(); var typeRegistry = new TypeRegistry(SharpGenLogger, docLinker); var namingRules = new NamingRulesManager(); var globalNamespace = new GlobalNamespaceProvider(GlobalNamespace); foreach (var nameOverride in GlobalNamespaceOverrides ?? Enumerable.Empty <ITaskItem>()) { var wellKnownName = nameOverride.ItemSpec; var overridenName = nameOverride.GetMetadata("Override"); if (overridenName != null && Enum.TryParse(wellKnownName, out WellKnownName name)) { globalNamespace.OverrideName(name, overridenName); } } // Run the main mapping process var transformer = new TransformManager( globalNamespace, namingRules, SharpGenLogger, typeRegistry, docLinker, new ConstantManager(namingRules, docLinker), new AssemblyManager()) { ForceGenerator = ForceGenerator }; var(solution, defines) = transformer.Transform(group, config, null); solution.Write(CSharpModel.ItemSpec); var consumerConfig = ConfigFile.Load(CppConsumerConfigCache.ItemSpec, new string[0], SharpGenLogger); consumerConfig.Id = ConsumerBindMappingConfigId; consumerConfig.Extension = new List <ExtensionBaseRule>(defines); var(bindings, generatedDefines) = transformer.GenerateTypeBindingsForConsumers(); consumerConfig.Bindings.AddRange(bindings); consumerConfig.Extension.AddRange(generatedDefines); consumerConfig.Mappings.AddRange( docLinker.GetAllDocLinks().Select( link => new MappingRule { DocItem = link.cppName, MappingNameFinal = link.cSharpName })); if (GenerateConsumerConfig) { GenerateConfigForConsumers(consumerConfig); } SaveDocLinks(docLinker); return(!Log.HasLoggedErrors); }
private bool Execute(ConfigFile config) { config.GetFilesWithIncludesAndExtensionHeaders( out var configsWithHeaders, out var configsWithExtensionHeaders ); var cppHeaderGenerator = new CppHeaderGenerator(SharpGenLogger, OutputPath); var cppHeaderGenerationResult = cppHeaderGenerator.GenerateCppHeaders(config, configsWithHeaders, configsWithExtensionHeaders); if (SharpGenLogger.HasErrors) { return(false); } var resolver = new IncludeDirectoryResolver(SharpGenLogger); resolver.Configure(config); var castXml = new CastXmlRunner(SharpGenLogger, resolver, CastXmlExecutable.ItemSpec, CastXmlArguments) { OutputPath = OutputPath }; var macroManager = new MacroManager(castXml); var cppExtensionGenerator = new CppExtensionHeaderGenerator(); var module = config.CreateSkeletonModule(); macroManager.Parse(Path.Combine(OutputPath, config.HeaderFileName), module); cppExtensionGenerator.GenerateExtensionHeaders( config, OutputPath, module, configsWithExtensionHeaders, cppHeaderGenerationResult.UpdatedConfigs ); GenerateInputsCache( macroManager.IncludedFiles .Concat(config.ConfigFilesLoaded.Select(x => x.AbsoluteFilePath)) .Concat(configsWithExtensionHeaders.Select(x => Path.Combine(OutputPath, x.ExtensionFileName))) .Select(s => Utilities.FixFilePath(s, Utilities.EmptyFilePathBehavior.Ignore)) .Where(x => x != null) .Distinct() ); if (SharpGenLogger.HasErrors) { return(false); } // Run the parser var parser = new CppParser(SharpGenLogger, config) { OutputPath = OutputPath }; if (SharpGenLogger.HasErrors) { return(false); } CppModule group; using (var xmlReader = castXml.Process(parser.RootConfigHeaderFileName)) { // Run the C++ parser group = parser.Run(module, xmlReader); } if (SharpGenLogger.HasErrors) { return(false); } config.ExpandDynamicVariables(SharpGenLogger, group); var docLinker = new DocumentationLinker(); var typeRegistry = new TypeRegistry(SharpGenLogger, docLinker); var namingRules = new NamingRulesManager(); var globalNamespace = new GlobalNamespaceProvider(); foreach (var nameOverride in GlobalNamespaceOverrides) { var wellKnownName = nameOverride.ItemSpec; var overridenName = nameOverride.GetMetadata("Override"); if (string.IsNullOrEmpty(overridenName)) { continue; } if (Enum.TryParse(wellKnownName, out WellKnownName name)) { globalNamespace.OverrideName(name, overridenName); } else { SharpGenLogger.Warning( LoggingCodes.InvalidGlobalNamespaceOverride, "Invalid override of \"{0}\": unknown class name, ignoring the override.", wellKnownName ); } } // Run the main mapping process var transformer = new TransformManager( globalNamespace, namingRules, SharpGenLogger, typeRegistry, docLinker, new ConstantManager(namingRules, docLinker) ); var(solution, defines) = transformer.Transform(group, config); var consumerConfig = new ConfigFile { Id = ConsumerBindMappingConfigId, IncludeProlog = { cppHeaderGenerationResult.Prologue }, Extension = new List <ExtensionBaseRule>(defines) }; var(bindings, generatedDefines) = transformer.GenerateTypeBindingsForConsumers(); consumerConfig.Bindings.AddRange(bindings); consumerConfig.Extension.AddRange(generatedDefines); consumerConfig.Mappings.AddRange( docLinker.GetAllDocLinks().Select( link => new MappingRule { DocItem = link.cppName, MappingNameFinal = link.cSharpName } ) ); GenerateConfigForConsumers(consumerConfig); if (SharpGenLogger.HasErrors) { return(false); } var documentationCacheItemSpec = DocumentationCache.ItemSpec; Utilities.RequireAbsolutePath(documentationCacheItemSpec, nameof(DocumentationCache)); var cache = File.Exists(documentationCacheItemSpec) ? DocItemCache.Read(documentationCacheItemSpec) : new DocItemCache(); DocumentationLogger docLogger = new(SharpGenLogger) { MaxLevel = LogLevel.Warning }; var docContext = new Lazy <DocumentationContext>(() => new DocumentationContext(docLogger)); ExtensibilityDriver.Instance.DocumentModule(SharpGenLogger, cache, solution, docContext).Wait(); if (docContext.IsValueCreated) { Regex[] silencePatterns = null; var docLogLevelDefault = DocumentationFailuresAsErrors ? LogLevel.Error : LogLevel.Warning; foreach (var queryFailure in docContext.Value.Failures) { if (silencePatterns == null) { silencePatterns = new Regex[SilenceMissingDocumentationErrorIdentifierPatterns.Length]; for (var i = 0; i < silencePatterns.Length; i++) { silencePatterns[i] = new Regex( SilenceMissingDocumentationErrorIdentifierPatterns[i].ItemSpec, RegexOptions.CultureInvariant ); } } if (silencePatterns.Length != 0) { bool SilencePredicate(Regex x) => x.Match(queryFailure.Query).Success; if (silencePatterns.Any(SilencePredicate)) { continue; } } var providerName = queryFailure.FailedProviderName ?? "<null>"; var docLogLevel = queryFailure.TreatProviderFailuresAsErrors ? docLogLevelDefault : docLogLevelDefault > LogLevel.Warning ? LogLevel.Warning : docLogLevelDefault; if (queryFailure.Exceptions == null || queryFailure.Exceptions.Count <= 1) { SharpGenLogger.LogRawMessage( docLogLevel, LoggingCodes.DocumentationProviderInternalError, "Documentation provider [{0}] query for \"{1}\" failed.", queryFailure.Exceptions?.FirstOrDefault(), providerName, queryFailure.Query ); } else { var exceptionsCount = queryFailure.Exceptions.Count; for (var index = 0; index < exceptionsCount; index++) { var exception = queryFailure.Exceptions[index]; SharpGenLogger.LogRawMessage( docLogLevel, LoggingCodes.DocumentationProviderInternalError, "Documentation provider [{0}] query for \"{1}\" failed ({2}/{3}).", exception, providerName, queryFailure.Query, index + 1, exceptionsCount ); } } } } cache.WriteIfDirty(documentationCacheItemSpec); if (SharpGenLogger.HasErrors) { return(false); } var documentationFiles = new Dictionary <string, XmlDocument>(); foreach (var file in ExternalDocumentation) { using var stream = File.OpenRead(file.ItemSpec); var xml = new XmlDocument(); xml.Load(stream); documentationFiles.Add(file.ItemSpec, xml); } PlatformDetectionType platformMask = 0; foreach (var platform in Platforms) { if (!Enum.TryParse <PlatformDetectionType>(platform.ItemSpec, out var parsedPlatform)) { SharpGenLogger.Warning( LoggingCodes.InvalidPlatformDetectionType, "The platform type {0} is an unknown platform to SharpGenTools. Falling back to Any platform detection.", platform ); platformMask = PlatformDetectionType.Any; } else { platformMask |= parsedPlatform; } } if (platformMask == 0) { platformMask = PlatformDetectionType.Any; } if (SharpGenLogger.HasErrors) { return(false); } var generator = new RoslynGenerator( SharpGenLogger, globalNamespace, docLinker, new ExternalDocCommentsReader(documentationFiles), new GeneratorConfig { Platforms = platformMask } ); generator.Run(solution, GeneratedCodeFolder); return(!SharpGenLogger.HasErrors); }
public void Destination() { var manager = new NamingRulesManager(); manager.AddShortNameRule("DST", "Destination"); manager.AddShortNameRule("DEST", "Destination"); CppEnum cppEnum = new("COLORMANAGEMENT_PROP"); cppEnum.AddEnumItem("COLORMANAGEMENT_PROP_SOURCE_COLOR_CONTEXT", "0"); cppEnum.AddEnumItem("COLORMANAGEMENT_PROP_SOURCE_RENDERING_INTENT", "1"); cppEnum.AddEnumItem("COLORMANAGEMENT_PROP_DESTINATION_COLOR_CONTEXT", "2"); cppEnum.AddEnumItem("COLORMANAGEMENT_PROP_DESTINATION_RENDERING_INTENT", "3"); cppEnum.AddEnumItem("COLORMANAGEMENT_PROP_ALPHA_MODE", "4"); cppEnum.AddEnumItem("COLORMANAGEMENT_PROP_QUALITY", "5"); Assert.Equal("ColormanagementProp", manager.Rename(cppEnum)); Assert.Equal( new[] { "SourceColorContext", "SourceRenderingIntent", "DestinationInationColorContext", "DestinationInationRenderingIntent", "AlphaMode", "Quality", }, RenameEnumItems() ); foreach (var cppEnumItem in cppEnum.EnumItems) { cppEnumItem.Rule.NamingFlags = NamingFlags.NoShortNameExpand; } Assert.Equal( new[] { "SourceColorContext", "SourceRenderingIntent", "DestinationColorContext", "DestinationRenderingIntent", "AlphaMode", "Quality", }, RenameEnumItems() ); foreach (var cppEnumItem in cppEnum.EnumItems) { cppEnumItem.Rule.NamingFlags = NamingFlags.NoShortNameExpand | NamingFlags.KeepUnderscore | NamingFlags.NoHungarianNotationHandler | NamingFlags.NoPrematureBreak; } Assert.Equal( new[] { "Source_Color_Context", "Source_Rendering_Intent", "Destination_Color_Context", "Destination_Rendering_Intent", "Alpha_Mode", "Quality", }, RenameEnumItems() ); string[] RenameEnumItems() => cppEnum.EnumItems.Select(x => manager.Rename(x, cppEnum.Name)).ToArray(); }
public void ShortNamingRules() { var manager = new NamingRulesManager(); manager.AddShortNameRule("DESC", "Description"); var parameters = new[] { new CppParameter("pShaderDESC"), new CppParameter("pShaderDESC") { Pointer = "*" }, new CppParameter("pShader_DESC") { Pointer = "*" }, new CppParameter("p0") { Pointer = "*" }, new CppParameter("p0") { Pointer = "*" }, new CppParameter("0"), new CppParameter("break"), new CppParameter("void"), new CppParameter("string") }; Assert.Equal( new[] { "pShaderDESC", "shaderDESC", "shaderDescription", "p0", "p01", "arg0", "@break", "@void", "text", }, manager.Rename(parameters) ); foreach (var cppParameter in parameters) { cppParameter.Rule.NamingFlags = NamingFlags.NoHungarianNotationHandler; } Assert.Equal( new[] { "pShaderDESC", "pShaderDESC1", "pShaderDescription", "p0", "p01", "arg0", "@break", "@void", "text", }, manager.Rename(parameters) ); foreach (var cppParameter in parameters) { cppParameter.Rule.NamingFlags = NamingFlags.NoShortNameExpand | NamingFlags.KeepUnderscore | NamingFlags.NoHungarianNotationHandler | NamingFlags.NoPrematureBreak; } Assert.Equal( new[] { "pShaderDESC", "pShaderDESC1", "pShader_Desc", "p0", "p01", "arg0", "@break", "@void", "text", }, manager.Rename(parameters) ); Assert.Equal("ShaderDESC", manager.Rename(new CppInterface("ShaderDESC"))); Assert.Equal("ShaderDescription", manager.Rename(new CppInterface("Shader_DESC"))); Assert.Equal("ShaderDescription", manager.Rename(new CppInterface("SHADER_DESC"))); Assert.Equal("ShaderDescription", manager.Rename(new CppStruct("SHADER_DESC"))); Assert.Equal("ShaderDescription", manager.Rename(new CppEnum("SHADER_DESC"))); }
protected TransformBase(NamingRulesManager namingRules, Ioc ioc) { NamingRules = namingRules; Ioc = ioc ?? throw new ArgumentNullException(nameof(ioc)); }