Browse Source

Fixed anonymous declaration parsing.

pull/273/head
triton 11 years ago
parent
commit
e4873e20cc
  1. 2
      src/CppParser/AST.cpp
  2. 4
      src/CppParser/AST.h
  3. 8
      src/CppParser/Parser.cpp

2
src/CppParser/AST.cpp

@ -166,7 +166,7 @@ DEF_VECTOR(DeclarationContext, Template*, Templates)
DEF_VECTOR(DeclarationContext, TypedefDecl*, Typedefs) DEF_VECTOR(DeclarationContext, TypedefDecl*, Typedefs)
DEF_VECTOR(DeclarationContext, Variable*, Variables) DEF_VECTOR(DeclarationContext, Variable*, Variables)
Declaration* DeclarationContext::FindAnonymous(uint64_t key) Declaration* DeclarationContext::FindAnonymous(const std::string& key)
{ {
auto it = Anonymous.find(key); auto it = Anonymous.find(key);
return (it != Anonymous.end()) ? it->second : 0; return (it != Anonymous.end()) ? it->second : 0;

4
src/CppParser/AST.h

@ -395,7 +395,7 @@ struct CS_API DeclarationContext : public Declaration
{ {
DeclarationContext(DeclarationKind kind); DeclarationContext(DeclarationKind kind);
CS_IGNORE Declaration* FindAnonymous(uint64_t key); CS_IGNORE Declaration* FindAnonymous(const std::string& USR);
CS_IGNORE CppSharp::CppParser::AST::Namespace* FindNamespace(const std::string& Name); CS_IGNORE CppSharp::CppParser::AST::Namespace* FindNamespace(const std::string& Name);
CS_IGNORE CppSharp::CppParser::AST::Namespace* FindNamespace(const std::vector<std::string>&); CS_IGNORE CppSharp::CppParser::AST::Namespace* FindNamespace(const std::vector<std::string>&);
@ -424,7 +424,7 @@ struct CS_API DeclarationContext : public Declaration
VECTOR(Template*, Templates) VECTOR(Template*, Templates)
VECTOR(TypedefDecl*, Typedefs) VECTOR(TypedefDecl*, Typedefs)
VECTOR(Variable*, Variables) VECTOR(Variable*, Variables)
std::map<uint64_t, Declaration*> Anonymous; std::map<std::string, Declaration*> Anonymous;
bool IsAnonymous; bool IsAnonymous;
}; };

8
src/CppParser/Parser.cpp

@ -578,7 +578,8 @@ Class* Parser::GetRecord(clang::RecordDecl* Record, bool& Process)
if (HasEmptyName) if (HasEmptyName)
{ {
if (auto AR = NS->FindAnonymous((uint64_t)Record)) auto USR = GetDeclUSR(Record);
if (auto AR = NS->FindAnonymous(USR))
RC = static_cast<Class*>(AR); RC = static_cast<Class*>(AR);
} }
else else
@ -593,7 +594,10 @@ Class* Parser::GetRecord(clang::RecordDecl* Record, bool& Process)
HandleDeclaration(Record, RC); HandleDeclaration(Record, RC);
if (HasEmptyName) if (HasEmptyName)
NS->Anonymous[(uint64_t)Record] = RC; {
auto USR = GetDeclUSR(Record);
NS->Anonymous[USR] = RC;
}
if (!isCompleteDefinition) if (!isCompleteDefinition)
return RC; return RC;

Loading…
Cancel
Save