📄 initcompletion.cpp
字号:
tag.returned = tag.returned.section(" ", 0, 0); if ( tag.returned.contains("<") ) tag.returned = tag.returned.section("<", 0, 0); QString inherits; if ( s.contains("inherits:") ) inherits = s.section("inherits:", -1, -1).section("\t", 0, 0).simplified(); if ( !inherits.isEmpty() ) { inheritsList[ classname ] = inherits; } if ( tag.kind != "prototype" && tag.kind != "function" && tag.kind != "member" ) continue; if ( tag.name=="Q_REQUIRED_RESULT" ) { if ( tag.longName.contains("(") ) { tag.name = tag.longName.remove("const ").section(" ", 1, 1).section("(", 0, 0); tag.kind = "function"; tag.parameters = tag.signature = "(" + tag.longName.section("(", 1, 1).section(")", -2, -2) + ")"; tag.access = "public"; tag.isFunction = true; } } if ( tag.name=="Q_REQUIRED_RESULT" || tag.name.at(0)=='&' || tag.name.at(0)=='*' ) continue; if( tag.name == classname || tag.name == "~"+classname ) continue; TagList list; list = map[classname]; bool alreadyInserted = false; foreach(Tag t, list) { if ( t.name == tag.name && t.parameters == tag.parameters ) { alreadyInserted = true; break; } } if ( !alreadyInserted ) { list << tag; map[classname] = list; } } // if ( !connectQDevelopDB( getQDevelopPath() + "qdevelop.db" ) ) //{ //return; //} //createTables(); QSqlQuery query(QSqlDatabase::database(getQDevelopPath() + "qdevelop.db" )); query.exec("BEGIN TRANSACTION;"); query.exec("delete from tags"); QStringList keys = map.keys(); foreach(QString key, keys) { if ( m_stopRequired ) break; TagList tagList = map[key]; Expression exp; exp.className = key; writeToDB(exp, tagList, query); } writeInheritanceToDB(inheritsList, query); query.exec("END TRANSACTION;");}////void InitCompletion::writeInheritanceToDB(QMap<QString, QString> inheritsList, QSqlQuery query){ QMapIterator<QString, QString> it(inheritsList); while (it.hasNext()) { it.next(); foreach(QString parent, it.value().split(",", QString::SkipEmptyParts ) ) { QString queryString = "insert into inheritance values("; queryString = queryString + "'" + parent.replace("'", "$") + "', " + "'" + QString(it.key()).replace("'", "$") + "')"; bool rc = query.exec(queryString); if (rc == false) { qDebug() << "Failed to insert record to db" << query.lastError(); qDebug() << queryString; return; } } }}//QStringList InitCompletion::inheritanceList( const QString classname, QStringList &list ){ /* Return a string list with inheritance classes for classname. Work with the classes browser. For the Qt classes, the inheritance is read in qdevelop.db. */ const QList<ParsedItem> *itemsList = m_treeClasses->treeClassesItems(); for (int i = 0; i < itemsList->size(); ++i) { if ( itemsList->at( i ).kind == "c" && itemsList->at( i ).name == classname && itemsList->at( i ).ex_cmd.contains(":") ) { QString ex_cmd = itemsList->at( i ).ex_cmd; ex_cmd = ex_cmd.left( ex_cmd.length()-3 ); ex_cmd = ex_cmd.section(":", 1); ex_cmd = ex_cmd.remove("public").remove("protected").remove("private").remove(" "); foreach(QString c, ex_cmd.split(",") ) { list << c; list = inheritanceList(c, list); } } } // QString queryString = QString() + "select * from inheritance where child='"+classname+"'"; QSqlQuery query(QSqlDatabase::database(getQDevelopPath() + "qdevelop.db" )); query.exec(queryString); while (query.next()) { QString parent = query.value(0).toString().replace("$", "'"); if ( !parent.isEmpty() ) { list << parent; list = inheritanceList(parent, list); } } return list;}//Expression InitCompletion::parseLine( QString text ){ Expression exp; Scope sc; int p = 0; QString simplified = simplifiedText( text ); int begin = simplified.length()-1; do { begin--; if( simplified[begin]=='(' ) p--; else if( simplified[begin]==')' ) p++; if( p > 0 && !(p == 1 && simplified[begin]==')') ) simplified[begin]=' '; if( QString(";{}=*/+~&|!^?:,<>").contains(simplified[begin]) ) break; else if( begin<simplified.length()-1 && simplified[begin]=='-' && simplified[begin+1]!='>' ) break; else if( ( simplified[begin]=='(' && p<0) ) break; } while(begin>0); // QString word = simplified.mid(begin+1).simplified(); int posWord = 0; while( posWord<word.length()-1 && (word.at( posWord ).isLetterOrNumber() || word.at( posWord )=='_') ) posWord++; word = word.left(posWord); ////QD << simplified.left(begin+1); while ( begin<simplified.length() && simplified[begin]!='.' && !(begin>0 && simplified[begin-1]=='-' && simplified[begin]=='>' ) && !(begin>0 && simplified[begin-1]==':' && simplified[begin]==':' ) ) begin++; QString varName = simplified.left(begin+1); QString line = simplified.mid(begin+1); exp = getExpression(varName, sc, m_showAllResults); QString className; if ( exp.access == ParseError ) { className = word; exp.access = AccessMembers; } else className = exp.className;//QD << varName << className; // while ( line.indexOf('.')!=-1 || line.indexOf(">")!=-1 || line.indexOf("::")!=-1 ) { QString function; int end = 9999; if( line.indexOf('.') != -1 ) end = qMin(end, line.indexOf('.')); if( line.indexOf('>') != -1 ) end = qMin(end, line.indexOf('>')); if( line.indexOf(':') != -1 ) end = qMin(end, line.indexOf(':')+1); function = line.left(end); line = line.mid(end+1); className = returned(className, function, exp); } exp.className = className; return exp;}//QString InitCompletion::returned(QString className, QString function, Expression &exp){ QStringList classes; classes << className; if ( !connectQDevelopDB( getQDevelopPath() + "qdevelop.db" ) ) { return QString(); } classes = inheritanceList(className, classes); // function = function.section("(", 0, 0).simplified(); const QList<ParsedItem> *itemsList = m_treeClasses->treeClassesItems(); for (int i = 0; i < itemsList->size(); ++i) { ParsedItem parsedItem = itemsList->at( i ); Tag tag; tag.access = parsedItem.access; tag.name = parsedItem.name; tag.parameters = parsedItem.signature; tag.returned = parsedItem.ex_cmd.section(" ", 0, 0); if ( tag.returned.contains("<") ) tag.returned = tag.returned.section("<", 0, 0); if ( parsedItem.kind == "f" ) tag.kind = "function"; else if ( parsedItem.kind == "p" ) tag.kind = "prototype"; else if ( parsedItem.kind == "e" ) { if ( parsedItem.enumname.section(":", 0, 0) != className ) continue; parsedItem.classname = className; tag.parameters = ""; tag.kind = "member"; } else if ( parsedItem.kind == "m" ) { tag.kind = "member"; tag.parameters = ""; } else { continue; }// bool isStatic = parsedItem.ex_cmd.simplified().startsWith("static"); if ( !classes.contains( parsedItem.classname ) ) continue; if( classes.contains( parsedItem.classname ) && function == parsedItem.name ) { exp.access = AccessMembers; return tag.returned; } } // Continue the reading in qdevelop.db createTables(); QSqlQuery query(QSqlDatabase::database(getQDevelopPath() + "qdevelop.db" )); query.exec("BEGIN TRANSACTION;"); QString queryString = QString() + "select * from inheritance where child='"+className+"'"; query.exec(queryString); while (query.next()) { QString parent = query.value(0).toString().replace("$", "'"); if ( !parent.isEmpty() ) { classes << parent; } } queryString = QString() + "select * from tags where class in ( "; foreach(QString c, classes) { queryString = queryString + " '" + c + "',"; } queryString = queryString.left( queryString.length()-1 ); queryString += " )"; // queryString += " and name = '" + function + "'"; query.exec(queryString); if (query.next()) { exp.access = AccessMembers; return query.value(7).toString().replace("$", "'"); } return QString();}//QString InitCompletion::classForFunction(QString classname, QString function){ /* Return the name of the first class which contains the function. In a class Foo which inherits QDialog, if the help is called on the function foo->show(). We receive Foo as classname and show as function. We find the first class in inheritance list which contains really the function and return it. Here, it's QWidget. Thus Assistant can be called with the right parameters. */ if ( !connectQDevelopDB( getQDevelopPath() + "qdevelop.db" ) ) { return QString(); } QStringList list; list << classname; list = inheritanceList(classname, list); createTables(); QSqlQuery query(QSqlDatabase::database(getQDevelopPath() + "qdevelop.db" )); foreach(QString name, list) { QString queryString = QString() + "select * from tags where class ='" + name + +"'"; queryString += " and name='" + function + "'"; // query.exec(queryString); while (query.next()) { return query.value(0).toString().replace("$", "'"); } } return QString();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -