diff --git a/share/qtcreator/templates/qt4project/widget.ui b/share/qtcreator/templates/qt4project/widget.ui index f4e94939e46edcd6e9cecf706a21a2947c3de60a..a804f2044eb4fa69dd5833134fcf3a29e9f5cba3 100644 --- a/share/qtcreator/templates/qt4project/widget.ui +++ b/share/qtcreator/templates/qt4project/widget.ui @@ -1,5 +1,5 @@ <ui version="4.0"> - <class>%CLASS%Class</class> + <class>%CLASS%</class> <widget class="%BASECLASS%" name="%CLASS%" > <property name="geometry" > <rect> diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 8805d4555dca6c56a47753d6558d2767e5683eef..6157204867fb29585d7214ce28d8a9daef33229d 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -1128,7 +1128,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item) if (function->argumentCount() == 0) { extraChars += QLatin1Char('<'); } - } else { + } else if (! function->isAmbiguous()) { extraChars += QLatin1Char('('); // If the function takes no arguments, automatically place the closing parenthesis diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 5eda4b77e54ff171c2f081bc3b6f916807352a1a..43bc047f35d53c15d00db55713baf3c664b0c7e2 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -214,7 +214,6 @@ private: Document::Ptr m_currentDoc; QSet<QString> m_todo; QSet<QString> m_processed; - QFutureSynchronizer<void> m_synchronizer; }; } // namespace Internal @@ -224,9 +223,7 @@ CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager) : snapshot(modelManager->snapshot()), m_modelManager(modelManager), preprocess(this, &env) -{ - m_synchronizer.setCancelOnWait(true); -} +{ } CppPreprocessor::~CppPreprocessor() { } @@ -510,7 +507,9 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type, snapshot.insert(doc->fileName(), doc); m_todo.remove(fileName); - m_synchronizer.addFuture(QtConcurrent::run(Process(m_modelManager), doc)); + Process process(m_modelManager); + + process(doc); (void) switchDocument(previousDoc); } diff --git a/src/plugins/designer/cpp/formclasswizardparameters.cpp b/src/plugins/designer/cpp/formclasswizardparameters.cpp index 2c2cde09cf3ad4ced2bc5a3b75808fee2a1ec23c..c7f7407e92588ed568cfa9675ebcfc122cf32968 100644 --- a/src/plugins/designer/cpp/formclasswizardparameters.cpp +++ b/src/plugins/designer/cpp/formclasswizardparameters.cpp @@ -162,6 +162,7 @@ bool FormClassWizardParameters::generateCpp(QString *header, QString *source, in if (languageChange) { sourceStr << '\n' << namespaceIndent << "void " << unqualifiedClassName << "::" << "changeEvent(QEvent *e)\n" << namespaceIndent << "{\n" + << namespaceIndent << indent << formBaseClass << "::changeEvent(e);\n" << namespaceIndent << indent << "switch (e->type()) {\n" << namespaceIndent << indent << "case QEvent::LanguageChange:\n" << namespaceIndent << indent << indent; if (embedding != InheritedUiClass) diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 9c778555d9db379a56c82cc74723be66255ef850..23c597b204e112c03fcb45e125ce3a4dbfcbd3bd 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -109,7 +109,8 @@ bool RemoteBranchModel::refreshBranches(const QString &workingDirectory, bool re int *currentBranch, QString *errorMessage) { // Run branch command with verbose. - QStringList branchArgs(QLatin1String("-v")); + QStringList branchArgs; + branchArgs << QLatin1String(GitClient::noColorOption) << QLatin1String("-v"); QString output; *currentBranch = -1; if (remoteBranches) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 25a134bd46a9c8767b0dde54499d86094275f005..c7558f1a18f9ce111512e6f0b10e8a3e76ea4449 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -57,8 +57,8 @@ using namespace Git; using namespace Git::Internal; -const char *const kGitDirectoryC = ".git"; -const char *const kBranchIndicatorC = "# On branch"; +static const char *const kGitDirectoryC = ".git"; +static const char *const kBranchIndicatorC = "# On branch"; static inline QString msgServerFailure() { @@ -108,6 +108,8 @@ GitClient::~GitClient() { } +const char *GitClient::noColorOption = "--no-color"; + QString GitClient::findRepositoryForFile(const QString &fileName) { const QString gitDirectory = QLatin1String(kGitDirectoryC); @@ -201,22 +203,24 @@ void GitClient::diff(const QString &workingDirectory, // when using the submit dialog. GitCommand *command = createCommand(workingDirectory, editor); // Directory diff? + QStringList commonDiffArgs; + commonDiffArgs << QLatin1String("diff") << QLatin1String(noColorOption); if (unstagedFileNames.empty() && stagedFileNames.empty()) { - QStringList arguments; - arguments << QLatin1String("diff") << diffArgs; + QStringList arguments(commonDiffArgs); + arguments << diffArgs; m_plugin->outputWindow()->append(formatCommand(binary, arguments)); command->addJob(arguments, m_settings.timeout); } else { // Files diff. if (!unstagedFileNames.empty()) { - QStringList arguments; - arguments << QLatin1String("diff") << diffArgs << QLatin1String("--") << unstagedFileNames; + QStringList arguments(commonDiffArgs); + arguments << QLatin1String("--") << unstagedFileNames; m_plugin->outputWindow()->append(formatCommand(binary, arguments)); command->addJob(arguments, m_settings.timeout); } if (!stagedFileNames.empty()) { - QStringList arguments; - arguments << QLatin1String("diff") << QLatin1String("--cached") << diffArgs << QLatin1String("--") << stagedFileNames; + QStringList arguments(commonDiffArgs); + arguments << QLatin1String("--cached") << diffArgs << QLatin1String("--") << stagedFileNames; m_plugin->outputWindow()->append(formatCommand(binary, arguments)); command->addJob(arguments, m_settings.timeout); } @@ -231,9 +235,9 @@ void GitClient::diff(const QString &workingDirectory, if (Git::Constants::debug) qDebug() << "diff" << workingDirectory << fileName; QStringList arguments; - arguments << QLatin1String("diff"); + arguments << QLatin1String("diff") << QLatin1String(noColorOption); if (!fileName.isEmpty()) - arguments << diffArgs << QLatin1String("--") << fileName; + arguments << diffArgs << QLatin1String("--") << fileName; const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND); const QString title = tr("Git Diff %1").arg(fileName); @@ -245,6 +249,7 @@ void GitClient::diff(const QString &workingDirectory, void GitClient::status(const QString &workingDirectory) { + // @TODO: Use "--no-color" once it is supported QStringList statusArgs(QLatin1String("status")); statusArgs << QLatin1String("-u"); executeGit(workingDirectory, statusArgs, 0, true); @@ -255,7 +260,8 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName) if (Git::Constants::debug) qDebug() << "log" << workingDirectory << fileName; - QStringList arguments(QLatin1String("log")); + QStringList arguments; + arguments << QLatin1String("log") << QLatin1String(noColorOption); if (m_settings.logCount > 0) arguments << QLatin1String("-n") << QString::number(m_settings.logCount); @@ -274,8 +280,8 @@ void GitClient::show(const QString &source, const QString &id) { if (Git::Constants::debug) qDebug() << "show" << source << id; - QStringList arguments(QLatin1String("show")); - arguments << id; + QStringList arguments; + arguments << QLatin1String("show") << QLatin1String(noColorOption) << id; const QString title = tr("Git Show %1").arg(id); const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND); @@ -450,7 +456,7 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString & if (Git::Constants::debug) qDebug() << Q_FUNC_INFO << workingDirectory << id; QStringList args(QLatin1String("show")); - args << id; + args << QLatin1String(noColorOption) << id; QByteArray outputText; QByteArray errorText; const bool rc = synchronousGit(workingDirectory, args, &outputText, &errorText); @@ -633,10 +639,12 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, // Run 'status'. Note that git returns exitcode 1 if there are no added files. QByteArray outputText; QByteArray errorText; + // @TODO: Use "--no-color" once it is supported QStringList statusArgs(QLatin1String("status")); if (untracked) statusArgs << QLatin1String("-u"); const bool statusRc = synchronousGit(workingDirectory, statusArgs, &outputText, &errorText); + GitCommand::removeColorCodes(&outputText); if (output) *output = QString::fromLocal8Bit(outputText).remove(QLatin1Char('\r')); // Is it something really fatal? @@ -958,14 +966,14 @@ void GitClient::stashPop(const QString &workingDirectory) void GitClient::branchList(const QString &workingDirectory) { QStringList arguments(QLatin1String("branch")); - arguments << QLatin1String("-r"); + arguments << QLatin1String("-r") << QLatin1String(noColorOption); executeGit(workingDirectory, arguments, 0, true); } void GitClient::stashList(const QString &workingDirectory) { QStringList arguments(QLatin1String("stash")); - arguments << QLatin1String("list"); + arguments << QLatin1String("list") << QLatin1String(noColorOption); executeGit(workingDirectory, arguments, 0, true); } diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 5a9d96e7b986d35dc5826f9a8722cc420672f3e2..046e08bc239ea275c5e105435b0926c5d1b6112a 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -135,6 +135,8 @@ public: static QString msgNoChangedFiles(); + static const char *noColorOption; + public slots: void show(const QString &source, const QString &id); diff --git a/src/plugins/git/gitcommand.cpp b/src/plugins/git/gitcommand.cpp index dd1c3882b04c4801fef52b15b46ce3da9973dfc8..47d792d53af90a2ca13bc35752157df00b4bbb51 100644 --- a/src/plugins/git/gitcommand.cpp +++ b/src/plugins/git/gitcommand.cpp @@ -121,6 +121,10 @@ void GitCommand::run() // Special hack: Always produce output for diff if (ok && output.isEmpty() && m_jobs.front().arguments.at(0) == QLatin1String("diff")) { output += "The file does not differ from HEAD"; + } else { + // @TODO: Remove, see below + if (ok && m_jobs.front().arguments.at(0) == QLatin1String("status")) + removeColorCodes(&output); } if (ok && !output.isEmpty()) @@ -133,5 +137,28 @@ void GitCommand::run() this->deleteLater(); } +// Clean output from carriage return and ANSI color codes. +// @TODO: Remove once all relevant commands support "--no-color", +//("status" is missing it as of git 1.6.2) + +void GitCommand::removeColorCodes(QByteArray *data) +{ + // Remove ansi color codes that look like "ESC[<stuff>m" + const QByteArray ansiColorEscape("\033["); + int escapePos = 0; + while (true) { + const int nextEscapePos = data->indexOf(ansiColorEscape, escapePos); + if (nextEscapePos == -1) + break; + const int endEscapePos = data->indexOf('m', nextEscapePos + ansiColorEscape.size()); + if (endEscapePos != -1) { + data->remove(nextEscapePos, endEscapePos - nextEscapePos + 1); + escapePos = nextEscapePos; + } else { + escapePos = nextEscapePos + ansiColorEscape.size(); + } + } +} + } // namespace Internal } // namespace Git diff --git a/src/plugins/git/gitcommand.h b/src/plugins/git/gitcommand.h index 8f32bd6862b53100656d959452c82137e731f4cb..f4bdb34768a2594bdcffa9f2d85ba2c77bc25553 100644 --- a/src/plugins/git/gitcommand.h +++ b/src/plugins/git/gitcommand.h @@ -50,6 +50,10 @@ public: void addJob(const QStringList &arguments, int timeout); void execute(); + // Clean output from carriage return and ANSI color codes. + // Workaround until all relevant commands support "--no-color". + static void removeColorCodes(QByteArray *data); + private: void run(); diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 19373cdadae9678ae11f8e1bf2399b48102f3ba0..1f051146bf497c85167c933b7cc27738f44d7aaa 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -1682,6 +1682,10 @@ FunctionDeclaratorAST *FunctionDeclaratorAST::clone(MemoryPool *pool) const void FunctionDeclaratorAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { + accept(parameters, visitor); + for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next) + accept(it, visitor); + accept(exception_specification, visitor); } visitor->endVisit(this); } diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 9093cb650f49ea9cdd03ab5e2ba4cd76e530022e..3f3f802506f462246e200d112f832a4ab47a2b27 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -805,6 +805,7 @@ public: unsigned rparen_token; SpecifierAST *cv_qualifier_seq; ExceptionSpecificationAST *exception_specification; + ExpressionAST *as_cpp_initializer; public: // annotations Function *symbol; diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp index f1cc0a3f981d754515ea54c6db505f7cd491bca3..ceef0d1d0559e7cce77719b7a1c87cd4f546220f 100644 --- a/src/shared/cplusplus/CheckDeclarator.cpp +++ b/src/shared/cplusplus/CheckDeclarator.cpp @@ -157,6 +157,7 @@ bool CheckDeclarator::visit(NestedDeclaratorAST *ast) bool CheckDeclarator::visit(FunctionDeclaratorAST *ast) { Function *fun = control()->newFunction(ast->firstToken()); + fun->setAmbiguous(ast->as_cpp_initializer != 0); ast->symbol = fun; fun->setReturnType(_fullySpecifiedType); diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index dac159bf22b2c08e973d92b44499fca666b9d080..423a05e05be8352e4ebccc5b24166fbbefc9bfbb 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -977,7 +977,7 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node) return false; } -bool Parser::parseDeclarator(DeclaratorAST *&node) +bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer) { if (! parseCoreDeclarator(node)) return false; @@ -988,6 +988,47 @@ bool Parser::parseDeclarator(DeclaratorAST *&node) unsigned startOfPostDeclarator = cursor(); if (LA() == T_LPAREN) { + if (stopAtCppInitializer) { + unsigned lparen_token = cursor(); + ExpressionAST *initializer = 0; + + bool blocked = blockErrors(true); + if (parseInitializer(initializer)) { + if (NestedExpressionAST *expr = initializer->asNestedExpression()) { + if (expr->expression && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) { + rewind(lparen_token); + + // check for ambiguous declarators. + + consumeToken(); + ParameterDeclarationClauseAST *parameter_declaration_clause = 0; + if (parseParameterDeclarationClause(parameter_declaration_clause) && LA() == T_RPAREN) { + unsigned rparen_token = consumeToken(); + + FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST; + ast->lparen_token = lparen_token; + ast->parameters = parameter_declaration_clause; + ast->as_cpp_initializer = initializer; + ast->rparen_token = rparen_token; + *postfix_ptr = ast; + postfix_ptr = &(*postfix_ptr)->next; + + blockErrors(blocked); + return true; + } + + + blockErrors(blocked); + rewind(lparen_token); + return true; + } + } + } + + blockErrors(blocked); + rewind(lparen_token); + } + FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST; ast->lparen_token = consumeToken(); parseParameterDeclarationClause(ast->parameters); @@ -1494,7 +1535,7 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node, if (acceptStructDeclarator && LA() == T_COLON) { // anonymous bit-field declaration. // ### TODO create the AST - } else if (! parseDeclarator(node)) { + } else if (! parseDeclarator(node, /*stopAtCppInitializer = */ ! acceptStructDeclarator)) { return false; } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 638c1147bdd54a54644ae44d19cefb128e7e5dfc..b2d55f3868fe4ac6750740b390054d3700e2a5c9 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -107,7 +107,7 @@ public: bool parseSimpleDeclaration(DeclarationAST *&node, bool acceptStructDeclarator = false); bool parseDeclarationStatement(StatementAST *&node); bool parseCoreDeclarator(DeclaratorAST *&node); - bool parseDeclarator(DeclaratorAST *&node); + bool parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer = false); bool parseDeleteExpression(ExpressionAST *&node); bool parseDoStatement(StatementAST *&node); bool parseElaboratedTypeSpecifier(SpecifierAST *&node); diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 35d2d9c6906739322d5986500a44b05d10c75b13..5185aa82659a8fd1f5e6897f21abfeab6cc4a5d0 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -255,6 +255,12 @@ bool Function::isPureVirtual() const void Function::setPureVirtual(bool isPureVirtual) { _isPureVirtual = isPureVirtual; } +bool Function::isAmbiguous() const +{ return _isAmbiguous; } + +void Function::setAmbiguous(bool isAmbiguous) +{ _isAmbiguous = isAmbiguous; } + void Function::visitSymbol0(SymbolVisitor *visitor) { if (visitor->visit(this)) { diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index a9f8cda5479c26f8d26efd5f7951011318517eb4..8efc0fbdbed0c104a843564817f77520b8131223 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -322,6 +322,9 @@ public: virtual Function *asFunctionType() { return this; } + bool isAmbiguous() const; // internal + void setAmbiguous(bool isAmbiguous); // internal + protected: virtual void visitSymbol0(SymbolVisitor *visitor); virtual void accept0(TypeVisitor *visitor); @@ -337,6 +340,7 @@ private: unsigned _isPureVirtual: 1; unsigned _isConst: 1; unsigned _isVolatile: 1; + unsigned _isAmbiguous: 1; unsigned _methodKey: 3; }; };