Browse Source

Corrected the access modifier of overridden methods because in C++ overriding may change access.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/57/head
Dimitar Dobrev 13 years ago
parent
commit
840e3c93cf
  1. 16
      src/AST/Class.cs
  2. 13
      src/AST/Function.cs
  3. 16
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  4. 18
      src/Generator/Utils/ParameterTypeComparer.cs

16
src/AST/Class.cs

@ -201,6 +201,22 @@ namespace CppSharp.AST
} }
} }
public Method GetRootBaseMethod(Method @override)
{
return (from @base in Bases
let baseMethod = (
from method in @base.Class.Methods
where
method.Name == @override.Name &&
method.ReturnType == @override.ReturnType &&
method.Parameters.Count == @override.Parameters.Count &&
method.Parameters.SequenceEqual(@override.Parameters,
new ParameterTypeComparer())
select method).FirstOrDefault()
let rootBaseMethod = @base.Class.GetRootBaseMethod(@override)
select rootBaseMethod ?? baseMethod).FirstOrDefault();
}
public override T Visit<T>(IDeclVisitor<T> visitor) public override T Visit<T>(IDeclVisitor<T> visitor)
{ {
return visitor.VisitClassDecl(this); return visitor.VisitClassDecl(this);

13
src/AST/Function.cs

@ -60,6 +60,19 @@ namespace CppSharp.AST
} }
} }
public class ParameterTypeComparer : IEqualityComparer<Parameter>
{
public bool Equals(Parameter x, Parameter y)
{
return x.QualifiedType == y.QualifiedType;
}
public int GetHashCode(Parameter obj)
{
return obj.Type.GetHashCode();
}
}
public enum FunctionSynthKind public enum FunctionSynthKind
{ {
None, None,

16
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -1483,7 +1483,7 @@ namespace CppSharp.Generators.CSharp
PushBlock(CSharpBlockKind.Method); PushBlock(CSharpBlockKind.Method);
GenerateDeclarationCommon(method); GenerateDeclarationCommon(method);
switch (method.Access) switch (GetValidMethodAccess(method, @class))
{ {
case AccessSpecifier.Public: case AccessSpecifier.Public:
Write(Driver.Options.GenerateAbstractImpls && @class.IsAbstract Write(Driver.Options.GenerateAbstractImpls && @class.IsAbstract
@ -1578,6 +1578,20 @@ namespace CppSharp.Generators.CSharp
PopBlock(NewLineKind.BeforeNextBlock); PopBlock(NewLineKind.BeforeNextBlock);
} }
private static AccessSpecifier GetValidMethodAccess(Method method, Class @class)
{
switch (method.Access)
{
case AccessSpecifier.Public:
return @class.IsAbstract && method.IsConstructor ?
AccessSpecifier.Protected : AccessSpecifier.Public;
case AccessSpecifier.Protected:
return method.IsOverride ?
@class.GetRootBaseMethod(method).Access : AccessSpecifier.Protected;
}
return AccessSpecifier.Private;
}
private void GenerateVirtualTableFunctionCall(Function method, Class @class) private void GenerateVirtualTableFunctionCall(Function method, Class @class)
{ {
string delegateId; string delegateId;

18
src/Generator/Utils/ParameterTypeComparer.cs

@ -1,18 +0,0 @@
using System.Collections.Generic;
using CppSharp.AST;
namespace CppSharp.Utils
{
public class ParameterTypeComparer : IEqualityComparer<Parameter>
{
public bool Equals(Parameter x, Parameter y)
{
return x.QualifiedType == y.QualifiedType;
}
public int GetHashCode(Parameter obj)
{
return obj.Type.GetHashCode();
}
}
}
Loading…
Cancel
Save