Tools and libraries to glue C/C++ APIs to high-level languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

285 lines
8.4 KiB

using System.Collections.Generic;
using System.Linq;
using CppSharp.AST.Extensions;
namespace CppSharp.AST
{
public enum CallingConvention
{
Default,
C,
StdCall,
ThisCall,
FastCall,
Unknown
}
public enum ParameterUsage
{
In,
Out,
InOut,
Unknown
}
public enum ParameterKind
{
Regular,
IndirectReturnType,
OperatorParameter,
ImplicitDestructorParameter,
Extension,
PropertyValue
}
public class Parameter : Declaration, ITypedDecl
{
public Parameter()
{
Kind = ParameterKind.Regular;
Usage = ParameterUsage.Unknown;
HasDefaultValue = false;
}
public Parameter(Parameter p)
: base(p)
{
HasDefaultValue = p.HasDefaultValue;
Index = p.Index;
IsIndirect = p.IsIndirect;
Kind = p.Kind;
QualifiedType = p.QualifiedType;
Usage = p.Usage;
OriginalDefaultArgument = p.OriginalDefaultArgument;
DefaultArgument = p.DefaultArgument;
}
public Type Type => QualifiedType.Type;
public QualifiedType QualifiedType { get; set; }
public bool IsIndirect { get; set; }
public uint Index { get; set; }
public ParameterKind Kind { get; set; }
public ParameterUsage Usage { get; set; }
public bool HasDefaultValue { get; set; }
public Stmt DefaultValue
{
get { return defaultValue; }
set
{
if (defaultValue != value)
{
defaultValue = value;
if (OriginalDefaultValue == null)
OriginalDefaultValue = value;
}
}
}
public Stmt OriginalDefaultValue { get; private set; }
public ExpressionObsolete DefaultArgument
{
get
{
return defaultArgument;
}
set
{
defaultArgument = value;
if (OriginalDefaultArgument == null)
OriginalDefaultArgument = value;
}
}
public ExpressionObsolete OriginalDefaultArgument { get; set; }
public bool IsIn => Usage == ParameterUsage.In;
public bool IsOut => Usage == ParameterUsage.Out;
public bool IsInOut => Usage == ParameterUsage.InOut;
public bool IsSynthetized => Kind != ParameterKind.Regular;
public override T Visit<T>(IDeclVisitor<T> visitor)
{
return visitor.VisitParameterDecl(this);
}
/// <summary>
/// HACK: in many cases QualifiedType.Qualifiers.IsConst does not work.
/// It's false in Clang to begin with. I tried fixing it to no avail.
/// I don't have any more time at the moment.
/// </summary>
public bool IsConst => DebugText.StartsWith("const ", System.StringComparison.Ordinal);
ExpressionObsolete defaultArgument;
private Stmt defaultValue;
}
public class ParameterTypeComparer : IEqualityComparer<Parameter>
{
public static readonly ParameterTypeComparer Instance = new ParameterTypeComparer();
private ParameterTypeComparer()
{
}
public bool Equals(Parameter x, Parameter y)
{
return x.QualifiedType.ResolvesTo(y.QualifiedType);
}
public int GetHashCode(Parameter obj)
{
return obj.Type.GetHashCode();
}
}
public enum FunctionSynthKind
{
None,
ComplementOperator,
AbstractImplCall,
DefaultValueOverload,
InterfaceInstance,
InterfaceDispose,
FieldAcessor
}
public enum FriendKind
{
None,
Declared,
Undeclared
}
public class Function : DeclarationContext, ITypedDecl, IMangledDecl
{
public Function()
{
CallingConvention = CallingConvention.Default;
Signature = string.Empty;
}
public Function(Function function)
: base(function)
{
ReturnType = function.ReturnType;
IsReturnIndirect = function.IsReturnIndirect;
HasThisReturn = function.HasThisReturn;
Parameters.AddRange(function.Parameters.Select(p => new Parameter(p)));
foreach (var parameter in Parameters)
parameter.Namespace = this;
InstantiatedFrom = function.InstantiatedFrom;
IsVariadic = function.IsVariadic;
IsInline = function.IsInline;
IsPure = function.IsPure;
IsDeleted = function.IsDeleted;
IsDefaulted = function.IsDefaulted;
IsAmbiguous = function.IsAmbiguous;
IsConstExpr = function.IsConstExpr;
FriendKind = function.FriendKind;
OperatorKind = function.OperatorKind;
CallingConvention = function.CallingConvention;
SynthKind = function.SynthKind;
OriginalFunction = function.OriginalFunction;
Mangled = function.Mangled;
Signature = function.Signature;
Body = function.Body;
FunctionType = function.FunctionType;
if (function.SpecializationInfo != null)
{
SpecializationInfo = new FunctionTemplateSpecialization(function.SpecializationInfo)
{
SpecializedFunction = function
};
}
}
public QualifiedType ReturnType { get; set; }
public bool IsReturnIndirect { get; set; }
public bool HasThisReturn { get; set; }
public List<Parameter> Parameters { get; } = new List<Parameter>();
public bool IsConstExpr { get; set; }
public bool IsVariadic { get; set; }
public bool IsInline { get; set; }
public bool IsPure { get; set; }
public bool IsDeleted { get; set; }
public bool IsDefaulted { get; set; }
public bool IsAmbiguous { get; set; }
public FriendKind FriendKind { get; set; }
public CXXOperatorKind OperatorKind { get; set; }
public bool IsOperator => OperatorKind != CXXOperatorKind.None;
public CallingConvention CallingConvention { get; set; }
public FunctionTemplateSpecialization SpecializationInfo { get; set; }
public Function InstantiatedFrom { get; set; }
public QualifiedType FunctionType { get; set; }
public bool IsThisCall => CallingConvention == CallingConvention.ThisCall;
public bool IsStdCall => CallingConvention == CallingConvention.StdCall;
public bool IsFastCall => CallingConvention == CallingConvention.FastCall;
public bool IsCCall => CallingConvention == CallingConvention.C;
public bool HasIndirectReturnTypeParameter
{
get
{
return Parameters.Any(param =>
param.Kind == ParameterKind.IndirectReturnType);
}
}
public QualifiedType OriginalReturnType
{
get
{
if (!HasIndirectReturnTypeParameter)
return ReturnType;
var hiddenParam = Parameters.Single(param =>
param.Kind == ParameterKind.IndirectReturnType);
return hiddenParam.QualifiedType;
}
set
{
if (HasIndirectReturnTypeParameter)
Parameters.Single(p => p.Kind == ParameterKind.IndirectReturnType).QualifiedType = value;
else
ReturnType = value;
}
}
public FunctionSynthKind SynthKind { get; set; }
public bool IsSynthetized => SynthKind != FunctionSynthKind.None;
public bool IsNonMemberOperator { get; set; }
public Function OriginalFunction { get; set; }
public string Mangled { get; set; }
public string Signature { get; set; }
public string Body { get; set; }
public Stmt BodyStmt { get; set; }
public override T Visit<T>(IDeclVisitor<T> visitor)
{
return visitor.VisitFunctionDecl(this);
}
public Type Type => ReturnType.Type;
public QualifiedType QualifiedType
{
get => ReturnType;
set => ReturnType = value;
}
}
}