mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
86 lines
3.1 KiB
86 lines
3.1 KiB
using System.Collections.Generic; |
|
using System.Linq; |
|
|
|
namespace CppSharp.AST |
|
{ |
|
public static class FunctionExtensions |
|
{ |
|
public static IEnumerable<Parameter> GatherInternalParams(this Function function, |
|
bool isItaniumLikeAbi, bool universalDelegate = false) |
|
{ |
|
var @params = new List<Parameter>(); |
|
|
|
var method = function as Method; |
|
var isInstanceMethod = method != null && !method.IsStatic; |
|
|
|
var pointer = new QualifiedType(new PointerType(new QualifiedType(new BuiltinType(PrimitiveType.Void)))); |
|
|
|
if (isInstanceMethod && !isItaniumLikeAbi) |
|
{ |
|
@params.Add(new Parameter |
|
{ |
|
QualifiedType = pointer, |
|
Name = "instance" |
|
}); |
|
} |
|
|
|
if (!function.HasIndirectReturnTypeParameter && |
|
isInstanceMethod && isItaniumLikeAbi) |
|
{ |
|
@params.Add(new Parameter |
|
{ |
|
QualifiedType = pointer, |
|
Name = "instance" |
|
}); |
|
} |
|
|
|
var i = 0; |
|
foreach (var param in function.Parameters.Where(p => p.Kind != ParameterKind.OperatorParameter)) |
|
{ |
|
@params.Add(new Parameter |
|
{ |
|
QualifiedType = universalDelegate && param.Kind == ParameterKind.IndirectReturnType ? |
|
pointer : param.QualifiedType, |
|
Kind = param.Kind, |
|
Usage = param.Usage, |
|
Name = universalDelegate ? "arg" + ++i : param.Name |
|
}); |
|
|
|
if (param.Kind == ParameterKind.IndirectReturnType && |
|
isInstanceMethod && isItaniumLikeAbi) |
|
{ |
|
@params.Add(new Parameter |
|
{ |
|
QualifiedType = pointer, |
|
Name = "instance" |
|
}); |
|
} |
|
} |
|
|
|
if (method != null && method.IsConstructor) |
|
{ |
|
var @class = (Class) method.Namespace; |
|
if (!isItaniumLikeAbi && @class.Layout.HasVirtualBases) |
|
{ |
|
@params.Add(new Parameter |
|
{ |
|
QualifiedType = new QualifiedType(new BuiltinType(PrimitiveType.Int)), |
|
Name = "__forBases" |
|
}); |
|
} |
|
} |
|
|
|
return @params; |
|
} |
|
|
|
public static bool CanOverride(this Method @override, Method method, |
|
ParameterTypeComparer parameterTypeComparer = null) |
|
{ |
|
parameterTypeComparer = parameterTypeComparer ?? new ParameterTypeComparer(); |
|
return (method.OriginalName == @override.OriginalName && |
|
method.ReturnType == @override.ReturnType && |
|
method.Parameters.SequenceEqual(@override.Parameters, parameterTypeComparer)) || |
|
(@override.IsDestructor && method.IsDestructor && method.IsVirtual); |
|
} |
|
} |
|
}
|
|
|