Browse Source

Considered dependent fields when generating internals for types nested in templates.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1026/head
Dimitar Dobrev 8 years ago
parent
commit
1ebf418e18
  1. 23
      src/Generator/Generators/CSharp/CSharpSources.cs
  2. 20
      src/Generator/Generators/CodeGenerator.cs

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

@ -286,7 +286,7 @@ namespace CppSharp.Generators.CSharp
IList<ClassTemplateSpecialization> specializations) IList<ClassTemplateSpecialization> specializations)
{ {
PushBlock(BlockKind.Namespace); PushBlock(BlockKind.Namespace);
var generated = GetGenerated(specializations); var generated = GetGeneratedClasses(classTemplate, specializations);
WriteLine("namespace {0}{1}", WriteLine("namespace {0}{1}",
classTemplate.OriginalNamespace is Class && classTemplate.OriginalNamespace is Class &&
!classTemplate.OriginalNamespace.IsDependent ? !classTemplate.OriginalNamespace.IsDependent ?
@ -304,7 +304,11 @@ namespace CppSharp.Generators.CSharp
foreach (var group in generated.SelectMany(s => s.Classes).Where( foreach (var group in generated.SelectMany(s => s.Classes).Where(
c => !c.IsIncomplete).GroupBy(c => c.Name)) c => !c.IsIncomplete).GroupBy(c => c.Name))
GenerateNestedInternals(group.Key, group); {
var nested = classTemplate.Classes.FirstOrDefault(c => c.Name == group.Key);
if (nested != null)
GenerateNestedInternals(group.Key, GetGeneratedClasses(nested, group));
}
WriteCloseBraceIndent(); WriteCloseBraceIndent();
PopBlock(NewLineKind.BeforeNextBlock); PopBlock(NewLineKind.BeforeNextBlock);
@ -324,17 +328,16 @@ namespace CppSharp.Generators.CSharp
NewLine(); NewLine();
} }
private IEnumerable<ClassTemplateSpecialization> GetGenerated( private IEnumerable<Class> GetGeneratedClasses(
IList<ClassTemplateSpecialization> specializations) Class dependentClass, IEnumerable<Class> specializedClasses)
{ {
var specialization = specializations.FirstOrDefault(s => s.IsGenerated) ?? var specialization = specializedClasses.FirstOrDefault(s => s.IsGenerated) ??
specializations[0]; specializedClasses.First();
Class classTemplate = specialization.TemplatedDecl.TemplatedClass; if (dependentClass.HasDependentValueFieldInLayout())
if (classTemplate.HasDependentValueFieldInLayout()) return specializedClasses;
return specializations;
return new List<ClassTemplateSpecialization> { specialization }; return new[] { specialization };
} }
public override void GenerateDeclarationCommon(Declaration decl) public override void GenerateDeclarationCommon(Declaration decl)

20
src/Generator/Generators/CodeGenerator.cs

@ -530,18 +530,20 @@ namespace CppSharp.Generators
public static string GetSuffixForInternal(DeclarationContext @class) public static string GetSuffixForInternal(DeclarationContext @class)
{ {
ClassTemplateSpecialization specialization = null; if (@class == null)
DeclarationContext declContext = @class; return string.Empty;
while (declContext != null)
{ Class template = null;
specialization = declContext as ClassTemplateSpecialization; var specialization = @class as ClassTemplateSpecialization ??
@class.Namespace as ClassTemplateSpecialization;
if (specialization != null) if (specialization != null)
break; {
declContext = declContext.Namespace; template = specialization.TemplatedDecl.TemplatedClass;
if (@class != specialization)
template = template.Classes.FirstOrDefault(c => c.Name == @class.Name);
} }
if (specialization == null || if (template == null || !template.HasDependentValueFieldInLayout())
!specialization.TemplatedDecl.TemplatedClass.HasDependentValueFieldInLayout())
return string.Empty; return string.Empty;
if (specialization.Arguments.All( if (specialization.Arguments.All(

Loading…
Cancel
Save