From 8d0db5d341a15443544174edebaf5f10d4d2ea41 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 22 Dec 2017 01:21:04 +0200 Subject: [PATCH] Reverted a simplification because it caused a regression. Signed-off-by: Dimitar Dobrev --- .../EqualiseAccessOfOverrideAndBasePass.cs | 36 ++++++++++++++----- tests/CSharp/CSharp.cpp | 16 +++++++++ tests/CSharp/CSharp.h | 11 ++++++ 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs b/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs index 26b464b3..32669568 100644 --- a/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs +++ b/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using CppSharp.AST; @@ -21,18 +20,39 @@ namespace CppSharp.Passes 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) { - if (!base.VisitMethodDecl(method) || !method.OverriddenMethods.Any()) + if (!base.VisitMethodDecl(method) || !method.IsOverride) + return false; + + var baseMethod = method.GetRootBaseMethod(); + if (!baseMethod.IsGenerated) return false; - var virtuals = new List(method.OverriddenMethods); - virtuals.Add(method); - AccessSpecifier access = virtuals.Max(o => o.Access); - foreach (var @virtual in virtuals) - @virtual.Access = access; + HashSet overrides; + if (basesOverrides.ContainsKey(baseMethod)) + overrides = basesOverrides[baseMethod]; + else + overrides = basesOverrides[baseMethod] = new HashSet { baseMethod }; + overrides.Add(method); return true; } + + private Dictionary> basesOverrides = new Dictionary>(); } } diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index fdeb74fc..086c3048 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -700,6 +700,10 @@ void HasOverridesWithChangedAccessBase::publicOverride() { } +void HasOverridesWithChangedAccessBase::differentIncreasedAccessOverride() +{ +} + HasOverridesWithChangedAccess::HasOverridesWithChangedAccess() { } @@ -712,6 +716,14 @@ void HasOverridesWithChangedAccess::publicOverride() { } +HasOverridesWithIncreasedProtectedAccess::HasOverridesWithIncreasedProtectedAccess() +{ +} + +void HasOverridesWithIncreasedProtectedAccess::differentIncreasedAccessOverride() +{ +} + HasOverridesWithIncreasedAccess::HasOverridesWithIncreasedAccess() { } @@ -720,6 +732,10 @@ void HasOverridesWithIncreasedAccess::privateOverride(int i) { } +void HasOverridesWithIncreasedAccess::differentIncreasedAccessOverride() +{ +} + IgnoredType PropertyWithIgnoredType::ignoredType() { return _ignoredType; diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index ac3d962c..dfbc4968 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -464,6 +464,8 @@ public: virtual void privateOverride(int i = 5); protected: virtual void publicOverride(); +private: + virtual void differentIncreasedAccessOverride(); }; class DLL_API HasOverridesWithChangedAccess : public HasOverridesWithChangedAccessBase @@ -475,11 +477,20 @@ private: virtual void privateOverride(int i); }; +class DLL_API HasOverridesWithIncreasedProtectedAccess : public HasOverridesWithChangedAccess +{ +public: + HasOverridesWithIncreasedProtectedAccess(); +protected: + virtual void differentIncreasedAccessOverride(); +}; + class DLL_API HasOverridesWithIncreasedAccess : public HasOverridesWithChangedAccess { public: HasOverridesWithIncreasedAccess(); virtual void privateOverride(int i); + virtual void differentIncreasedAccessOverride(); }; class DLL_API AbstractWithProperty