int OldStyleConnect::classifyConnect()

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;
}