summaryrefslogtreecommitdiffstats
path: root/tools/qdoc3/cppcodeparser.cpp
diff options
context:
space:
mode:
authorMartin Smith <msmith@trolltech.com>2009-11-05 13:09:16 (GMT)
committerMartin Smith <msmith@trolltech.com>2009-11-11 12:47:34 (GMT)
commit385ef0b086d0736d1dd8ef03ced73c73e61dcb43 (patch)
tree98643160d26b38de4d491a1952f4722c64ffd978 /tools/qdoc3/cppcodeparser.cpp
parent3a492b3bcd3898335dd36b46906a5b9cce5120f3 (diff)
downloadQt-385ef0b086d0736d1dd8ef03ced73c73e61dcb43.zip
Qt-385ef0b086d0736d1dd8ef03ced73c73e61dcb43.tar.gz
Qt-385ef0b086d0736d1dd8ef03ced73c73e61dcb43.tar.bz2
qdoc3: Fixed a linking problem for qml methods.
Note the Invalid Syntax errors for some uses of \qmlmethod and \qmlsignal. A syntactically correct signature is now required as the argument.
Diffstat (limited to 'tools/qdoc3/cppcodeparser.cpp')
-rw-r--r--tools/qdoc3/cppcodeparser.cpp70
1 files changed, 53 insertions, 17 deletions
diff --git a/tools/qdoc3/cppcodeparser.cpp b/tools/qdoc3/cppcodeparser.cpp
index cabbe38..90d83ca 100644
--- a/tools/qdoc3/cppcodeparser.cpp
+++ b/tools/qdoc3/cppcodeparser.cpp
@@ -693,13 +693,13 @@ Node *CppCodeParser::processTopicCommand(const Doc& doc,
if (n && n->subType() == Node::QmlClass) {
qmlClass = static_cast<QmlClassNode*>(n);
if (command == COMMAND_QMLSIGNAL)
- return new QmlSignalNode(qmlClass,name,false);
+ return makeFunctionNode(doc,arg,qmlClass,Node::QmlSignal,false,COMMAND_QMLSIGNAL);
else if (command == COMMAND_QMLATTACHEDSIGNAL)
- return new QmlSignalNode(qmlClass,name,true);
+ return makeFunctionNode(doc,arg,qmlClass,Node::QmlSignal,true,COMMAND_QMLATTACHEDSIGNAL);
else if (command == COMMAND_QMLMETHOD)
- return new QmlMethodNode(qmlClass,name,false);
+ return makeFunctionNode(doc,arg,qmlClass,Node::QmlMethod,false,COMMAND_QMLMETHOD);
else if (command == COMMAND_QMLATTACHEDMETHOD)
- return new QmlMethodNode(qmlClass,name,true);
+ return makeFunctionNode(doc,arg,qmlClass,Node::QmlMethod,true,COMMAND_QMLATTACHEDMETHOD);
else
return 0; // never get here.
}
@@ -1265,7 +1265,9 @@ bool CppCodeParser::matchParameter(FunctionNode *func)
bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
QStringList *parentPathPtr,
FunctionNode **funcPtr,
- const QString &templateStuff)
+ const QString &templateStuff,
+ Node::Type type,
+ bool attached)
{
CodeChunk returnType;
QStringList parentPath;
@@ -1295,8 +1297,9 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
if (tokenizer->parsingFnOrMacro()
&& (match(Tok_Q_DECLARE_FLAGS) || match(Tok_Q_PROPERTY)))
returnType = CodeChunk(previousLexeme());
- else
+ else {
return false;
+ }
}
if (returnType.toString() == "QBool")
@@ -1326,8 +1329,9 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
readToken();
}
}
- if (tok != Tok_LeftParen)
+ if (tok != Tok_LeftParen) {
return false;
+ }
}
else if (tok == Tok_LeftParen) {
// constructor or destructor
@@ -1373,8 +1377,9 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
returnType.append(lexeme());
readToken();
}
- if (tok != Tok_Semicolon)
+ if (tok != Tok_Semicolon) {
return false;
+ }
}
else if (tok == Tok_Colon) {
returnType.appendHotspot();
@@ -1383,8 +1388,9 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
returnType.append(lexeme());
readToken();
}
- if (tok != Tok_Semicolon)
+ if (tok != Tok_Semicolon) {
return false;
+ }
}
VariableNode *var = new VariableNode(parent, name);
@@ -1397,12 +1403,13 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
var->setStatic(sta);
return false;
}
- if (tok != Tok_LeftParen)
+ if (tok != Tok_LeftParen) {
return false;
+ }
}
readToken();
- FunctionNode *func = new FunctionNode(parent, name);
+ FunctionNode *func = new FunctionNode(type, parent, name, attached);
func->setAccess(access);
func->setLocation(location());
func->setReturnType(returnType.toString());
@@ -1423,12 +1430,14 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
if (tok != Tok_RightParen) {
do {
- if (!matchParameter(func))
+ if (!matchParameter(func)) {
return false;
+ }
} while (match(Tok_Comma));
}
- if (!match(Tok_RightParen))
+ if (!match(Tok_RightParen)) {
return false;
+ }
func->setConst(match(Tok_const));
@@ -1444,8 +1453,9 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent,
if (!match(Tok_Semicolon) && tok != Tok_Eoi) {
int braceDepth0 = tokenizer->braceDepth();
- if (!match(Tok_LeftBrace))
+ if (!match(Tok_LeftBrace)) {
return false;
+ }
while (tokenizer->braceDepth() >= braceDepth0 && tok != Tok_Eoi)
readToken();
match(Tok_RightBrace);
@@ -2092,7 +2102,9 @@ bool CppCodeParser::matchDocsAndStuff()
bool CppCodeParser::makeFunctionNode(const QString& synopsis,
QStringList *parentPathPtr,
FunctionNode **funcPtr,
- InnerNode *root)
+ InnerNode *root,
+ Node::Type type,
+ bool attached)
{
Tokenizer *outerTokenizer = tokenizer;
int outerTok = tok;
@@ -2104,15 +2116,39 @@ bool CppCodeParser::makeFunctionNode(const QString& synopsis,
tokenizer = &stringTokenizer;
readToken();
- bool ok = matchFunctionDecl(root, parentPathPtr, funcPtr);
+ bool ok = matchFunctionDecl(root, parentPathPtr, funcPtr, QString(), type, attached);
// potential memory leak with funcPtr
tokenizer = outerTokenizer;
tok = outerTok;
-
return ok;
}
+/*!
+ Create a new FunctionNode for a QML method or signal, as
+ specified by \a type, as a child of \a parent. \a sig is
+ the complete signature, and if \a attached is true, the
+ method or signal is "attached". \a qdoctag is the text of
+ the \a type.
+ */
+FunctionNode* CppCodeParser::makeFunctionNode(const Doc& doc,
+ const QString& sig,
+ InnerNode* parent,
+ Node::Type type,
+ bool attached,
+ QString qdoctag)
+{
+ QStringList pp;
+ FunctionNode* fn = 0;
+ if (!makeFunctionNode(sig,&pp,&fn,parent,type,attached) &&
+ !makeFunctionNode("void "+sig,&pp,&fn,parent,type,attached)) {
+ doc.location().warning(tr("Invalid syntax in '\\%1'").arg(qdoctag));
+ }
+ if (fn)
+ return fn;
+ return 0;
+}
+
void CppCodeParser::parseQiteratorDotH(const Location &location,
const QString &filePath)
{