Browse Source

Fixed the generated C# for templates with fields other templates not used anywhere else.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1011/head
Dimitar Dobrev 8 years ago
parent
commit
4eb8ee83da
  1. 31
      src/Generator/Passes/TrimSpecializationsPass.cs
  2. 1
      tests/CSharp/CSharpTemplates.h

31
src/Generator/Passes/TrimSpecializationsPass.cs

@ -63,17 +63,11 @@ namespace CppSharp.Passes
if (function.IsGenerated) if (function.IsGenerated)
{ {
Action<ClassTemplateSpecialization> add =
s =>
{
internalSpecializations.Remove(s);
specializations.Add(s);
};
ASTUtils.CheckTypeForSpecialization(function.OriginalReturnType.Type, ASTUtils.CheckTypeForSpecialization(function.OriginalReturnType.Type,
function, add, Context.TypeMaps); function, AddSpecialization, Context.TypeMaps);
foreach (var parameter in function.Parameters) foreach (var parameter in function.Parameters)
ASTUtils.CheckTypeForSpecialization(parameter.Type, function, ASTUtils.CheckTypeForSpecialization(parameter.Type, function,
add, Context.TypeMaps); AddSpecialization, Context.TypeMaps);
} }
return true; return true;
@ -88,6 +82,18 @@ namespace CppSharp.Passes
return true; 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) private void CleanSpecializations(Class template)
{ {
template.Specializations.RemoveAll(s => template.Specializations.RemoveAll(s =>
@ -187,14 +193,7 @@ namespace CppSharp.Passes
{ {
var specialization = @base.Class as ClassTemplateSpecialization; var specialization = @base.Class as ClassTemplateSpecialization;
if (specialization != null) if (specialization != null)
{ AddSpecialization(specialization);
internalSpecializations.Remove(specialization);
specializations.Add(specialization);
foreach (var field in specialization.Fields)
field.Visit(this);
foreach (var method in specialization.Methods)
method.Visit(this);
}
CheckBasesForSpecialization(@base.Class); CheckBasesForSpecialization(@base.Class);
} }
} }

1
tests/CSharp/CSharpTemplates.h

@ -344,6 +344,7 @@ private:
T t[1]; T t[1];
HasDefaultTemplateArgument<char> h; HasDefaultTemplateArgument<char> h;
InternalWithExtension<char> i; InternalWithExtension<char> i;
HasDefaultTemplateArgument<T, double> specializationAsFieldOfAnother;
}; };
template <typename T> template <typename T>

Loading…
Cancel
Save