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