summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2010-12-03 15:40:08 +0100
committerChristian Kamm <christian.d.kamm@nokia.com>2011-01-04 15:58:21 +0100
commit633c254986477e1bf4259d7b316a47eb0d1fa806 (patch)
treec7898ef0112cde050a8ddc523f6033478f766b2e /src
parent5f50a6ae343574bc247eb631c0a2314273f50add (diff)
downloadqt-creator-633c254986477e1bf4259d7b316a47eb0d1fa806.tar.gz
C++: Fix bind of Q_INVOKABLE functions.
Reviewed-by: Roberto Raggi
Diffstat (limited to 'src')
-rw-r--r--src/libs/cplusplus/pp-engine.cpp2
-rw-r--r--src/shared/cplusplus/Bind.cpp24
2 files changed, 23 insertions, 3 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 63afa844ab..15a7151a1e 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -1438,6 +1438,8 @@ bool Preprocessor::isQtReservedWord(const QByteArray &macroId) const
return true;
else if (size == 12 && macroId.at(0) == 'Q' && macroId == "Q_INTERFACES")
return true;
+ else if (size == 11 && macroId.at(0) == 'Q' && macroId == "Q_INVOKABLE")
+ return true;
else if (size == 6 && macroId.at(0) == 'S' && macroId == "SIGNAL")
return true;
else if (size == 4 && macroId.at(0) == 'S' && macroId == "SLOT")
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index 307ad0ef66..e887240b3b 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1722,10 +1722,25 @@ bool Bind::visit(BracedInitializerAST *ast)
return false;
}
+static int methodKeyForInvokableToken(int kind)
+{
+ if (kind == T_Q_SIGNAL)
+ return Function::SignalMethod;
+ else if (kind == T_Q_SLOT)
+ return Function::SlotMethod;
+ else if (kind == T_Q_INVOKABLE)
+ return Function::InvokableMethod;
+
+ return Function::NormalMethod;
+}
// DeclarationAST
bool Bind::visit(SimpleDeclarationAST *ast)
{
+ int methodKey = _methodKey;
+ if (ast->qt_invokable_token)
+ methodKey = methodKeyForInvokableToken(tokenKind(ast->qt_invokable_token));
+
// unsigned qt_invokable_token = ast->qt_invokable_token;
FullySpecifiedType type;
for (SpecifierListAST *it = ast->decl_specifier_list; it; it = it->next) {
@@ -1782,7 +1797,7 @@ bool Bind::visit(SimpleDeclarationAST *ast)
decl->setVisibility(_visibility);
if (Function *funTy = decl->type()->asFunctionType()) {
- funTy->setMethodKey(_methodKey);
+ funTy->setMethodKey(methodKey);
if (funTy->isVirtual() && it->value->equal_token)
funTy->setPureVirtual(true);
@@ -1921,7 +1936,10 @@ bool Bind::visit(ExceptionDeclarationAST *ast)
bool Bind::visit(FunctionDefinitionAST *ast)
{
- // unsigned qt_invokable_token = ast->qt_invokable_token;
+ int methodKey = _methodKey;
+ if (ast->qt_invokable_token)
+ methodKey = methodKeyForInvokableToken(tokenKind(ast->qt_invokable_token));
+
FullySpecifiedType declSpecifiers;
for (SpecifierListAST *it = ast->decl_specifier_list; it; it = it->next) {
declSpecifiers = this->specifier(it->value, declSpecifiers);
@@ -1937,7 +1955,7 @@ bool Bind::visit(FunctionDefinitionAST *ast)
if (_scope->isClass()) {
fun->setVisibility(_visibility);
- fun->setMethodKey(_methodKey);
+ fun->setMethodKey(methodKey);
}
if (declaratorId && declaratorId->name) {