Browse Source

Fixed handling of static fields in the parser.

References #320.
pull/356/head
triton 11 years ago
parent
commit
ec4ee6ba3c
  1. 11
      src/CppParser/AST.cpp
  2. 2
      src/CppParser/AST.h
  3. 14
      src/CppParser/Parser.cpp
  4. 8
      tests/Basic/Basic.Tests.cs
  5. 10
      tests/Basic/Basic.h

11
src/CppParser/AST.cpp

@ -416,6 +416,17 @@ TypedefDecl* DeclarationContext::FindTypedef(const std::string& Name, bool Creat @@ -416,6 +416,17 @@ TypedefDecl* DeclarationContext::FindTypedef(const std::string& Name, bool Creat
return tdef;
}
Variable* DeclarationContext::FindVariable(const std::string& USR)
{
auto found = std::find_if(Variables.begin(), Variables.end(),
[&](Variable* var) { return var->USR == USR; });
if (found != Variables.end())
return *found;
return nullptr;
}
TypedefDecl::TypedefDecl() : Declaration(DeclarationKind::Typedef) {}
DEF_STRING(Statement, String)

2
src/CppParser/AST.h

@ -438,6 +438,8 @@ public: @@ -438,6 +438,8 @@ public:
CS_IGNORE TypedefDecl* FindTypedef(const std::string& Name, bool Create = false);
CS_IGNORE Variable* FindVariable(const std::string& USR);
VECTOR(Namespace*, Namespaces)
VECTOR(Enumeration*, Enums)
VECTOR(Function*, Functions)

14
src/CppParser/Parser.cpp

@ -2342,10 +2342,18 @@ Variable* Parser::WalkVariable(clang::VarDecl *VD) @@ -2342,10 +2342,18 @@ Variable* Parser::WalkVariable(clang::VarDecl *VD)
{
using namespace clang;
auto NS = GetNamespace(VD);
assert(NS && "Expected a valid namespace");
auto USR = GetDeclUSR(VD);
if (auto Var = NS->FindVariable(USR))
return Var;
auto Var = new Variable();
HandleDeclaration(VD, Var);
Var->Name = VD->getName();
Var->_Namespace = NS;
Var->Access = ConvertToAccess(VD->getAccess());
auto TL = VD->getTypeSourceInfo()->getTypeLoc();
@ -2354,6 +2362,8 @@ Variable* Parser::WalkVariable(clang::VarDecl *VD) @@ -2354,6 +2362,8 @@ Variable* Parser::WalkVariable(clang::VarDecl *VD)
auto Mangled = GetDeclMangledName(VD, TargetABI, /*IsDependent=*/false);
Var->Mangled = Mangled;
NS->Variables.push_back(Var);
return Var;
}
@ -2811,10 +2821,6 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D, @@ -2811,10 +2821,6 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D,
{
auto VD = cast<VarDecl>(D);
Decl = WalkVariable(VD);
auto NS = GetNamespace(VD);
Decl->_Namespace = NS;
NS->Variables.push_back(static_cast<Variable*>(Decl));
break;
}
case Decl::CXXConstructor:

8
tests/Basic/Basic.Tests.cs

@ -369,6 +369,14 @@ public class BasicTests : GeneratorTestFixture @@ -369,6 +369,14 @@ public class BasicTests : GeneratorTestFixture
Assert.That(prop.FieldValue, Is.EqualTo(10));
}
public void TestVariable()
{
// Test field property
var @var = new TestVariables();
@var.Value = 10;
Assert.That(TestVariables.VALUE, Is.EqualTo(10));
}
[Test]
public unsafe void TestArraysPointers()
{

10
tests/Basic/Basic.h

@ -498,6 +498,16 @@ public: @@ -498,6 +498,16 @@ public:
int TestIndexedPropertiesInValueType::operator[](int i) { return i; }
// Tests variables
struct DLL_API TestVariables
{
static int VALUE;
void SetValue(int value = VALUE);
};
int TestVariables::VALUE;
void TestVariables::SetValue(int value) { VALUE = value; }
enum struct MyEnum { A, B, C };
class DLL_API TestArraysPointers

Loading…
Cancel
Save