Browse Source

Added parsing support for class function templates and added parsing of template parameters.

pull/1/head
triton 12 years ago
parent
commit
09b5863b5e
  1. 2
      src/Bridge/Class.cs
  2. 1
      src/Bridge/Template.cs
  3. 22
      src/Parser/Parser.cpp

2
src/Bridge/Class.cs

@ -84,6 +84,7 @@ namespace Cxxi @@ -84,6 +84,7 @@ namespace Cxxi
public List<Method> Methods;
public List<Variable> Variables;
public List<Event> Events;
public List<FunctionTemplate> FunctionTemplates;
// True if the record is a POD (Plain Old Data) type.
public bool IsPOD;
@ -113,6 +114,7 @@ namespace Cxxi @@ -113,6 +114,7 @@ namespace Cxxi
Events = new List<Event>();
NestedClasses = new List<Class>();
NestedEnums = new List<Enumeration>();
FunctionTemplates = new List<FunctionTemplate>();
IsAbstract = false;
IsUnion = false;
IsOpaque = false;

1
src/Bridge/Template.cs

@ -12,6 +12,7 @@ namespace Cxxi @@ -12,6 +12,7 @@ namespace Cxxi
protected Template(Declaration decl)
{
TemplatedDecl = decl;
Parameters = new List<TemplateParameter>();
}
public Declaration TemplatedDecl;

22
src/Parser/Parser.cpp

@ -389,6 +389,17 @@ Cxxi::Class^ Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, bool IsDependen @@ -389,6 +389,17 @@ Cxxi::Class^ Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, bool IsDependen
RC->Variables->Add(Var);
}
// Iterate through the record function template methods.
for(auto it = Record->decls_begin(); it != Record->decls_end(); ++it)
{
auto Decl = *it;
if (!isa<FunctionTemplateDecl>(Decl)) continue;
Cxxi::FunctionTemplate^ FT = WalkFunctionTemplate(
cast<FunctionTemplateDecl>(Decl));
RC->FunctionTemplates->Add(FT);
}
// Iterate through the record bases.
for(auto it = Record->bases_begin(); it != Record->bases_end(); ++it)
{
@ -435,6 +446,17 @@ Cxxi::FunctionTemplate^ Parser::WalkFunctionTemplate(clang::FunctionTemplateDecl @@ -435,6 +446,17 @@ Cxxi::FunctionTemplate^ Parser::WalkFunctionTemplate(clang::FunctionTemplateDecl
/*AddToNamespace=*/false);
Cxxi::FunctionTemplate^ FT = gcnew Cxxi::FunctionTemplate(Function);
auto TPL = TD->getTemplateParameters();
for(auto it = TPL->begin(); it != TPL->end(); ++it)
{
auto ND = *it;
auto TP = Cxxi::TemplateParameter();
TP.Name = clix::marshalString<clix::E_UTF8>(ND->getNameAsString());
FT->Parameters->Add(TP);
}
return FT;
}

Loading…
Cancel
Save