Skip to content

Commit 1ebf418

Browse files
committed
Considered dependent fields when generating internals for types nested in templates.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 93e4a41 commit 1ebf418

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ private void GenerateClassTemplateSpecializationsInternals(Class classTemplate,
286286
IList<ClassTemplateSpecialization> specializations)
287287
{
288288
PushBlock(BlockKind.Namespace);
289-
var generated = GetGenerated(specializations);
289+
var generated = GetGeneratedClasses(classTemplate, specializations);
290290
WriteLine("namespace {0}{1}",
291291
classTemplate.OriginalNamespace is Class &&
292292
!classTemplate.OriginalNamespace.IsDependent ?
@@ -304,7 +304,11 @@ classTemplate.OriginalNamespace is Class &&
304304

305305
foreach (var group in generated.SelectMany(s => s.Classes).Where(
306306
c => !c.IsIncomplete).GroupBy(c => c.Name))
307-
GenerateNestedInternals(group.Key, group);
307+
{
308+
var nested = classTemplate.Classes.FirstOrDefault(c => c.Name == group.Key);
309+
if (nested != null)
310+
GenerateNestedInternals(group.Key, GetGeneratedClasses(nested, group));
311+
}
308312

309313
WriteCloseBraceIndent();
310314
PopBlock(NewLineKind.BeforeNextBlock);
@@ -324,17 +328,16 @@ private void GenerateNestedInternals(string name, IEnumerable<Class> nestedClass
324328
NewLine();
325329
}
326330

327-
private IEnumerable<ClassTemplateSpecialization> GetGenerated(
328-
IList<ClassTemplateSpecialization> specializations)
331+
private IEnumerable<Class> GetGeneratedClasses(
332+
Class dependentClass, IEnumerable<Class> specializedClasses)
329333
{
330-
var specialization = specializations.FirstOrDefault(s => s.IsGenerated) ??
331-
specializations[0];
334+
var specialization = specializedClasses.FirstOrDefault(s => s.IsGenerated) ??
335+
specializedClasses.First();
332336

333-
Class classTemplate = specialization.TemplatedDecl.TemplatedClass;
334-
if (classTemplate.HasDependentValueFieldInLayout())
335-
return specializations;
337+
if (dependentClass.HasDependentValueFieldInLayout())
338+
return specializedClasses;
336339

337-
return new List<ClassTemplateSpecialization> { specialization };
340+
return new[] { specialization };
338341
}
339342

340343
public override void GenerateDeclarationCommon(Declaration decl)

src/Generator/Generators/CodeGenerator.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -530,18 +530,20 @@ public static class Helpers
530530

531531
public static string GetSuffixForInternal(DeclarationContext @class)
532532
{
533-
ClassTemplateSpecialization specialization = null;
534-
DeclarationContext declContext = @class;
535-
while (declContext != null)
533+
if (@class == null)
534+
return string.Empty;
535+
536+
Class template = null;
537+
var specialization = @class as ClassTemplateSpecialization ??
538+
@class.Namespace as ClassTemplateSpecialization;
539+
if (specialization != null)
536540
{
537-
specialization = declContext as ClassTemplateSpecialization;
538-
if (specialization != null)
539-
break;
540-
declContext = declContext.Namespace;
541+
template = specialization.TemplatedDecl.TemplatedClass;
542+
if (@class != specialization)
543+
template = template.Classes.FirstOrDefault(c => c.Name == @class.Name);
541544
}
542545

543-
if (specialization == null ||
544-
!specialization.TemplatedDecl.TemplatedClass.HasDependentValueFieldInLayout())
546+
if (template == null || !template.HasDependentValueFieldInLayout())
545547
return string.Empty;
546548

547549
if (specialization.Arguments.All(

0 commit comments

Comments
 (0)