From 4eb8ee83da7db3f161c4972627dffac0a5e43ac4 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Wed, 29 Nov 2017 00:10:03 +0200 Subject: [PATCH] Fixed the generated C# for templates with fields other templates not used anywhere else. Signed-off-by: Dimitar Dobrev --- .../Passes/TrimSpecializationsPass.cs | 31 +++++++++---------- tests/CSharp/CSharpTemplates.h | 1 + 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index 2c1586e9..1569f47f 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -63,17 +63,11 @@ namespace CppSharp.Passes if (function.IsGenerated) { - Action add = - s => - { - internalSpecializations.Remove(s); - specializations.Add(s); - }; ASTUtils.CheckTypeForSpecialization(function.OriginalReturnType.Type, - function, add, Context.TypeMaps); + function, AddSpecialization, Context.TypeMaps); foreach (var parameter in function.Parameters) ASTUtils.CheckTypeForSpecialization(parameter.Type, function, - add, Context.TypeMaps); + AddSpecialization, Context.TypeMaps); } return true; @@ -88,6 +82,18 @@ namespace CppSharp.Passes return true; } + private void AddSpecialization(ClassTemplateSpecialization specialization) + { + if (specializations.Contains(specialization)) + return; + internalSpecializations.Remove(specialization); + specializations.Add(specialization); + foreach (var field in specialization.Fields) + field.Visit(this); + foreach (var method in specialization.Methods) + method.Visit(this); + } + private void CleanSpecializations(Class template) { template.Specializations.RemoveAll(s => @@ -187,14 +193,7 @@ namespace CppSharp.Passes { var specialization = @base.Class as ClassTemplateSpecialization; if (specialization != null) - { - internalSpecializations.Remove(specialization); - specializations.Add(specialization); - foreach (var field in specialization.Fields) - field.Visit(this); - foreach (var method in specialization.Methods) - method.Visit(this); - } + AddSpecialization(specialization); CheckBasesForSpecialization(@base.Class); } } diff --git a/tests/CSharp/CSharpTemplates.h b/tests/CSharp/CSharpTemplates.h index 2320bc97..2cfbed03 100644 --- a/tests/CSharp/CSharpTemplates.h +++ b/tests/CSharp/CSharpTemplates.h @@ -344,6 +344,7 @@ private: T t[1]; HasDefaultTemplateArgument h; InternalWithExtension i; + HasDefaultTemplateArgument specializationAsFieldOfAnother; }; template