Skip to content

Commit 8d0db5d

Browse files
committed
Reverted a simplification because it caused a regression.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 6553084 commit 8d0db5d

File tree

3 files changed

+55
-8
lines changed

3 files changed

+55
-8
lines changed

src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Linq;
43
using CppSharp.AST;
54

@@ -21,18 +20,39 @@ public EqualiseAccessOfOverrideAndBasePass()
2120
VisitOptions.VisitTemplateArguments = false;
2221
}
2322

23+
public override bool VisitASTContext(ASTContext context)
24+
{
25+
var result = base.VisitASTContext(context);
26+
27+
foreach (var baseOverride in basesOverrides)
28+
{
29+
var access = baseOverride.Value.Max(o => o.Access);
30+
foreach (var @override in baseOverride.Value)
31+
@override.Access = access;
32+
}
33+
34+
return result;
35+
}
36+
2437
public override bool VisitMethodDecl(Method method)
2538
{
26-
if (!base.VisitMethodDecl(method) || !method.OverriddenMethods.Any())
39+
if (!base.VisitMethodDecl(method) || !method.IsOverride)
40+
return false;
41+
42+
var baseMethod = method.GetRootBaseMethod();
43+
if (!baseMethod.IsGenerated)
2744
return false;
2845

29-
var virtuals = new List<Method>(method.OverriddenMethods);
30-
virtuals.Add(method);
31-
AccessSpecifier access = virtuals.Max(o => o.Access);
32-
foreach (var @virtual in virtuals)
33-
@virtual.Access = access;
46+
HashSet<Method> overrides;
47+
if (basesOverrides.ContainsKey(baseMethod))
48+
overrides = basesOverrides[baseMethod];
49+
else
50+
overrides = basesOverrides[baseMethod] = new HashSet<Method> { baseMethod };
51+
overrides.Add(method);
3452

3553
return true;
3654
}
55+
56+
private Dictionary<Method, HashSet<Method>> basesOverrides = new Dictionary<Method, HashSet<Method>>();
3757
}
3858
}

tests/CSharp/CSharp.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,10 @@ void HasOverridesWithChangedAccessBase::publicOverride()
700700
{
701701
}
702702

703+
void HasOverridesWithChangedAccessBase::differentIncreasedAccessOverride()
704+
{
705+
}
706+
703707
HasOverridesWithChangedAccess::HasOverridesWithChangedAccess()
704708
{
705709
}
@@ -712,6 +716,14 @@ void HasOverridesWithChangedAccess::publicOverride()
712716
{
713717
}
714718

719+
HasOverridesWithIncreasedProtectedAccess::HasOverridesWithIncreasedProtectedAccess()
720+
{
721+
}
722+
723+
void HasOverridesWithIncreasedProtectedAccess::differentIncreasedAccessOverride()
724+
{
725+
}
726+
715727
HasOverridesWithIncreasedAccess::HasOverridesWithIncreasedAccess()
716728
{
717729
}
@@ -720,6 +732,10 @@ void HasOverridesWithIncreasedAccess::privateOverride(int i)
720732
{
721733
}
722734

735+
void HasOverridesWithIncreasedAccess::differentIncreasedAccessOverride()
736+
{
737+
}
738+
723739
IgnoredType PropertyWithIgnoredType::ignoredType()
724740
{
725741
return _ignoredType;

tests/CSharp/CSharp.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,8 @@ class DLL_API HasOverridesWithChangedAccessBase
464464
virtual void privateOverride(int i = 5);
465465
protected:
466466
virtual void publicOverride();
467+
private:
468+
virtual void differentIncreasedAccessOverride();
467469
};
468470

469471
class DLL_API HasOverridesWithChangedAccess : public HasOverridesWithChangedAccessBase
@@ -475,11 +477,20 @@ class DLL_API HasOverridesWithChangedAccess : public HasOverridesWithChangedAcce
475477
virtual void privateOverride(int i);
476478
};
477479

480+
class DLL_API HasOverridesWithIncreasedProtectedAccess : public HasOverridesWithChangedAccess
481+
{
482+
public:
483+
HasOverridesWithIncreasedProtectedAccess();
484+
protected:
485+
virtual void differentIncreasedAccessOverride();
486+
};
487+
478488
class DLL_API HasOverridesWithIncreasedAccess : public HasOverridesWithChangedAccess
479489
{
480490
public:
481491
HasOverridesWithIncreasedAccess();
482492
virtual void privateOverride(int i);
493+
virtual void differentIncreasedAccessOverride();
483494
};
484495

485496
class DLL_API AbstractWithProperty

0 commit comments

Comments
 (0)