@@ -54,6 +54,7 @@ static bool inMacroCommand_ = false;
54
54
static bool parsingHeaderFile_ = false ;
55
55
QStringList CppCodeParser::exampleFiles;
56
56
QStringList CppCodeParser::exampleDirs;
57
+ CppCodeParser* CppCodeParser::cppParser_ = 0 ;
57
58
58
59
/* !
59
60
The constructor initializes some regular expressions
@@ -63,6 +64,7 @@ CppCodeParser::CppCodeParser()
63
64
: varComment(" /\\ *\\ s*([a-zA-Z_0-9]+)\\ s*\\ */" ), sep(" (?:<[^>]+>)?::" )
64
65
{
65
66
reset ();
67
+ cppParser_ = this ;
66
68
}
67
69
68
70
/* !
@@ -374,12 +376,12 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc,
374
376
}
375
377
else {
376
378
func->setMetaness (FunctionNode::MacroWithParams);
377
- QList <Parameter> params = func->parameters ();
379
+ QVector <Parameter> params = func->parameters ();
378
380
for (int i = 0 ; i < params.size (); ++i) {
379
381
Parameter ¶m = params[i];
380
- if (param.name ().isEmpty () && !param.leftType ().isEmpty ()
381
- && param.leftType () != " ..." )
382
- param = Parameter (" " , " " , param.leftType ());
382
+ if (param.name ().isEmpty () && !param.dataType ().isEmpty ()
383
+ && param.dataType () != " ..." )
384
+ param = Parameter (" " , " " , param.dataType ());
383
385
}
384
386
func->setParameters (params);
385
387
}
@@ -1308,23 +1310,23 @@ bool CppCodeParser::matchDataType(CodeChunk *dataType, QString *var)
1308
1310
1309
1311
/* !
1310
1312
Parse the next function parameter, if there is one, and
1311
- append it to parameter list \a p. Return true if a parameter
1312
- is parsed and appended to \a p. Otherwise return false.
1313
+ append it to parameter vector \a pvect. Return true if
1314
+ a parameter is parsed and appended to \a pvect.
1315
+ Otherwise return false.
1313
1316
*/
1314
- bool CppCodeParser::matchParameter (ParsedParameterList& pplist )
1317
+ bool CppCodeParser::matchParameter (QVector<Parameter>& pvect, bool & isQPrivateSignal )
1315
1318
{
1316
- ParsedParameter pp;
1317
1319
if (match (Tok_QPrivateSignal)) {
1318
- pp.qPrivateSignal_ = true ;
1319
- pplist.append (pp);
1320
+ isQPrivateSignal = true ;
1320
1321
return true ;
1321
1322
}
1322
1323
1324
+ Parameter p;
1323
1325
CodeChunk chunk;
1324
- if (!matchDataType (&chunk, &pp .name_ )) {
1326
+ if (!matchDataType (&chunk, &p .name_ )) {
1325
1327
return false ;
1326
1328
}
1327
- pp .dataType_ = chunk.toString ();
1329
+ p .dataType_ = chunk.toString ();
1328
1330
chunk.clear ();
1329
1331
match (Tok_Comment);
1330
1332
if (match (Tok_Equal)) {
@@ -1336,8 +1338,8 @@ bool CppCodeParser::matchParameter(ParsedParameterList& pplist)
1336
1338
readToken ();
1337
1339
}
1338
1340
}
1339
- pp .defaultValue_ = chunk.toString ();
1340
- pplist .append (pp );
1341
+ p .defaultValue_ = chunk.toString ();
1342
+ pvect .append (p );
1341
1343
return true ;
1342
1344
}
1343
1345
@@ -1542,10 +1544,11 @@ bool CppCodeParser::matchFunctionDecl(Aggregate *parent,
1542
1544
readToken ();
1543
1545
1544
1546
// A left paren was seen. Parse the parameters
1545
- ParsedParameterList pplist;
1547
+ bool isQPrivateSignal = false ;
1548
+ QVector<Parameter> pvect;
1546
1549
if (tok != Tok_RightParen) {
1547
1550
do {
1548
- if (!matchParameter (pplist ))
1551
+ if (!matchParameter (pvect, isQPrivateSignal ))
1549
1552
return false ;
1550
1553
} while (match (Tok_Comma));
1551
1554
}
@@ -1629,13 +1632,10 @@ bool CppCodeParser::matchFunctionDecl(Aggregate *parent,
1629
1632
func->setStatic (matched_static);
1630
1633
func->setConst (matchedConst);
1631
1634
func->setVirtualness (virtuality);
1632
- if (!pplist.isEmpty ()) {
1633
- foreach (const ParsedParameter& pp, pplist) {
1634
- if (pp.qPrivateSignal_ )
1635
- func->setPrivateSignal ();
1636
- else
1637
- func->addParameter (Parameter (pp.dataType_ , " " , pp.name_ , pp.defaultValue_ ));
1638
- }
1635
+ if (isQPrivateSignal)
1636
+ func->setPrivateSignal ();
1637
+ if (!pvect.isEmpty ()) {
1638
+ func->setParameters (pvect);
1639
1639
}
1640
1640
}
1641
1641
if (parentPathPtr != 0 )
@@ -2416,6 +2416,34 @@ bool CppCodeParser::makeFunctionNode(const QString& signature,
2416
2416
return ok;
2417
2417
}
2418
2418
2419
+ /* !
2420
+ This function uses a Tokenizer to parse the \a parameters of a
2421
+ function into the parameter vector \a {pvect}.
2422
+ */
2423
+ bool CppCodeParser::parseParameters (const QString& parameters,
2424
+ QVector<Parameter>& pvect,
2425
+ bool & isQPrivateSignal)
2426
+ {
2427
+ Tokenizer* outerTokenizer = tokenizer;
2428
+ int outerTok = tok;
2429
+
2430
+ QByteArray latin1 = parameters.toLatin1 ();
2431
+ Tokenizer stringTokenizer (Location (), latin1);
2432
+ stringTokenizer.setParsingFnOrMacro (true );
2433
+ tokenizer = &stringTokenizer;
2434
+ readToken ();
2435
+
2436
+ inMacroCommand_ = false ;
2437
+ do {
2438
+ if (!matchParameter (pvect, isQPrivateSignal))
2439
+ return false ;
2440
+ } while (match (Tok_Comma));
2441
+
2442
+ tokenizer = outerTokenizer;
2443
+ tok = outerTok;
2444
+ return true ;
2445
+ }
2446
+
2419
2447
/* !
2420
2448
Create a new FunctionNode for a QML method or signal, as
2421
2449
specified by \a type, as a child of \a parent. \a sig is
0 commit comments