Browse Source

Match names of parameters in templates to their specializations

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1641/head
Dimitar Dobrev 4 years ago
parent
commit
3ae0fd0fd5
  1. 1
      src/Generator/Driver.cs
  2. 28
      src/Generator/Passes/MatchParamNamesWithInstantiatedFromPass.cs

1
src/Generator/Driver.cs

@ -216,6 +216,7 @@ namespace CppSharp @@ -216,6 +216,7 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass());
TranslationUnitPasses.AddPass(new MatchParamNamesWithInstantiatedFromPass());
if (Options.IsCSharpGenerator)
TranslationUnitPasses.AddPass(new EqualiseAccessOfOverrideAndBasePass());

28
src/Generator/Passes/MatchParamNamesWithInstantiatedFromPass.cs

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
using CppSharp.AST;
namespace CppSharp.Passes
{
/// <summary>
/// Fixes a so far irreproducible bug where parameters in a template have names
/// different from the ones the respective parameters have in the specializations.
/// </summary>
public class MatchParamNamesWithInstantiatedFromPass : TranslationUnitPass
{
public MatchParamNamesWithInstantiatedFromPass() => VisitOptions.ResetFlags(
VisitFlags.ClassMethods | VisitFlags.NamespaceFunctions |
VisitFlags.ClassTemplateSpecializations);
public override bool VisitFunctionDecl(Function function)
{
if (!base.VisitFunctionDecl(function) || function.InstantiatedFrom == null ||
(function.Namespace is ClassTemplateSpecialization specialization &&
specialization.SpecializationKind == TemplateSpecializationKind.ExplicitSpecialization))
return false;
for (int i = 0; i < function.Parameters.Count; i++)
function.InstantiatedFrom.Parameters[i].Name = function.Parameters[i].Name;
return true;
}
}
}
Loading…
Cancel
Save