void QuickOpenFunctionDialog::gotoFile( QString name ) { FunctionModel *fmodel; FunctionList funcList; FunctionDom fdom; for( FunctionList::ConstIterator it = m_functionDefList.begin() ; it!=m_functionDefList.end() ; ++it ){ fdom = *it; fmodel = fdom.data(); if( fmodel->name() == name ){ funcList.append( fdom ); } } if( funcList.count() == 1 ){ fdom = funcList.first(); fmodel = fdom.data(); QString fileNameStr = fmodel->fileName(); int startline, startcol; fmodel->getStartPosition( &startline, &startcol ); m_part->partController()->editDocument( KURL( fileNameStr), startline, startcol ); selectClassViewItem( ItemDom(&(*fmodel)) ); }else if( funcList.count() > 1 ){ QString fileStr; QuickOpenFunctionChooseForm fdlg( this, name.ascii() ); for( FunctionList::Iterator it = funcList.begin() ; it!=funcList.end() ; ++it ){ fmodel = (*it).data(); fdlg.argBox->insertItem( m_part->languageSupport()->formatModelItem(fmodel) + (fmodel->scope().isEmpty() ? "" : " (in " + fmodel->scope().join("::") + ")")); fileStr = KURL( fmodel->fileName() ).fileName(); KURL full_url( fmodel->fileName() ); KURL base_url( part()->project()->projectDirectory()+"/" ); fdlg.setRelativePath(fdlg.fileBox->count(), KURL::relativeURL( base_url, full_url )); fdlg.fileBox->insertItem(fileStr); } if( fdlg.exec() ){ int id = fdlg.argBox->currentItem(); if( id>-1 && id < (int) funcList.count() ){ FunctionModel *model = funcList[id].data(); int line, col; model->getStartPosition( &line, &col ); selectClassViewItem( ItemDom(&(*model)) ); QString fileNameStr = model->fileName(); m_part->partController()->editDocument( KURL(fileNameStr), line ); } } } else{ KMessageBox::error( this, i18n("Error: cannot find matching name function.") ); } accept(); }
void Navigator::selectFunctionNav(QListViewItem *item) { FunctionNavItem *nav = dynamic_cast<FunctionNavItem*>(item); if (!nav) return; FileDom file = m_part->codeModel()->fileByName(m_part->m_activeFileName); if (!file) return; switch (nav->type()) { case FunctionNavItem::Definition: //jump to definition { FileList files = file->wholeGroup(); FunctionDefinitionList deflist; CodeModelUtils::findFunctionDefinitions(NavOp(this, nav->text(0)), files, deflist); if (deflist.count() < 1) return; FunctionDefinitionDom fun = deflist.first(); if (!fun) return; int startLine = 0, startColumn = 0; fun->getStartPosition(&startLine, &startColumn); m_part->partController()->editDocument(KURL(fun->fileName()), startLine); break; } case FunctionNavItem::Declaration: //jump to declaration { FileList files = file->wholeGroup(); FunctionList declist; CodeModelUtils::findFunctionDeclarations(NavOp(this, nav->text(0)), files, declist); if (declist.count() < 1) return; FunctionDom fun = declist.first(); if (!fun) return; int startLine = 0, startColumn = 0; fun->getStartPosition(&startLine, &startColumn); m_part->partController()->editDocument(KURL(fun->fileName()), startLine); break; } } }
QString Navigator::fullFunctionDeclarationName(FunctionDom fun) { QStringList scope = fun->scope(); QString funName = scope.join("."); if (!funName.isEmpty()) funName += "."; funName += m_part->languageSupport()->formatModelItem(fun, true); funName = m_part->languageSupport()->formatClassName(funName); return funName; }
void RubySupportPart::parse(const QString &fileName) { QFile f(QFile::encodeName(fileName)); if (!f.open(IO_ReadOnly)) return; QTextStream stream(&f); QRegExp classre("^\\s*(class|module)\\s+([A-Z][A-Za-z0-9_]+::)*([A-Z][A-Za-z0-9_]+)\\s*(<\\s*([A-Z][A-Za-z0-9_:]+))?$"); QRegExp methodre("^(\\s*)def\\s+(([A-Z][A-Za-z0-9_:]+|self)\\.)?([A-Za-z0-9_]+[!?=]?|\\[\\]=?|\\*\\*||\\-|[!~+*/%&|><^]|>>|<<||<=>|<=|>=|==|===|!=|=~|!~).*$"); QRegExp accessre("^\\s*(private|protected|public)\\s*((:([A-Za-z0-9_]+[!?=]?|\\[\\]=?|\\*\\*||\\-|[!~+*/%&|><^]|>>|<<||<=>|<=|>=|==|===|!=|=~|!~),?\\s*)*)$"); QRegExp attr_accessorre("^\\s*(attr_accessor|attr_reader|attr_writer)\\s*((:([A-Za-z0-9_]+),?\\s*)*)$"); QRegExp symbolre(":([^,]+),?"); QRegExp line_contre(",\\s*$"); QRegExp slot_signalre("^\\s*(slots|signals|k_dcop|k_dcop_signals)\\s*(('[^)]+\\)',?\\s*)*)$"); QRegExp memberre("'([A-Za-z0-9_ &*]+\\s)?([A-Za-z0-9_]+)\\([^)]*\\)',?"); QRegExp begin_commentre("^*=begin"); QRegExp end_commentre("^*=end"); QRegExp variablere("(@@?[A-Za-z0-9_]+)\\s*=\\s*((?:([A-Za-z0-9_:.]+)\\.new)|[\\[\"'%:/\\?\\{]|%r|<<|true|false|^\\?|0[0-7]+|[-+]?0b[01]+|[-+]?0x[1-9a-fA-F]+|[-+]?[0-9_\\.e]+|nil)?"); QRegExp endre("^(\\s*)end\\s*$"); FileDom m_file = codeModel()->create<FileModel>(); m_file->setName(fileName); ClassDom lastClass; FunctionDom lastMethod; QString lastMethodIndentation; int lastAccess = CodeModelItem::Public; QString rawline; QCString line; int lineNo = 0; while (!stream.atEnd()) { rawline = stream.readLine(); line = rawline.stripWhiteSpace().local8Bit(); if (classre.search(line) != -1) { if (m_file->hasClass(classre.cap(3))) { lastClass = m_file->classByName( classre.cap(3) )[ 0 ]; } else { lastClass = codeModel()->create<ClassModel>(); lastClass->setName(classre.cap(3)); lastClass->setFileName( fileName ); lastClass->setStartPosition( lineNo, 0 ); m_file->addClass( lastClass ); } QString parent = classre.cap(5); if (!parent.isEmpty()) { kdDebug() << "Add parent " << parent << endl; lastClass->addBaseClass( parent ); } lastAccess = CodeModelItem::Public; } else if (methodre.search(line) != -1) { FunctionDom methodDecl; if ( lastClass != 0 && lastClass->hasFunction( methodre.cap(4) ) ) { FunctionList methods = lastClass->functionByName( methodre.cap(4) ); methodDecl = methods[0]; } else { methodDecl = codeModel()->create<FunctionModel>(); methodDecl->setFileName( fileName ); methodDecl->setStartPosition( lineNo, 0 ); methodDecl->setName(methodre.cap(4)); } FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>(); method->setName(methodre.cap(4)); kdDebug() << "Add method: " << method->name() << endl; method->setFileName( fileName ); method->setStartPosition( lineNo, 0 ); if (methodDecl->name() == "initialize") { // Ruby constructors are alway private methodDecl->setAccess( CodeModelItem::Private ); } else { methodDecl->setAccess( lastAccess ); } if (methodre.cap(2) != "") { // A ruby class/singleton method of the form <classname>.<methodname> methodDecl->setStatic( true ); } lastMethodIndentation = methodre.cap(1); lastMethod = method; if (lastClass != 0) { QStringList scope( lastClass->name() ); method->setScope( scope ); methodDecl->setScope( scope ); if( !lastClass->hasFunction(methodDecl->name()) ) { lastClass->addFunction( methodDecl ); } if( !lastClass->hasFunctionDefinition(method->name()) ) { lastClass->addFunctionDefinition( method ); } } else if( !m_file->hasFunctionDefinition(method->name()) ){ m_file->addFunction( methodDecl ); m_file->addFunctionDefinition( method ); lastClass = 0; } } else if (endre.search(line) != -1 && lastMethod != 0 && endre.cap(1) == lastMethodIndentation ) { int endCol, endLine; lastMethod->getEndPosition(&endCol, &endLine); if (endLine == 0) { //hack to set end position of the previous method to the line //where its corresponding "end" is found //there's an assumption that method's "def" statement will have the same //indentation level as method's "end" lastMethod->setEndPosition(lineNo, 0); } } else if (accessre.search(line) != -1 && lastClass != 0) { int currentAccess = lastAccess; if (accessre.cap(1) == "public") { currentAccess = CodeModelItem::Public; } else if (accessre.cap(1) == "protected") { currentAccess = CodeModelItem::Protected; } else if (accessre.cap(1) == "private") { currentAccess = CodeModelItem::Private; } if (accessre.cap(2) == "") { lastAccess = currentAccess; } else { QString symbolList( accessre.cap(2) ); int pos = 0; while ( pos >= 0 ) { pos = symbolre.search( symbolList, pos ); if (pos == -1) { if (line_contre.search(line) != -1) { rawline = stream.readLine(); if (!stream.atEnd()) { line = rawline.stripWhiteSpace().local8Bit(); ++lineNo; symbolList = line; pos = 0; } } } else { if ( lastClass->hasFunction( symbolre.cap(1) ) ) { FunctionList methods = lastClass->functionByName( symbolre.cap(1) ); methods[0]->setAccess( currentAccess ); } pos += symbolre.matchedLength(); } } } } else if (slot_signalre.search(line) != -1 && lastClass != 0) { QString memberList( slot_signalre.cap(2) ); int pos = 0; while ( pos >= 0 ) { pos = memberre.search( memberList, pos ); if (pos == -1) { if (line_contre.search(line) != -1) { rawline = stream.readLine(); if (!stream.atEnd()) { line = rawline.stripWhiteSpace().local8Bit(); ++lineNo; memberList = line; pos = 0; } } } else { FunctionDom method; if ( lastClass->hasFunction( memberre.cap(2) ) ) { FunctionList methods = lastClass->functionByName( memberre.cap(2) ); method = methods[0]; } else { method = codeModel()->create<FunctionModel>(); } QStringList scope( lastClass->name() ); method->setScope( scope ); method->setName(memberre.cap(2)); method->setFileName( fileName ); method->setStartPosition( lineNo, 0 ); if (slot_signalre.cap(1) == "slots" || slot_signalre.cap(1) == "k_dcop") { method->setSlot( true ); } else { method->setSignal( true ); } if ( !lastClass->hasFunction(method->name()) ) { lastClass->addFunction( method ); } pos += memberre.matchedLength(); } } } else if (attr_accessorre.search(line) != -1 && lastClass != 0) { QString attr( attr_accessorre.cap(1) ); QString symbolList( attr_accessorre.cap(2) ); int pos = 0; while ( pos >= 0 ) { pos = symbolre.search( symbolList, pos ); if (pos == -1) { if (line_contre.search(line) != -1) { rawline = stream.readLine(); if (!stream.atEnd()) { line = rawline.stripWhiteSpace().local8Bit(); ++lineNo; symbolList = line; pos = 0; } } } else { QStringList scope( lastClass->name() ); if ( !lastClass->hasFunction(symbolre.cap(1)) && (attr == "attr_accessor" || attr == "attr_reader") ) { FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>(); method->setName(symbolre.cap(1)); kdDebug() << "Add method: " << method->name() << endl; method->setFileName( fileName ); method->setStartPosition( lineNo, 0 ); method->setScope(scope); lastClass->addFunction( model_cast<FunctionDom>(method) ); lastClass->addFunctionDefinition( method ); } if ( !lastClass->hasFunction(symbolre.cap(1) + "=") && (attr == "attr_accessor" || attr == "attr_writer") ) { FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>(); method->setName(symbolre.cap(1) + "="); kdDebug() << "Add method: " << method->name() << endl; method->setFileName( fileName ); method->setStartPosition( lineNo, 0 ); method->setScope(scope); lastClass->addFunction( model_cast<FunctionDom>(method) ); lastClass->addFunctionDefinition( method ); } pos += symbolre.matchedLength(); } } } else if (variablere.search(line) != -1 && lastClass != 0) { VariableDom attr; if ( lastClass->hasVariable( variablere.cap(1) ) ) { attr = lastClass->variableByName( variablere.cap(1) ); } else { attr = codeModel()->create<VariableModel>(); attr->setName( variablere.cap(1) ); attr->setFileName( fileName ); attr->setStartPosition( lineNo, 0 ); attr->setAccess( CodeModelItem::Private ); if (QRegExp("^@@").search(attr->name()) != -1) { attr->setStatic( true ); } lastClass->addVariable( attr ); } // Give priority to any variable initialized in the constructor // Otherwise, take the first one found in the source file if (lastMethod != 0 && lastMethod->name() == "initialize") { attr->setFileName( fileName ); attr->setStartPosition( lineNo, 0 ); } if (QRegExp("^(/|%r)").search(variablere.cap(2)) != -1) { attr->setType( "Regexp" ); } else if (QRegExp("^[\"'%<]").search(variablere.cap(2)) != -1) { attr->setType( "String" ); } else if (QRegExp("^\\[").search(variablere.cap(2)) != -1) { attr->setType( "Array" ); } else if (QRegExp("^\\{").search(variablere.cap(2)) != -1) { attr->setType( "Hash" ); } else if (QRegExp("^:").search(variablere.cap(2)) != -1) { attr->setType( "Symbol" ); } else if (QRegExp("\\.\\.").search(variablere.cap(2)) != -1) { attr->setType( "Range" ); } else if (variablere.cap(2) == "true" || variablere.cap(2) == "false") { attr->setType( "Boolean" ); } else if ( QRegExp("^[-+]?[0-9_]+").exactMatch(variablere.cap(2)) || QRegExp("^[-+]?(0x|0|0b|\\?)").search(variablere.cap(2)) != -1 ) { attr->setType( "Integer" ); } else if (QRegExp("[0-9._]+(e[-+0-9]+)?").exactMatch(variablere.cap(2))) { attr->setType( "Float" ); } else if (variablere.cap(2) != "nil" && variablere.cap(3) != "") { attr->setType( variablere.cap(3) ); } } else if (begin_commentre.search(line) != -1) { while (!stream.atEnd() && end_commentre.search(line) == -1) { rawline = stream.readLine(); line = rawline.stripWhiteSpace().local8Bit(); ++lineNo; } } ++lineNo; } f.close(); codeModel()->addFile( m_file ); }
void BashSupportPart::parse(const QString &fileName) { QFileInfo fi(fileName); m_vars.clear(); if (fi.extension() == "sh") { if( codeModel()->hasFile(fileName) ){ emit aboutToRemoveSourceInfo( fileName ); codeModel()->removeFile( codeModel()->fileByName(fileName) ); } FileDom m_file = codeModel()->create<FileModel>(); m_file->setName( fileName ); m_vars.clear(); QFile f(QFile::encodeName(fileName)); if (!f.open(IO_ReadOnly)) return; QString rawline; QString line; uint lineNo = 0; //KRegExp methodre("\\b([\\d\\w]+[\\s]*)\\([\\s]*\\)"); QRegExp methodre("^\\s*(\\w+)\\s*\\(\\s*\\)"); QRegExp varre( "^\\s*(\\w+)[=]" ); QRegExp expvarre( "^export\\s*(\\w+)[=]" ); QRegExp forvarre("\\bfor[\\s]+([\\d\\w]+)[\\s]+in[\\s]+"); QTextStream stream(&f); while (!stream.atEnd()) { rawline = stream.readLine(); line = rawline.stripWhiteSpace().local8Bit(); kdDebug() << "Trying line: " << line << endl; if (methodre.search(line) != -1) { FunctionDom method = codeModel()->create<FunctionModel>(); method->setName(methodre.cap(1)); method->setFileName(fileName); method->setStartPosition(lineNo, 0); if( !m_file->hasFunction(method->name()) ){ kdDebug() << "Add global method " << method->name() << endl; m_file->addFunction( method ); } } else if(varre.search(line) != -1) { addAttribute(varre.cap(1), m_file, lineNo); } else if(expvarre.search(line) != -1) { addAttribute(expvarre.cap(1), m_file, lineNo); } else if(forvarre.search(line) != -1) { addAttribute(forvarre.cap(1), m_file, lineNo); } ++lineNo; } f.close(); kdDebug() << "Trying to add list..." << endl; codeModel()->addFile( m_file ); VariableList attrList = codeModel()->globalNamespace()->variableList(); for (VariableList::Iterator it = attrList.begin(); it != attrList.end(); ++it) { kdDebug() << "Adding " << (*it)->name() << endl; m_vars.append((*it)->name()); } m_cc->setVars(m_vars); codeModel()->addFile( m_file ); } }
void PythonSupportPart::parse(const QString &fileName) { QFile f(QFile::encodeName(fileName)); if (!f.open(IO_ReadOnly)) return; QTextStream stream(&f); QRegExp classre("^[ \t]*class[ \t]+([A-Za-z0-9_]+)[ \t]*(\\(([A-Za-z0-9_, \t]+)\\))?.*$"); QRegExp methodre("^[ \t]*def[ \t]+([A-Za-z0-9_]+).*$"); FileDom m_file = codeModel()->create<FileModel>(); m_file->setName( fileName ); ClassDom lastClass; QString rawline; QCString line; int lineNo = 0; while (!stream.atEnd()) { rawline = stream.readLine(); line = rawline.stripWhiteSpace().local8Bit(); if (classre.search(line) != -1) { lastClass = codeModel()->create<ClassModel>(); lastClass->setName(classre.cap(1)); lastClass->setFileName( fileName ); lastClass->setStartPosition( lineNo, 0 ); QStringList parentList = QStringList::split(",", classre.cap(3)); QStringList::ConstIterator it; for (it = parentList.begin(); it != parentList.end(); ++it) { QString baseName = (*it).stripWhiteSpace(); kdDebug(9014) << "Add parent" << baseName << endl; lastClass->addBaseClass( baseName ); } if (m_file->hasClass(lastClass->name())) { ClassDom old = m_file->classByName( lastClass->name() )[ 0 ]; old->setFileName( lastClass->fileName() ); int line, col; lastClass->getStartPosition( &line, &col ); old->setStartPosition( line, col ); lastClass = old; } else { kdDebug(9014) << "Add class " << lastClass->name() << endl; m_file->addClass( lastClass ); } } else if (methodre.search(line) != -1 ) { FunctionDom method = codeModel()->create<FunctionModel>(); method->setName(methodre.cap(1)); method->setFileName( fileName ); method->setStartPosition( lineNo, 0 ); if (lastClass && rawline.left(3) != "def") { if( !lastClass->hasFunction(method->name()) ) lastClass->addFunction( method ); QStringList scope; scope << lastClass->name(); method->setScope( scope ); } else if( !m_file->hasFunction(method->name()) ) { m_file->addFunction( method ); lastClass = 0; } } ++lineNo; } f.close(); codeModel()->addFile( m_file ); }