QmlJSRefactoringFile::QmlJSRefactoringFile(TextEditor::TextEditorWidget *editor, Document::Ptr document) : RefactoringFile(editor) , m_qmljsDocument(document) { m_fileName = document->fileName(); }
void CppPreprocessor::sourceNeeded(unsigned line, const QString &fileName, IncludeType type) { typedef Document::DiagnosticMessage Message; if (fileName.isEmpty()) return; QString absoluteFileName = resolveFile(fileName, type); absoluteFileName = QDir::cleanPath(absoluteFileName); if (m_currentDoc) { m_currentDoc->addIncludeFile(Document::Include(fileName, absoluteFileName, line, type)); if (absoluteFileName.isEmpty()) { const QString text = QCoreApplication::translate( "CppPreprocessor", "%1: No such file or directory").arg(fileName); Message message(Message::Warning, m_currentDoc->fileName(), line, /*column =*/ 0, text); m_currentDoc->addDiagnosticMessage(message); return; } } if (m_included.contains(absoluteFileName)) return; // we've already seen this file. if (absoluteFileName != modelManager()->configurationFileName()) m_included.insert(absoluteFileName); // Already in snapshot? Use it! Document::Ptr doc = m_snapshot.document(absoluteFileName); if (doc) { mergeEnvironment(doc); return; } // Otherwise get file contents unsigned editorRevision = 0; QByteArray contents; const bool gotFileContents = getFileContents(absoluteFileName, &contents, &editorRevision); contents = convertToLatin1(contents); if (m_currentDoc && !gotFileContents) { const QString text = QCoreApplication::translate( "CppPreprocessor", "%1: Could not get file contents").arg(fileName); Message message(Message::Warning, m_currentDoc->fileName(), line, /*column =*/ 0, text); m_currentDoc->addDiagnosticMessage(message); return; } if (m_dumpFileNameWhileParsing) { qDebug() << "Parsing file:" << absoluteFileName << "contents:" << contents.size() << "bytes"; } doc = Document::create(absoluteFileName); doc->setRevision(m_revision); doc->setEditorRevision(editorRevision); const QFileInfo info(absoluteFileName); if (info.exists()) doc->setLastModified(info.lastModified()); const Document::Ptr previousDoc = switchDocument(doc); const QByteArray preprocessedCode = m_preprocess.run(absoluteFileName, contents); // { // QByteArray b(preprocessedCode); // b.replace("\n", "<<<\n"); // qDebug("Preprocessed code for \"%s\": [[%s]]", fileName.toUtf8().constData(), // b.constData()); // } QCryptographicHash hash(QCryptographicHash::Sha1); hash.addData(preprocessedCode); foreach (const Macro ¯o, doc->definedMacros()) { if (macro.isHidden()) { static const QByteArray undef("#undef "); hash.addData(undef); hash.addData(macro.name()); } else { static const QByteArray def("#define "); hash.addData(macro.name()); hash.addData(" ", 1); hash.addData(def); hash.addData(macro.definitionText()); } hash.addData("\n", 1); } doc->setFingerprint(hash.result()); Document::Ptr anotherDoc = m_globalSnapshot.document(absoluteFileName); if (anotherDoc && anotherDoc->fingerprint() == doc->fingerprint()) { switchDocument(previousDoc); mergeEnvironment(anotherDoc); m_snapshot.insert(anotherDoc); m_todo.remove(absoluteFileName); return; } doc->setUtf8Source(preprocessedCode); doc->keepSourceAndAST(); doc->tokenize(); m_snapshot.insert(doc); m_todo.remove(absoluteFileName); Process process(m_modelManager, doc, m_workingCopy); process(); (void) switchDocument(previousDoc); }
void CppPreprocessor::sourceNeeded(unsigned line, const QString &fileName, IncludeType type) { if (fileName.isEmpty()) return; QString absoluteFileName = resolveFile(fileName, type); absoluteFileName = QDir::cleanPath(absoluteFileName); if (m_currentDoc) m_currentDoc->addIncludeFile(Document::Include(fileName, absoluteFileName, line, type)); if (m_included.contains(absoluteFileName)) return; // we've already seen this file. if (absoluteFileName != modelManager()->configurationFileName()) m_included.insert(absoluteFileName); unsigned editorRevision = 0; QByteArray contents; getFileContents(absoluteFileName, &contents, &editorRevision); contents = convertToLatin1(contents); if (m_currentDoc) { if (contents.isEmpty() && !QFileInfo(absoluteFileName).isAbsolute()) { QString msg = QCoreApplication::translate( "CppPreprocessor", "%1: No such file or directory").arg(fileName); Document::DiagnosticMessage d(Document::DiagnosticMessage::Warning, m_currentDoc->fileName(), line, /*column = */ 0, msg); m_currentDoc->addDiagnosticMessage(d); return; } } if (m_dumpFileNameWhileParsing) { qDebug() << "Parsing file:" << absoluteFileName << "contents:" << contents.size() ; } Document::Ptr doc = m_snapshot.document(absoluteFileName); if (doc) { mergeEnvironment(doc); return; } doc = Document::create(absoluteFileName); doc->setRevision(m_revision); doc->setEditorRevision(editorRevision); const QFileInfo info(absoluteFileName); if (info.exists()) doc->setLastModified(info.lastModified()); const Document::Ptr previousDoc = switchDocument(doc); const QByteArray preprocessedCode = m_preprocess.run(absoluteFileName, contents); // { // QByteArray b(preprocessedCode); // b.replace("\n", "<<<\n"); // qDebug("Preprocessed code for \"%s\": [[%s]]", fileName.toUtf8().constData(), // b.constData()); // } doc->setUtf8Source(preprocessedCode); doc->keepSourceAndAST(); doc->tokenize(); m_snapshot.insert(doc); m_todo.remove(absoluteFileName); Process process(m_modelManager, doc, m_workingCopy); process(); (void) switchDocument(previousDoc); }
RemoveCastMethods(Document::Ptr doc, QTextDocument *document) : ASTVisitor(doc->translationUnit()), document(document) {}
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc) { if (m_currentFileName == doc->fileName()) m_itemsOfCurrentDoc.clear(); }
void CppToolsPlugin::test_codegen_definition_empty_class() { const QByteArray srcText = "\n" "class Foo\n" // line 1 "{\n" "void foo();\n" // line 3 "};\n" "\n"; const QByteArray dstText = "\n" "int x;\n" // line 1 "\n"; Document::Ptr src = Document::create(QDir::tempPath() + QLatin1String("/file.h")); Utils::FileSaver srcSaver(src->fileName()); srcSaver.write(srcText); srcSaver.finalize(); src->setUtf8Source(srcText); src->parse(); src->check(); QCOMPARE(src->diagnosticMessages().size(), 0); QCOMPARE(src->globalSymbolCount(), 1U); Document::Ptr dst = Document::create(QDir::tempPath() + QLatin1String("/file.cpp")); Utils::FileSaver dstSaver(dst->fileName()); dstSaver.write(dstText); dstSaver.finalize(); dst->setUtf8Source(dstText); dst->parse(); dst->check(); QCOMPARE(dst->diagnosticMessages().size(), 0); QCOMPARE(dst->globalSymbolCount(), 1U); Snapshot snapshot; snapshot.insert(src); snapshot.insert(dst); Class *foo = src->globalSymbolAt(0)->asClass(); QVERIFY(foo); QCOMPARE(foo->line(), 1U); QCOMPARE(foo->column(), 7U); QCOMPARE(foo->memberCount(), 1U); Declaration *decl = foo->memberAt(0)->asDeclaration(); QVERIFY(decl); QCOMPARE(decl->line(), 3U); QCOMPARE(decl->column(), 6U); CppRefactoringChanges changes(snapshot); InsertionPointLocator find(changes); QList<InsertionLocation> locList = find.methodDefinition(decl); QVERIFY(locList.size() == 1); InsertionLocation loc = locList.first(); QCOMPARE(loc.fileName(), dst->fileName()); QCOMPARE(loc.prefix(), QLatin1String("\n\n")); QCOMPARE(loc.suffix(), QString()); QCOMPARE(loc.line(), 3U); QCOMPARE(loc.column(), 1U); }
void tst_Lookup::simple_class_1() { const QByteArray source = "\n" "@interface Zoo {} +(id)alloc; -(id)init; @end\n" "@implementation Zoo +(id)alloc{} -(id)init{} -(void)dealloc{} @end\n"; Document::Ptr doc = Document::create("simple_class_1"); doc->setSource(source); doc->parse(); doc->check(); QVERIFY(doc->diagnosticMessages().isEmpty()); QCOMPARE(doc->globalSymbolCount(), 2U); Snapshot snapshot; snapshot.insert(doc); ObjCClass *iface = doc->globalSymbolAt(0)->asObjCClass(); QVERIFY(iface); QVERIFY(iface->isInterface()); QCOMPARE(iface->memberCount(), 2U); ObjCClass *impl = doc->globalSymbolAt(1)->asObjCClass(); QVERIFY(impl); QVERIFY(!impl->isInterface()); QCOMPARE(impl->memberCount(), 3U); Declaration *allocMethodIface = iface->memberAt(0)->asDeclaration(); QVERIFY(allocMethodIface); QVERIFY(allocMethodIface->name() && allocMethodIface->name()->identifier()); QCOMPARE(QLatin1String(allocMethodIface->name()->identifier()->chars()), QLatin1String("alloc")); ObjCMethod *allocMethodImpl = impl->memberAt(0)->asObjCMethod(); QVERIFY(allocMethodImpl); QVERIFY(allocMethodImpl->name() && allocMethodImpl->name()->identifier()); QCOMPARE(QLatin1String(allocMethodImpl->name()->identifier()->chars()), QLatin1String("alloc")); ObjCMethod *deallocMethod = impl->memberAt(2)->asObjCMethod(); QVERIFY(deallocMethod); QVERIFY(deallocMethod->name() && deallocMethod->name()->identifier()); QCOMPARE(QLatin1String(deallocMethod->name()->identifier()->chars()), QLatin1String("dealloc")); const LookupContext context(doc, snapshot); // check class resolving: ClassOrNamespace *klass = context.lookupType(impl->name(), impl->enclosingScope()); QVERIFY(klass != 0); QCOMPARE(klass->symbols().size(), 2); QVERIFY(klass->symbols().contains(iface)); QVERIFY(klass->symbols().contains(impl)); // check method resolving: QList<LookupItem> results = context.lookup(allocMethodImpl->name(), impl); QCOMPARE(results.size(), 2); QCOMPARE(results.at(0).declaration(), allocMethodIface); QCOMPARE(results.at(1).declaration(), allocMethodImpl); results = context.lookup(deallocMethod->name(), impl); QCOMPARE(results.size(), 1); QCOMPARE(results.at(0).declaration(), deallocMethod); }
bool QtCreatorIntegration::navigateToSlot(const QString &objectName, const QString &signalSignature, const QStringList ¶meterNames, QString *errorMessage) { const EditorData ed = m_few->activeEditor(); QTC_ASSERT(ed, return false) const QString currentUiFile = ed.formWindowEditor->file()->fileName(); #if 0 return Designer::Internal::navigateToSlot(currentUiFile, objectName, signalSignature, parameterNames, errorMessage); #endif // TODO: we should pass to findDocumentsIncluding an absolute path to generated .h file from ui. // Currently we are guessing the name of ui_<>.h file and pass the file name only to the findDocumentsIncluding(). // The idea is that the .pro file knows if the .ui files is inside, and the .pro file knows it will // be generating the ui_<>.h file for it, and the .pro file knows what the generated file's name and its absolute path will be. // So we should somehow get that info from project manager (?) const QFileInfo fi(currentUiFile); const QString uicedName = QLatin1String("ui_") + fi.completeBaseName() + QLatin1String(".h"); // Retrieve code model snapshot restricted to project of ui file. const ProjectExplorer::Project *uiProject = ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(currentUiFile); if (!uiProject) { *errorMessage = tr("Internal error: No project could be found for %1.").arg(currentUiFile); return false; } CPlusPlus::Snapshot docTable = CppModelManagerInterface::instance()->snapshot(); CPlusPlus::Snapshot newDocTable; for (CPlusPlus::Snapshot::iterator it = docTable.begin(); it != docTable.end(); ++it) { const ProjectExplorer::Project *project = ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(it.key()); if (project == uiProject) newDocTable.insert(it.value()); } docTable = newDocTable; // take all docs, find the ones that include the ui_xx.h. QList<Document::Ptr> docList = findDocumentsIncluding(docTable, uicedName, true); // change to false when we know the absolute path to generated ui_<>.h file if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO << objectName << signalSignature << "Looking for " << uicedName << " returned " << docList.size(); if (docList.isEmpty()) { *errorMessage = tr("No documents matching '%1' could be found.\nRebuilding the project might help.").arg(uicedName); return false; } QDesignerFormWindowInterface *fwi = ed.widgetHost->formWindow(); const QString uiClass = uiClassName(fwi->mainContainer()->objectName()); if (Designer::Constants::Internal::debug) qDebug() << "Checking docs for " << uiClass; // Find the class definition (ui class defined as member or base class) // in the file itself or in the directly included files (order 1). QString namespaceName; const Class *cl = 0; Document::Ptr doc; foreach (const Document::Ptr &d, docList) { const ClassDocumentPtrPair cd = findClassRecursively(docTable, d, uiClass, 1u , &namespaceName); if (cd.first) { cl = cd.first; doc = cd.second; break; } } if (!cl) { *errorMessage = msgClassNotFound(uiClass, docList); return false; } Overview o; const QString className = namespaceName + o.prettyName(cl->name()); if (Designer::Constants::Internal::debug) qDebug() << "Found class " << className << doc->fileName(); const QString functionName = QLatin1String("on_") + objectName + QLatin1Char('_') + signalSignature; const QString functionNameWithParameterNames = addParameterNames(functionName, parameterNames); if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO << "Found " << uiClass << doc->fileName() << " checking " << functionName << functionNameWithParameterNames; int line = 0; Document::Ptr sourceDoc; if (Function *fun = findDeclaration(cl, functionName)) { sourceDoc = findDefinition(fun, &line); if (!sourceDoc) { // add function definition to cpp file sourceDoc = addDefinition(docTable, doc->fileName(), className, functionNameWithParameterNames, &line); } } else { // add function declaration to cl CppModelManagerInterface::WorkingCopy workingCopy = CppModelManagerInterface::instance()->workingCopy(); const QString fileName = doc->fileName(); getParsedDocument(fileName, workingCopy, docTable); addDeclaration(docTable, fileName, cl, functionNameWithParameterNames); // add function definition to cpp file sourceDoc = addDefinition(docTable, fileName, className, functionNameWithParameterNames, &line); } if (!sourceDoc) { *errorMessage = tr("Unable to add the method definition."); return false; } // jump to function definition, position within code TextEditor::BaseTextEditorWidget::openEditorAt(sourceDoc->fileName(), line + 2, indentation); return true; }
bool SQLiteDocumentDAO::update(Document::Ptr pub) { if(!pub) { return false; } repository()->journalDAO()->saveOrUpdate(pub->journal()); QueryParameters params; params.insert("title", pub->title()); params.insert("abstract", pub->abstract()); params.insert("year", pub->year()); params.insert("month", pub->month()); params.insert("conference", pub->conference()); params.insert("publisher", pub->publisher()); params.insert("volume", pub->volume()); params.insert("number", pub->number()); params.insert("url", pub->url()); params.insert("doi", pub->doi()); params.insert("isbn", pub->isbn()); params.insert("localURL", pub->localUrl()); params.insert("type", static_cast<uint>(pub->type())); params.insert("isPublished", pub->isPublished()); params.insert("isPeerReviewed", pub->isPeerReviewed()); //params.insert("keywords", pub->keywords()); params.insert("series", pub->series()); params.insert("subTitle", pub->subTitle()); params.insert("pages", pub->pages().toString()); params.insert("authors", StringUtils::serialize(pub->authors())); params.insert("editors", StringUtils::serialize(pub->editors())); params.insert("citeKey", pub->citeKey()); if(pub->journal()) { params.insert("journalId", pub->journal()->id()); } else { params.insert("journalId", QVariant()); } bool ok = QueryExecutor().update("document", makeQueryParameters("id", pub->id()), params); if(ok) { emit dataChanged(); } return ok; }
Document::Ptr SQLiteDocumentDAO::findById(qulonglong id) const { if(repository()->publications()->contains(id)) { return repository()->publications()->find(id); } QueryExecutor executor(database()); QSqlQuery query = executor.select("document", QStringList(), makeQueryParameters("id", id)); if(query.next()) { QSqlRecord record = query.record(); qulonglong id = record.value("id").toULongLong(); Document::Ptr pub = Document::Ptr(new Document()); pub->setId(id); pub->setTitle(record.value("title").toString()); pub->setAbstract(record.value("abstract").toString()); pub->setYear(record.value("year").toInt()); pub->setMonth(record.value("month").toInt()); pub->setConference(record.value("conference").toString()); pub->setPublisher(record.value("publisher").toString()); pub->setVolume(record.value("volume").toInt()); pub->setNumber(record.value("number").toInt()); pub->setUrl(record.value("url").toString()); pub->setDoi(record.value("doi").toString()); pub->setIsbn(record.value("isbn").toString()); pub->setLocalUrl(record.value("localURL").toString()); pub->setType(static_cast<DocumentType>(record.value("type").toUInt())); pub->setPublished(record.value("isPublished").toBool()); pub->setPeerReviewed(record.value("isPeerReviewed").toBool()); pub->setKeywords(QStringList()); pub->setSeries(record.value("series").toString()); pub->setSubTitle(record.value("subTitle").toString()); pub->setPages(PageRange::fromString(record.value("pages").toString())); pub->setCiteKey(record.value("citeKey").toString()); repository()->publications()->insert(id, pub); QString authors = record.value("authors").toString(); pub->setAuthors(StringUtils::deserialize(authors)); QString editors = record.value("editors").toString(); pub->setEditors(StringUtils::deserialize(editors)); qulonglong jid = record.value("journalId").toULongLong(); if(jid != 0) { pub->setJournal(repository()->journalDAO()->findById(jid)); } emit dataChanged(); return pub; } return Document::Ptr(); }
bool SQLiteDocumentDAO::save(Document::Ptr pub) { if(!pub) { return false; } QueryExecutor executor(database()); QueryParameters params; if(pub->journal()) { Journal::Ptr realJournal = repository()->journalDAO()->findByName(pub->journal()->name(), true); if(realJournal != pub->journal()) { Journal::Ptr old = pub->journal(); pub->setJournal(realJournal); delete old; } } params.insert("title", pub->title()); params.insert("abstract", pub->abstract()); params.insert("year", pub->year()); params.insert("month", pub->month()); params.insert("conference", pub->conference()); params.insert("publisher", pub->publisher()); params.insert("volume", pub->volume()); params.insert("number", pub->number()); params.insert("url", pub->url()); params.insert("doi", pub->doi()); params.insert("isbn", pub->isbn()); params.insert("localURL", pub->localUrl()); params.insert("type", static_cast<uint>(pub->type())); params.insert("isPublished", pub->isPublished()); params.insert("isPeerReviewed", pub->isPeerReviewed()); //params.insert("keywords", pub->keywords()); params.insert("series", pub->series()); params.insert("subTitle", pub->subTitle()); params.insert("pages", pub->pages().toString()); params.insert("authors", StringUtils::serialize(pub->authors())); params.insert("editors", StringUtils::serialize(pub->editors())); params.insert("citeKey", pub->citeKey()); if(pub->journal()) { params.insert("journalId", pub->journal()->id()); } else { params.insert("journalId", QVariant()); } bool ok = executor.insert("document", params); if(ok) { qulonglong id = executor.lastInsertID(); pub->setId(id); repository()->publications()->insert(id, pub); emit dataChanged(); } return ok; }
int main(int argc, char *argv[]) { int sockfd, newsockfd, port_no, bindfd, listenfd, bytes_sent, bytes_recvd; char sbuffer[512], cli_ip[16], sname[64], cname[64]; char *ptr_buff, *ptr_port; const char *ptr_cli_ip; struct sockaddr_in serv_addr, cli_addr; socklen_t serv_size, cli_size; int inp_true = 0, count = 0, inp, ni, x, y, toss; char serv_choice, cli_choice, nc; char choice_buffer[2], co_ordinates_buffer[2], toss_buffer; system("clear"); ptr_buff = &sbuffer[0]; ptr_port = (char *)&PORT; //creating sever side socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("Server side listening Socket could not be created!"); return 1; } memset(&serv_addr, 0, sizeof(serv_addr)); port_no = atoi(ptr_port); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port_no); serv_addr.sin_addr.s_addr = INADDR_ANY; //binding socket bindfd = bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (bindfd == -1) { perror("Failed to bind!"); return 1; } Repo repo(MONGODB_HOST, MONGODB_PORT); cout<<"--Player History--"<<endl; repo.Read(); cout<<endl<<"Enter your Name : "; cin>>sname; Player *playerExist = Exist(sname); if (playerExist->name != "") { cout<<endl<<"Welcome back "<<sname; cout<<endl<<"Your history : "; cout<<endl<<"win = "<<playerExist->win; cout<<endl<<"lose = "<<playerExist->lose; cout<<endl<<"draw = "<<playerExist->draw; } else { Document::Ptr person = new Document(); person->add("name", string(sname)); person->add("win", 0); person->add("lose", 0); person->add("draw", 0); repo.Create(person); } char ans; cout<<endl<<"Reset Game History ? (y/N)"; cin>>ans; if (ans == 'y') { repo.Delete("all"); cout<<"--Player History--"<<endl; repo.Read(); } /*-----*/ cout<<"Server created!"<<endl<<"Waiting for a Player..."<<endl; //listening for incoming connections listenfd = listen(sockfd, 5); if (listenfd == -1) { perror("Failed to listen!"); return 1; } serv_size = sizeof(serv_addr); cli_size = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &cli_size); if (newsockfd == -1) { perror("Failed to accept from client!"); return 1; } ptr_cli_ip = inet_ntop(AF_INET, &cli_addr.sin_addr, cli_ip, cli_size); cout<<"Server received connections from "<<cli_ip<<endl; memset(&cname, 0, sizeof(cname)); do { static int flag = 0; bytes_recvd = recv(newsockfd, &cname, sizeof(cname), 0); if (bytes_recvd == -1 && flag == 0) { memset(&cname, 0, sizeof(cname)); cout<<"Could not ACQUIRE Player Information!"<<endl<<"Trying again..."<<endl; continue; } else { flag = 1; bytes_sent = send(newsockfd, &sname, sizeof(sname), 0); if (bytes_sent == -1) cout<<"Could not SEND Player Data!"<<"Trying Again..."<<endl; else cout<<cname<<" has joined the game."<<endl; } }while(bytes_recvd == -1 || bytes_sent == -1); cout<<"Creating Game. Please wait..."<<endl; sleep(2); cout<<endl<<"Game created!"<<endl<<endl<<"Doing a toss..."; srand(time(NULL)); toss = rand() % 2; sleep(1); sprintf(&toss_buffer, "%d", toss); bytes_sent = send(newsockfd, &toss_buffer, sizeof(toss_buffer), 0); if (bytes_sent == -1) { perror("TOSS BUFFER not sent!"); return 1; } if (toss == 0) { cout<<endl<<"You WON the toss!"<<endl; do { cout<<sname<<" Enter Your Choice (X or O): "; cin>>serv_choice; if (serv_choice == 'X' || serv_choice == 'x') { serv_choice = 'X'; cli_choice = 'O'; inp_true = 1; cout<<endl<<cname<<" gets O."<<endl<<endl<<"Lets Play!"<<endl<<endl; } else if (serv_choice == 'O' || serv_choice == 'o' || serv_choice == '0') { serv_choice = 'O'; cli_choice = 'X'; inp_true = 1; cout<<endl<<cname<<" gets X."<<endl<<endl<<"Lets Play!"<<endl<<endl; } else { cout<<"\nInvalid Choice! Please Choose Again..."<<endl; inp_true = 0; } }while(inp_true == 0); memset(&choice_buffer, 0, sizeof(choice_buffer)); choice_buffer[0] = serv_choice; choice_buffer[1] = cli_choice; bytes_sent = send(newsockfd, &choice_buffer, sizeof(choice_buffer), 0); if (bytes_sent == -1) { perror("CHOICE BUFFER could not be sent!"); return 1; } }
void tst_Lookup::base_class_defined_1() { Overview overview; const QByteArray source = "\n" "class base {};\n" "class derived: public base {};\n"; Document::Ptr doc = Document::create("base_class_defined_1"); doc->setSource(source); doc->parse(); doc->check(); QVERIFY(doc->diagnosticMessages().isEmpty()); QCOMPARE(doc->globalSymbolCount(), 2U); Snapshot snapshot; snapshot.insert(doc->fileName(), doc); Document::Ptr emptyDoc = Document::create("<empty>"); Class *baseClass = doc->globalSymbolAt(0)->asClass(); QVERIFY(baseClass); Class *derivedClass = doc->globalSymbolAt(1)->asClass(); QVERIFY(derivedClass); LookupContext ctx(derivedClass, emptyDoc, doc, snapshot); const QList<Symbol *> candidates = ctx.resolveClass(derivedClass->baseClassAt(0)->name()); QCOMPARE(candidates.size(), 1); QCOMPARE(candidates.at(0), baseClass); TranslationUnit *unit = doc->translationUnit(); QVERIFY(unit != 0); TranslationUnitAST *ast = unit->ast()->asTranslationUnit(); QVERIFY(ast != 0); ClassSymbols classSymbols(doc->control()); classSymbols(ast); QCOMPARE(classSymbols.size(), 2); const QMap<Class *, ClassSpecifierAST *> classToAST = invert(classSymbols.asMap()); QVERIFY(classToAST.value(baseClass) != 0); QVERIFY(classToAST.value(derivedClass) != 0); }
void Snapshot::insert(Document::Ptr doc) { if (doc) _documents.insert(doc->fileName(), doc); }
void tst_Lookup::iface_impl_scoping() { const QByteArray source = "\n" "@interface Scooping{}-(int)method1:(int)arg;-(void)method2;@end\n" "@implementation Scooping-(int)method1:(int)arg{return arg;}@end\n"; Document::Ptr doc = Document::create("class_with_protocol_with_protocol"); doc->setSource(source); doc->parse(); doc->check(); QVERIFY(doc->diagnosticMessages().isEmpty()); QCOMPARE(doc->globalSymbolCount(), 2U); Snapshot snapshot; snapshot.insert(doc); ObjCClass *iface = doc->globalSymbolAt(0)->asObjCClass(); QVERIFY(iface); QVERIFY(iface->isInterface()); ObjCClass *impl = doc->globalSymbolAt(1)->asObjCClass(); QVERIFY(impl); QVERIFY(!impl->isInterface()); QCOMPARE(iface->memberCount(), 2U); QCOMPARE(impl->memberCount(), 1U); ObjCMethod *method1Impl = impl->memberAt(0)->asObjCMethod(); QVERIFY(method1Impl); QCOMPARE(method1Impl->identifier()->chars(), "method1"); // get the body of method1 QCOMPARE(method1Impl->memberCount(), 2U); Argument *method1Arg = method1Impl->memberAt(0)->asArgument(); QVERIFY(method1Arg); QCOMPARE(method1Arg->identifier()->chars(), "arg"); QVERIFY(method1Arg->type()->isIntegerType()); Block *method1Body = method1Impl->memberAt(1)->asBlock(); QVERIFY(method1Body); const LookupContext context(doc, snapshot); { // verify if we can resolve "arg" in the body QCOMPARE(method1Impl->argumentCount(), 1U); Argument *arg = method1Impl->argumentAt(0)->asArgument(); QVERIFY(arg); QVERIFY(arg->name()); QVERIFY(arg->name()->identifier()); QCOMPARE(arg->name()->identifier()->chars(), "arg"); QVERIFY(arg->type()->isIntegerType()); const QList<LookupItem> candidates = context.lookup(arg->name(), method1Body->enclosingScope()); QCOMPARE(candidates.size(), 1); QVERIFY(candidates.at(0).declaration()->type()->asIntegerType()); } Declaration *method2 = iface->memberAt(1)->asDeclaration(); QVERIFY(method2); QCOMPARE(method2->identifier()->chars(), "method2"); { // verify if we can resolve "method2" in the body const QList<LookupItem> candidates = context.lookup(method2->name(), method1Body->enclosingScope()); QCOMPARE(candidates.size(), 1); QCOMPARE(candidates.at(0).declaration(), method2); } }
void BuiltinEditorDocumentParser::updateHelper(const WorkingCopy &theWorkingCopy) { if (filePath().isEmpty()) return; const Configuration baseConfig = configuration(); const bool releaseSourceAndAST_ = releaseSourceAndAST(); State baseState = state(); ExtraState state = extraState(); WorkingCopy workingCopy = theWorkingCopy; bool invalidateSnapshot = false, invalidateConfig = false, editorDefinesChanged_ = false; CppModelManager *modelManager = CppModelManager::instance(); QByteArray configFile = modelManager->codeModelConfiguration(); ProjectPartHeaderPaths headerPaths; QStringList precompiledHeaders; QString projectConfigFile; LanguageFeatures features = LanguageFeatures::defaultFeatures(); baseState.projectPart = determineProjectPart(filePath(), baseConfig, baseState); if (state.forceSnapshotInvalidation) { invalidateSnapshot = true; state.forceSnapshotInvalidation = false; } if (const ProjectPart::Ptr part = baseState.projectPart) { configFile += part->toolchainDefines; configFile += overwrittenToolchainDefines(*part.data()); configFile += part->projectDefines; headerPaths = part->headerPaths; projectConfigFile = part->projectConfigFile; if (baseConfig.usePrecompiledHeaders) precompiledHeaders = part->precompiledHeaders; features = part->languageFeatures; } if (configFile != state.configFile) { state.configFile = configFile; invalidateSnapshot = true; invalidateConfig = true; } if (baseConfig.editorDefines != baseState.editorDefines) { baseState.editorDefines = baseConfig.editorDefines; invalidateSnapshot = true; editorDefinesChanged_ = true; } if (headerPaths != state.headerPaths) { state.headerPaths = headerPaths; invalidateSnapshot = true; } if (projectConfigFile != state.projectConfigFile) { state.projectConfigFile = projectConfigFile; invalidateSnapshot = true; } if (precompiledHeaders != state.precompiledHeaders) { state.precompiledHeaders = precompiledHeaders; invalidateSnapshot = true; } unsigned rev = 0; if (Document::Ptr doc = state.snapshot.document(filePath())) rev = doc->revision(); else invalidateSnapshot = true; Snapshot globalSnapshot = modelManager->snapshot(); if (invalidateSnapshot) { state.snapshot = Snapshot(); } else { // Remove changed files from the snapshot QSet<Utils::FileName> toRemove; foreach (const Document::Ptr &doc, state.snapshot) { const Utils::FileName fileName = Utils::FileName::fromString(doc->fileName()); if (workingCopy.contains(fileName)) { if (workingCopy.get(fileName).second != doc->editorRevision()) addFileAndDependencies(&state.snapshot, &toRemove, fileName); continue; } Document::Ptr otherDoc = globalSnapshot.document(fileName); if (!otherDoc.isNull() && otherDoc->revision() != doc->revision()) addFileAndDependencies(&state.snapshot, &toRemove, fileName); } if (!toRemove.isEmpty()) { invalidateSnapshot = true; foreach (const Utils::FileName &fileName, toRemove) state.snapshot.remove(fileName); } }
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc) { QMutexLocker locker(&m_mutex); if (m_currentFileName == doc->fileName()) m_itemsOfCurrentDoc.clear(); }
bool QtCreatorIntegration::navigateToSlot(const QString &objectName, const QString &signalSignature, const QStringList ¶meterNames, QString *errorMessage) { typedef QMap<int, Document::Ptr> DocumentMap; const Utils::FileName currentUiFile = FormEditorW::activeEditor()->document()->filePath(); #if 0 return Designer::Internal::navigateToSlot(currentUiFile.toString(), objectName, signalSignature, parameterNames, errorMessage); #endif // TODO: we should pass to findDocumentsIncluding an absolute path to generated .h file from ui. // Currently we are guessing the name of ui_<>.h file and pass the file name only to the findDocumentsIncluding(). // The idea is that the .pro file knows if the .ui files is inside, and the .pro file knows it will // be generating the ui_<>.h file for it, and the .pro file knows what the generated file's name and its absolute path will be. // So we should somehow get that info from project manager (?) const QFileInfo fi = currentUiFile.toFileInfo(); const QString uiFolder = fi.absolutePath(); const QString uicedName = "ui_" + fi.completeBaseName() + ".h"; // Retrieve code model snapshot restricted to project of ui file or the working copy. Snapshot docTable = CppTools::CppModelManager::instance()->snapshot(); Snapshot newDocTable; const Project *uiProject = SessionManager::projectForFile(currentUiFile); if (uiProject) { for (Snapshot::const_iterator i = docTable.begin(), ei = docTable.end(); i != ei; ++i) { const Project *project = SessionManager::projectForFile(i.key()); if (project == uiProject) newDocTable.insert(i.value()); } } else { const CppTools::WorkingCopy workingCopy = CppTools::CppModelManager::instance()->workingCopy(); const Utils::FileName configFileName = Utils::FileName::fromString(CppTools::CppModelManager::configurationFileName()); QHashIterator<Utils::FileName, QPair<QByteArray, unsigned> > it = workingCopy.iterator(); while (it.hasNext()) { it.next(); const Utils::FileName &fileName = it.key(); if (fileName != configFileName) newDocTable.insert(docTable.document(fileName)); } } docTable = newDocTable; // take all docs, find the ones that include the ui_xx.h. // Sort into a map, putting the ones whose path closely matches the ui-folder path // first in case there are project subdirectories that contain identical file names. const QList<Document::Ptr> docList = findDocumentsIncluding(docTable, uicedName, true); // change to false when we know the absolute path to generated ui_<>.h file DocumentMap docMap; for (const Document::Ptr &d : docList) { const QFileInfo docFi(d->fileName()); docMap.insert(qAbs(docFi.absolutePath().compare(uiFolder, Qt::CaseInsensitive)), d); } if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO << objectName << signalSignature << "Looking for " << uicedName << " returned " << docList.size(); if (docMap.isEmpty()) { *errorMessage = tr("No documents matching \"%1\" could be found.\nRebuilding the project might help.").arg(uicedName); return false; } QDesignerFormWindowInterface *fwi = FormEditorW::activeWidgetHost()->formWindow(); const QString uiClass = uiClassName(fwi->mainContainer()->objectName()); if (Designer::Constants::Internal::debug) qDebug() << "Checking docs for " << uiClass; // Find the class definition (ui class defined as member or base class) // in the file itself or in the directly included files (order 1). QString namespaceName; const Class *cl = 0; Document::Ptr doc; for (const Document::Ptr &d : qAsConst(docMap)) { LookupContext context(d, docTable); const ClassDocumentPtrPair cd = findClassRecursively(context, uiClass, 1u , &namespaceName); if (cd.first) { cl = cd.first; doc = cd.second; break; } } if (!cl) { *errorMessage = msgClassNotFound(uiClass, docList); return false; } Overview o; const QString className = namespaceName + o.prettyName(cl->name()); if (Designer::Constants::Internal::debug) qDebug() << "Found class " << className << doc->fileName(); const QString functionName = "on_" + objectName + '_' + signalSignature; const QString functionNameWithParameterNames = addParameterNames(functionName, parameterNames); if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO << "Found " << uiClass << doc->fileName() << " checking " << functionName << functionNameWithParameterNames; int line = 0; Document::Ptr sourceDoc; if (Function *fun = findDeclaration(cl, functionName)) { sourceDoc = findDefinition(fun, &line); if (!sourceDoc) { // add function definition to cpp file sourceDoc = addDefinition(docTable, doc->fileName(), className, functionNameWithParameterNames, &line); } } else { // add function declaration to cl CppTools::WorkingCopy workingCopy = CppTools::CppModelManager::instance()->workingCopy(); const QString fileName = doc->fileName(); getParsedDocument(fileName, workingCopy, docTable); addDeclaration(docTable, fileName, cl, functionNameWithParameterNames); // add function definition to cpp file sourceDoc = addDefinition(docTable, fileName, className, functionNameWithParameterNames, &line); } if (!sourceDoc) { *errorMessage = tr("Unable to add the method definition."); return false; } // jump to function definition, position within code Core::EditorManager::openEditorAt(sourceDoc->fileName(), line + 2, indentation); return true; }
void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy) { QMutexLocker locker(&m_mutex); if (m_fileInEditor.isEmpty()) return; bool invalidateSnapshot = false, invalidateConfig = false, editorDefinesChanged = false; CppModelManager *modelManager = dynamic_cast<CppModelManager *>(CppModelManagerInterface::instance()); QByteArray configFile = modelManager->codeModelConfiguration(); QStringList includePaths; QStringList frameworkPaths; QStringList precompiledHeaders; updateProjectPart(); if (m_forceSnapshotInvalidation) { invalidateSnapshot = true; m_forceSnapshotInvalidation = false; } if (m_projectPart) { configFile += m_projectPart->toolchainDefines; configFile += m_projectPart->projectDefines; includePaths = m_projectPart->includePaths; frameworkPaths = m_projectPart->frameworkPaths; if (m_usePrecompiledHeaders) precompiledHeaders = m_projectPart->precompiledHeaders; } if (configFile != m_configFile) { m_configFile = configFile; invalidateSnapshot = true; invalidateConfig = true; } if (m_editorDefinesChangedSinceLastUpdate) { invalidateSnapshot = true; editorDefinesChanged = true; m_editorDefinesChangedSinceLastUpdate = false; } if (includePaths != m_includePaths) { m_includePaths = includePaths; invalidateSnapshot = true; } if (frameworkPaths != m_frameworkPaths) { m_frameworkPaths = frameworkPaths; invalidateSnapshot = true; } if (precompiledHeaders != m_precompiledHeaders) { m_precompiledHeaders = precompiledHeaders; invalidateSnapshot = true; } unsigned rev = 0; if (Document::Ptr doc = document()) rev = doc->revision(); else invalidateSnapshot = true; Snapshot globalSnapshot = modelManager->snapshot(); if (invalidateSnapshot) { m_snapshot = Snapshot(); } else { // Remove changed files from the snapshot QSet<QString> toRemove; foreach (const Document::Ptr &doc, m_snapshot) { QString fileName = doc->fileName(); if (workingCopy.contains(fileName)) { if (workingCopy.get(fileName).second != doc->editorRevision()) addFileAndDependencies(&toRemove, fileName); continue; } Document::Ptr otherDoc = globalSnapshot.document(fileName); if (!otherDoc.isNull() && otherDoc->revision() != doc->revision()) addFileAndDependencies(&toRemove, fileName); } if (!toRemove.isEmpty()) { invalidateSnapshot = true; foreach (const QString &fileName, toRemove) m_snapshot.remove(fileName); }
void LocatorData::onDocumentUpdated(const Document::Ptr &doc) { QList<Entry> entries = FunctionFinder().run(doc); QMutexLocker l(&m_mutex); m_entries.insert(doc->fileName(), entries); }
FindASTNodes(Document::Ptr doc, QTextDocument *document) : ASTVisitor(doc->translationUnit()), document(document) { }
void CppToolsPlugin::test_codegen_definition_middle_member_surrounded_by_undefined() { const QByteArray srcText = "\n" "class Foo\n" // line 1 "{\n" "void foo();\n" // line 3 "void bar();\n" // line 4 "void baz();\n" // line 5 "void car();\n" // line 6 "};\n" "\n"; const QByteArray dstText = QString::fromLatin1( "\n" "#include \"%1/file.h\"\n" // line 1 "int x;\n" "\n" "void Foo::car()\n" // line 4 "{\n" "\n" "}\n" "\n" "int y;\n").arg(QDir::tempPath()).toLatin1(); Document::Ptr src = Document::create(QDir::tempPath() + QLatin1String("/file.h")); Utils::FileSaver srcSaver(src->fileName()); srcSaver.write(srcText); srcSaver.finalize(); src->setUtf8Source(srcText); src->parse(); src->check(); QCOMPARE(src->diagnosticMessages().size(), 0); QCOMPARE(src->globalSymbolCount(), 1U); Document::Ptr dst = Document::create(QDir::tempPath() + QLatin1String("/file.cpp")); dst->addIncludeFile(Document::Include(QLatin1String("file.h"), src->fileName(), 1, Client::IncludeLocal)); Utils::FileSaver dstSaver(dst->fileName()); dstSaver.write(dstText); dstSaver.finalize(); dst->setUtf8Source(dstText); dst->parse(); dst->check(); QCOMPARE(dst->diagnosticMessages().size(), 0); QCOMPARE(dst->globalSymbolCount(), 3U); Snapshot snapshot; snapshot.insert(src); snapshot.insert(dst); Class *foo = src->globalSymbolAt(0)->asClass(); QVERIFY(foo); QCOMPARE(foo->line(), 1U); QCOMPARE(foo->column(), 7U); QCOMPARE(foo->memberCount(), 4U); Declaration *decl = foo->memberAt(1)->asDeclaration(); QVERIFY(decl); QCOMPARE(decl->line(), 4U); QCOMPARE(decl->column(), 6U); CppRefactoringChanges changes(snapshot); InsertionPointLocator find(changes); QList<InsertionLocation> locList = find.methodDefinition(decl); QVERIFY(locList.size() == 1); InsertionLocation loc = locList.first(); QCOMPARE(loc.fileName(), dst->fileName()); QCOMPARE(loc.line(), 4U); QCOMPARE(loc.column(), 1U); QCOMPARE(loc.prefix(), QString()); QCOMPARE(loc.suffix(), QLatin1String("\n\n")); }
Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot, int targetOffset) { Utils::ChangeSet changes; // parse the current source declaration TypeOfExpression typeOfExpression; // ### just need to preprocess... typeOfExpression.init(sourceDocument, snapshot); QString newDeclText = linkSelection.selectedText(); for (int i = 0; i < newDeclText.size(); ++i) { if (newDeclText.at(i).toAscii() == 0) newDeclText[i] = QLatin1Char('\n'); } newDeclText.append(QLatin1String("{}")); const QString newDeclTextPreprocessed = typeOfExpression.preprocess(newDeclText); Document::Ptr newDeclDoc = Document::create(QLatin1String("<decl>")); newDeclDoc->setSource(newDeclTextPreprocessed.toUtf8()); newDeclDoc->parse(Document::ParseDeclaration); newDeclDoc->check(); // extract the function symbol if (!newDeclDoc->translationUnit()->ast()) return changes; FunctionDefinitionAST *newDef = newDeclDoc->translationUnit()->ast()->asFunctionDefinition(); if (!newDef) return changes; Function *newFunction = newDef->symbol; if (!newFunction) return changes; Overview overview; overview.setShowReturnTypes(true); overview.setShowTemplateParameters(true); overview.setShowArgumentNames(true); overview.setShowFunctionSignatures(true); // abort if the name of the newly parsed function is not the expected one DeclaratorIdAST *newDeclId = getDeclaratorId(newDef->declarator); if (!newDeclId || !newDeclId->name || !newDeclId->name->name || overview(newDeclId->name->name) != nameInitial) { return changes; } LookupContext sourceContext(sourceDocument, snapshot); LookupContext targetContext(targetFile->cppDocument(), snapshot); // sync return type { // set up for rewriting return type SubstitutionEnvironment env; env.setContext(sourceContext); env.switchScope(sourceFunction->enclosingScope()); ClassOrNamespace *targetCoN = targetContext.lookupType(targetFunction->enclosingScope()); if (!targetCoN) targetCoN = targetContext.globalNamespace(); UseMinimalNames q(targetCoN); env.enter(&q); Control *control = sourceContext.control().data(); // get return type start position and declarator info from declaration DeclaratorAST *declarator = 0; SpecifierAST *firstReplaceableSpecifier = 0; TranslationUnit *targetTranslationUnit = targetFile->cppDocument()->translationUnit(); if (SimpleDeclarationAST *simple = targetDeclaration->asSimpleDeclaration()) { declarator = simple->declarator_list->value; firstReplaceableSpecifier = findFirstReplaceableSpecifier( targetTranslationUnit, simple->decl_specifier_list); } else if (FunctionDefinitionAST *def = targetDeclaration->asFunctionDefinition()) { declarator = def->declarator; firstReplaceableSpecifier = findFirstReplaceableSpecifier( targetTranslationUnit, def->decl_specifier_list); } int returnTypeStart = 0; if (firstReplaceableSpecifier) returnTypeStart = targetFile->startOf(firstReplaceableSpecifier); else returnTypeStart = targetFile->startOf(declarator); if (!newFunction->returnType().isEqualTo(sourceFunction->returnType()) && !newFunction->returnType().isEqualTo(targetFunction->returnType())) { FullySpecifiedType type = rewriteType(newFunction->returnType(), &env, control); const QString replacement = overview(type, targetFunction->name()); changes.replace(returnTypeStart, targetFile->startOf(targetFunctionDeclarator->lparen_token), replacement); } } // sync parameters { // set up for rewriting parameter types SubstitutionEnvironment env; env.setContext(sourceContext); env.switchScope(sourceFunction); ClassOrNamespace *targetCoN = targetContext.lookupType(targetFunction); if (!targetCoN) targetCoN = targetContext.globalNamespace(); UseMinimalNames q(targetCoN); env.enter(&q); Control *control = sourceContext.control().data(); Overview overview; const unsigned sourceArgCount = declaredArgumentCount(sourceFunction); const unsigned newArgCount = declaredArgumentCount(newFunction); const unsigned targetArgCount = declaredArgumentCount(targetFunction); // check if parameter types or names have changed const unsigned existingArgs = qMin(targetArgCount, newArgCount); ParameterDeclarationClauseAST *targetParameterDecl = targetFunctionDeclarator->parameter_declaration_clause; ParameterDeclarationListAST *firstTargetParameterDeclIt = targetParameterDecl ? targetParameterDecl->parameter_declaration_list : 0; ParameterDeclarationListAST *targetParameterDeclIt = firstTargetParameterDeclIt; for (unsigned i = 0; i < existingArgs && targetParameterDeclIt; ++i, targetParameterDeclIt = targetParameterDeclIt->next) { Symbol *targetParam = targetFunction->argumentAt(i); Symbol *newParam = newFunction->argumentAt(i); // if new's name and type are the same as source's, forbid changes bool allowChangeType = true; const Name *replacementName = newParam->name(); if (i < sourceArgCount) { Symbol *sourceParam = sourceFunction->argumentAt(i); if (newParam->type().isEqualTo(sourceParam->type())) allowChangeType = false; if (namesEqual(replacementName, sourceParam->name())) replacementName = targetParam->name(); } // don't change the name if it's in a comment if (hasCommentedName(targetFile->cppDocument()->translationUnit(), targetFile->cppDocument()->source(), targetFunctionDeclarator, i)) replacementName = 0; // find the end of the parameter declaration ParameterDeclarationAST *targetParamAst = targetParameterDeclIt->value; int parameterNameEnd = 0; if (targetParamAst->declarator) parameterNameEnd = targetFile->endOf(targetParamAst->declarator); else if (targetParamAst->type_specifier_list) parameterNameEnd = targetFile->endOf(targetParamAst->type_specifier_list->lastToken() - 1); else parameterNameEnd = targetFile->startOf(targetParamAst); // change name and type? if (allowChangeType && !targetParam->type().isEqualTo(newParam->type())) { FullySpecifiedType replacementType = rewriteType(newParam->type(), &env, control); const QString replacement = overview(replacementType, replacementName); changes.replace(targetFile->startOf(targetParamAst), parameterNameEnd, replacement); } // change the name only? else if (!namesEqual(targetParam->name(), replacementName)) { DeclaratorIdAST *id = getDeclaratorId(targetParamAst->declarator); QString replacementNameStr = overview(replacementName); if (id) { changes.replace(targetFile->range(id), replacementNameStr); } else { // add name to unnamed parameter replacementNameStr.prepend(QLatin1Char(' ')); int end; if (targetParamAst->equal_token) { end = targetFile->startOf(targetParamAst->equal_token); replacementNameStr.append(QLatin1Char(' ')); } else { // one past end on purpose end = targetFile->startOf(targetParamAst->lastToken()); } changes.replace(parameterNameEnd, end, replacementNameStr); } } } // remove some parameters? if (newArgCount < targetArgCount) { targetParameterDeclIt = firstTargetParameterDeclIt; if (targetParameterDeclIt) { if (newArgCount == 0) { changes.remove(targetFile->startOf(targetParameterDeclIt->firstToken()), targetFile->endOf(targetParameterDeclIt->lastToken() - 1)); } else { // get the last valid argument for (unsigned i = 0; i < newArgCount - 1 && targetParameterDeclIt; ++i) targetParameterDeclIt = targetParameterDeclIt->next; if (targetParameterDeclIt) { const int start = targetFile->endOf(targetParameterDeclIt->value); const int end = targetFile->endOf(targetParameterDecl->lastToken() - 1); changes.remove(start, end); } } } } // add some parameters? else if (newArgCount > targetArgCount) { QString newParams; for (unsigned i = targetArgCount; i < newArgCount; ++i) { Symbol *param = newFunction->argumentAt(i); FullySpecifiedType type = rewriteType(param->type(), &env, control); if (i != 0) newParams += QLatin1String(", "); newParams += overview(type, param->name()); } targetParameterDeclIt = firstTargetParameterDeclIt; if (targetParameterDeclIt) { while (targetParameterDeclIt->next) targetParameterDeclIt = targetParameterDeclIt->next; changes.insert(targetFile->endOf(targetParameterDeclIt->value), newParams); } else { changes.insert(targetFile->endOf(targetFunctionDeclarator->lparen_token), newParams); } } } // sync cv qualification if (targetFunction->isConst() != newFunction->isConst() || targetFunction->isVolatile() != newFunction->isVolatile()) { QString cvString; if (newFunction->isConst()) cvString += QLatin1String("const"); if (newFunction->isVolatile()) { if (!cvString.isEmpty()) cvString += QLatin1Char(' '); cvString += QLatin1String("volatile"); } const int rparenEnd = targetFile->endOf(targetFunctionDeclarator->rparen_token); if (targetFunctionDeclarator->cv_qualifier_list) { const int cvEnd = targetFile->endOf(targetFunctionDeclarator->cv_qualifier_list->lastToken() - 1); // if the qualifies changed, replace if (!cvString.isEmpty()) { changes.replace(targetFile->startOf(targetFunctionDeclarator->cv_qualifier_list->firstToken()), cvEnd, cvString); } else { // remove changes.remove(rparenEnd, cvEnd); } } else { // otherwise add cvString.prepend(QLatin1Char(' ')); changes.insert(rparenEnd, cvString); } } if (targetOffset != -1) { // move all change operations to have the right start offset const int moveAmount = targetOffset - targetFile->startOf(targetDeclaration); QList<Utils::ChangeSet::EditOp> ops = changes.operationList(); for (int i = 0; i < ops.size(); ++i) { ops[i].pos1 += moveAmount; ops[i].pos2 += moveAmount; } changes = Utils::ChangeSet(ops); } return changes; }