diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs index f2ce2ed2..d8311816 100644 --- a/src/Generator/Generators/CSharp/CSharpSources.cs +++ b/src/Generator/Generators/CSharp/CSharpSources.cs @@ -189,7 +189,12 @@ namespace CppSharp.Generators.CSharp context.Declarations.Any(d => d.IsGenerated || (d is Class && !d.IsIncomplete)); using var _ = shouldGenerateNamespace - ? PushWriteBlock(BlockKind.Namespace, $"namespace {context.Name}", NewLineKind.BeforeNextBlock) + ? + ( + Options.GenerateTypesOnly && context.Name != Options.GenerateTypesRootNamespace + ? PushWriteBlock(BlockKind.Class, $"public partial class {context.Name}", NewLineKind.BeforeNextBlock) + : PushWriteBlock(BlockKind.Namespace, $"namespace {context.Name}", NewLineKind.BeforeNextBlock) + ) : default; return base.VisitNamespace(@namespace); @@ -254,11 +259,26 @@ namespace CppSharp.Generators.CSharp if (classes.FindAll(cls => cls.IsValueType && cls.Name == parentName && context.QualifiedLogicalName == cls.Namespace.QualifiedLogicalName).Any()) keyword = "struct"; - if (Options.GenerateTypesOnly && Options.PutAllGlobalsInGlobalClass) - parentName = "Globals"; + bool generate = true; - WriteLine($"public unsafe partial {keyword} {parentName}"); - WriteOpenBraceAndIndent(); + if (Options.GenerateTypesOnly) + { + if (context is Namespace n) + { + if (n.Name == Options.GenerateTypesRootNamespace) + parentName = "Globals"; + else if (!string.IsNullOrEmpty(n.Name)) + generate = false; + else if (Options.PutAllGlobalsInGlobalClass) + parentName = "Globals"; + } + } + + if (generate) + { + WriteLine($"public unsafe partial {keyword} {parentName}"); + WriteOpenBraceAndIndent(); + } if (Options.GenerateBindings) { @@ -293,8 +313,11 @@ namespace CppSharp.Generators.CSharp v => v.IsGenerated && v.Access == AccessSpecifier.Public)) GenerateVariable(null, variable); - UnindentAndWriteCloseBrace(); - PopBlock(NewLineKind.BeforeNextBlock); + if (generate) + { + UnindentAndWriteCloseBrace(); + PopBlock(NewLineKind.BeforeNextBlock); + } } private void GenerateClassTemplateSpecializationInternal(Class classTemplate) diff --git a/src/Generator/Options.cs b/src/Generator/Options.cs index 3b84a2ae..e45df870 100644 --- a/src/Generator/Options.cs +++ b/src/Generator/Options.cs @@ -93,6 +93,7 @@ namespace CppSharp /// true to generate class templates; otherwise, false. /// public bool GenerateClassTemplates { get; set; } + public string GenerateTypesRootNamespace { get; set; } = String.Empty; public bool GenerateTypesOnly { get; set; } = false; internal bool GenerateBindings => !GenerateTypesOnly; public bool AllowRenaming { get; set; } = true;