Skip to content

Commit cdc2e73

Browse files
committed
Fixed the generated C# when a template is nested in another.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 573818f commit cdc2e73

File tree

5 files changed

+43
-63
lines changed

5 files changed

+43
-63
lines changed

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

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,15 +1148,7 @@ public enum RbTreeColor : uint
11481148

11491149
namespace RbTree
11501150
{
1151-
[StructLayout(LayoutKind.Explicit, Size = 48)]
1152-
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_
1153-
{
1154-
[FieldOffset(0)]
1155-
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
1156-
}
1157-
1158-
1159-
public unsafe partial class RbTreeImpl
1151+
namespace RbTreeImpl
11601152
{
11611153
[StructLayout(LayoutKind.Explicit, Size = 48)]
11621154
public unsafe partial struct __Internal
@@ -1170,26 +1162,14 @@ public unsafe partial struct __Internal
11701162
[FieldOffset(40)]
11711163
internal ulong _M_node_count;
11721164
}
1173-
1174-
}
1175-
1176-
public unsafe partial class ReuseOrAllocNode
1177-
{
1178-
[StructLayout(LayoutKind.Explicit, Size = 0)]
1179-
public partial struct __Internal
1180-
{
1181-
}
1182-
11831165
}
11841166

1185-
public unsafe partial class AllocNode
1167+
[StructLayout(LayoutKind.Explicit, Size = 48)]
1168+
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_
11861169
{
1187-
[StructLayout(LayoutKind.Explicit, Size = 0)]
1188-
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_
1189-
{
1190-
}
1170+
[FieldOffset(0)]
1171+
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
11911172
}
1192-
11931173
}
11941174

11951175
public unsafe partial class RbTreeNodeBase

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

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,15 +1148,7 @@ public enum RbTreeColor : uint
11481148

11491149
namespace RbTree
11501150
{
1151-
[StructLayout(LayoutKind.Explicit, Size = 48)]
1152-
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_
1153-
{
1154-
[FieldOffset(0)]
1155-
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
1156-
}
1157-
1158-
1159-
public unsafe partial class RbTreeImpl
1151+
namespace RbTreeImpl
11601152
{
11611153
[StructLayout(LayoutKind.Explicit, Size = 48)]
11621154
public unsafe partial struct __Internal
@@ -1170,26 +1162,14 @@ public unsafe partial struct __Internal
11701162
[FieldOffset(40)]
11711163
internal ulong _M_node_count;
11721164
}
1173-
1174-
}
1175-
1176-
public unsafe partial class ReuseOrAllocNode
1177-
{
1178-
[StructLayout(LayoutKind.Explicit, Size = 0)]
1179-
public partial struct __Internal
1180-
{
1181-
}
1182-
11831165
}
11841166

1185-
public unsafe partial class AllocNode
1167+
[StructLayout(LayoutKind.Explicit, Size = 48)]
1168+
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_
11861169
{
1187-
[StructLayout(LayoutKind.Explicit, Size = 0)]
1188-
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_
1189-
{
1190-
}
1170+
[FieldOffset(0)]
1171+
internal global::Std.RbTree.RbTreeImpl.__Internal _M_impl;
11911172
}
1192-
11931173
}
11941174

11951175
public unsafe partial class RbTreeNodeBase

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,17 @@ private void GenerateClassTemplateSpecializationsInternals(Class classTemplate,
288288
PushBlock(BlockKind.Namespace);
289289
var generated = GetGenerated(specializations);
290290
WriteLine("namespace {0}{1}",
291-
classTemplate.OriginalNamespace is Class ?
291+
classTemplate.OriginalNamespace is Class &&
292+
!classTemplate.OriginalNamespace.IsDependent ?
292293
classTemplate.OriginalNamespace.Name + '_' : string.Empty,
293294
classTemplate.Name);
294295
WriteStartBraceIndent();
295296

297+
foreach (var nestedTemplate in classTemplate.Classes.Where(
298+
c => c.IsDependent && !c.Ignore && c.Specializations.Any(s => !s.Ignore)))
299+
GenerateClassTemplateSpecializationsInternals(
300+
nestedTemplate, nestedTemplate.Specializations);
301+
296302
foreach (var specialization in generated)
297303
GenerateClassInternals(specialization);
298304

@@ -361,8 +367,10 @@ public override bool VisitClassDecl(Class @class)
361367
return true;
362368
}
363369

364-
foreach (var nestedTemplate in @class.Classes.Where(c => !c.IsIncomplete && c.IsDependent))
365-
GenerateClassTemplateSpecializationInternal(nestedTemplate);
370+
if (!@class.IsDependent)
371+
foreach (var nestedTemplate in @class.Classes.Where(
372+
c => !c.IsIncomplete && c.IsDependent))
373+
GenerateClassTemplateSpecializationInternal(nestedTemplate);
366374

367375
if (@class.IsTemplate)
368376
{
@@ -373,6 +381,9 @@ public override bool VisitClassDecl(Class @class)
373381
return true;
374382
}
375383

384+
if (@class.IsDependent && !@class.IsGenerated)
385+
return true;
386+
376387
var typeMaps = new List<System.Type>();
377388
var keys = new List<string>();
378389
// disable the type maps, if any, for this class because of copy ctors, operators and others

src/Generator/Passes/MarkUsedClassInternalsPass.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,17 @@ private static void MarkUsedFieldTypes(DeclarationContext declContext,
5353
do
5454
{
5555
if (declarationContext.Ignore)
56-
{
5756
declarationContext.GenerationKind = GenerationKind.Internal;
5857

59-
var specialization = declarationContext as ClassTemplateSpecialization;
60-
if (specialization?.TemplatedDecl.TemplatedClass.Ignore == true)
61-
specialization.TemplatedDecl.TemplatedClass.GenerationKind = GenerationKind.Internal;
62-
}
58+
var specialization = declarationContext as ClassTemplateSpecialization;
59+
Class template = specialization?.TemplatedDecl.TemplatedClass;
60+
if (template?.Ignore == true)
61+
template.GenerationKind = GenerationKind.Internal;
62+
63+
Class nested = template?.Classes.Find(c => c.OriginalName == decl.OriginalName);
64+
if (nested?.Ignore == true)
65+
nested.GenerationKind = GenerationKind.Internal;
66+
6367
declarationContext = declarationContext.Namespace;
6468
} while (declarationContext != null);
6569

src/Generator/Passes/ResolveIncompleteDeclsPass.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,20 @@ public override bool VisitClassTemplateDecl(ClassTemplate template)
3131
EnsureCompleteDeclaration(template.TemplatedDecl);
3232

3333
template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? template.TemplatedDecl;
34+
Class templatedClass = template.TemplatedClass;
35+
var parentSpecialization = templatedClass.Namespace as ClassTemplateSpecialization;
36+
if (parentSpecialization != null)
37+
templatedClass = parentSpecialization.TemplatedDecl.TemplatedClass.Classes.Find(
38+
c => c.OriginalName == template.OriginalName) ?? template.TemplatedClass;
3439
// store all specializations in the real template class because ClassTemplateDecl only forwards
3540
foreach (var specialization in template.Specializations.Where(
36-
s => !template.TemplatedClass.Specializations.Contains(s)))
37-
template.TemplatedClass.Specializations.Add(specialization);
41+
s => !templatedClass.Specializations.Contains(s)))
42+
templatedClass.Specializations.Add(specialization);
3843

39-
if (template.TemplatedClass.TemplateParameters.Count == 0 || complete)
44+
if (templatedClass.TemplateParameters.Count == 0 || complete)
4045
{
41-
template.TemplatedClass.TemplateParameters.Clear();
42-
template.TemplatedClass.TemplateParameters.AddRange(template.Parameters);
46+
templatedClass.TemplateParameters.Clear();
47+
templatedClass.TemplateParameters.AddRange(template.Parameters);
4348
}
4449

4550
return true;

0 commit comments

Comments
 (0)