void RubySupportPart::slotRunTestUnderCursor() { // if we can't save all parts, then the user canceled if ( partController()->saveAllFiles() == false ) return; KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart()); QString prog; if (ro_part != 0) { prog = ro_part->url().path(); } else return; KTextEditor::ViewCursorInterface* activeViewCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( ro_part->widget() ); if (!activeViewCursor) return; unsigned int line, column; activeViewCursor->cursorPositionReal(&line, &column); CodeModelUtils::CodeModelHelper hlp(codeModel(), codeModel()->fileByName(prog)); FunctionDom fun = hlp.functionAt(line, column); if (fun == 0) return; QFileInfo program(prog); QString cmd = QString("%1 -K%2 -C\"%3\" -I\"%4\" \"%5\" %6") .arg(interpreter()) .arg(characterCoding()) .arg(runDirectory()) .arg(program.dirPath()) .arg(program.fileName()) .arg(" -n " + fun->name()); startApplication(cmd); }
void FixedFormParser::process(const QCString &line, const QString &fileName, int lineNum) { QCString simplified; int l = line.length(); for (int i=0; i < l; ++i) if (line[i] != ' ') simplified += line[i]; if ( simplified.isEmpty() ) return; QString name; if (functionre.search(simplified) != -1) name = functionre.cap(3); else if (subroutinere.search(simplified) != -1) name = subroutinere.cap(1); else return; FunctionDom method = m_model->create<FunctionModel>(); method->setName(name); method->setFileName(fileName); method->setStartPosition(lineNum, 0); if( !m_file->hasFunction(method->name()) ) m_file->addFunction(method); }
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 ); }