Example #1
0
void QsCodeParser::quickifyClass(ClassNode *quickClass)
{
    QString qtClassName = quickClass->name();
    QString bare = quickClass->name();
    if (bare != "Qt" && bare != "Object") {
	if (bare.startsWith("Q")) {
	    bare = bare.mid(1);
	}
        else {
	    qtClassName.prepend("Q");
	    classesWithNoQ.insert(bare);
	}
    }

    ClassNode *qtClass = 0;
    ClassNode *wrapperClass = 0;

    if ((wrapperClass = tryClass("Quick" + bare)) != 0 ||
	 (wrapperClass = tryClass("QS" + bare + "Class")) != 0) {
	qtClass = tryClass(qtClassName);
	if (qtClass == 0) {
	    qtClass = wrapperClass;
	    wrapperClass = 0;
	}
    }
    else if ((wrapperClass = tryClass("Quick" + bare + "Ptr")) != 0) {
	QRegExp ptrToQtType("(Q[A-Za-z0-9_]+)\\s*\\*");
	FunctionNode *ctor =
		wrapperClass->findFunctionNode(wrapperClass->name());
	if (ctor != 0 && !ctor->parameters().isEmpty() &&
	     ptrToQtType.exactMatch(ctor->parameters().first().leftType()))
	    qtClassName = ptrToQtType.cap(1);
	qtClass = tryClass(qtClassName);
    }
    else {
	wrapperClass = tryClass("Q" + bare + "Ptr");
	if (wrapperClass == 0)
	    wrapperClass = tryClass("Quick" + bare + "Interface");
	qtClass = tryClass(qtClassName);
    }

    if (qtClass == 0) {
	if (wrapperClass == 0) {
	    quickClass->location().warning(tr("Cannot find Qt class '%1'")
					    .arg(qtClassName));
	}
        else {
	    quickClass->location().warning(tr("Cannot find Qt class '%1'"
					       " wrapped by '%2'")
					    .arg(qtClassName)
					    .arg(wrapperClass->name()));
	}
	return;
    }

    QList<RelatedClass>::ConstIterator r = qtClass->baseClasses().begin();
    while (r != qtClass->baseClasses().end()) {
	ClassNode *quickBaseClass = cpp2qs.findClassNode(qsTre,
                                                         (*r).node->name());
	if (quickBaseClass)
	    quickClass->addBaseClass((*r).access, quickBaseClass);
	++r;
    }
    if (quickClass->baseClasses().isEmpty() && quickClass->name() != "Object")
	quickClass->addBaseClass(Node::Public,
                                 cpp2qs.findClassNode(qsTre,"Object"));

    QSet<QString> funcBlackList;
    QSet<QString> propertyBlackList;

    NodeList children;
    if (wrapperClass != 0) {
	children = wrapperClass->childNodes();

	funcBlackList.insert(wrapperClass->name());
	funcBlackList.insert("~" + wrapperClass->name());
    }
    children += qtClass->childNodes();

    for (int pass = 0; pass < 2; pass++) {
	NodeList::ConstIterator c = children.begin();
	while (c != children.end()) {
	    if ((*c)->access() != Node::Private &&
		 (*c)->status() == Node::Commendable) {
		if (pass == 0) {
		    if ((*c)->type() == Node::Enum) {
			EnumNode *enume = (EnumNode *) *c;
			quickifyEnum(quickClass, enume);
		    }
                    else if ((*c)->type() == Node::Property) {
			if (!propertyBlackList.contains((*c)->name())) {
			    PropertyNode *property = (PropertyNode *) *c;
			    quickifyProperty(quickClass, qtClass, property);
			    if (!property->getters().isEmpty())
				funcBlackList.insert(property->getters().first()->name());
			    if (!property->setters().isEmpty())
				funcBlackList.insert(property->setters().first()->name());
			    if (!property->resetters().isEmpty())
				funcBlackList.insert(property->resetters().first()->name());
			    propertyBlackList.insert(property->name());
			}
		    }
		}
                else if ((*c)->type() == Node::Function)  {
		    FunctionNode *func = (FunctionNode *) *c;
		    quickifyFunction(quickClass, qtClass, func,
				      funcBlackList.contains((*c)->name()) &&
				      func->parameters().count() < 2);
		}
	    }
	    ++c;
	}
    }
    setQtDoc(quickClass, qtClass->doc());
    classesWithNoQuickDoc.insert(quickClass->name(), quickClass);
}