Browse Source

Fixed the parsing of function prototypes in cases where the Clang type locator is not available.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/127/head
Dimitar Dobrev 12 years ago
parent
commit
df99550a39
  1. 4
      src/CppParser/AST.h
  2. 22
      src/CppParser/Parser.cpp
  3. 20
      src/Parser/Parser.cpp
  4. 2
      tests/Basic/Basic.Tests.cs
  5. 5
      tests/Basic/Basic.cs

4
src/CppParser/AST.h

@ -22,8 +22,8 @@ @@ -22,8 +22,8 @@
#define VECTOR(type, name) \
std::vector<type> name; \
type get##name(unsigned i) { return name[i]; } \
unsigned get##name##Count() { return name.size(); }
type get##name (unsigned i) { return name[i]; } \
unsigned get##name##Count () { return name.size(); }
namespace CppSharp { namespace CppParser { namespace AST {

22
src/CppParser/Parser.cpp

@ -1272,18 +1272,24 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, @@ -1272,18 +1272,24 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
for (unsigned i = 0; i < FP->getNumArgs(); ++i)
{
auto PVD = FTL.getArg(i);
auto FA = new Parameter();
HandleDeclaration(PVD, FA);
if (FTL)
{
auto PVD = FTL.getArg(i);
auto PTL = PVD->getTypeSourceInfo()->getTypeLoc();
HandleDeclaration(PVD, FA);
FA->Name = PVD->getNameAsString();
FA->QualifiedType = GetQualifiedType(PVD->getType(),
WalkType(PVD->getType(), &PTL));
auto PTL = PVD->getTypeSourceInfo()->getTypeLoc();
F->Parameters.push_back(FA);
FA->Name = PVD->getNameAsString();
FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL));
}
else
{
auto Arg = FP->getArgType(i);
FA->Name = "";
FA->QualifiedType = GetQualifiedType(Arg, WalkType(Arg));
}
}
return F;

20
src/Parser/Parser.cpp

@ -1384,16 +1384,24 @@ CppSharp::AST::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc* @@ -1384,16 +1384,24 @@ CppSharp::AST::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc*
for (unsigned i = 0; i < FP->getNumArgs(); ++i)
{
auto PVD = FTL.getArg(i);
auto FA = gcnew CppSharp::AST::Parameter();
HandleDeclaration(PVD, FA);
if (FTL)
{
auto PVD = FTL.getArg(i);
auto PTL = PVD->getTypeSourceInfo()->getTypeLoc();
HandleDeclaration(PVD, FA);
FA->Name = marshalString<E_UTF8>(PVD->getNameAsString());
FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL));
auto PTL = PVD->getTypeSourceInfo()->getTypeLoc();
FA->Name = marshalString<E_UTF8>(PVD->getNameAsString());
FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL));
}
else
{
auto Arg = FP->getArgType(i);
FA->Name = "";
FA->QualifiedType = GetQualifiedType(Arg, WalkType(Arg));
}
F->Parameters->Add(FA);
}

2
tests/Basic/Basic.Tests.cs

@ -111,7 +111,7 @@ public class BasicTests @@ -111,7 +111,7 @@ public class BasicTests
{
var returnsAbstractFoo = new ReturnsAbstractFoo();
var abstractFoo = returnsAbstractFoo.getFoo();
Assert.AreEqual(abstractFoo.pureFunction(), 5);
Assert.AreEqual(abstractFoo.pureFunction(1), 5);
Assert.AreEqual(abstractFoo.pureFunction1(), 10);
Assert.AreEqual(abstractFoo.pureFunction2(), 15);
}

5
tests/Basic/Basic.cs

@ -16,7 +16,10 @@ namespace CppSharp.Tests @@ -16,7 +16,10 @@ namespace CppSharp.Tests
public override void SetupPasses(Driver driver)
{
driver.Options.GenerateAbstractImpls = true;
if (driver.Options.IsCSharpGenerator)
{
driver.Options.GenerateAbstractImpls = true;
}
}
public override void Preprocess(Driver driver, ASTContext lib)

Loading…
Cancel
Save