From ee3fbd8e0326efe624fb0428eb62938f9f5dbbad Mon Sep 17 00:00:00 2001 From: triton Date: Tue, 8 Apr 2014 12:38:58 +0100 Subject: [PATCH] Added support for anonymous C++11 inline namespaces to the AST and parsers. --- src/AST/Namespace.cs | 4 +++- src/CppParser/AST.cpp | 6 +++--- src/CppParser/AST.h | 3 +++ src/CppParser/Parser.cpp | 2 ++ src/Parser/Parser.cpp | 2 ++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/AST/Namespace.cs b/src/AST/Namespace.cs index 3c0605bc..c84f2dd4 100644 --- a/src/AST/Namespace.cs +++ b/src/AST/Namespace.cs @@ -311,7 +311,9 @@ namespace CppSharp.AST /// Represents a C++ namespace. /// public class Namespace : DeclarationContext - { + { + public bool IsInline; + public override T Visit(IDeclVisitor visitor) { return visitor.VisitNamespace(this); diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index c1ace1e3..5cca3884 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -108,8 +108,8 @@ DEF_STRING(Declaration, Name) DEF_STRING(Declaration, DebugText) DEF_VECTOR(Declaration, PreprocessedEntity*, PreprocessedEntities) -DeclarationContext::DeclarationContext() - : Declaration(DeclarationKind::DeclarationContext) {} +DeclarationContext::DeclarationContext() : IsAnonymous(false), + Declaration(DeclarationKind::DeclarationContext) {} DEF_VECTOR(DeclarationContext, Namespace*, Namespaces) DEF_VECTOR(DeclarationContext, Enumeration*, Enums) @@ -403,7 +403,7 @@ ClassTemplatePartialSpecialization::ClassTemplatePartialSpecialization() FunctionTemplate::FunctionTemplate() { Kind = DeclarationKind::FunctionTemplate; } -Namespace::Namespace() { Kind = DeclarationKind::Namespace; } +Namespace::Namespace() : IsInline(false) { Kind = DeclarationKind::Namespace; } PreprocessedEntity::PreprocessedEntity() : Declaration(DeclarationKind::PreprocessedEntity), diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 73f24171..7395f076 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -406,6 +406,8 @@ struct CS_API DeclarationContext : public Declaration VECTOR(TypedefDecl*, Typedefs) VECTOR(Variable*, Variables) std::map Anonymous; + + bool IsAnonymous; }; struct CS_API TypedefDecl : public Declaration @@ -652,6 +654,7 @@ struct CS_API FunctionTemplate : public Template struct CS_API Namespace : public DeclarationContext { Namespace(); + bool IsInline; }; enum struct MacroLocation diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 5debf6c4..003bb56c 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1077,6 +1077,8 @@ DeclarationContext* Parser::GetNamespace(clang::Decl* D, continue; auto Name = ND->getName(); DC = DC->FindCreateNamespace(Name); + ((Namespace*)DC)->IsAnonymous = ND->isAnonymousNamespace(); + ((Namespace*)DC)->IsInline = ND->isInline(); HandleDeclaration(ND, DC); continue; } diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index ef79cc50..e93f6a06 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1090,6 +1090,8 @@ CppSharp::AST::DeclarationContext^ Parser::GetNamespace(clang::Decl* D, continue; auto Name = clix::marshalString(ND->getName()); DC = DC->FindCreateNamespace(Name); + safe_cast(DC)->IsAnonymous = ND->isAnonymousNamespace(); + safe_cast(DC)->IsInline = ND->isInline(); HandleDeclaration(ND, DC); continue; }