Match names of parameters in templates to their specializations

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
This commit is contained in:
Dimitar Dobrev 2021-11-12 17:59:12 +02:00
Родитель 0214b6e1cc
Коммит 3ae0fd0fd5
2 изменённых файлов: 29 добавлений и 0 удалений

Просмотреть файл

@ -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());

Просмотреть файл

@ -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;
}
}
}