Browse Source

Fixed the generated C# when a template is nested in another.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1026/head
Dimitar Dobrev 8 years ago
parent
commit
cdc2e73f84
  1. 30
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Std.cs
  2. 30
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/Std.cs
  3. 17
      src/Generator/Generators/CSharp/CSharpSources.cs
  4. 14
      src/Generator/Passes/MarkUsedClassInternalsPass.cs
  5. 15
      src/Generator/Passes/ResolveIncompleteDeclsPass.cs

30
src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Std.cs

@ -1148,15 +1148,7 @@ namespace Std @@ -1148,15 +1148,7 @@ namespace Std
namespace RbTree
{
[StructLayout(LayoutKind.Explicit, Size = 48)]
public unsafe partial struct __Internalc__N_std_S__Rb_tree____N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C___N_std_S_pair__1S0_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S__Select1st__S3____N_std_S_less__S0____N_std_S_allocator__S3_
{
[FieldOffset(0)]
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
}
public unsafe partial class RbTreeImpl
namespace RbTreeImpl
{
[StructLayout(LayoutKind.Explicit, Size = 48)]
public unsafe partial struct __Internal
@ -1170,26 +1162,14 @@ namespace Std @@ -1170,26 +1162,14 @@ namespace Std
[FieldOffset(40)]
internal ulong _M_node_count;
}
}
public unsafe partial class ReuseOrAllocNode
{
[StructLayout(LayoutKind.Explicit, Size = 0)]
public partial struct __Internal
{
}
}
public unsafe partial class AllocNode
[StructLayout(LayoutKind.Explicit, Size = 48)]
public unsafe partial struct __Internalc__N_std_S__Rb_tree____N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C___N_std_S_pair__1S0_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S__Select1st__S3____N_std_S_less__S0____N_std_S_allocator__S3_
{
[StructLayout(LayoutKind.Explicit, Size = 0)]
public unsafe partial struct __Internalc__N_std_S__Rb_tree____N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C___N_std_S_pair__1S0_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S__Select1st__S3____N_std_S_less__S0____N_std_S_allocator__S3_
{
}
[FieldOffset(0)]
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
}
}
public unsafe partial class RbTreeNodeBase

30
src/CppParser/Bindings/CSharp/x86_64-linux-gnu/Std.cs

@ -1148,15 +1148,7 @@ namespace Std @@ -1148,15 +1148,7 @@ namespace Std
namespace RbTree
{
[StructLayout(LayoutKind.Explicit, Size = 48)]
public unsafe partial struct __Internalc__N_std_S__Rb_tree____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C___N_std_S_pair__1S0_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S__Select1st__S3____N_std_S_less__S0____N_std_S_allocator__S3_
{
[FieldOffset(0)]
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
}
public unsafe partial class RbTreeImpl
namespace RbTreeImpl
{
[StructLayout(LayoutKind.Explicit, Size = 48)]
public unsafe partial struct __Internal
@ -1170,26 +1162,14 @@ namespace Std @@ -1170,26 +1162,14 @@ namespace Std
[FieldOffset(40)]
internal ulong _M_node_count;
}
}
public unsafe partial class ReuseOrAllocNode
{
[StructLayout(LayoutKind.Explicit, Size = 0)]
public partial struct __Internal
{
}
}
public unsafe partial class AllocNode
[StructLayout(LayoutKind.Explicit, Size = 48)]
public unsafe partial struct __Internalc__N_std_S__Rb_tree____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C___N_std_S_pair__1S0_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S__Select1st__S3____N_std_S_less__S0____N_std_S_allocator__S3_
{
[StructLayout(LayoutKind.Explicit, Size = 0)]
public unsafe partial struct __Internalc__N_std_S__Rb_tree____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C___N_std_S_pair__1S0_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S__Select1st__S3____N_std_S_less__S0____N_std_S_allocator__S3_
{
}
[FieldOffset(0)]
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
}
}
public unsafe partial class RbTreeNodeBase

17
src/Generator/Generators/CSharp/CSharpSources.cs

@ -288,11 +288,17 @@ namespace CppSharp.Generators.CSharp @@ -288,11 +288,17 @@ namespace CppSharp.Generators.CSharp
PushBlock(BlockKind.Namespace);
var generated = GetGenerated(specializations);
WriteLine("namespace {0}{1}",
classTemplate.OriginalNamespace is Class ?
classTemplate.OriginalNamespace is Class &&
!classTemplate.OriginalNamespace.IsDependent ?
classTemplate.OriginalNamespace.Name + '_' : string.Empty,
classTemplate.Name);
WriteStartBraceIndent();
foreach (var nestedTemplate in classTemplate.Classes.Where(
c => c.IsDependent && !c.Ignore && c.Specializations.Any(s => !s.Ignore)))
GenerateClassTemplateSpecializationsInternals(
nestedTemplate, nestedTemplate.Specializations);
foreach (var specialization in generated)
GenerateClassInternals(specialization);
@ -361,8 +367,10 @@ namespace CppSharp.Generators.CSharp @@ -361,8 +367,10 @@ namespace CppSharp.Generators.CSharp
return true;
}
foreach (var nestedTemplate in @class.Classes.Where(c => !c.IsIncomplete && c.IsDependent))
GenerateClassTemplateSpecializationInternal(nestedTemplate);
if (!@class.IsDependent)
foreach (var nestedTemplate in @class.Classes.Where(
c => !c.IsIncomplete && c.IsDependent))
GenerateClassTemplateSpecializationInternal(nestedTemplate);
if (@class.IsTemplate)
{
@ -373,6 +381,9 @@ namespace CppSharp.Generators.CSharp @@ -373,6 +381,9 @@ namespace CppSharp.Generators.CSharp
return true;
}
if (@class.IsDependent && !@class.IsGenerated)
return true;
var typeMaps = new List<System.Type>();
var keys = new List<string>();
// disable the type maps, if any, for this class because of copy ctors, operators and others

14
src/Generator/Passes/MarkUsedClassInternalsPass.cs

@ -53,13 +53,17 @@ namespace CppSharp.Passes @@ -53,13 +53,17 @@ namespace CppSharp.Passes
do
{
if (declarationContext.Ignore)
{
declarationContext.GenerationKind = GenerationKind.Internal;
var specialization = declarationContext as ClassTemplateSpecialization;
if (specialization?.TemplatedDecl.TemplatedClass.Ignore == true)
specialization.TemplatedDecl.TemplatedClass.GenerationKind = GenerationKind.Internal;
}
var specialization = declarationContext as ClassTemplateSpecialization;
Class template = specialization?.TemplatedDecl.TemplatedClass;
if (template?.Ignore == true)
template.GenerationKind = GenerationKind.Internal;
Class nested = template?.Classes.Find(c => c.OriginalName == decl.OriginalName);
if (nested?.Ignore == true)
nested.GenerationKind = GenerationKind.Internal;
declarationContext = declarationContext.Namespace;
} while (declarationContext != null);

15
src/Generator/Passes/ResolveIncompleteDeclsPass.cs

@ -31,15 +31,20 @@ namespace CppSharp.Passes @@ -31,15 +31,20 @@ namespace CppSharp.Passes
EnsureCompleteDeclaration(template.TemplatedDecl);
template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? template.TemplatedDecl;
Class templatedClass = template.TemplatedClass;
var parentSpecialization = templatedClass.Namespace as ClassTemplateSpecialization;
if (parentSpecialization != null)
templatedClass = parentSpecialization.TemplatedDecl.TemplatedClass.Classes.Find(
c => c.OriginalName == template.OriginalName) ?? template.TemplatedClass;
// store all specializations in the real template class because ClassTemplateDecl only forwards
foreach (var specialization in template.Specializations.Where(
s => !template.TemplatedClass.Specializations.Contains(s)))
template.TemplatedClass.Specializations.Add(specialization);
s => !templatedClass.Specializations.Contains(s)))
templatedClass.Specializations.Add(specialization);
if (template.TemplatedClass.TemplateParameters.Count == 0 || complete)
if (templatedClass.TemplateParameters.Count == 0 || complete)
{
template.TemplatedClass.TemplateParameters.Clear();
template.TemplatedClass.TemplateParameters.AddRange(template.Parameters);
templatedClass.TemplateParameters.Clear();
templatedClass.TemplateParameters.AddRange(template.Parameters);
}
return true;

Loading…
Cancel
Save