Browse Source

Added support for anonymous C++11 inline namespaces to the AST and parsers.

pull/222/head
triton 11 years ago
parent
commit
ee3fbd8e03
  1. 4
      src/AST/Namespace.cs
  2. 6
      src/CppParser/AST.cpp
  3. 3
      src/CppParser/AST.h
  4. 2
      src/CppParser/Parser.cpp
  5. 2
      src/Parser/Parser.cpp

4
src/AST/Namespace.cs

@ -311,7 +311,9 @@ namespace CppSharp.AST
/// Represents a C++ namespace. /// Represents a C++ namespace.
/// </summary> /// </summary>
public class Namespace : DeclarationContext public class Namespace : DeclarationContext
{ {
public bool IsInline;
public override T Visit<T>(IDeclVisitor<T> visitor) public override T Visit<T>(IDeclVisitor<T> visitor)
{ {
return visitor.VisitNamespace(this); return visitor.VisitNamespace(this);

6
src/CppParser/AST.cpp

@ -108,8 +108,8 @@ DEF_STRING(Declaration, Name)
DEF_STRING(Declaration, DebugText) DEF_STRING(Declaration, DebugText)
DEF_VECTOR(Declaration, PreprocessedEntity*, PreprocessedEntities) DEF_VECTOR(Declaration, PreprocessedEntity*, PreprocessedEntities)
DeclarationContext::DeclarationContext() DeclarationContext::DeclarationContext() : IsAnonymous(false),
: Declaration(DeclarationKind::DeclarationContext) {} Declaration(DeclarationKind::DeclarationContext) {}
DEF_VECTOR(DeclarationContext, Namespace*, Namespaces) DEF_VECTOR(DeclarationContext, Namespace*, Namespaces)
DEF_VECTOR(DeclarationContext, Enumeration*, Enums) DEF_VECTOR(DeclarationContext, Enumeration*, Enums)
@ -403,7 +403,7 @@ ClassTemplatePartialSpecialization::ClassTemplatePartialSpecialization()
FunctionTemplate::FunctionTemplate() { Kind = DeclarationKind::FunctionTemplate; } FunctionTemplate::FunctionTemplate() { Kind = DeclarationKind::FunctionTemplate; }
Namespace::Namespace() { Kind = DeclarationKind::Namespace; } Namespace::Namespace() : IsInline(false) { Kind = DeclarationKind::Namespace; }
PreprocessedEntity::PreprocessedEntity() PreprocessedEntity::PreprocessedEntity()
: Declaration(DeclarationKind::PreprocessedEntity), : Declaration(DeclarationKind::PreprocessedEntity),

3
src/CppParser/AST.h

@ -406,6 +406,8 @@ struct CS_API DeclarationContext : public Declaration
VECTOR(TypedefDecl*, Typedefs) VECTOR(TypedefDecl*, Typedefs)
VECTOR(Variable*, Variables) VECTOR(Variable*, Variables)
std::map<uint64_t, Declaration*> Anonymous; std::map<uint64_t, Declaration*> Anonymous;
bool IsAnonymous;
}; };
struct CS_API TypedefDecl : public Declaration struct CS_API TypedefDecl : public Declaration
@ -652,6 +654,7 @@ struct CS_API FunctionTemplate : public Template
struct CS_API Namespace : public DeclarationContext struct CS_API Namespace : public DeclarationContext
{ {
Namespace(); Namespace();
bool IsInline;
}; };
enum struct MacroLocation enum struct MacroLocation

2
src/CppParser/Parser.cpp

@ -1077,6 +1077,8 @@ DeclarationContext* Parser::GetNamespace(clang::Decl* D,
continue; continue;
auto Name = ND->getName(); auto Name = ND->getName();
DC = DC->FindCreateNamespace(Name); DC = DC->FindCreateNamespace(Name);
((Namespace*)DC)->IsAnonymous = ND->isAnonymousNamespace();
((Namespace*)DC)->IsInline = ND->isInline();
HandleDeclaration(ND, DC); HandleDeclaration(ND, DC);
continue; continue;
} }

2
src/Parser/Parser.cpp

@ -1090,6 +1090,8 @@ CppSharp::AST::DeclarationContext^ Parser::GetNamespace(clang::Decl* D,
continue; continue;
auto Name = clix::marshalString<clix::E_UTF8>(ND->getName()); auto Name = clix::marshalString<clix::E_UTF8>(ND->getName());
DC = DC->FindCreateNamespace(Name); DC = DC->FindCreateNamespace(Name);
safe_cast<CppSharp::AST::Namespace^>(DC)->IsAnonymous = ND->isAnonymousNamespace();
safe_cast<CppSharp::AST::Namespace^>(DC)->IsInline = ND->isInline();
HandleDeclaration(ND, DC); HandleDeclaration(ND, DC);
continue; continue;
} }

Loading…
Cancel
Save