static SymbolInfo * createFunctionSymbol(uint32_t index, elf::Section §ion, const char *name, uint32_t virtAddress, uint32_t size) { auto symbol = new FunctionSymbol(); symbol->index = index; symbol->name = name; symbol->size = size; if (section.header.type == elf::SHT_RPL_IMPORTS) { symbol->functionType = FunctionSymbol::Kernel; symbol->kernelFunction = findKernelFunction(section.msym, name); if (symbol->kernelFunction) { symbol->address = symbol->kernelFunction->vaddr; } else { symbol->address = virtAddress; if (symbol->address) { writeFunctionThunk(symbol->address, index); } } } else { symbol->functionType = FunctionSymbol::User; symbol->address = virtAddress; } return symbol; }
void QsCodeParser::quickifyFunction(ClassNode *quickClass, ClassNode *qtClass, FunctionNode *func, bool onBlackList) { if (func->metaness() == FunctionNode::Dtor) return; FunctionNode *kernelFunc = findKernelFunction( QStringList() << quickClass->name(), func->name()); QString quickName = func->name(); if (func->metaness() == FunctionNode::Ctor) quickName = quickClass->name(); FunctionNode *quickFunc = new FunctionNode(quickClass, quickName); quickFunc->setLocation(func->location()); if (onBlackList) { quickFunc->setAccess(Node::Protected); } else { if (kernelFunc != 0 && func->numOverloads() == 1 && (func->parameters().count() == 0 || func->parameters().last().defaultValue().isEmpty())) { kernelFunc->setAccess(Node::Private); } else { if (func->metaness() == FunctionNode::Plain) quickFunc->setAccess(Node::Protected); } } quickFunc->setReturnType(cpp2qs.convertedDataType(qsTre, func->returnType())); if (func->metaness() != FunctionNode::Slot) quickFunc->setMetaness(func->metaness()); quickFunc->setVirtualness(FunctionNode::ImpureVirtual); quickFunc->setOverload(func->isOverload()); QList<Parameter>::ConstIterator q = func->parameters().begin(); while (q != func->parameters().end()) { QString dataType = cpp2qs.convertedDataType(qsTre, (*q).leftType(), (*q).rightType()); if (dataType.isEmpty()) { dataType = "UNKNOWN"; quickFunc->setAccess(Node::Private); } Parameter param(dataType, "", (*q).name(), (*q).defaultValue().isEmpty() ? "" : "undefined"); quickFunc->addParameter(param); ++q; } if (func->doc().isEmpty()) { if (func->parent() != (InnerNode *) qtClass) { func = qtClass->findFunctionNode(func); if (func != 0) setQtDoc(quickFunc, func->doc()); } } else { setQtDoc(quickFunc, func->doc()); } }
Node *QsCodeParser::processTopicCommand(const Doc& doc, const QString& command, const QString& arg) { if (command == COMMAND_QUICKFN) { QStringList parentPath; FunctionNode *quickFunc = 0; FunctionNode *clone; if (makeFunctionNode(arg, &parentPath, &clone)) { FunctionNode *kernelFunc = findKernelFunction(parentPath, clone->name()); if (kernelFunc != 0) kernelFunc->setAccess(Node::Private); quickFunc = qsTre->findFunctionNode(parentPath, clone); if (quickFunc == 0 && kernelFunc != 0) { quickFunc = new FunctionNode(kernelFunc->parent(), kernelFunc->name()); quickFunc->setLocation(kernelFunc->location()); quickFunc->setReturnType(clone->returnType()); quickFunc->setParameters(clone->parameters()); } if (quickFunc == 0) { doc.location().warning(tr("Cannot find '%1' specified with '\\%2'") .arg(arg).arg(command)); } else { quickFunc->setAccess(Node::Public); QStringList qtParams = quickFunc->parameterNames(); quickFunc->borrowParameterNames(clone); QStringList quickParams = quickFunc->parameterNames(); setQuickDoc(quickFunc, doc, qtParams, quickParams); } delete clone; } else { doc.location().warning(tr("Cannot find '%1' specified with '\\%2'") .arg(arg).arg(command)); } return 0; } else if (nodeTypeMap.contains(command)) { QStringList subArgs = arg.split(" "); QString dataType; if (subArgs.count() == 3 && subArgs[1] == ":") { dataType = subArgs[2]; } else if (subArgs.count() != 1) { doc.location().warning(tr("Invalid syntax in '\\%1'") .arg(command)); } QStringList path = subArgs[0].split("."); Node *quickNode = qsTre->findNode(path, nodeTypeMap[command]); if (quickNode == 0) { doc.location().warning(tr("Cannot find '%1' specified with '\\%2'") .arg(arg).arg(command)); } else { setQuickDoc(quickNode, doc); if (quickNode->type() == Node::Class) { classesWithNoQuickDoc.remove(quickNode->name()); if (doc.briefText().isEmpty()) doc.location().warning(tr("Missing '\\%1' for class '%2'") .arg(COMMAND_BRIEF) .arg(quickNode->name())); } else if (quickNode->type() == Node::Property) { PropertyNode *quickProperty = (PropertyNode *) quickNode; if (quickProperty->dataType() == "Object") { if (dataType.isEmpty()) { doc.location().warning(tr("Missing data type in '\\%1'" " (assuming 'Object')") .arg(command)); } else { quickProperty->setDataType(dataType); } } else if (dataType != quickProperty->dataType()) { doc.location().warning(tr("Ignored contradictory data type" " in '\\%1'") .arg(command)); } } } return 0; } else { return CppCodeParser::processTopicCommand(doc, command, arg); } }