Browse Source

Simplified the equalisation of access of overrides.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1026/head
Dimitar Dobrev 8 years ago
parent
commit
1e80e8cf3c
  1. 36
      src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs

36
src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using CppSharp.AST; using CppSharp.AST;
@ -20,39 +21,18 @@ namespace CppSharp.Passes
VisitOptions.VisitTemplateArguments = false; VisitOptions.VisitTemplateArguments = false;
} }
public override bool VisitASTContext(ASTContext context)
{
var result = base.VisitASTContext(context);
foreach (var baseOverride in basesOverrides)
{
var access = baseOverride.Value.Max(o => o.Access);
foreach (var @override in baseOverride.Value)
@override.Access = access;
}
return result;
}
public override bool VisitMethodDecl(Method method) public override bool VisitMethodDecl(Method method)
{ {
if (!base.VisitMethodDecl(method) || !method.IsOverride) if (!base.VisitMethodDecl(method) || !method.OverriddenMethods.Any())
return false;
var baseMethod = method.GetRootBaseMethod();
if (!baseMethod.IsGenerated)
return false; return false;
HashSet<Method> overrides; var virtuals = new List<Method>(method.OverriddenMethods);
if (basesOverrides.ContainsKey(baseMethod)) virtuals.Add(method);
overrides = basesOverrides[baseMethod]; AccessSpecifier access = virtuals.Max(o => o.Access);
else foreach (var @virtual in virtuals)
overrides = basesOverrides[baseMethod] = new HashSet<Method> { baseMethod }; @virtual.Access = access;
overrides.Add(method);
return true; return true;
} }
private Dictionary<Method, HashSet<Method>> basesOverrides = new Dictionary<Method, HashSet<Method>>();
} }
} }

Loading…
Cancel
Save