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
return tdef; 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) {} TypedefDecl::TypedefDecl() : Declaration(DeclarationKind::Typedef) {}
DEF_STRING(Statement, String) DEF_STRING(Statement, String)

2
src/CppParser/AST.h

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

14
src/CppParser/Parser.cpp

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

8
tests/Basic/Basic.Tests.cs

@ -369,6 +369,14 @@ public class BasicTests : GeneratorTestFixture
Assert.That(prop.FieldValue, Is.EqualTo(10)); 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] [Test]
public unsafe void TestArraysPointers() public unsafe void TestArraysPointers()
{ {

10
tests/Basic/Basic.h

@ -498,6 +498,16 @@ public:
int TestIndexedPropertiesInValueType::operator[](int i) { return i; } 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 }; enum struct MyEnum { A, B, C };
class DLL_API TestArraysPointers class DLL_API TestArraysPointers

Loading…
Cancel
Save