diff --git a/shared/cplusplus/TranslationUnit.cpp b/shared/cplusplus/TranslationUnit.cpp index 896ab7d1a55fa475646c69c76c1a0c138ebbd161..bc4d219e0f333c10d7ff9c11c2d71b4cbb74784c 100644 --- a/shared/cplusplus/TranslationUnit.cpp +++ b/shared/cplusplus/TranslationUnit.cpp @@ -146,7 +146,7 @@ unsigned TranslationUnit::matchingBrace(unsigned index) const MemoryPool *TranslationUnit::memoryPool() const { return _pool; } -TranslationUnitAST *TranslationUnit::ast() const +AST *TranslationUnit::ast() const { return _ast; } bool TranslationUnit::isTokenized() const @@ -218,17 +218,49 @@ bool TranslationUnit::skipFunctionBody() const void TranslationUnit::setSkipFunctionBody(bool skipFunctionBody) { _skipFunctionBody = skipFunctionBody; } -void TranslationUnit::parse() +bool TranslationUnit::parse(ParseMode mode) { if (isParsed()) - return; + return false; if (! isTokenized()) tokenize(); Parser parser(this); parser.setQtMocRunEnabled(_qtMocRunEnabled); - parser.parseTranslationUnit(_ast); + + bool parsed = false; + + switch (mode) { + case ParseTranlationUnit: { + TranslationUnitAST *node = 0; + parsed = parser.parseTranslationUnit(node); + _ast = node; + } break; + + case ParseDeclaration: { + DeclarationAST *node = 0; + parsed = parser.parseDeclaration(node); + _ast = node; + } break; + + case ParseExpression: { + ExpressionAST *node = 0; + parsed = parser.parseExpression(node); + _ast = node; + } break; + + case ParseStatement: { + StatementAST *node = 0; + parsed = parser.parseStatement(node); + _ast = node; + } break; + + default: + break; + } // switch + + return parsed; } void TranslationUnit::pushLineOffset(unsigned offset) diff --git a/shared/cplusplus/TranslationUnit.h b/shared/cplusplus/TranslationUnit.h index 41f5a1d6e86e07f89847a3aed7f8928b452b8586..ae6b911aeeeb6584a5137572ea3ad7884c317f4e 100644 --- a/shared/cplusplus/TranslationUnit.h +++ b/shared/cplusplus/TranslationUnit.h @@ -95,7 +95,7 @@ public: NumericLiteral *numericLiteral(unsigned index) const; MemoryPool *memoryPool() const; - TranslationUnitAST *ast() const; + AST *ast() const; bool blockErrors(bool block); @@ -113,7 +113,15 @@ public: void setSkipFunctionBody(bool skipFunctionBody); bool isParsed() const; - void parse(); + + enum ParseMode { + ParseTranlationUnit, + ParseDeclaration, + ParseExpression, + ParseStatement + }; + + bool parse(ParseMode mode = ParseTranlationUnit); void resetAST(); void release(); @@ -169,7 +177,7 @@ private: std::vector<unsigned> _lineOffsets; std::vector<PPLine> _ppLines; MemoryPool *_pool; - TranslationUnitAST *_ast; + AST *_ast; TranslationUnit *_previousTranslationUnit; union { unsigned _flags; diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 3fe4ea86b63982e13e91f367637ec40730bc2457..782c14ff6d556ecac284d71a567d619d1e52d145 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -251,9 +251,31 @@ QSet<QByteArray> Document::macroNames() const return _macroNames; } -void Document::parse() +bool Document::parse(ParseMode mode) { - _translationUnit->parse(); + TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit; + switch (mode) { + case ParseTranlationUnit: + m = TranslationUnit::ParseTranlationUnit; + break; + + case ParseDeclaration: + m = TranslationUnit::ParseDeclaration; + break; + + case ParseExpression: + m = TranslationUnit::ParseExpression; + break; + + case ParseStatement: + m = TranslationUnit::ParseStatement; + break; + + default: + break; + } + + return _translationUnit->parse(m); } void Document::check() @@ -264,7 +286,10 @@ void Document::check() _globalNamespace = _control->newNamespace(0); Scope *globals = _globalNamespace->members(); - if (TranslationUnitAST *ast = _translationUnit->ast()) { + if (! _translationUnit->ast()) + return; // nothing to do. + + if (TranslationUnitAST *ast = _translationUnit->ast()->asTranslationUnit()) { for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) { semantic.check(decl, globals); } diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index d4de240d3a45a99f710d0ea25d0b9572f4f8ded3..17762200fa03c99fdde3871c5c9398c07720f411 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -85,7 +85,14 @@ public: void startSkippingBlocks(unsigned offset); void stopSkippingBlocks(unsigned offset); - void parse(); // ### remove + enum ParseMode { // ### keep in sync with CPlusPlus::TranslationUnit + ParseTranlationUnit, + ParseDeclaration, + ParseExpression, + ParseStatement + }; + + bool parse(ParseMode mode = ParseTranlationUnit); void check(); void releaseTranslationUnit(); diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp index 7e3ed35af8b25c9084e91bb0477b7238524c6def..2672bfb105f1422b8d39f3da2941d0ee280d2dfa 100644 --- a/src/libs/cplusplus/TypeOfExpression.cpp +++ b/src/libs/cplusplus/TypeOfExpression.cpp @@ -81,34 +81,17 @@ ExpressionAST *TypeOfExpression::expressionAST() const ExpressionAST *TypeOfExpression::extractExpressionAST(Document::Ptr doc) const { - TranslationUnitAST *translationUnitAST = doc->translationUnit()->ast(); + if (! doc->translationUnit()->ast()) + return 0; - // ### evaluate the expression - ExpressionAST *expressionAST = 0; - if (translationUnitAST) { - DeclarationAST *declaration = translationUnitAST->declarations; - SimpleDeclarationAST *simpleDecl = 0; - if (declaration) - simpleDecl = declaration->asSimpleDeclaration(); - if (simpleDecl && simpleDecl->decl_specifier_seq) { - if (TypeofSpecifierAST *typeOfSpec = simpleDecl->decl_specifier_seq->asTypeofSpecifier()) - expressionAST = typeOfSpec->expression; - } - } - return expressionAST; + return doc->translationUnit()->ast()->asExpression(); } Document::Ptr TypeOfExpression::documentForExpression(const QString &expression) const { - // create a __typeof__ specifier - QByteArray declaration; - declaration += "__typeof__ "; - declaration += expression.toLatin1(); // C++ code needs to be in latin1 - declaration += ";"; - // create the expression's AST. Document::Ptr doc = Document::create(QLatin1String("<completion>")); - doc->setSource(declaration); - doc->parse(); + doc->setSource(expression.toUtf8()); + doc->parse(Document::ParseExpression); return doc; } diff --git a/src/plugins/cmakeprojectmanager/cmakestep.cpp b/src/plugins/cmakeprojectmanager/cmakestep.cpp index 25f383b4545d9e79a84046d9b275115285e66ea1..821bf6b1beca5b1b356adfa8d12430eaa7626325 100644 --- a/src/plugins/cmakeprojectmanager/cmakestep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakestep.cpp @@ -19,6 +19,7 @@ CMakeStep::~CMakeStep() bool CMakeStep::init(const QString &buildConfiguration) { // TODO + return true; } void CMakeStep::run(QFutureInterface<bool> &fi) diff --git a/src/plugins/cpptools/rpp/pp-engine.cpp b/src/plugins/cpptools/rpp/pp-engine.cpp index 70e802c5497fde34ad03ca6df8f70bca3c83c392..3a3e9245b30229a330fe9f3ea894eb5ec9a66b29 100644 --- a/src/plugins/cpptools/rpp/pp-engine.cpp +++ b/src/plugins/cpptools/rpp/pp-engine.cpp @@ -640,9 +640,9 @@ void pp::operator()(const QByteArray &source, QByteArray *result) const char *beginOfText = startOfToken(*identifierToken); const char *endOfText = endOfToken(*_dot); ++_dot; // skip T_RPAREN - m->hidden = true; + //m->hidden = true; expand(beginOfText, endOfText, result); - m->hidden = false; + //m->hidden = false; } } } diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6b3eb20ad7f62e8b0e80a63cb62af625674da9bb..fb73d4fe5e2b41a2a750f4ab656d3966baab951c 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -170,7 +170,7 @@ void GitClient::diff(const QString &workingDirectory, const QStringList &fileNam if (Git::Constants::debug) qDebug() << "diff" << workingDirectory << fileNames; QStringList arguments; - arguments << QLatin1String("diff") << fileNames; + arguments << QLatin1String("diff") << QLatin1String("--") << fileNames; const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND); const QString title = tr("Git Diff"); @@ -187,7 +187,7 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName) QStringList arguments; arguments << QLatin1String("diff"); if (!fileName.isEmpty()) - arguments << fileName; + arguments << QLatin1String("--") << fileName; const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND); const QString title = tr("Git Diff %1").arg(fileName); @@ -246,7 +246,7 @@ void GitClient::blame(const QString &workingDirectory, const QString &fileName) if (Git::Constants::debug) qDebug() << "blame" << workingDirectory << fileName; QStringList arguments(QLatin1String("blame")); - arguments << fileName; + arguments << QLatin1String("--") << fileName; const QString kind = QLatin1String(Git::Constants::GIT_BLAME_EDITOR_KIND); const QString title = tr("Git Blame %1").arg(fileName); @@ -314,7 +314,7 @@ bool GitClient::synchronousReset(const QString &workingDirectory, QByteArray outputText; QByteArray errorText; QStringList arguments; - arguments << QLatin1String("reset") << QLatin1String("HEAD") << files; + arguments << QLatin1String("reset") << QLatin1String("HEAD") << QLatin1String("--") << files; const bool rc = synchronousGit(workingDirectory, arguments, &outputText, &errorText); const QString output = QString::fromLocal8Bit(outputText); m_plugin->m_outputWindow->popup(false); @@ -643,9 +643,9 @@ GitCommand::~GitCommand() { } -void GitCommand::execute(const QStringList &arguments - , const QString &workingDirectory - , const ProjectExplorer::Environment &environment) +void GitCommand::execute(const QStringList &arguments, + const QString &workingDirectory, + const ProjectExplorer::Environment &environment) { if (Git::Constants::debug) qDebug() << "GitCommand::execute" << workingDirectory << arguments; @@ -663,9 +663,9 @@ void GitCommand::execute(const QStringList &arguments , Core::ProgressManagerInterface::CloseOnSuccess); } -void GitCommand::run(const QStringList &arguments - , const QString &workingDirectory - , const ProjectExplorer::Environment &environment) +void GitCommand::run(const QStringList &arguments, + const QString &workingDirectory, + const ProjectExplorer::Environment &environment) { if (Git::Constants::debug) qDebug() << "GitCommand::run" << workingDirectory << arguments; diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp index 5d5cb0a2ef3e2134c16a88ce941ce62b7a1f9130..e9110f8fbeb01bb004e511f5b3d9ef5543371e33 100644 --- a/src/plugins/git/gitsubmiteditorwidget.cpp +++ b/src/plugins/git/gitsubmiteditorwidget.cpp @@ -57,9 +57,9 @@ GitSubmitEditorPanelData GitSubmitEditorWidget::panelData() const rc.author = m_gitSubmitPanelUi.authorLineEdit->text(); rc.email = m_gitSubmitPanelUi.emailLineEdit->text(); return rc; -}; +} -void GitSubmitEditorWidget::setPanelData(const GitSubmitEditorPanelData &data) +void GitSubmitEditorWidget::setPanelData(const GitSubmitEditorPanelData &data) { m_gitSubmitPanelUi.authorLineEdit->setText(data.author); m_gitSubmitPanelUi.emailLineEdit->setText(data.email); diff --git a/src/plugins/git/gitsubmitpanel.ui b/src/plugins/git/gitsubmitpanel.ui index d408eeab11d23e9a708817fb00f415faa74ca186..aba46b7c52542d09f7ba027fc21571f5bfa5c9a0 100644 --- a/src/plugins/git/gitsubmitpanel.ui +++ b/src/plugins/git/gitsubmitpanel.ui @@ -11,6 +11,9 @@ </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> + <property name="margin"> + <number>0</number> + </property> <item> <widget class="QGroupBox" name="infoGroup"> <property name="title"> diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp index 0618fe6c730b2afc802ae1222026c9b79c9fe0e0..0e7dd7ece2ad88e1a746a037e4475c9c0bae0e66 100644 --- a/src/plugins/qt4projectmanager/profilereader.cpp +++ b/src/plugins/qt4projectmanager/profilereader.cpp @@ -69,7 +69,7 @@ bool ProFileReader::readProFile(const QString &fileName) // return false; // } // } - QString fn = QFileInfo(fileName).filePath(); + QString fn = QFileInfo(fileName).filePath(); ProFile *pro = new ProFile(fn); if (!queryProFile(pro)) { delete pro; diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 08ebe8aab95fe47a239bd11a43839631a0bff940..672ce8b835b9077fd5ae28c743231979b39b1304 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -883,12 +883,12 @@ QStringList Qt4ProFileNode::subDirsPaths(ProFileReader *reader) const QString realFile; const QString subDirKey = subDirVar + QLatin1String(".subdir"); if (reader->contains(subDirKey)) - realDir = reader->value(subDirKey); + realDir = QFileInfo(reader->value(subDirKey)).filePath(); else realDir = subDirVar; QFileInfo info(realDir); if (!info.isAbsolute()) - realDir = QString("%1/%2").arg(m_projectDir, realDir); + realDir = m_projectDir + "/" + realDir; #ifdef QTEXTENDED_QBUILD_SUPPORT // QBuild only uses project files named qbuild.pro, and subdirs are implied diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 3ac864f9ab4a690147e052f5fdcced70362b21a1..6152a93b795c0925cb64ee60609de3a1d0f61213 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -240,7 +240,7 @@ bool VCSBaseSubmitEditor::restoreState(const QByteArray &/*state*/) return true; } -QStringList VCSBaseSubmitEditor::checkedFiles() const +QStringList VCSBaseSubmitEditor::checkedFiles() const { return vcsFileListToFileList(m_d->m_widget->checkedFiles()); } @@ -255,7 +255,7 @@ void VCSBaseSubmitEditor::addFiles(const QStringList& list, bool checked, bool u m_d->m_widget->addFiles(list, checked, userCheckable); } -void VCSBaseSubmitEditor::slotDiffSelectedVCSFiles(const QStringList &rawList) +void VCSBaseSubmitEditor::slotDiffSelectedVCSFiles(const QStringList &rawList) { emit diffSelectedFiles(vcsFileListToFileList(rawList)); } @@ -299,4 +299,4 @@ QIcon VCSBaseSubmitEditor::submitIcon() return QIcon(QLatin1String(":/vcsbase/images/submit.png")); } -} +} // namespace VCSBase diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp index 946bd5c735a03e588b1c9d7712521637474b3d68..234c9684a394c06e6f4b2f852af9ff1ae6de5851 100644 --- a/tests/manual/cplusplus/main.cpp +++ b/tests/manual/cplusplus/main.cpp @@ -56,8 +56,10 @@ int main(int, char *[]) TranslationUnit unit(&control, fileId); unit.setSource(source.constData(), source.size()); unit.parse(); + if (unit.ast()) { + TranslationUnitAST *ast = unit.ast()->asTranslationUnit(); + Q_ASSERT(ast != 0); - if (TranslationUnitAST *ast = unit.ast()) { Scope globalScope; Semantic sem(&control); for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) {