initcompletion.cpp

来自「用Qt4编写的linux IDE开发环境」· C++ 代码 · 共 955 行 · 第 1/3 页

CPP
955
字号
        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 + =
减小字号Ctrl + -
显示快捷键?