From d0bfb648b566807f622d4b09c507e3060e962f2f Mon Sep 17 00:00:00 2001 From: triton Date: Tue, 26 Feb 2013 00:57:19 +0000 Subject: [PATCH] Added base class information to classes. --- src/Bridge/Class.cs | 31 ++++++++++++++++++++++++------ src/Parser/Parser.cpp | 44 +++++++++++++++++++++++++++---------------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/Bridge/Class.cs b/src/Bridge/Class.cs index 408eb4fa..b9f8248c 100644 --- a/src/Bridge/Class.cs +++ b/src/Bridge/Class.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; @@ -14,16 +15,34 @@ namespace Cxxi // Represents a base class of a C++ class. public class BaseClassSpecifier { - public Class Class { get; set; } public AccessSpecifier Access { get; set; } public bool IsVirtual { get; set; } + public Type Type { get; set; } - BaseClassSpecifier(Class @class, AccessSpecifier access, - bool isVirtual = false) + public Class Class { - Class = @class; - Access = access; - IsVirtual = isVirtual; + get + { + Class @class; + if (!Type.IsTagDecl(out @class)) + throw new NotSupportedException(); + + return @class; + } + } + + public bool IsClass + { + get + { + Class @class; + return Type.IsTagDecl(out @class); + } + } + + public BaseClassSpecifier() + { + } } diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 06240a13..750dc607 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -266,6 +266,21 @@ std::string Parser::GetTypeName(const clang::Type* Type) //-----------------------------------// +static Cxxi::AccessSpecifier ConvertToAccess(clang::AccessSpecifier AS) +{ + switch(AS) + { + case clang::AS_private: + return Cxxi::AccessSpecifier::Private; + case clang::AS_protected: + return Cxxi::AccessSpecifier::Protected; + case clang::AS_public: + return Cxxi::AccessSpecifier::Public; + } + + return Cxxi::AccessSpecifier::Public; +} + Cxxi::Class^ Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, bool IsDependent) { using namespace clang; @@ -340,6 +355,19 @@ Cxxi::Class^ Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, bool IsDependen RC->Fields->Add(Field); } + // Iterate through the record bases. + for(auto it = Record->bases_begin(); it != Record->bases_end(); ++it) + { + clang::CXXBaseSpecifier &BS = *it; + + Cxxi::BaseClassSpecifier^ Base = gcnew Cxxi::BaseClassSpecifier(); + Base->Access = ConvertToAccess(BS.getAccessSpecifier()); + Base->IsVirtual = BS.isVirtual(); + Base->Type = WalkType(BS.getType(), &BS.getTypeSourceInfo()->getTypeLoc()); + + RC->Bases->Add(Base); + } + //Debug("Size: %I64d\n", Layout.getSize().getQuantity()); return RC; @@ -420,21 +448,6 @@ static Cxxi::CXXOperatorKind GetOperatorKindFromDecl(clang::DeclarationName Name return Cxxi::CXXOperatorKind::None; } -static Cxxi::AccessSpecifier ConvertToAccess(clang::AccessSpecifier AS) -{ - switch(AS) - { - case clang::AS_private: - return Cxxi::AccessSpecifier::Private; - case clang::AS_protected: - return Cxxi::AccessSpecifier::Protected; - case clang::AS_public: - return Cxxi::AccessSpecifier::Public; - } - - return Cxxi::AccessSpecifier::Public; -} - Cxxi::Method^ Parser::WalkMethodCXX(clang::CXXMethodDecl* MD) { using namespace clang; @@ -812,7 +825,6 @@ Cxxi::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, case Type::TemplateTypeParm: { auto TP = Type->getAs(); - auto TPT = gcnew Cxxi::TemplateParameterType(); //TPT->Parameter = WalkDeclaration(TP->getDecl());