diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs index 351d113b..a74293f6 100644 --- a/src/Generator/Generators/CSharp/CSharpSources.cs +++ b/src/Generator/Generators/CSharp/CSharpSources.cs @@ -313,30 +313,32 @@ namespace CppSharp.Generators.CSharp classTemplate.Specializations); } - private void GenerateClassTemplateSpecializationsInternals(Class classTemplate, + private void GenerateClassTemplateSpecializationsInternals(Class template, IList specializations) { PushBlock(BlockKind.Namespace); - var generated = GetGeneratedClasses(classTemplate, specializations); + var generated = GetGeneratedClasses(template, specializations); WriteLine("namespace {0}{1}", - classTemplate.OriginalNamespace is Class && - !classTemplate.OriginalNamespace.IsDependent ? - classTemplate.OriginalNamespace.Name + '_' : string.Empty, - classTemplate.Name); + template.OriginalNamespace is Class && + !template.OriginalNamespace.IsDependent ? + template.OriginalNamespace.Name + '_' : string.Empty, + template.Name); WriteOpenBraceAndIndent(); - foreach (var nestedTemplate in classTemplate.Classes.Where( + foreach (var nestedTemplate in template.Classes.Where( c => c.IsDependent && !c.Ignore && c.Specializations.Any(s => !s.Ignore))) GenerateClassTemplateSpecializationsInternals( nestedTemplate, nestedTemplate.Specializations); - foreach (var specialization in generated.KeepSingleAllPointersSpecialization()) - GenerateClassInternals(specialization); + if (template.HasDependentValueFieldInLayout() || + template.Specializations.Intersect(specializations).Count() == specializations.Count) + foreach (var specialization in generated) + GenerateClassInternals(specialization); foreach (var group in specializations.SelectMany(s => s.Classes).Where( c => !c.IsIncomplete).GroupBy(c => c.Name)) { - var nested = classTemplate.Classes.FirstOrDefault(c => c.Name == group.Key); + var nested = template.Classes.FirstOrDefault(c => c.Name == group.Key); if (nested != null) GenerateNestedInternals(group.Key, GetGeneratedClasses(nested, group)); } diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index 6bee663d..c72a7232 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -138,7 +138,9 @@ namespace CppSharp.Passes template.Specializations.All(s => s.Ignore)) template.ExplicitlyIgnore(); - if (template.Specializations.Any() && template.HasDependentValueFieldInLayout()) + if (template.Specializations.Any() && + (template.HasDependentValueFieldInLayout() || + template.Classes.Any(c => c.HasDependentValueFieldInLayout()))) TryMoveExternalSpecializations(template); } diff --git a/tests/NamespacesBase/NamespacesBase.h b/tests/NamespacesBase/NamespacesBase.h index e54e71aa..2a0f0628 100644 --- a/tests/NamespacesBase/NamespacesBase.h +++ b/tests/NamespacesBase/NamespacesBase.h @@ -73,6 +73,12 @@ void TemplateClass::setField(const T& value) template class IndependentFields { +public: + class Nested + { + private: + T field; + }; }; template diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h index 812ffb48..7d4d69c6 100644 --- a/tests/NamespacesDerived/NamespacesDerived.h +++ b/tests/NamespacesDerived/NamespacesDerived.h @@ -70,6 +70,7 @@ private: TemplateClass> nestedSpecialization; IndependentFields independentSpecialization; IndependentFields independentExternalSpecialization; + IndependentFields::Nested nestedInExternalSpecialization; }; class DLL_API HasVirtualInDependency : public HasVirtualInCore