Browse Source

Merge pull request #446 from ddobrev/master

Fixed the signatures of const functions
pull/447/merge
João Matos 11 years ago
parent
commit
e65c0ce1ea
  1. 14
      src/CppParser/Parser.cpp
  2. 7
      src/Generator.Tests/AST/TestAST.cs
  3. 3
      tests/Native/AST.h

14
src/CppParser/Parser.cpp

@ -2197,7 +2197,6 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F,
F->Mangled = Mangled; F->Mangled = Mangled;
clang::SourceLocation ParamStartLoc = FD->getLocStart(); clang::SourceLocation ParamStartLoc = FD->getLocStart();
clang::SourceLocation ParamEndLoc = FD->getLocEnd();
clang::SourceLocation ResultLoc; clang::SourceLocation ResultLoc;
auto FTSI = FD->getTypeSourceInfo(); auto FTSI = FD->getTypeSourceInfo();
@ -2213,7 +2212,6 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F,
assert (!FTInfo.isNull()); assert (!FTInfo.isNull());
ParamStartLoc = FTInfo.getLParenLoc(); ParamStartLoc = FTInfo.getLParenLoc();
ParamEndLoc = FTInfo.getRParenLoc();
ResultLoc = FTInfo.getReturnLoc().getLocStart(); ResultLoc = FTInfo.getReturnLoc().getLocStart();
} }
} }
@ -2222,17 +2220,7 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F,
if (ResultLoc.isValid()) if (ResultLoc.isValid())
BeginLoc = ResultLoc; BeginLoc = ResultLoc;
// For some weird reason 'kw_const' doesn't work; Clang considers the 'const' a 'raw_identifier' clang::SourceRange Range(BeginLoc, FD->getLocEnd());
clang::SourceLocation EndLoc = Lexer::findLocationAfterToken(
ParamEndLoc, tok::TokenKind::raw_identifier, C->getSourceManager(), C->getLangOpts(),
/*SkipTrailingWhitespaceAndNewLine=*/true);
if (EndLoc.isValid())
EndLoc = EndLoc.getLocWithOffset(/*Offset=*/-1);
else
EndLoc = ParamEndLoc;
clang::SourceRange Range(BeginLoc, EndLoc);
std::string Sig; std::string Sig;
if (GetDeclText(Range, Sig)) if (GetDeclText(Range, Sig))

7
src/Generator.Tests/AST/TestAST.cs

@ -243,7 +243,7 @@ namespace CppSharp.Generator.Tests.AST
[Test] [Test]
public void TestLineNumberOfFriend() public void TestLineNumberOfFriend()
{ {
Assert.AreEqual(83, AstContext.FindFunction("operator+").First().LineNumberStart); Assert.AreEqual(86, AstContext.FindFunction("operator+").First().LineNumberStart);
} }
[Test] [Test]
@ -251,7 +251,10 @@ namespace CppSharp.Generator.Tests.AST
{ {
Assert.AreEqual("void testSignature()", AstContext.FindFunction("testSignature").Single().Signature); Assert.AreEqual("void testSignature()", AstContext.FindFunction("testSignature").Single().Signature);
Assert.AreEqual("void testImpl()", AstContext.FindFunction("testImpl").Single().Signature); Assert.AreEqual("void testImpl()", AstContext.FindFunction("testImpl").Single().Signature);
Assert.AreEqual("void testConstSignature() const", AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstSignature").Signature); Assert.AreEqual("void testConstSignature() const",
AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstSignature").Signature);
Assert.AreEqual("void testConstSignatureWithTrailingMacro() const",
AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstSignatureWithTrailingMacro").Signature);
// TODO: restore when the const of a return type is fixed properly // TODO: restore when the const of a return type is fixed properly
//Assert.AreEqual("const int& testConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstRefSignature").Signature); //Assert.AreEqual("const int& testConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstRefSignature").Signature);
//Assert.AreEqual("const int& testStaticConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testStaticConstRefSignature").Signature); //Assert.AreEqual("const int& testStaticConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testStaticConstRefSignature").Signature);

3
tests/Native/AST.h

@ -67,10 +67,13 @@ namespace HidesClass
void testSignature(); void testSignature();
#define MY_MACRO
class HasConstFunction class HasConstFunction
{ {
public: public:
void testConstSignature() const; void testConstSignature() const;
void testConstSignatureWithTrailingMacro() const MY_MACRO;
const int& testConstRefSignature(); const int& testConstRefSignature();
static const int& testStaticConstRefSignature(); static const int& testStaticConstRefSignature();
friend inline const TestTemplateClass2 operator+(const TestTemplateClass2& f1, const TestTemplateClass2& f2); friend inline const TestTemplateClass2 operator+(const TestTemplateClass2& f1, const TestTemplateClass2& f2);

Loading…
Cancel
Save