diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 2deeb55f..3fec967e 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -310,27 +310,31 @@ namespace CppSharp.Generators.CSharp private void GenerateClassTemplateSpecializationInternal(ClassTemplate classTemplate) { - PushBlock(CSharpBlockKind.Namespace); - WriteLine("namespace {0}", classTemplate.Name); - WriteStartBraceIndent(); - IList specializations; if (classTemplate.TemplatedClass.Fields.Any(f => f.IsDependent && !f.Type.IsAddress())) specializations = classTemplate.Specializations; else specializations = new[] { classTemplate.Specializations[0] }; - foreach (var nestedClass in specializations[0].Classes.Where(c => !c.IsDependent)) + if (classTemplate.TemplatedClass.Classes.Count == 0 && specializations.Count == 0) + return; + + PushBlock(CSharpBlockKind.Namespace); + WriteLine("namespace {0}", classTemplate.Name); + WriteStartBraceIndent(); + + foreach (var specialization in specializations) + GenerateClassInternals(specialization); + + foreach (var nestedClass in classTemplate.TemplatedClass.Classes) { + NewLine(); GenerateClassProlog(nestedClass); NewLine(); WriteStartBraceIndent(); GenerateClassInternals(nestedClass); WriteCloseBraceIndent(); } - NewLine(); - foreach (var specialization in specializations) - GenerateClassInternals(specialization); WriteCloseBraceIndent(); PopBlock(NewLineKind.BeforeNextBlock); diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index 320dbf61..d13a87e3 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -29,6 +29,10 @@ namespace CppSharp.Passes template.Specializations.Remove(specialization); } + for (int i = template.Specializations.Count - 1; i >= 0; i--) + if (template.Specializations[i] is ClassTemplatePartialSpecialization) + template.Specializations.RemoveAt(i); + return true; } } diff --git a/tests/CSharp/CSharpTemplates.h b/tests/CSharp/CSharpTemplates.h index 81984b6a..121fa10f 100644 --- a/tests/CSharp/CSharpTemplates.h +++ b/tests/CSharp/CSharpTemplates.h @@ -64,3 +64,18 @@ private: TwoTemplateArgs p2, TwoTemplateArgs p3); }; + +template +class PartiallySpecialized +{ +}; + +template +class PartiallySpecialized +{ + union + { + int i; + float f; + }; +};