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.
 
 
 
 
 

848 lines
20 KiB

/************************************************************************
*
* CppSharp
* Licensed under the MIT license.
*
************************************************************************/
#pragma once
#include "Helpers.h"
#include "Sources.h"
#include "Types.h"
#include <algorithm>
namespace CppSharp {
namespace CppParser {
namespace AST {
enum class DeclarationKind
{
DeclarationContext,
Typedef,
TypeAlias,
Parameter,
Function,
Method,
Enumeration,
EnumerationItem,
Variable,
Field,
AccessSpecifier,
Class,
Template,
TypeAliasTemplate,
ClassTemplate,
ClassTemplateSpecialization,
ClassTemplatePartialSpecialization,
FunctionTemplate,
Namespace,
PreprocessedEntity,
MacroDefinition,
MacroExpansion,
TranslationUnit,
Friend,
TemplateTemplateParm,
TemplateTypeParm,
NonTypeTemplateParm,
VarTemplate,
VarTemplateSpecialization,
VarTemplatePartialSpecialization,
UnresolvedUsingTypename,
};
#define DECLARE_DECL_KIND(klass, kind) \
klass();
enum class AccessSpecifier
{
Private,
Protected,
Public
};
class DeclarationContext;
class RawComment;
class PreprocessedEntity;
class ExpressionObsolete;
class CS_API Declaration
{
public:
Declaration(DeclarationKind kind);
Declaration(const Declaration&);
~Declaration();
DeclarationKind kind;
int alignAs;
int maxFieldAlignment;
AccessSpecifier access;
DeclarationContext* _namespace;
SourceLocation location;
int lineNumberStart;
int lineNumberEnd;
std::string name;
std::string USR;
std::string debugText;
bool isIncomplete;
bool isDependent;
bool isImplicit;
bool isInvalid;
bool isDeprecated;
Declaration* completeDeclaration;
unsigned definitionOrder;
VECTOR(PreprocessedEntity*, PreprocessedEntities)
VECTOR(Declaration*, Redeclarations)
void* originalPtr;
RawComment* comment;
};
class Class;
class Enumeration;
class Function;
class TypedefDecl;
class TypeAlias;
class Namespace;
class Template;
class TypeAliasTemplate;
class ClassTemplate;
class FunctionTemplate;
class Variable;
class Friend;
class CS_API DeclarationContext : public Declaration
{
public:
DeclarationContext(DeclarationKind kind);
CS_IGNORE Declaration* FindAnonymous(const std::string& USR);
CS_IGNORE Namespace* FindNamespace(const std::string& Name);
CS_IGNORE Namespace* FindNamespace(const std::vector<std::string>&);
CS_IGNORE Namespace* FindCreateNamespace(const std::string& Name);
CS_IGNORE Class* CreateClass(const std::string& Name, bool IsComplete);
CS_IGNORE Class* FindClass(const void* OriginalPtr, const std::string& Name, bool IsComplete);
CS_IGNORE Class* FindClass(const void* OriginalPtr, const std::string& Name, bool IsComplete, bool Create);
CS_IGNORE template <typename T>
T* FindTemplate(const std::string& USR);
CS_IGNORE Enumeration* FindEnum(const void* OriginalPtr);
CS_IGNORE Enumeration* FindEnum(const std::string& Name, bool Create = false);
CS_IGNORE Enumeration* FindEnumWithItem(const std::string& Name);
CS_IGNORE Function* FindFunction(const std::string& USR);
CS_IGNORE TypedefDecl* FindTypedef(const std::string& Name, bool Create = false);
CS_IGNORE TypeAlias* FindTypeAlias(const std::string& Name, bool Create = false);
CS_IGNORE Variable* FindVariable(const std::string& USR);
CS_IGNORE Friend* FindFriend(const std::string& USR);
VECTOR(Namespace*, Namespaces)
VECTOR(Enumeration*, Enums)
VECTOR(Function*, Functions)
VECTOR(Class*, Classes)
VECTOR(Template*, Templates)
VECTOR(TypedefDecl*, Typedefs)
VECTOR(TypeAlias*, TypeAliases)
VECTOR(Variable*, Variables)
VECTOR(Friend*, Friends)
std::map<std::string, Declaration*> anonymous;
bool isAnonymous;
};
class CS_API TypedefNameDecl : public Declaration
{
public:
TypedefNameDecl(DeclarationKind kind);
~TypedefNameDecl();
QualifiedType qualifiedType;
};
class CS_API TypedefDecl : public TypedefNameDecl
{
public:
DECLARE_DECL_KIND(TypedefDecl, Typedef)
~TypedefDecl();
};
class CS_API TypeAlias : public TypedefNameDecl
{
public:
TypeAlias();
~TypeAlias();
TypeAliasTemplate* describedAliasTemplate;
};
class CS_API Friend : public Declaration
{
public:
DECLARE_DECL_KIND(Friend, Friend)
~Friend();
Declaration* declaration;
};
enum class StatementClassObsolete
{
Any,
BinaryOperator,
CallExprClass,
DeclRefExprClass,
CXXConstructExprClass,
CXXOperatorCallExpr,
ImplicitCastExpr,
ExplicitCastExpr,
};
class CS_API StatementObsolete
{
public:
StatementObsolete(const std::string& str, StatementClassObsolete Class = StatementClassObsolete::Any, Declaration* decl = 0);
StatementClassObsolete _class;
Declaration* decl;
std::string string;
};
class CS_API ExpressionObsolete : public StatementObsolete
{
public:
ExpressionObsolete(const std::string& str, StatementClassObsolete Class = StatementClassObsolete::Any, Declaration* decl = 0);
};
class Expr;
class CS_API BinaryOperatorObsolete : public ExpressionObsolete
{
public:
BinaryOperatorObsolete(const std::string& str, ExpressionObsolete* lhs, ExpressionObsolete* rhs, const std::string& opcodeStr);
~BinaryOperatorObsolete();
ExpressionObsolete* LHS;
ExpressionObsolete* RHS;
std::string opcodeStr;
};
class CS_API CallExprObsolete : public ExpressionObsolete
{
public:
CallExprObsolete(const std::string& str, Declaration* decl);
~CallExprObsolete();
VECTOR(ExpressionObsolete*, Arguments)
};
class CS_API CXXConstructExprObsolete : public ExpressionObsolete
{
public:
CXXConstructExprObsolete(const std::string& str, Declaration* decl = 0);
~CXXConstructExprObsolete();
VECTOR(ExpressionObsolete*, Arguments)
};
class CS_API Parameter : public Declaration
{
public:
Parameter();
~Parameter();
QualifiedType qualifiedType;
bool isIndirect;
bool hasDefaultValue;
unsigned int index;
ExpressionObsolete* defaultArgument;
Expr* defaultValue;
};
enum class CXXMethodKind
{
Normal,
Constructor,
Destructor,
Conversion,
Operator,
UsingDirective
};
enum class CXXOperatorKind
{
None,
New,
Delete,
Array_New,
Array_Delete,
Plus,
Minus,
Star,
Slash,
Percent,
Caret,
Amp,
Pipe,
Tilde,
Exclaim,
Equal,
Less,
Greater,
PlusEqual,
MinusEqual,
StarEqual,
SlashEqual,
PercentEqual,
CaretEqual,
AmpEqual,
PipeEqual,
LessLess,
GreaterGreater,
LessLessEqual,
GreaterGreaterEqual,
EqualEqual,
ExclaimEqual,
LessEqual,
GreaterEqual,
Spaceship,
AmpAmp,
PipePipe,
PlusPlus,
MinusMinus,
Comma,
ArrowStar,
Arrow,
Call,
Subscript,
Conditional,
Coawait
};
class FunctionTemplateSpecialization;
enum class FriendKind
{
None,
Declared,
Undeclared
};
class Stmt;
class CS_API Function : public DeclarationContext
{
public:
Function();
~Function();
QualifiedType returnType;
bool isReturnIndirect;
bool hasThisReturn;
bool isConstExpr;
bool isVariadic;
bool isInline;
bool isPure;
bool isDeleted;
bool isDefaulted;
FriendKind friendKind;
CXXOperatorKind operatorKind;
std::string mangled;
std::string signature;
std::string body;
Stmt* bodyStmt;
CallingConvention callingConvention;
VECTOR(Parameter*, Parameters)
FunctionTemplateSpecialization* specializationInfo;
Function* instantiatedFrom;
QualifiedType qualifiedType;
};
class AccessSpecifierDecl;
enum class RefQualifierKind
{
None,
LValue,
RValue
};
class CS_API Method : public Function
{
public:
Method();
~Method();
bool isVirtual;
bool isStatic;
bool isConst;
bool isExplicit;
bool isVolatile;
CXXMethodKind methodKind;
bool isDefaultConstructor;
bool isCopyConstructor;
bool isMoveConstructor;
QualifiedType conversionType;
RefQualifierKind refQualifier;
VECTOR(Method*, OverriddenMethods)
};
class CS_API Enumeration : public DeclarationContext
{
public:
DECLARE_DECL_KIND(Enumeration, Enumeration)
~Enumeration();
class CS_API Item : public Declaration
{
public:
DECLARE_DECL_KIND(Item, EnumerationItem)
Item(const Item&);
~Item();
std::string expression;
uint64_t value;
};
enum class CS_FLAGS EnumModifiers
{
Anonymous = 1 << 0,
Scoped = 1 << 1,
Flags = 1 << 2,
};
EnumModifiers modifiers;
Type* type;
BuiltinType* builtinType;
VECTOR(Item*, Items)
Item* FindItemByName(const std::string& Name);
};
class CS_API Variable : public Declaration
{
public:
DECLARE_DECL_KIND(Variable, Variable)
~Variable();
bool isConstExpr;
std::string mangled;
QualifiedType qualifiedType;
ExpressionObsolete* initializer;
};
class PreprocessedEntity;
struct CS_API BaseClassSpecifier
{
BaseClassSpecifier();
AccessSpecifier access;
bool isVirtual;
Type* type;
int offset;
};
class Class;
class CS_API Field : public Declaration
{
public:
DECLARE_DECL_KIND(Field, Field)
~Field();
QualifiedType qualifiedType;
Class* _class;
bool isBitField;
unsigned bitWidth;
};
class CS_API AccessSpecifierDecl : public Declaration
{
public:
DECLARE_DECL_KIND(AccessSpecifierDecl, AccessSpecifier)
~AccessSpecifierDecl();
};
enum class CppAbi
{
Itanium,
Microsoft,
ARM,
AArch64,
iOS,
AppleARM64,
WebAssembly
};
enum class VTableComponentKind
{
VCallOffset,
VBaseOffset,
OffsetToTop,
RTTI,
FunctionPointer,
CompleteDtorPointer,
DeletingDtorPointer,
UnusedFunctionPointer,
};
struct CS_API VTableComponent
{
VTableComponent();
VTableComponentKind kind;
unsigned offset;
Declaration* declaration;
};
struct CS_API VTableLayout
{
VTableLayout();
VTableLayout(const VTableLayout&);
~VTableLayout();
VECTOR(VTableComponent, Components)
};
struct CS_API VFTableInfo
{
VFTableInfo();
VFTableInfo(const VFTableInfo&);
uint64_t VBTableIndex;
uint32_t VFPtrOffset;
uint32_t VFPtrFullOffset;
VTableLayout layout;
};
class CS_API LayoutField
{
public:
LayoutField();
LayoutField(const LayoutField& other);
~LayoutField();
unsigned offset;
std::string name;
QualifiedType qualifiedType;
void* fieldPtr;
};
class Class;
class CS_API LayoutBase
{
public:
LayoutBase();
LayoutBase(const LayoutBase& other);
~LayoutBase();
unsigned offset;
Class* _class;
};
enum class RecordArgABI
{
/// Pass it using the normal C aggregate rules for the ABI,
/// potentially introducing extra copies and passing some
/// or all of it in registers.
Default = 0,
/// Pass it on the stack using its defined layout.
/// The argument must be evaluated directly into the correct
/// stack position in the arguments area, and the call machinery
/// must not move it or introduce extra copies.
DirectInMemory,
/// Pass it as a pointer to temporary memory.
Indirect
};
struct CS_API ClassLayout
{
ClassLayout();
CppAbi ABI;
RecordArgABI argABI;
VECTOR(VFTableInfo, VFTables)
VTableLayout layout;
bool hasOwnVFPtr;
long VBPtrOffset;
int alignment;
int size;
int dataSize;
VECTOR(LayoutField, Fields)
VECTOR(LayoutBase, Bases)
};
enum class TagKind
{
Struct,
Interface,
Union,
Class,
Enum
};
class CS_API Class : public DeclarationContext
{
public:
Class();
~Class();
VECTOR(BaseClassSpecifier*, Bases)
VECTOR(Field*, Fields)
VECTOR(Method*, Methods)
VECTOR(AccessSpecifierDecl*, Specifiers)
bool isPOD;
bool isAbstract;
bool isUnion;
bool isDynamic;
bool isPolymorphic;
bool hasNonTrivialDefaultConstructor;
bool hasNonTrivialCopyConstructor;
bool hasNonTrivialDestructor;
bool isExternCContext;
bool isInjected;
TagKind tagKind;
ClassLayout* layout;
};
class CS_API Template : public Declaration
{
public:
Template(DeclarationKind kind);
DECLARE_DECL_KIND(Template, Template)
Declaration* TemplatedDecl;
VECTOR(Declaration*, Parameters)
};
template <typename T>
T* DeclarationContext::FindTemplate(const std::string& USR)
{
auto foundTemplate = std::find_if(Templates.begin(), Templates.end(),
[&](Template* t)
{
return t->USR == USR;
});
if (foundTemplate != Templates.end())
return static_cast<T*>(*foundTemplate);
return nullptr;
}
class CS_API TypeAliasTemplate : public Template
{
public:
TypeAliasTemplate();
~TypeAliasTemplate();
Declaration* CanonicalDecl = nullptr;
};
class CS_API TemplateParameter : public Declaration
{
public:
TemplateParameter(DeclarationKind kind);
~TemplateParameter();
unsigned int depth;
unsigned int index;
bool isParameterPack;
};
class CS_API TemplateTemplateParameter : public Template
{
public:
TemplateTemplateParameter();
~TemplateTemplateParameter();
bool isParameterPack;
bool isPackExpansion;
bool isExpandedParameterPack;
};
class CS_API TypeTemplateParameter : public TemplateParameter
{
public:
TypeTemplateParameter();
TypeTemplateParameter(const TypeTemplateParameter&);
~TypeTemplateParameter();
QualifiedType defaultArgument;
};
class CS_API NonTypeTemplateParameter : public TemplateParameter
{
public:
NonTypeTemplateParameter();
NonTypeTemplateParameter(const NonTypeTemplateParameter&);
~NonTypeTemplateParameter();
ExpressionObsolete* defaultArgument;
Expr* defaultArgumentNew;
unsigned int position;
bool isPackExpansion;
bool isExpandedParameterPack;
QualifiedType type;
};
class ClassTemplateSpecialization;
class ClassTemplatePartialSpecialization;
class CS_API ClassTemplate : public Template
{
public:
ClassTemplate();
~ClassTemplate();
VECTOR(ClassTemplateSpecialization*, Specializations)
ClassTemplateSpecialization* FindSpecialization(const std::string& usr);
ClassTemplatePartialSpecialization* FindPartialSpecialization(const std::string& usr);
};
enum class TemplateSpecializationKind
{
Undeclared,
ImplicitInstantiation,
ExplicitSpecialization,
ExplicitInstantiationDeclaration,
ExplicitInstantiationDefinition
};
class CS_API ClassTemplateSpecialization : public Class
{
public:
ClassTemplateSpecialization();
~ClassTemplateSpecialization();
ClassTemplate* templatedDecl;
VECTOR(TemplateArgument, Arguments)
TemplateSpecializationKind specializationKind;
};
class CS_API ClassTemplatePartialSpecialization : public ClassTemplateSpecialization
{
public:
ClassTemplatePartialSpecialization();
~ClassTemplatePartialSpecialization();
VECTOR(Declaration*, Parameters)
};
class CS_API FunctionTemplate : public Template
{
public:
FunctionTemplate();
~FunctionTemplate();
VECTOR(FunctionTemplateSpecialization*, Specializations)
FunctionTemplateSpecialization* FindSpecialization(const std::string& usr);
};
class CS_API FunctionTemplateSpecialization
{
public:
FunctionTemplateSpecialization();
~FunctionTemplateSpecialization();
FunctionTemplate* _template;
VECTOR(TemplateArgument, Arguments)
Function* specializedFunction;
TemplateSpecializationKind specializationKind;
};
class VarTemplateSpecialization;
class VarTemplatePartialSpecialization;
class CS_API VarTemplate : public Template
{
public:
VarTemplate();
~VarTemplate();
VECTOR(VarTemplateSpecialization*, Specializations)
VarTemplateSpecialization* FindSpecialization(const std::string& usr);
VarTemplatePartialSpecialization* FindPartialSpecialization(const std::string& usr);
};
class CS_API VarTemplateSpecialization : public Variable
{
public:
VarTemplateSpecialization();
~VarTemplateSpecialization();
VarTemplate* templatedDecl;
VECTOR(TemplateArgument, Arguments)
TemplateSpecializationKind specializationKind;
};
class CS_API VarTemplatePartialSpecialization : public VarTemplateSpecialization
{
public:
VarTemplatePartialSpecialization();
~VarTemplatePartialSpecialization();
};
class CS_API UnresolvedUsingTypename : public Declaration
{
public:
UnresolvedUsingTypename();
~UnresolvedUsingTypename();
};
class CS_API Namespace : public DeclarationContext
{
public:
Namespace();
~Namespace();
bool isInline;
};
enum class MacroLocation
{
Unknown,
ClassHead,
ClassBody,
FunctionHead,
FunctionParameters,
FunctionBody,
};
class CS_API PreprocessedEntity
{
public:
PreprocessedEntity();
MacroLocation macroLocation;
void* originalPtr;
DeclarationKind kind;
};
class CS_API MacroDefinition : public PreprocessedEntity
{
public:
MacroDefinition();
~MacroDefinition();
std::string name;
std::string expression;
int lineNumberStart;
int lineNumberEnd;
};
class CS_API MacroExpansion : public PreprocessedEntity
{
public:
MacroExpansion();
~MacroExpansion();
std::string name;
std::string text;
MacroDefinition* definition;
};
class CS_API TranslationUnit : public Namespace
{
public:
TranslationUnit();
~TranslationUnit();
std::string fileName;
bool isSystemHeader;
VECTOR(MacroDefinition*, Macros)
};
class CS_API ASTContext
{
public:
ASTContext();
~ASTContext();
TranslationUnit* FindOrCreateModule(const std::string& File);
VECTOR(TranslationUnit*, TranslationUnits)
};
}
}
} // namespace CppSharp::CppParser::AST