Fixed icheck build.

This commit is contained in:
Erik Verbruggen
2010-04-23 15:25:05 +02:00
parent 25837759ea
commit a8fc1f48d4
4 changed files with 206 additions and 231 deletions

View File

@@ -622,11 +622,12 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type, unsigned
(void) switchDocument(previousDoc);
#else
(void) switchDocument(previousDoc);
Document::CheckMode mode = Document::FastCheck;
mode = Document::FullCheck;
doc->parse();
doc->check(mode);
(void) switchDocument(previousDoc);
#endif
}

View File

@@ -1,6 +1,7 @@
# ----------------------------------------------------
# This file is generated by the Qt Visual Studio Add-in.
# ------------------------------------------------------
HEADERS += \
$$REL_PATH_TO_SRC/shared/cplusplus/AST.h \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTMatcher.h \
@@ -57,7 +58,8 @@ HEADERS += \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeMatcher.h \
$$REL_PATH_TO_SRC/libs/cplusplus/TypePrettyPrinter.h \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.h \
$$REL_PATH_TO_SRC/plugins/cpptools/cpptools_global.h
$$REL_PATH_TO_SRC/plugins/cpptools/cpptools_global.h \
$$REL_PATH_TO_SRC/shared/cplusplus/QtContextKeywords.h
SOURCES += \
$$REL_PATH_TO_SRC/shared/cplusplus/AST.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTMatch0.cpp \
@@ -113,4 +115,5 @@ SOURCES += \
$$REL_PATH_TO_SRC/shared/cplusplus/Type.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeMatcher.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/TypePrettyPrinter.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.cpp
$$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/QtContextKeywords.cpp

View File

@@ -30,6 +30,10 @@
#include "parsemanager.h"
#include "cplusplus/CppDocument.h"
#include "Control.h"
#include "Literals.h"
#include "Overview.h"
#include "Scope.h"
#include "Semantic.h"
#include "TranslationUnit.h"
#include "AST.h"
#include "Symbols.h"
@@ -68,48 +72,52 @@ Q_PROPERTY( ConnectionState state READ state NOTIFY stateChanged);
******************************************************************/
bool PROPERTYITEM::isEqualTo(PROPERTYITEM *cpppt)
{
QString thistype = this->trlUnit->spell(this->ast->type_token);
QString cppttype = cpppt->trlUnit->spell(cpppt->ast->type_token);
if(thistype != cppttype)
if (!ast->type_id || !cpppt->ast->type_id)
return false;
if (type != cpppt->type)
return false;
QString thistypename = this->trlUnit->spell(this->ast->type_name_token);
QString cppttypename = cpppt->trlUnit->spell(cpppt->ast->type_name_token);
if (!ast->property_name || !ast->property_name->name || !ast->property_name->name->identifier())
return false;
QString thistypename = ast->property_name->name->identifier()->chars();
if (!cpppt->ast->property_name || !cpppt->ast->property_name->name || !cpppt->ast->property_name->name->identifier())
return false;
QString cppttypename = cpppt->ast->property_name->name->identifier()->chars();
if(thistypename != cppttypename)
return false;
if(this->readdefined != cpppt->readdefined)
if ((this->readAst == 0) != (cpppt->readAst == 0))
return false;
if(this->writedefined != cpppt->writedefined)
if((this->writeAst == 0) != (cpppt->writeAst == 0))
return false;
if(this->resetdefined != cpppt->resetdefined)
if((this->resetAst == 0) != (cpppt->resetAst == 0))
return false;
if(this->notifydefined != cpppt->notifydefined)
if((this->notifyAst == 0) != (cpppt->notifyAst == 0))
return false;
//check for read function
if(this->readdefined){
if(this->readAst){
if(!this->readFct || !cpppt->readFct)
return false;
if(!this->readFct->isEqualTo(cpppt->readFct))
return false;
}
//check for write function
if(this->writedefined){
if(this->writeAst){
if(!this->writeFct || !cpppt->writeFct)
return false;
if(!this->writeFct->isEqualTo(cpppt->writeFct))
return false;
}
//check for reset function
if(this->resetdefined){
if(this->resetAst){
if(!this->resetFct || !cpppt->resetFct)
return false;
if(!this->resetFct->isEqualTo(cpppt->resetFct))
return false;
}
//check for notify function
if(this->notifydefined){
if(this->notifyAst){
if(!this->notifyFct || !cpppt->notifyFct)
return false;
if(!this->notifyFct->isEqualTo(cpppt->notifyFct))
@@ -380,9 +388,8 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist
/**********
Functions
**********/
FunctionDefinitionAST *pfctdef = pmemberlist->value->asFunctionDefinition();
if(pfctdef){
FUNCTIONITEM* item = new FUNCTIONITEM();
if (FunctionDefinitionAST *pfctdef = pmemberlist->value->asFunctionDefinition()){
FUNCTIONITEM* item = new FUNCTIONITEM;
item->trlUnit = classitem->trlUnit;
item->function = pfctdef->symbol;
item->classAst = classitem->classspec;
@@ -427,64 +434,46 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist
/**********
Q_PROPERTY
**********/
QPropertyDeclarationAST *ppdecl = pmemberlist->value->asQPropertyDeclarationAST();
if(ppdecl){
PROPERTYITEM* item = new PROPERTYITEM();
item->ast = ppdecl;
item->highestlevelclass = highestlevelclass;
item->trlUnit = classitem->trlUnit;
item->readdefined = (ppdecl->read_token > 0);
item->writedefined = (ppdecl->write_token > 0);
item->resetdefined = (ppdecl->reset_token > 0);
item->notifydefined = (ppdecl->notify_token > 0);
propertylist.push_back(item);
if(item->ast->type_name_token > 0){
QString propertyname = item->trlUnit->spell(item->ast->type_name_token);
Trace(" - Q_PROPERTY: " + classname + "::" + propertyname + " found");
if(QtPropertyDeclarationAST *ppdecl = pmemberlist->value->asQtPropertyDeclaration()) {
propertylist.push_back(PROPERTYITEM::create(ppdecl, highestlevelclass));
if (ppdecl->property_name && ppdecl->property_name->name && ppdecl->property_name->name->identifier()) {
Trace(" - Q_PROPERTY: " + QLatin1String(ppdecl->property_name->name->identifier()->chars()) + " found");
}
}
else{
} else{
/**********
Q_ENUM
**********/
QEnumDeclarationAST *pqenum = pmemberlist->value->asQEnumDeclarationAST();
if(pqenum){
if(pqenum->enumerator_list){
for (EnumeratorListAST *plist = pqenum->enumerator_list; plist; plist = plist->next) {
QENUMITEM* item = new QENUMITEM();
item->ast = plist->value;
if (QtEnumDeclarationAST *pqenum = pmemberlist->value->asQtEnumDeclaration()) {
for (NameListAST *plist = pqenum->enumerator_list; plist; plist = plist->next) {
QENUMITEM* item = new QENUMITEM;
item->name = plist->value->name->identifier()->chars();
item->highestlevelclass = highestlevelclass;
item->trlUnit = classitem->trlUnit;
qenumlist.push_back(item);
QString enumname = item->trlUnit->spell(item->ast->firstToken());
Trace(" - Q_ENUM: " + classname + "::" + enumname + " found");
Trace(" - Q_ENUM: " + classname + "::" + item->name + " found");
}
}
}
else{
/**********
Q_FLAGS
**********/
QFlagsDeclarationAST *pqflags = pmemberlist->value->asQFlagsDeclarationAST();
if(pqflags){
if(pqflags->enumerator_list){
for (EnumeratorListAST *plist = pqflags->enumerator_list; plist; plist = plist->next) {
QFLAGITEM* item = new QFLAGITEM();
item->ast = plist->value;
if (QtFlagsDeclarationAST *pqflags = pmemberlist->value->asQtFlagsDeclaration()){
for (NameListAST *plist = pqflags->flag_enums_list; plist; plist = plist->next) {
QFLAGITEM* item = new QFLAGITEM;
item->name = plist->value->name;
item->highestlevelclass = highestlevelclass;
item->trlUnit = classitem->trlUnit;
qflaglist.push_back(item);
QString enumname = item->trlUnit->spell(plist->firstToken());
Trace(" - Q_FLAGS: " + classname + "::" + enumname + " found");
}
Trace(" - Q_FLAGS: " + classname + "::" + item->name->identifier()->chars() + " found");
}
}
#if 0
The code for Q_DECLARE_FLAGS was wrong. It's optional, and only does a typedef.
That means, if you do the typedef yourself and not use Q_DECLARE_FLAGS, that *is* valid.
Meaning, if one would want to do a check like the ones in this app, one has to check the defined types in the class scope.
else {
/****************
Q_DECLARE_FLAGS
****************/
QDeclareFlagsDeclarationAST *pqdeclflags = pmemberlist->value->asQDeclareFlagsDeclarationAST();
QtDeclareFlagsDeclarationAST *pqdeclflags = pmemberlist->value->asQDeclareFlagsDeclarationAST();
if(pqdeclflags){
QDECLAREFLAGSITEM* item = new QDECLAREFLAGSITEM();
item->ast = pqdeclflags;
@@ -493,6 +482,7 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist
qdeclareflaglist.push_back(item);
}
}
#endif
}
}
}
@@ -841,8 +831,6 @@ QStringList ParseManager::getErrorMessage(FUNCTIONITEM* fct)
fctstring += "::";
unsigned int token = fct->function->sourceLocation() - 1;
if(token >= 0){
//tok.isNot(T_EOF_SYMBOL)
while(fct->trlUnit->tokenAt(token).isNot(T_EOF_SYMBOL)){
fctstring += fct->trlUnit->tokenAt(token).spell();
if(*fct->trlUnit->tokenAt(token).spell() == ')')
@@ -850,7 +838,6 @@ QStringList ParseManager::getErrorMessage(FUNCTIONITEM* fct)
fctstring += " ";
token++;
}
}
Function* pfct = fct->function;
if(pfct){
@@ -925,7 +912,7 @@ QList<PROPERTYITEM*> ParseManager::checkMetadataProperties(const QList<QList<PRO
else {
foreach(PROPERTYITEM *pprop, ipropertylist){
pprop->classWichIsNotFound << "<all classes>";
QString name = pprop->trlUnit->spell(pprop->ast->type_name_token);
QString name = pprop->ast->property_name->name->identifier()->chars();
Trace("- Property: <all classes>::" + name + " not found!");
}
ippts.append(ipropertylist);
@@ -935,6 +922,15 @@ QList<PROPERTYITEM*> ParseManager::checkMetadataProperties(const QList<QList<PRO
return missingiprops;
}
static QString findName(ExpressionAST *ast)
{
// The "old" icheck code assumed that functions were only a single identifier, so I'll assume the same:
if (NameAST *nameAST = ast->asName())
return nameAST->name->identifier()->chars();
else
return QString();
}
/**************************************
Function that resolves the dependensies
between Q_PROPERTY
@@ -944,28 +940,26 @@ functions.
void ParseManager::assignPropertyFunctions(PROPERTYITEM* prop, const QList<QList<FUNCTIONITEM*> > &fctlookuplist)
{
//get the name of the needed functions
QString type;
QString readfctname;
QString writefctname;
QString resetfctname;
QString notifyfctname;
int needtofind = 0;
type = prop->trlUnit->spell(prop->ast->type_token);
if(prop->readdefined){
readfctname = prop->trlUnit->spell(prop->ast->read_function_token);
if(prop->readAst){
readfctname = findName(prop->readAst);
needtofind++;
}
if(prop->writedefined){
writefctname = prop->trlUnit->spell(prop->ast->write_function_token);
if(prop->writeAst){
writefctname = findName(prop->writeAst);
needtofind++;
}
if(prop->resetdefined){
resetfctname = prop->trlUnit->spell(prop->ast->reset_function_token);
if(prop->resetAst){
resetfctname = findName(prop->resetAst);
needtofind++;
}
if(prop->notifydefined){
notifyfctname = prop->trlUnit->spell(prop->ast->notify_function_token);
if(prop->notifyAst){
notifyfctname = findName(prop->notifyAst);
needtofind++;
}
//Now iterate over all function to find all functions wich are defined in the Q_PROPERTY macro
@@ -975,24 +969,24 @@ void ParseManager::assignPropertyFunctions(PROPERTYITEM* prop, const QList<QList
foreach(FUNCTIONITEM* pfct, fctlist){
QString fctname = pfct->trlUnit->spell(pfct->function->sourceLocation());
//check the function type against the property type
QString fcttype =pfct->trlUnit->spell(pfct->function->sourceLocation() - 1);
FullySpecifiedType retTy = pfct->function->returnType();
if(fctname.length() > 0 && fcttype.length() > 0){
if(prop->readdefined && fctname == readfctname){
if(type != fcttype)
if (!fctname.isEmpty() && retTy.isValid()) {
if(prop->readAst && fctname == readfctname){
if (prop->type != retTy)
continue;
prop->readFct = pfct;
needtofind--;
}
if(prop->writedefined && fctname == writefctname){
if(prop->writeAst && fctname == writefctname){
prop->writeFct = pfct;
needtofind--;
}
if(prop->resetdefined && fctname == resetfctname){
if(prop->resetAst && fctname == resetfctname){
prop->resetFct = pfct;
needtofind--;
}
if(prop->notifydefined && fctname == notifyfctname){
if(prop->notifyAst && fctname == notifyfctname){
prop->notifyFct = pfct;
needtofind--;
}
@@ -1033,7 +1027,7 @@ QList<PROPERTYITEM*> ParseManager::containsAllPropertyFunction(const QList<PROPE
if(propt->isEqualTo(ipropt)){
found = true;
missingimplinclasses.clear();
Trace("- Property: " + classname + "::" + propt->trlUnit->spell(propt->ast->type_name_token) + " found");
Trace("- Property: " + classname + "::" + propt->ast->property_name->name->identifier()->chars() + " found");
break;
}
}
@@ -1041,12 +1035,13 @@ QList<PROPERTYITEM*> ParseManager::containsAllPropertyFunction(const QList<PROPE
ipropt->classWichIsNotFound.append(missingimplinclasses);
ret.push_back(ipropt);
QString classname = ipropt->trlUnit->spell(ipropt->highestlevelclass->classspec->name->firstToken());
Trace("- Property: " + classname + "::" + ipropt->trlUnit->spell(ipropt->ast->type_name_token) + " not found!");
Trace("- Property: " + classname + "::" + ipropt->ast->property_name->name->identifier()->chars() + " not found!");
}
}
else{
QString classname = ipropt->trlUnit->spell(ipropt->highestlevelclass->classspec->name->firstToken());
QString proptype = ipropt->trlUnit->spell(ipropt->ast->type_name_token);
Overview oo;
QString proptype = oo(ipropt->type);
Trace("- Property: " + classname + "::" + proptype + " functions are missing!");
ret.push_back(ipropt);
}
@@ -1080,13 +1075,13 @@ QStringList ParseManager::getErrorMessage(PROPERTYITEM* ppt)
out << ppt->trlUnit->spell(i) << " ";
}
out << endl << " -";
if(ppt->readdefined && !ppt->readFct)
if(ppt->readAst && !ppt->readFct)
out << "READ ";
if(ppt->writedefined && !ppt->writeFct)
if(ppt->writeAst && !ppt->writeFct)
out << "WRITE ";
if(ppt->resetdefined && !ppt->resetFct)
if(ppt->resetAst && !ppt->resetFct)
out << "RESET.";
if(ppt->notifydefined && !ppt->notifyFct)
if(ppt->notifyAst && !ppt->notifyFct)
out << "NOTIFY ";
out << "functions missing." << endl;
ret << tmp;
@@ -1154,8 +1149,7 @@ QList<QENUMITEM*> ParseManager::checkMetadataEnums(const QList<QList<QENUMITEM*>
else {
foreach(QENUMITEM *qenum, iqenumlist){
qenum->classWichIsNotFound << "<all classes>";
QString name= qenum->trlUnit->spell(qenum->ast->firstToken());
Trace("- Enum: <all classes>::" + name + " not found!");
Trace("- Enum: <all classes>::" + qenum->name + " not found!");
}
iqenums.append(iqenumlist);
}
@@ -1210,18 +1204,13 @@ between Q_ENUMS and enums.
***************************************/
void ParseManager::assignEnumValues(QENUMITEM* qenum, const QList<QList<ENUMITEM*> > &enumlookuplist)
{
QString enumname;
EnumeratorAST *penum = qenum->ast->asEnumerator();
if(penum){
//get the name of the enum definition
enumname = qenum->trlUnit->spell(penum->firstToken());
//iterate over all enums and find the one with the same name like enumname
bool found = false;
foreach (QList<ENUMITEM*> penumlist, enumlookuplist) {
foreach(ENUMITEM *penum, penumlist){
EnumSpecifierAST *penumsec = penum->ast;
QString enumname1 = penum->trlUnit->spell(penumsec->name->firstToken());
if(enumname == enumname1){
if(qenum->name == enumname1){
qenum->values << getEnumValueStringList(penum);
found = true;
break;
@@ -1231,7 +1220,6 @@ void ParseManager::assignEnumValues(QENUMITEM* qenum, const QList<QList<ENUMITEM
qenum->foundallenums = false;
}
}
}
/***********************************
Function that checkt if the Q_ENUMS
@@ -1240,6 +1228,8 @@ Enum values are the same.
***********************************/
QList<QENUMITEM*> ParseManager::containsAllEnums(const QList<QENUMITEM*> &classqenumlist, const QList<QENUMITEM*> &iclassqenumlist)
{
Overview oo;
QList<QENUMITEM*> ret;
foreach(QENUMITEM* iqenum, iclassqenumlist){
bool found = false;
@@ -1250,23 +1240,22 @@ QList<QENUMITEM*> ParseManager::containsAllEnums(const QList<QENUMITEM*> &classq
if(clspec != qenum->highestlevelclass->classspec){
clspec = qenum->highestlevelclass->classspec;
//get the classname
unsigned int firsttoken = clspec->name->firstToken();
classname += qenum->trlUnit->spell(firsttoken);
classname += oo(clspec->symbol);
if(missingimplinclasses.indexOf(classname) < 0)
missingimplinclasses.push_back(classname);
}
if(qenum->isEqualTo(iqenum)){
found = true;
missingimplinclasses.clear();
Trace("- Enum: " + classname + "::" + qenum->trlUnit->spell(qenum->ast->firstToken()) + " found");
Trace("- Enum: " + classname + "::" + qenum->name + " found");
break;
}
}
if(!found){
iqenum->classWichIsNotFound.append(missingimplinclasses);
ret.push_back(iqenum);
QString classname = iqenum->trlUnit->spell(iqenum->highestlevelclass->classspec->name->firstToken());
Trace("- Enum: " + classname + "::" + iqenum->trlUnit->spell(iqenum->ast->firstToken()) + " not found!");
QString classname = oo(iqenum->highestlevelclass->classspec->symbol);
Trace("- Enum: " + classname + "::" + iqenum->name + " not found!");
}
}
return ret;
@@ -1278,6 +1267,7 @@ string for a Q_ENUMS mismatch.
************************************/
QStringList ParseManager::getErrorMessage(QENUMITEM* qenum)
{
Overview oo;
QStringList ret;
if(!qenum->foundallenums)
@@ -1285,18 +1275,8 @@ QStringList ParseManager::getErrorMessage(QENUMITEM* qenum)
QString tmp;
QTextStream out(&tmp);
unsigned int firsttoken = qenum->highestlevelclass->classspec->name->firstToken();
unsigned int lasttoken = qenum->highestlevelclass->classspec->name->lastToken();
for(unsigned int i = firsttoken; i < lasttoken; i++){
out << qenum->trlUnit->spell(i);
}
out << "::Q_ENUMS ( ";
firsttoken = qenum->ast->firstToken();
lasttoken = qenum->ast->lastToken();
for(unsigned int i = firsttoken; i < lasttoken; i++)
out << qenum->trlUnit->spell(i) << " ";
out << ")";
out << endl << " - one or more Enums missing." << endl;
out << oo(qenum->highestlevelclass->classspec->symbol);
out << "::Q_ENUMS " << qenum->name << " enum missing.";
ret << tmp;
}
@@ -1304,13 +1284,8 @@ QStringList ParseManager::getErrorMessage(QENUMITEM* qenum)
QString tmp;
QTextStream out(&tmp);
out << qenum->classWichIsNotFound[i] << "::Q_ENUMS ( ";
unsigned int firsttoken = qenum->ast->firstToken();
unsigned int lasttoken = qenum->ast->lastToken();
for(unsigned int i = firsttoken; i < lasttoken; i++)
out << qenum->trlUnit->spell(i) << " ";
out << ")";
out << qenum->classWichIsNotFound[i] << "::Q_ENUMS "
<< qenum->name;
ret << tmp;
}
return ret;
@@ -1360,7 +1335,7 @@ QList<QFLAGITEM*> ParseManager::checkMetadataFlags(const QList<QList<QFLAGITEM*>
else {
foreach(QFLAGITEM *pflag, iqflaglist){
pflag->classWichIsNotFound << "<all classes>";
QString name= pflag->trlUnit->spell(pflag->ast->firstToken());
QString name= pflag->name->identifier()->chars();
Trace("- Flag: <all classes>::" + name + " not found!");
}
iqflags.append(iqflaglist);
@@ -1377,36 +1352,26 @@ and enums.
***************************************/
void ParseManager::assignFlagValues(QFLAGITEM* qflags, const QList<QList<QDECLAREFLAGSITEM*> > &qdeclareflagslookuplist, const QList<QList<ENUMITEM*> > &enumlookuplist)
{
QString qflagname;
QString enumname;
//read the flag names
EnumeratorAST *pflags = qflags->ast->asEnumerator();
if(pflags){
qflagname = qflags->trlUnit->spell(pflags->firstToken());
enumname = qflagname;
//try to find if there is a deflare flag macro with the same name as in qflagname
bool found = false;
foreach(QList<QDECLAREFLAGSITEM*> qdeclarelist, qdeclareflagslookuplist){
foreach(QDECLAREFLAGSITEM* qdeclare, qdeclarelist){
QString declarename = qdeclare->trlUnit->spell(qdeclare->ast->flag_token);
if(declarename == qflagname){
//now map the right enum name to the flag
enumname = qdeclare->trlUnit->spell(qdeclare->ast->enum_token);
found = true;
break;
Scope *classMembers = qflags->highestlevelclass->classspec->symbol->members();
Symbol *s = classMembers->lookat(qflags->name);
if (s->isTypedef()) {
FullySpecifiedType ty = s->type();
if (Enum *e = ty->asEnumType()) {
enumname = e->name()->identifier()->chars();
}
}
if(found)
break;
}
//now we have the right enum name now we need to find the enum
found = false;
bool found = false;
foreach(QList<ENUMITEM*> enumitemlist, enumlookuplist){
foreach(ENUMITEM* enumitem, enumitemlist){
EnumSpecifierAST *penumspec = enumitem->ast;
QString enumspecname = enumitem->trlUnit->spell(penumspec->name->firstToken());
if(enumspecname == enumname){
qflags->enumvalues << getEnumValueStringList(enumitem, qflagname);
qflags->enumvalues << getEnumValueStringList(enumitem, qflags->name->identifier()->chars());
found = true;
break;
}
@@ -1417,7 +1382,6 @@ void ParseManager::assignFlagValues(QFLAGITEM* qflags, const QList<QList<QDECLAR
if(!found)
qflags->foundallenums = false;
}
}
/*****************************************
Function that compares if all enums
@@ -1437,23 +1401,22 @@ QList<QFLAGITEM*> ParseManager::containsAllFlags(const QList<QFLAGITEM*> &classq
if(clspec != qflags->highestlevelclass->classspec){
clspec = qflags->highestlevelclass->classspec;
//get the classname
unsigned int firsttoken = clspec->name->firstToken();
classname += qflags->trlUnit->spell(firsttoken);
classname += clspec->symbol->name()->identifier()->chars();
if(missingimplinclasses.indexOf(classname) < 0)
missingimplinclasses.push_back(classname);
}
if(qflags->isEqualTo(iqflags)){
found = true;
missingimplinclasses.clear();
Trace("- Flag: " + classname + "::" + qflags->trlUnit->spell(qflags->ast->firstToken()) + " found");
Trace("- Flag: " + classname + "::" + qflags->name->identifier()->chars() + " found");
break;
}
}
if(!found){
iqflags->classWichIsNotFound.append(missingimplinclasses);
ret.push_back(iqflags);
QString classname = iqflags->trlUnit->spell(iqflags->highestlevelclass->classspec->name->firstToken());
Trace("- Flag: " + classname + "::" + iqflags->trlUnit->spell(iqflags->ast->firstToken()) + " not found!");
QString classname = iqflags->highestlevelclass->classspec->symbol->name()->identifier()->chars();
Trace("- Flag: " + classname + "::" + iqflags->name->identifier()->chars() + " not found!");
}
}
else
@@ -1468,6 +1431,7 @@ string for a Q_FLAGS mismatch.
************************************/
QStringList ParseManager::getErrorMessage(QFLAGITEM* pfg)
{
Overview oo;
QStringList ret;
if(!pfg->foundallenums)
@@ -1475,31 +1439,15 @@ QStringList ParseManager::getErrorMessage(QFLAGITEM* pfg)
QString tmp;
QTextStream out(&tmp);
unsigned int firsttoken = pfg->highestlevelclass->classspec->name->firstToken();
unsigned int lasttoken = pfg->highestlevelclass->classspec->name->lastToken();
for(unsigned int i = firsttoken; i < lasttoken; i++){
out << pfg->trlUnit->spell(i);
}
out << "::Q_FLAGS ( ";
firsttoken = pfg->ast->firstToken();
lasttoken = pfg->ast->lastToken();
for(unsigned int i = firsttoken; i < lasttoken; i++)
out << pfg->trlUnit->spell(i) << " ";
out << ")";
out << endl << " - one or more Enums missing." << endl;
out << oo(pfg->highestlevelclass->classspec->symbol->name());
out << "::Q_FLAGS "<<pfg->name->identifier()->chars()<< ": enum missing.";
ret << tmp;
}
for(int i = 0; i < pfg->classWichIsNotFound.size(); i++){
QString tmp;
QTextStream out(&tmp);
out << pfg->classWichIsNotFound[i] << "::Q_FLAGS ( ";
unsigned int firsttoken = pfg->ast->firstToken();
unsigned int lasttoken = pfg->ast->lastToken();
for(unsigned int i = firsttoken; i < lasttoken; i++)
out << pfg->trlUnit->spell(i) << " ";
out << ")";
out << pfg->classWichIsNotFound[i] << "::Q_FLAGS " << oo(pfg->name);
ret << tmp;
}
return ret;
@@ -1546,4 +1494,35 @@ void ParseManager::Trace(QString value)
out << value << endl;
}
}
PROPERTYITEM *PROPERTYITEM::create(QtPropertyDeclarationAST *ast, const CLASSLISTITEM *clazz)
{
PROPERTYITEM *item = new PROPERTYITEM;
item->ast = ast;
item->highestlevelclass = clazz;
item->trlUnit = clazz->trlUnit;
if (ast->type_id) {
Semantic mySem(item->trlUnit);
item->type = mySem.check(ast->type_id, clazz->classspec->symbol->asClass()->members());
}
for (QtPropertyDeclarationItemListAST *it = ast->property_declaration_items;
it; it = it->next) {
if (!it->value->item_name_token)
continue;
const char *name = item->trlUnit->spell(it->value->item_name_token);
if (!qstrcmp(name, "READ"))
item->readAst = it->value->expression;
else if (!qstrcmp(name, "WRITE"))
item->writeAst = it->value->expression;
else if (!qstrcmp(name, "RESET"))
item->resetAst = it->value->expression;
else if (!qstrcmp(name, "NOTIFY"))
item->notifyAst = it->value->expression;
}
return item;
}
//--->

View File

@@ -61,11 +61,14 @@
#ifndef PARSEMANAGER_H
#define PARSEMANAGER_H
#include "cplusplus/CppDocument.h"
#include "ASTfwd.h"
#include "FullySpecifiedType.h"
#include <QObject>
#include <QList>
#include <QFuture>
#include <QStringList>
#include "cplusplus/CppDocument.h"
#include <QFile>
namespace CppTools{
@@ -75,15 +78,6 @@ namespace CppTools{
}
namespace CPlusPlus {
class TranslationUnit;
class AST;
class ClassSpecifierAST;
class QPropertyDeclarationAST;
class QDeclareFlagsDeclarationAST;
class EnumSpecifierAST;
class Function;
class EnumeratorAST;
class CLASSLISTITEM
{
public:
@@ -106,6 +100,7 @@ namespace CPlusPlus {
CPlusPlus::Function* function;
bool isEqualTo(FUNCTIONITEM* cpfct, bool ignoreName = true);
FUNCTIONITEM()
{
highestlevelclass = 0;
@@ -119,15 +114,16 @@ namespace CPlusPlus {
public:
const CLASSLISTITEM* highestlevelclass;
QStringList classWichIsNotFound;
QPropertyDeclarationAST *ast;
QtPropertyDeclarationAST *ast;
CPlusPlus::TranslationUnit* trlUnit;
bool readdefined;
FullySpecifiedType type;
ExpressionAST *readAst;
FUNCTIONITEM *readFct;
bool writedefined;
ExpressionAST *writeAst;
FUNCTIONITEM *writeFct;
bool resetdefined;
ExpressionAST *resetAst;
FUNCTIONITEM *resetFct;
bool notifydefined;
ExpressionAST *notifyAst;
FUNCTIONITEM *notifyFct;
bool foundalldefinedfct;
@@ -137,25 +133,26 @@ namespace CPlusPlus {
highestlevelclass = 0;
ast = 0;
trlUnit = 0;
readdefined = false;
readAst = 0;
readFct = 0;
writedefined = false;
writeAst = 0;
writeFct = 0;
resetdefined = false;
resetAst = 0;
resetFct = 0;
notifydefined = false;
notifyAst = 0;
notifyFct = 0;
foundalldefinedfct = false;
}
static PROPERTYITEM *create(QtPropertyDeclarationAST *ast, const CLASSLISTITEM *clazz);
};
class QENUMITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
QStringList classWichIsNotFound;
EnumeratorAST* ast;
QString name;
//an item in this list will be shown like:
//EnumName.EnumItemName.Value
//ConnectionState.disconnected.0
@@ -166,8 +163,6 @@ namespace CPlusPlus {
QENUMITEM()
{
highestlevelclass = 0;
trlUnit = 0;
ast = 0;
values.clear();
foundallenums = true;
}
@@ -193,9 +188,8 @@ namespace CPlusPlus {
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
const Name *name;
QStringList classWichIsNotFound;
EnumeratorAST* ast;
QStringList enumvalues;
bool foundallenums;
@@ -203,8 +197,6 @@ namespace CPlusPlus {
QFLAGITEM()
{
highestlevelclass = 0;
trlUnit = 0;
ast = 0;
enumvalues.clear();
foundallenums = true;
}
@@ -216,7 +208,7 @@ namespace CPlusPlus {
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
QStringList classWichIsNotFound;
QDeclareFlagsDeclarationAST* ast;
QtFlagsDeclarationAST* ast;
QDECLAREFLAGSITEM()
{