in src/checks/level2/old-style-connect.cpp [102:185]
int OldStyleConnect::classifyConnect(FunctionDecl *connectFunc, T *connectCall) const
{
int classification = ConnectFlag_None;
const std::string methodName = connectFunc->getQualifiedNameAsString();
if (methodName == "QObject::connect") {
classification |= ConnectFlag_Connect;
} else if (methodName == "QObject::disconnect") {
classification |= ConnectFlag_Disconnect;
} else if (methodName == "QTimer::singleShot") {
classification |= ConnectFlag_QTimerSingleShot;
} else if (methodName == "QState::addTransition") {
classification |= ConnectFlag_QStateAddTransition;
} else if (methodName == "QMenu::addAction" || methodName == "QWidget::addAction") {
classification |= ConnectFlag_QMenuAddAction;
} else if (methodName == "QMessageBox::open") {
classification |= ConnectFlag_QMessageBoxOpen;
} else if (methodName == "QSignalSpy::QSignalSpy") {
classification |= ConnectFlag_QSignalSpy;
}
if (classification == ConnectFlag_None) {
return classification;
}
if (clazy::connectHasPMFStyle(connectFunc)) {
return classification;
}
classification |= ConnectFlag_OldStyle;
const unsigned int numParams = connectFunc->getNumParams();
if (classification & ConnectFlag_Connect) {
if (numParams == 5) {
classification |= ConnectFlag_5ArgsConnect;
} else if (numParams == 4) {
classification |= ConnectFlag_4ArgsConnect;
} else {
classification |= ConnectFlag_Bogus;
}
} else if (classification & ConnectFlag_Disconnect) {
if (numParams == 4) {
classification |= ConnectFlag_4ArgsDisconnect;
} else if (numParams == 3) {
classification |= ConnectFlag_3ArgsDisconnect;
} else if (numParams == 2) {
classification |= ConnectFlag_2ArgsDisconnect;
} else {
classification |= ConnectFlag_Bogus;
}
}
if (classification & ConnectFlag_OldStyle) {
// It's old style, but check if all macros are literals
int numLiterals = 0;
for (auto arg : connectCall->arguments()) {
auto argLocation = arg->getBeginLoc();
std::string dummy;
if (isSignalOrSlot(argLocation, dummy)) {
++numLiterals;
}
}
if ((classification & ConnectFlag_QTimerSingleShot) && numLiterals != 1) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if (((classification & ConnectFlag_Connect) && numLiterals != 2)) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if ((classification & ConnectFlag_4ArgsDisconnect) && numLiterals != 2) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if ((classification & ConnectFlag_QStateAddTransition) && numLiterals != 1) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if ((classification & ConnectFlag_Disconnect) && numLiterals == 0) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if ((classification & ConnectFlag_QMenuAddAction) && numLiterals != 1) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if ((classification & ConnectFlag_QMessageBoxOpen) && numLiterals != 1) {
classification |= ConnectFlag_OldStyleButNonLiteral;
} else if ((classification & ConnectFlag_QSignalSpy) && numLiterals != 1) {
classification |= ConnectFlag_OldStyleButNonLiteral;
}
}
return classification;
}