From 6b2b58477f6d4540e1695833f172e5edecc49bed Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 22 Mar 2016 18:23:21 +0100 Subject: [PATCH 01/72] QbsProjectManager: Turn some errors into warnings when loading projects. If at all possible, we want to load a project even in the presence of some problems in project files, so that users can still navigate it even if it cannot be built successfully. Change-Id: If938d43b4c02a3e90d3066e0c6820e6b63cc58d0 Reviewed-by: Joerg Bornemann --- src/plugins/qbsprojectmanager/qbsprojectparser.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp index 5192ad38ef7..e4fc351edf1 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp @@ -103,6 +103,8 @@ void QbsProjectParser::parse(const QVariantMap &config, const Environment &env, params.setSearchPaths(prefs.searchPaths(resourcesBaseDirectory())); params.setPluginPaths(prefs.pluginPaths(pluginsBaseDirectory())); params.setLibexecPath(libExecDirectory()); + params.setProductErrorMode(qbs::ErrorHandlingMode::Relaxed); + params.setPropertyCheckingMode(qbs::ErrorHandlingMode::Relaxed); m_qbsSetupProjectJob = m_project.setupProject(params, QbsManager::logSink(), 0); From 0301a703eca05dd3efadf8cbf4913e3b5ad4d201 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 22 Mar 2016 16:34:55 +0100 Subject: [PATCH 02/72] Debugger: Remove unneeded re-init of RunParameters::useTerminal ... and some dead code. Change-Id: I22fc6f8ecc09c4c3b928d7b7a510e762a54c0f8f Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerruncontrol.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 2cd3122f4e4..26d8fe4d4ce 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -332,10 +332,6 @@ void DebuggerRunControlCreator::enrich(const RunConfiguration *runConfig, const if (!kit && target) kit = target->kit(); - // Make sure we have something sensible to start with. - m_rp.inferior.runMode = ApplicationLauncher::Console; - m_rp.useTerminal = false; - // Extract as much as possible from available RunConfiguration. if (m_runConfig && m_runConfig->runnable().is()) { m_rp.inferior = m_runConfig->runnable().as(); From e16b02c68021a641186d54d638a6f924032b0c1f Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 22 Mar 2016 17:17:05 +0100 Subject: [PATCH 03/72] Debugger: Move kit guessing out of run control creation It's only used when starting with a -debug command line and when attaching to a running run control. No need to clutter the normal codepaths with it. Change-Id: Ib374c64a7f63fa79e88967573c37a5da1f415d50 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerplugin.cpp | 41 ++++++++++++++++ src/plugins/debugger/debuggerruncontrol.cpp | 52 +++------------------ 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 267821535fc..7a2acc923f5 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1073,6 +1073,42 @@ static QString msgParameterMissing(const QString &a) return DebuggerPlugin::tr("Option \"%1\" is missing the parameter.").arg(a); } +static Kit *guessKitFromParameters(const DebuggerRunParameters &rp) +{ + Kit *kit = 0; + + // Try to find a kit via ABI. + QList abis; + if (rp.toolChainAbi.isValid()) + abis.push_back(rp.toolChainAbi); + else if (!rp.inferior.executable.isEmpty()) + abis = Abi::abisOfBinary(FileName::fromString(rp.inferior.executable)); + + if (!abis.isEmpty()) { + // Try exact abis. + kit = KitManager::find(KitMatcher([abis](const Kit *k) -> bool { + if (const ToolChain *tc = ToolChainKitInformation::toolChain(k)) + return abis.contains(tc->targetAbi()) && DebuggerKitInformation::isValidDebugger(k); + return false; + })); + if (!kit) { + // Or something compatible. + kit = KitManager::find(KitMatcher([abis](const Kit *k) -> bool { + if (const ToolChain *tc = ToolChainKitInformation::toolChain(k)) + foreach (const Abi &a, abis) + if (a.isCompatibleWith(tc->targetAbi()) && DebuggerKitInformation::isValidDebugger(k)) + return true; + return false; + })); + } + } + + if (!kit) + kit = KitManager::defaultKit(); + + return kit; +} + bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, const QStringList::const_iterator &cend, QString *errorMessage) { @@ -1135,6 +1171,9 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, rp.inferior.environment = Utils::Environment::systemEnvironment(); rp.stubEnvironment = Utils::Environment::systemEnvironment(); rp.debuggerEnvironment = Utils::Environment::systemEnvironment(); + + if (!kit) + kit = guessKitFromParameters(rp); m_scheduledStarts.append(QPair(rp, kit)); return true; } @@ -2074,6 +2113,8 @@ void DebuggerPlugin::attachExternalApplication(RunControl *rc) if (const RunConfiguration *runConfiguration = rc->runConfiguration()) if (const Target *target = runConfiguration->target()) kit = target->kit(); + if (!kit) + kit = guessKitFromParameters(rp); createAndScheduleRun(rp, kit); } diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 26d8fe4d4ce..4e8388addab 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -321,6 +321,7 @@ void DebuggerRunControlCreator::initialize(const DebuggerStartParameters &sp) void DebuggerRunControlCreator::enrich(const RunConfiguration *runConfig, const Kit *kit) { m_runConfig = runConfig; + QTC_ASSERT(kit, return); Target *target = 0; Project *project = 0; @@ -329,9 +330,6 @@ void DebuggerRunControlCreator::enrich(const RunConfiguration *runConfig, const if (m_runConfig) target = m_runConfig->target(); - if (!kit && target) - kit = target->kit(); - // Extract as much as possible from available RunConfiguration. if (m_runConfig && m_runConfig->runnable().is()) { m_rp.inferior = m_runConfig->runnable().as(); @@ -347,46 +345,6 @@ void DebuggerRunControlCreator::enrich(const RunConfiguration *runConfig, const m_rp.inferior.executable = p.exe; } - if (!kit) { - // This code can only be reached when starting via the command line - // (-debug pid or executable) or attaching from runconfiguration - // without specifying a kit. Try to find a kit via ABI. - QList abis; - if (m_rp.toolChainAbi.isValid()) { - abis.push_back(m_rp.toolChainAbi); - } else if (!m_rp.inferior.executable.isEmpty()) { - abis = Abi::abisOfBinary(FileName::fromString(m_rp.inferior.executable)); - } - - if (!abis.isEmpty()) { - // Try exact abis. - kit = KitManager::find(KitMatcher([abis](const Kit *k) -> bool { - if (const ToolChain *tc = ToolChainKitInformation::toolChain(k)) - return abis.contains(tc->targetAbi()) && DebuggerKitInformation::isValidDebugger(k); - return false; - })); - if (!kit) { - // Or something compatible. - kit = KitManager::find(KitMatcher([abis](const Kit *k) -> bool { - if (const ToolChain *tc = ToolChainKitInformation::toolChain(k)) - foreach (const Abi &a, abis) - if (a.isCompatibleWith(tc->targetAbi()) && DebuggerKitInformation::isValidDebugger(k)) - return true; - return false; - })); - } - } - } - - if (!kit) - kit = KitManager::defaultKit(); - - // We really should have a kit now. - if (!kit) { - m_errors.append(DebuggerKitInformation::tr("No kit found.")); - return; - } - if (m_runConfig) { if (auto envAspect = m_runConfig->extraAspect()) { m_rp.inferior.environment = envAspect->environment(); // Correct. @@ -410,7 +368,7 @@ void DebuggerRunControlCreator::enrich(const RunConfiguration *runConfig, const if (project && m_rp.projectSourceFiles.isEmpty()) m_rp.projectSourceFiles = project->files(Project::SourceFiles); - if (false && project && kit) { + if (false && project) { const QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(kit); m_rp.nativeMixedEnabled = version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 7, 0); } @@ -616,7 +574,7 @@ public: // We cover only local setup here. Remote setups are handled by the // RunControl factories in the target specific plugins. DebuggerRunControlCreator creator; - creator.enrich(runConfig, 0); + creator.enrich(runConfig, runConfig->target()->kit()); creator.createRunControl(mode); if (errorMessage) *errorMessage = creator.fullError(); @@ -654,6 +612,7 @@ QObject *createDebuggerRunControlFactory(QObject *parent) */ DebuggerRunControl *createAndScheduleRun(const DebuggerRunParameters &rp, const Kit *kit) { + QTC_ASSERT(kit, return 0); // Caller needs to look for a suitable kit. DebuggerRunControlCreator creator; creator.m_rp = rp; creator.enrich(0, kit); @@ -677,9 +636,10 @@ DebuggerRunControl *createDebuggerRunControl(const DebuggerStartParameters &sp, QString *errorMessage, Core::Id runMode) { + QTC_ASSERT(runConfig, return 0); DebuggerRunControlCreator creator; creator.initialize(sp); - creator.enrich(runConfig, 0); + creator.enrich(runConfig, runConfig->target()->kit()); creator.createRunControl(runMode); if (errorMessage) *errorMessage = creator.fullError(); From 2cf72a628d5477853a9713ee6182b241299fd9a4 Mon Sep 17 00:00:00 2001 From: Nikita Baryshnikov Date: Tue, 22 Mar 2016 15:16:37 +0300 Subject: [PATCH 04/72] TextBrowserHelpViewer: cleanup removed loadResource which was left from 96e8f0bb7b4e289af45c17bf66026fca47b1e626. Change-Id: Ie1b00412104735b5f3e67939c99dc6cd68d85522 Reviewed-by: Eike Ziller --- src/plugins/help/textbrowserhelpviewer.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/help/textbrowserhelpviewer.h b/src/plugins/help/textbrowserhelpviewer.h index d71bf2b5ef8..11a78819a81 100644 --- a/src/plugins/help/textbrowserhelpviewer.h +++ b/src/plugins/help/textbrowserhelpviewer.h @@ -82,8 +82,6 @@ private slots: void goToHistoryItem(); private: - QVariant loadResource(int type, const QUrl &name); - TextBrowserHelpWidget *m_textBrowser; }; @@ -110,11 +108,11 @@ private: QString linkAt(const QPoint& pos); void openLink(const QUrl &url, bool newPage); -public: int zoomCount; bool forceFont; bool m_openInNewPageActionVisible; TextBrowserHelpViewer *m_parent; + friend class Help::Internal::TextBrowserHelpViewer; }; } // namespace Internal From 5f91cb0d68e1e4a446f4ce79165eca50f52f47a9 Mon Sep 17 00:00:00 2001 From: Nikita Baryshnikov Date: Fri, 24 Jul 2015 16:17:57 +0300 Subject: [PATCH 05/72] CppTools: fix metatype registration macro usage in places where we do not need it Change-Id: Ibf35f8144da859fffa3e0a7b6bb262284ec2292a Reviewed-by: Orgad Shaneh Reviewed-by: Nikolai Kosjar --- src/plugins/cppeditor/cppincludehierarchy_test.cpp | 2 -- src/plugins/cppeditor/cppquickfix_test.cpp | 2 -- src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp | 1 - src/plugins/cpptools/cpplocalsymbols_test.cpp | 1 - src/plugins/cpptools/cpplocatorfilter_test.cpp | 2 -- src/plugins/cpptools/cppmodelmanager.cpp | 2 -- src/plugins/cpptools/cppmodelmanager_test.cpp | 2 +- src/plugins/cpptools/functionutils.cpp | 2 -- src/plugins/cpptools/modelmanagertesthelper.cpp | 2 -- src/plugins/cpptools/symbolsearcher_test.cpp | 1 - 10 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/plugins/cppeditor/cppincludehierarchy_test.cpp b/src/plugins/cppeditor/cppincludehierarchy_test.cpp index ffef3a8b35e..8bb29f4123e 100644 --- a/src/plugins/cppeditor/cppincludehierarchy_test.cpp +++ b/src/plugins/cppeditor/cppincludehierarchy_test.cpp @@ -35,8 +35,6 @@ #include #include -Q_DECLARE_METATYPE(QList) - using namespace CPlusPlus; using namespace CppTools; diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index b592d9f9da8..ddd2b5097d4 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -315,8 +315,6 @@ typedef QSharedPointer CppQuickFixFactoryPtr; } // namespace CppEditor -Q_DECLARE_METATYPE(CppEditor::CppQuickFixFactoryPtr) - namespace CppEditor { namespace Internal { diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index c5bbf1f4499..b2e1c982949 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -89,7 +89,6 @@ public: }; typedef QList OverrideItemList; Q_DECLARE_METATYPE(OverrideItem) -Q_DECLARE_METATYPE(OverrideItemList) inline bool operator==(const OverrideItem &lhs, const OverrideItem &rhs) { diff --git a/src/plugins/cpptools/cpplocalsymbols_test.cpp b/src/plugins/cpptools/cpplocalsymbols_test.cpp index 7fb8a921e20..9183c9bfcdd 100644 --- a/src/plugins/cpptools/cpplocalsymbols_test.cpp +++ b/src/plugins/cpptools/cpplocalsymbols_test.cpp @@ -115,7 +115,6 @@ struct Result } // anonymous namespace Q_DECLARE_METATYPE(Result) -Q_DECLARE_METATYPE(QList) QT_BEGIN_NAMESPACE namespace QTest { diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp index b9b08f3d547..27258855d80 100644 --- a/src/plugins/cpptools/cpplocatorfilter_test.cpp +++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp @@ -48,8 +48,6 @@ using namespace CppTools::Internal; using namespace ExtensionSystem; using namespace Utils; -Q_DECLARE_METATYPE(ILocatorFilter *) - namespace { enum { debug = 0 }; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index cdf5922e424..13b582cfed0 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -67,8 +67,6 @@ #include #endif -Q_DECLARE_METATYPE(QSet) - static const bool DumpProjectInfo = qgetenv("QTC_DUMP_PROJECT_INFO") == "1"; using namespace CppTools; diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index 23042216310..92bbebf91da 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -57,7 +57,7 @@ using namespace ProjectExplorer; typedef CPlusPlus::Document Document; -Q_DECLARE_METATYPE(QVector) +Q_DECLARE_METATYPE(ProjectFile) namespace { diff --git a/src/plugins/cpptools/functionutils.cpp b/src/plugins/cpptools/functionutils.cpp index dd26c80f25d..b8224923a06 100644 --- a/src/plugins/cpptools/functionutils.cpp +++ b/src/plugins/cpptools/functionutils.cpp @@ -175,8 +175,6 @@ typedef QList VirtualityList; } // CppTools namespace Q_DECLARE_METATYPE(CppTools::Internal::Virtuality) -Q_DECLARE_METATYPE(CppTools::Internal::VirtualityList) -Q_DECLARE_METATYPE(QList) namespace CppTools { namespace Internal { diff --git a/src/plugins/cpptools/modelmanagertesthelper.cpp b/src/plugins/cpptools/modelmanagertesthelper.cpp index 38573fcf07e..f347cd81af4 100644 --- a/src/plugins/cpptools/modelmanagertesthelper.cpp +++ b/src/plugins/cpptools/modelmanagertesthelper.cpp @@ -33,8 +33,6 @@ #include -Q_DECLARE_METATYPE(QSet) - using namespace CppTools::Internal; using namespace CppTools::Tests; diff --git a/src/plugins/cpptools/symbolsearcher_test.cpp b/src/plugins/cpptools/symbolsearcher_test.cpp index 1eae1a9b9a7..dc71fa1562c 100644 --- a/src/plugins/cpptools/symbolsearcher_test.cpp +++ b/src/plugins/cpptools/symbolsearcher_test.cpp @@ -126,7 +126,6 @@ private: } // anonymous namespace Q_DECLARE_METATYPE(ResultData) -Q_DECLARE_METATYPE(ResultDataList) QT_BEGIN_NAMESPACE namespace QTest { From ffe939271e0bff155ccdcf05d265e8bdc083744d Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 12 Mar 2016 22:30:50 +0200 Subject: [PATCH 06/72] Utils: Fix SmallString deallocate with clang Change-Id: I131a5713e886e062d917112f2d2466e3752bed84 Reviewed-by: Nikolai Kosjar --- src/libs/utils/smallstringmemory.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/smallstringmemory.h b/src/libs/utils/smallstringmemory.h index f44ff6443be..4b1b3b4c7a4 100644 --- a/src/libs/utils/smallstringmemory.h +++ b/src/libs/utils/smallstringmemory.h @@ -46,13 +46,13 @@ inline void deallocate(char *memory) #ifdef WIN32 _aligned_free(memory); #else -#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic ignored "-Wfree-nonheap-object" +#endif std::free(memory); #pragma GCC diagnostic pop #endif -#endif } inline char *reallocate(char *oldMemory, std::size_t newSize) From 4ef953a83ab6143c1e2f0d4ea57a9c9d148ef8e1 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 24 Mar 2016 12:25:52 +0100 Subject: [PATCH 07/72] Icon exporter: Add filtering option Generation and optimization of all icons becomes slower with each added icon. Regex based filtering by element will save me time. Change-Id: I0d621e6ce78968d5a04d3f595f7c5ef60c129432 Reviewed-by: Alessandro Portale --- src/tools/icons/export.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/tools/icons/export.py b/src/tools/icons/export.py index 351942fb47a..6f140997146 100644 --- a/src/tools/icons/export.py +++ b/src/tools/icons/export.py @@ -30,7 +30,7 @@ # Each images is generated as normal and high resolution variant. # Each png file is afterwards optimized with optipng. -import sys, os, subprocess, xml.etree.ElementTree as ET +import sys, os, subprocess, re, xml.etree.ElementTree as ET from distutils import spawn scriptDir = os.path.dirname(os.path.abspath(sys.argv[0])) + '/' @@ -39,6 +39,10 @@ scriptDir = os.path.dirname(os.path.abspath(sys.argv[0])) + '/' qtcSourceRoot = os.getenv('QTC_SRC', os.path.abspath(scriptDir + '../../..')) \ .replace('\\', '/') + '/' +svgElementFilter = "" +if len(sys.argv) > 1: + svgElementFilter = sys.argv[1] + # Inkscape is required by this script inkscapeExecutable = spawn.find_executable("inkscape") if not inkscapeExecutable: @@ -55,7 +59,12 @@ for svgElement in svgTreeRoot.iter(): try: svgElementID = svgElement.attrib['id'] if svgElementID.startswith(('src/', 'share/')): - svgIDs.append(svgElementID) + if svgElementFilter != "": + pattern = re.compile(svgElementFilter) + if pattern.match(svgElementID): + svgIDs.append(svgElementID) + else: + svgIDs.append(svgElementID) except: pass From af55f36eafee454fb5ea07ecc5f35a974d52b2ae Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 24 Mar 2016 13:43:33 +0100 Subject: [PATCH 08/72] Debugger: Also copy fallback data on Copy View Contents to Editor Getting e.g. an object's address is better than an empty value. Change-Id: Ia78335da8b9eadeadc2e6f1757399ae604eb6610 Reviewed-by: Eike Ziller --- src/plugins/debugger/watchhandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 1337cb864f8..1b5486150c1 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1787,7 +1787,7 @@ static void showInEditorHelper(const WatchItem *item, QTextStream &ts, int depth { const QChar tab = QLatin1Char('\t'); const QChar nl = QLatin1Char('\n'); - ts << QString(depth, tab) << item->name << tab << item->value << tab + ts << QString(depth, tab) << item->name << tab << displayValue(item) << tab << item->type << nl; foreach (const TreeItem *child, item->children()) showInEditorHelper(static_cast(child), ts, depth + 1); From 259c3cb4d48cdfb11a17b51ae1df597f37841aac Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 24 Mar 2016 13:59:05 +0100 Subject: [PATCH 09/72] Debugger: Fix object leakage on shutdown and heap-use-after-free. Task-number: QTCREATORBUG-15938 Change-Id: I437756705c33730398a129651fabe34c92334656 Reviewed-by: Eike Ziller --- src/plugins/debugger/debuggermainwindow.cpp | 36 ++++++++----- src/plugins/debugger/debuggermainwindow.h | 14 ++---- src/plugins/debugger/debuggerplugin.cpp | 56 +++++++++++---------- src/plugins/valgrind/callgrindtool.cpp | 1 - 4 files changed, 56 insertions(+), 51 deletions(-) diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 54390d844d1..50778240bdf 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -81,9 +81,22 @@ DebuggerMainWindow::~DebuggerMainWindow() { // as we have to setParent(0) on dock widget that are not selected, // we keep track of all and make sure we don't leak any - foreach (const DockPtr &ptr, m_dockWidgets) { - if (ptr) - delete ptr.data(); + foreach (const Perspective &perspective, m_perspectiveForPerspectiveId) { + foreach (const Perspective::Operation &operation, perspective.operations()) { + if (operation.widget) { + // There are two possible states: Either addDockForWidget(widget) has + // been on operation.widget (e.g. when the perspective gets activated) + // for the first time, or not. In the first case we delete only the + // widget, in the second case its parent, which is the dock. + if (QWidget *parent = operation.widget->parentWidget()) { + QTC_CHECK(qobject_cast(parent)); + delete parent; + } else { + // These are from perspectives that never + delete operation.widget; + } + } + } } } @@ -119,11 +132,6 @@ QDockWidget *DebuggerMainWindow::dockWidget(const QByteArray &dockId) const return m_dockForDockId.value(dockId); } -QWidget *DebuggerMainWindow::modeWindow() -{ - return m_modeWindow; -} - void DebuggerMainWindow::resetCurrentPerspective() { loadPerspectiveHelper(m_currentPerspectiveId, false); @@ -140,7 +148,7 @@ void DebuggerMainWindow::restorePerspective(const QByteArray &perspectiveId) m_perspectiveChooser->setCurrentIndex(index); } -void DebuggerMainWindow::finalizeSetup(Core::IMode *mode, QWidget *central) +void DebuggerMainWindow::finalizeSetup() { auto viewButton = new QToolButton; viewButton->setText(tr("Views")); @@ -195,7 +203,10 @@ void DebuggerMainWindow::finalizeSetup(Core::IMode *mode, QWidget *central) m_toolbarDock = dock; addDockWidget(Qt::BottomDockWidgetArea, dock); +} +QWidget *createModeWindow(Core::IMode *mode, DebuggerMainWindow *mainWindow, QWidget *central) +{ if (!central) central = new EditorManagerPlaceHolder(mode); @@ -225,7 +236,7 @@ void DebuggerMainWindow::finalizeSetup(Core::IMode *mode, QWidget *central) // Right-side window with editor, output etc. auto mainWindowSplitter = new MiniSplitter; - mainWindowSplitter->addWidget(this); + mainWindowSplitter->addWidget(mainWindow); mainWindowSplitter->addWidget(new OutputPanePlaceHolder(mode, mainWindowSplitter)); auto outputPane = new OutputPanePlaceHolder(mode, mainWindowSplitter); outputPane->setObjectName(QLatin1String("DebuggerOutputPanePlaceHolder")); @@ -242,9 +253,9 @@ void DebuggerMainWindow::finalizeSetup(Core::IMode *mode, QWidget *central) splitter->setStretchFactor(0, 0); splitter->setStretchFactor(1, 1); splitter->setObjectName(QLatin1String("DebugModeWidget")); - setCentralWidget(centralEditorWidget); + mainWindow->setCentralWidget(centralEditorWidget); - m_modeWindow = splitter; + return splitter; } void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId, bool fromStoredSettings) @@ -351,7 +362,6 @@ QDockWidget *DebuggerMainWindow::registerDockWidget(const QByteArray &dockId, QW QTC_ASSERT(!widget->objectName().isEmpty(), return 0); QDockWidget *dockWidget = addDockForWidget(widget); dockWidget->setParent(0); - m_dockWidgets.append(DebuggerMainWindow::DockPtr(dockWidget)); m_dockForDockId[dockId] = dockWidget; return dockWidget; } diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index 3c7d221a59a..28bb312580b 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -61,7 +61,7 @@ public: Qt::DockWidgetArea area = Qt::BottomDockWidgetArea); QByteArray dockId; - QWidget *widget = 0; + QPointer widget; QByteArray anchorDockId; OperationType operationType; bool visibleByDefault; @@ -115,14 +115,12 @@ public: void resetCurrentPerspective(); void restorePerspective(const QByteArray &perspectiveId); - void finalizeSetup(Core::IMode *mode, QWidget *central = 0); + void finalizeSetup(); void showStatusMessage(const QString &message, int timeoutMS); QDockWidget *dockWidget(const QByteArray &dockId) const; QByteArray currentPerspective() const { return m_currentPerspectiveId; } - QWidget *modeWindow(); - private: QDockWidget *registerDockWidget(const QByteArray &dockId, QWidget *widget); void loadPerspectiveHelper(const QByteArray &perspectiveId, bool fromStoredSettings = true); @@ -136,14 +134,10 @@ private: QHash m_dockForDockId; QHash m_toolbarForPerspectiveId; QHash m_perspectiveForPerspectiveId; - - // list of dock widgets to prevent memory leak - typedef QPointer DockPtr; - QList m_dockWidgets; - - QWidget *m_modeWindow = 0; }; +QWidget *createModeWindow(Core::IMode *mode, DebuggerMainWindow *mainWindow, QWidget *central); + } // Utils #endif // DEBUGGERMAINWINDOW_H diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 7a2acc923f5..20b093a635d 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -486,41 +486,27 @@ bool DummyEngine::hasCapability(unsigned cap) const class DebugModeContext : public IContext { public: - DebugModeContext(DebuggerMainWindow *mainWindow) : m_mainWindow(mainWindow) + DebugModeContext(QWidget *modeWindow) { setContext(Context(CC::C_EDITORMANAGER)); + setWidget(modeWindow); ICore::addContextObject(this); } - - QWidget *widget() const override { return m_mainWindow->modeWindow(); } - - DebuggerMainWindow *m_mainWindow; }; class DebugMode : public IMode { public: - DebugMode(DebuggerMainWindow *mainWindow) : m_mainWindow(mainWindow) + DebugMode() { setObjectName(QLatin1String("DebugMode")); setContext(Context(C_DEBUGMODE, CC::C_NAVIGATION_PANE)); setDisplayName(DebuggerPlugin::tr("Debug")); setIcon(Utils::Icon::modeIcon(Icons::MODE_DEBUGGER_CLASSIC, Icons::MODE_DEBUGGER_FLAT, Icons::MODE_DEBUGGER_FLAT_ACTIVE)); -// setIcon(Utils::Icon::modeIcon(Icons::MODE_ANALYZE_CLASSIC, -// Icons::MODE_ANALYZE_FLAT, Icons::MODE_ANALYZE_FLAT_ACTIVE)); setPriority(85); setId(MODE_DEBUG); } - - QWidget *widget() const override { return m_mainWindow->modeWindow(); } - - ~DebugMode() - { -// delete m_widget; - } - - DebuggerMainWindow *m_mainWindow; }; /////////////////////////////////////////////////////////////////////// @@ -924,7 +910,9 @@ public: void updateActiveLanguages(); public: - DebuggerMainWindow *m_mainWindow = 0; + QPointer m_mainWindow; + QPointer m_modeWindow; + QPointer m_mode; QHash m_descriptions; ActionContainer *m_menu = 0; @@ -1051,11 +1039,6 @@ DebuggerPluginPrivate::~DebuggerPluginPrivate() delete m_breakHandler; m_breakHandler = 0; - -// delete m_debugMode; -// m_debugMode = 0; - delete m_mainWindow; - m_mainWindow = 0; } DebuggerEngine *DebuggerPluginPrivate::dummyEngine() @@ -1748,13 +1731,16 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, this, &DebuggerPluginPrivate::updateDebugWithoutDeployMenu); + m_mainWindow->finalizeSetup(); + // Debug mode setup - auto mode = new DebugMode(m_mainWindow); + m_mode = new DebugMode; + m_modeWindow = createModeWindow(m_mode, m_mainWindow, 0); + m_mode->setWidget(m_modeWindow); (void) new DebugModeContext(m_mainWindow); - m_mainWindow->finalizeSetup(mode); - m_plugin->addAutoReleasedObject(mode); + m_plugin->addObject(m_mode); connect(SessionManager::instance(), &SessionManager::startupProjectChanged, @@ -3047,6 +3033,23 @@ void DebuggerPluginPrivate::aboutToShutdown() disconnect(SessionManager::instance(), SIGNAL(startupProjectChanged(ProjectExplorer::Project*)), this, 0); + + m_mainWindow->saveCurrentPerspective(); + delete m_mainWindow; + m_mainWindow = 0; + + // removeObject leads to aboutToRemoveObject, which leads to + // ModeManager::aboutToRemove, which leads to the mode manager + // removing the mode's widget from the stackwidget + // (currently by index, but possibly the stackwidget resets the + // parent and stuff on the widget) + m_plugin->removeObject(m_mode); + + delete m_modeWindow; + m_modeWindow = 0; + + delete m_mode; + m_mode = 0; } void updateState(DebuggerEngine *engine) @@ -3214,7 +3217,6 @@ IPlugin::ShutdownFlag DebuggerPlugin::aboutToShutdown() { removeObject(this); dd->aboutToShutdown(); - dd->m_mainWindow->saveCurrentPerspective(); return SynchronousShutdown; } diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index d13659146e2..f72c3f1bbc2 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -503,7 +503,6 @@ CallgrindTool::CallgrindTool(QObject *parent) CallgrindTool::~CallgrindTool() { qDeleteAll(m_textMarks); - doClear(false); } void CallgrindTool::slotGoToOverview() From 9ddf44cb9a388b83bd27bf4bd6c817a7f719ef53 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 24 Mar 2016 15:23:48 +0100 Subject: [PATCH 10/72] QmlProfiler: remove dead code Change-Id: I9f55fa23056b33fe55d0621058978aa45b0fa622 Reviewed-by: hjk --- src/plugins/qmlprofiler/qmlprofilertraceview.cpp | 6 ------ src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp | 13 ------------- 2 files changed, 19 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp index 048a76033f9..552a8ad18cf 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp @@ -71,16 +71,10 @@ class QmlProfilerTraceView::QmlProfilerTraceViewPrivate public: QmlProfilerTraceViewPrivate(QmlProfilerTraceView *qq) : q(qq) {} QmlProfilerTraceView *q; - QmlProfilerViewManager *m_viewContainer; - - QSize m_sizeHint; - QQuickWidget *m_mainView; QmlProfilerModelManager *m_modelManager; Timeline::TimelineModelAggregator *m_modelProxy; - - Timeline::TimelineZoomControl *m_zoomControl; }; diff --git a/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp b/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp index 1c4a67e5b93..22fb59934ed 100644 --- a/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp @@ -34,7 +34,6 @@ #include #include -#include #include #include @@ -81,8 +80,6 @@ void QmlProfilerViewManager::createViews() QTC_ASSERT(d->profilerModelManager, return); QTC_ASSERT(d->profilerState, return); - //Utils::FancyMainWindow *mw = Debugger::mainWindow(); - d->traceView = new QmlProfilerTraceView(0, this, d->profilerModelManager); d->traceView->setWindowTitle(tr("Timeline")); connect(d->traceView, &QmlProfilerTraceView::gotoSourceLocation, @@ -103,11 +100,6 @@ void QmlProfilerViewManager::createViews() if (d->eventsViewFactory) d->eventsViews.append(d->eventsViewFactory->create(0, d->profilerModelManager)); - // Clear settings if the new views aren't there yet. Otherwise we get glitches - QSettings *settings = Core::ICore::settings(); - settings->beginGroup(QLatin1String("AnalyzerViewSettings_") + - QLatin1String(QmlProfiler::Constants::QmlProfilerPerspectiveId)); - foreach (QmlProfilerEventsView *view, d->eventsViews) { connect(view, &QmlProfilerEventsView::typeSelected, this, &QmlProfilerViewManager::typeSelected); @@ -122,14 +114,9 @@ void QmlProfilerViewManager::createViews() QByteArray dockId = view->objectName().toLatin1(); perspective.addOperation({dockId, view, Constants::QmlProfilerTimelineDockId, Perspective::AddToTab}); new QmlProfilerStateWidget(d->profilerState, d->profilerModelManager, view); - -// if (!settings->contains(view->parent()->objectName())) // parent() is QDockWidget. -// settings->remove(QString()); } perspective.addOperation({Constants::QmlProfilerTimelineDockId, 0, {}, Perspective::Raise}); Debugger::registerPerspective(Constants::QmlProfilerPerspectiveId, perspective); - - settings->endGroup(); } bool QmlProfilerViewManager::hasValidSelection() const From 658d29335b27af40c7162953c5733b4f082b3941 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 20 Mar 2016 12:27:51 +0200 Subject: [PATCH 11/72] Debugger: Re-enable item selection in watches for core dump In 7de7eb6bcada805eff176634e8131c4914e1213d the behavior on Unrunnable state was changed, probably by mistake. AddWatcherWhileRunningCapability should allow adding watchers while running, but it should not prevent selection when not supported and the inferior is not running. Another missing part was that Unrunnable was considered running, although it shouldn't. Change-Id: I7d27b81977a6921919327b3122a865b7ffa2d0bd Reviewed-by: hjk --- src/plugins/debugger/watchhandler.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 1b5486150c1..4852bf1c978 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1078,16 +1078,24 @@ Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const const Qt::ItemFlags notEditable = Qt::ItemIsSelectable | Qt::ItemIsEnabled; const Qt::ItemFlags editable = notEditable | Qt::ItemIsEditable; + bool isRunning = true; + switch (state) { + case InferiorStopOk: + case InferiorUnrunnable: + case DebuggerNotReady: + case DebuggerFinished: + isRunning = false; + break; + default: + break; + } if (item->isWatcher()) { if (state == InferiorUnrunnable) return (column == 0 && item->iname.count('.') == 1) ? editable : notEditable; - if (state != InferiorStopOk - && state != DebuggerNotReady - && state != DebuggerFinished - && !m_engine->hasCapability(AddWatcherWhileRunningCapability)) - return Qt::ItemFlags(); + if (isRunning && !m_engine->hasCapability(AddWatcherWhileRunningCapability)) + return notEditable; if (column == 0 && item->iname.count('.') == 1) return editable; // Watcher names are editable. if (column == 1 && item->arrayIndex >= 0) @@ -1101,8 +1109,10 @@ Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const return editable; // Watcher values are sometimes editable. } } else if (item->isLocal()) { - if (state != InferiorStopOk && !m_engine->hasCapability(AddWatcherWhileRunningCapability)) - return Qt::ItemFlags(); + if (state == InferiorUnrunnable) + return notEditable; + if (isRunning && !m_engine->hasCapability(AddWatcherWhileRunningCapability)) + return notEditable; if (column == 1 && item->valueEditable && !item->elided) return editable; // Locals values are sometimes editable. if (column == 1 && item->arrayIndex >= 0) From fb137ade7d93955a930ca9ba21f55dfd6b599f08 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Thu, 24 Mar 2016 11:03:25 +0100 Subject: [PATCH 12/72] Fix crash in VariableChooser fce83bd9f84883f93829e6ca9eacf098b018a02d in qtbase causes a crash: setModel creates a new selection model, which calls currentChanged, which accesses an uninitialized member. Hence, protect the access to it. Change-Id: I144f40aa4286f1a9edba24519a30c08ff5091f57 Reviewed-by: hjk --- src/plugins/coreplugin/variablechooser.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index 09aa1c8c4a4..92b1caa7f7f 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -245,7 +245,10 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) : q(parent), m_lineEdit(0), m_textEdit(0), - m_plainTextEdit(0) + m_plainTextEdit(0), + m_iconButton(0), + m_variableTree(0), + m_variableDescription(0) { m_defaultDescription = VariableChooser::tr("Select a variable to insert."); @@ -408,7 +411,8 @@ void VariableChooser::addSupportForChildWidgets(QWidget *parent, MacroExpander * */ void VariableChooserPrivate::updateDescription(const QModelIndex &index) { - m_variableDescription->setText(m_model.data(index, Qt::ToolTipRole).toString()); + if (m_variableDescription) + m_variableDescription->setText(m_model.data(index, Qt::ToolTipRole).toString()); } /*! From f9a49118dd2ae5f0f179f914d7a7150bca8b320b Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Fri, 25 Mar 2016 10:06:18 +0300 Subject: [PATCH 13/72] Valgrind: Remove unused and unimplemented function Change-Id: I5f7571f5f275881b67556ed1d53589bd5a7d0110 Reviewed-by: hjk --- src/plugins/valgrind/memchecktool.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index a0e4b539d1d..412418d2023 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -249,8 +249,6 @@ class MemcheckTool : public QObject public: MemcheckTool(QObject *parent); - void createWidgets(); - MemcheckRunControl *createRunControl(ProjectExplorer::RunConfiguration *runConfiguration, Core::Id runMode); From 93ef19b232cd0da91d56f0032030df487b56d900 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 24 Mar 2016 20:55:28 +0100 Subject: [PATCH 14/72] iOS: Set the proper runcontrol icon This is the only RunControl which set another icon than ProjectExplorer::Icons::RUN_SMALL. I assume that was a mistake. Change-Id: I1c31909827c03b2c9b7acb0488eb269ef30c2a34 Reviewed-by: hjk --- src/plugins/ios/iosruncontrol.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/ios/iosruncontrol.cpp b/src/plugins/ios/iosruncontrol.cpp index 90b276119c4..47e019a6e6b 100644 --- a/src/plugins/ios/iosruncontrol.cpp +++ b/src/plugins/ios/iosruncontrol.cpp @@ -28,8 +28,8 @@ #include "iosrunconfiguration.h" #include "iosrunner.h" -#include #include +#include using namespace ProjectExplorer; @@ -41,7 +41,7 @@ IosRunControl::IosRunControl(IosRunConfiguration *rc) , m_runner(new IosRunner(this, rc, false, QmlDebug::NoQmlDebugServices)) , m_running(false) { - setIcon(Core::Icons::DEBUG_START_SMALL); + setIcon(Icons::RUN_SMALL); } IosRunControl::~IosRunControl() From e13f1a5047169a394571da2799e0e9171250e069 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 13 Mar 2016 22:15:19 +0200 Subject: [PATCH 15/72] Debugger: Fix memory leaks Detected by memcheck. Change-Id: I56c0c39f3aa2251d6425ddc9388fdebc511d7f47 Reviewed-by: hjk --- src/plugins/debugger/console/console.cpp | 2 +- src/plugins/debugger/debuggerplugin.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/debugger/console/console.cpp b/src/plugins/debugger/console/console.cpp index 25bed9768bf..3ea294ef3e5 100644 --- a/src/plugins/debugger/console/console.cpp +++ b/src/plugins/debugger/console/console.cpp @@ -57,7 +57,7 @@ namespace Internal { Console::Console() { - m_consoleItemModel = new ConsoleItemModel; + m_consoleItemModel = new ConsoleItemModel(this); m_consoleWidget = new QWidget; m_consoleWidget->setWindowTitle(displayName()); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 20b093a635d..5b447cc4398 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1738,7 +1738,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, m_modeWindow = createModeWindow(m_mode, m_mainWindow, 0); m_mode->setWidget(m_modeWindow); - (void) new DebugModeContext(m_mainWindow); + m_plugin->addAutoReleasedObject(new DebugModeContext(m_mainWindow)); m_plugin->addObject(m_mode); @@ -3523,7 +3523,7 @@ void registerToolbar(const QByteArray &perspectiveId, const ToolbarDescription & QAction *createStartAction() { - auto action = new QAction(DebuggerMainWindow::tr("Start"), 0); + auto action = new QAction(DebuggerMainWindow::tr("Start"), DebuggerPlugin::instance()); action->setIcon(Debugger::Icons::ANALYZER_CONTROL_START.icon()); action->setEnabled(true); return action; @@ -3531,7 +3531,7 @@ QAction *createStartAction() QAction *createStopAction() { - auto action = new QAction(DebuggerMainWindow::tr("Stop"), 0); + auto action = new QAction(DebuggerMainWindow::tr("Stop"), DebuggerPlugin::instance()); action->setIcon(ProjectExplorer::Icons::STOP_SMALL.icon()); action->setEnabled(true); return action; From 0a89b89065b633cfb4f5dc8c9fd38240b38e53a8 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 14 Mar 2016 10:03:04 +0200 Subject: [PATCH 16/72] Valgrind: Fix memory leaks Detected by memcheck. Change-Id: I7eaf4cf7ee2b4c03b03bfc1bbc2d49c68612b6ad Reviewed-by: hjk --- src/plugins/valgrind/callgrindtool.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index f72c3f1bbc2..2fbb4958dea 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -442,6 +442,7 @@ CallgrindTool::CallgrindTool(QObject *parent) auto button = new QToolButton; button->setMenu(menu); + menu->setParent(button); button->setPopupMode(QToolButton::InstantPopup); button->setText(QLatin1String("$")); button->setToolTip(tr("Cost Format")); From 9af85186e67d44417249da9325b0a65203e92201 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 28 Mar 2016 20:39:44 +0200 Subject: [PATCH 17/72] Icons: More visible "puched edge" Overlayed icons are not clearly enough visible. This was mentioned by Diana and by several users. This change fixes that. Change-Id: If3e767b5248c9802a1e3d255f6d314660a4efff6 Reviewed-by: Alessandro Portale --- src/libs/utils/icon.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/icon.cpp b/src/libs/utils/icon.cpp index e1e641baf73..37b6878c963 100644 --- a/src/libs/utils/icon.cpp +++ b/src/libs/utils/icon.cpp @@ -38,6 +38,9 @@ namespace Utils { +static const qreal PunchEdgeWidth = 0.5; +static const qreal PunchEdgeIntensity = 0.6; + static QPixmap maskToColorAndAlpha(const QPixmap &mask, const QColor &color) { QImage result(mask.toImage().convertToFormat(QImage::Format_ARGB32)); @@ -95,9 +98,9 @@ static QPixmap combinedMask(const MasksAndColors &masks, Icon::IconStyleOptions for (;maskImage != masks.constEnd(); ++maskImage) { if (style & Icon::PunchEdges) { p.save(); - p.setOpacity(0.4); + p.setOpacity(PunchEdgeIntensity); p.setCompositionMode(QPainter::CompositionMode_Lighten); - smearPixmap(&p, maskToColorAndAlpha((*maskImage).first, Qt::white), 0.5); + smearPixmap(&p, maskToColorAndAlpha((*maskImage).first, Qt::white), PunchEdgeWidth); p.restore(); } p.drawPixmap(0, 0, (*maskImage).first); @@ -118,9 +121,9 @@ static QPixmap masksToIcon(const MasksAndColors &masks, const QPixmap &combinedM if (style & Icon::PunchEdges && maskImage != masks.constBegin()) { // Punch a transparent outline around an overlay. p.save(); - p.setOpacity(0.4); + p.setOpacity(PunchEdgeIntensity); p.setCompositionMode(QPainter::CompositionMode_DestinationOut); - smearPixmap(&p, maskToColorAndAlpha((*maskImage).first, Qt::white), 0.5); + smearPixmap(&p, maskToColorAndAlpha((*maskImage).first, Qt::white), PunchEdgeWidth); p.restore(); } p.drawPixmap(0, 0, maskToColorAndAlpha((*maskImage).first, (*maskImage).second)); From 35bafd39529c7710f5be3142d0b23a89d36a3a61 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 18 Mar 2016 17:43:33 +0100 Subject: [PATCH 18/72] QmlJS: Fix resolution of "alias" directives in qrc files Previously qrc paths of QML/JS documents were not considered for implicit imports. Only the path of the document in the file system was considered. The QML engine, however, doesn't know the original path at all and only uses the qrc paths for import resolution. This created a mismatch between what the QML engine could recognize and what the code model suggested. Without alias directives, any files imported from a qrc file would have to reside in the same directory as the one implicitly importing them, so this arrangement happened to work, most of the time. In order to support aliases we have to search the files in the same qrc path to figure out the imports. To do that, we keep a reverse map of qrc paths to files in the QrcParser and iterate that when resolving imports. Change-Id: I84baae6cbfbe96ddd5322c81494c1e4a3f473f3f Reviewed-by: Eike Ziller Reviewed-by: Tobias Hunger --- src/libs/qmljs/qmljsinterpreter.cpp | 8 ++ src/libs/qmljs/qmljsinterpreter.h | 1 + src/libs/qmljs/qmljslink.cpp | 23 +++-- src/libs/qmljs/qmljsmodelmanagerinterface.cpp | 83 +++++++++---------- src/libs/qmljs/qmljsmodelmanagerinterface.h | 6 ++ src/libs/qmljs/qmljsqrcparser.cpp | 46 ++++++++-- src/libs/qmljs/qmljsqrcparser.h | 4 + 7 files changed, 114 insertions(+), 57 deletions(-) diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 00959abc307..078ee96ad8c 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -2277,6 +2277,14 @@ ImportInfo ImportInfo::implicitDirectoryImport(const QString &directory) return info; } +ImportInfo ImportInfo::qrcDirectoryImport(const QString &directory) +{ + ImportInfo info; + info.m_type = ImportType::QrcDirectory; + info.m_path = directory; + return info; +} + bool ImportInfo::isValid() const { return m_type != ImportType::Invalid; diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 4ceece5e3da..02e22e2f4cb 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -1002,6 +1002,7 @@ public: const QString &as, AST::UiImport *ast = 0); static ImportInfo invalidImport(AST::UiImport *ast = 0); static ImportInfo implicitDirectoryImport(const QString &directory); + static ImportInfo qrcDirectoryImport(const QString &directory); bool isValid() const; ImportType::Enum type() const; diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 1f3045a675a..f46b228547b 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -575,16 +575,23 @@ void LinkPrivate::loadQmldirComponents(ObjectValue *import, ComponentVersion ver void LinkPrivate::loadImplicitDirectoryImports(Imports *imports, Document::Ptr doc) { - ImportInfo implcitDirectoryImportInfo = ImportInfo::implicitDirectoryImport(doc->path()); - - Import directoryImport = importCache.value(ImportCacheKey(implcitDirectoryImportInfo)); - if (!directoryImport.object) { - directoryImport = importFileOrDirectory(doc, implcitDirectoryImportInfo); + auto processImport = [this, imports, doc](const ImportInfo &importInfo){ + Import directoryImport = importCache.value(ImportCacheKey(importInfo)); + if (!directoryImport.object) { + directoryImport = importFileOrDirectory(doc, importInfo); + if (directoryImport.object) + importCache.insert(ImportCacheKey(importInfo), directoryImport); + } if (directoryImport.object) - importCache.insert(ImportCacheKey(implcitDirectoryImportInfo), directoryImport); + imports->append(directoryImport); + }; + + processImport(ImportInfo::implicitDirectoryImport(doc->path())); + foreach (const QString &path, + ModelManagerInterface::instance()->qrcPathsForFile(doc->fileName())) { + processImport(ImportInfo::qrcDirectoryImport( + QrcParser::qrcDirectoryPathForQrcFilePath(path))); } - if (directoryImport.object) - imports->append(directoryImport); } void LinkPrivate::loadImplicitDefaultImports(Imports *imports) diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp index de0ad9d61a5..75cea106844 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp @@ -427,46 +427,10 @@ bool pInfoLessThanImports(const ModelManagerInterface::ProjectInfo &p1, const Mo } -QStringList ModelManagerInterface::filesAtQrcPath(const QString &path, const QLocale *locale, - ProjectExplorer::Project *project, - QrcResourceSelector resources) +void ModelManagerInterface::iterateQrcFiles(ProjectExplorer::Project *project, + QrcResourceSelector resources, + std::function callback) { - QString normPath = QrcParser::normalizedQrcFilePath(path); - QList pInfos; - if (project) - pInfos.append(projectInfo(project)); - else - pInfos = projectInfos(); - - QStringList res; - QSet pathsChecked; - foreach (const ModelManagerInterface::ProjectInfo &pInfo, pInfos) { - QStringList qrcFilePaths; - if (resources == ActiveQrcResources) - qrcFilePaths = pInfo.activeResourceFiles; - else - qrcFilePaths = pInfo.allResourceFiles; - foreach (const QString &qrcFilePath, qrcFilePaths) { - if (pathsChecked.contains(qrcFilePath)) - continue; - pathsChecked.insert(qrcFilePath); - QrcParser::ConstPtr qrcFile = m_qrcCache.parsedPath(qrcFilePath); - if (qrcFile.isNull()) - continue; - qrcFile->collectFilesAtPath(normPath, &res, locale); - } - } - res.sort(); // make the result predictable - return res; -} - -QMap ModelManagerInterface::filesInQrcPath(const QString &path, - const QLocale *locale, - ProjectExplorer::Project *project, - bool addDirs, - QrcResourceSelector resources) -{ - QString normPath = QrcParser::normalizedQrcDirectoryPath(path); QList pInfos; if (project) { pInfos.append(projectInfo(project)); @@ -477,7 +441,7 @@ QMap ModelManagerInterface::filesInQrcPath(const QString & else qSort(pInfos.begin(), pInfos.end(), &pInfoLessThanAll); } - QMap res; + QSet pathsChecked; foreach (const ModelManagerInterface::ProjectInfo &pInfo, pInfos) { QStringList qrcFilePaths; @@ -490,12 +454,47 @@ QMap ModelManagerInterface::filesInQrcPath(const QString & continue; pathsChecked.insert(qrcFilePath); QrcParser::ConstPtr qrcFile = m_qrcCache.parsedPath(qrcFilePath); - if (qrcFile.isNull()) continue; - qrcFile->collectFilesInPath(normPath, &res, addDirs, locale); + callback(qrcFile); } } +} + +QStringList ModelManagerInterface::qrcPathsForFile(const QString &file, const QLocale *locale, + ProjectExplorer::Project *project, + QrcResourceSelector resources) +{ + QStringList res; + iterateQrcFiles(project, resources, [&](QrcParser::ConstPtr qrcFile) { + qrcFile->collectResourceFilesForSourceFile(file, &res, locale); + }); + return res; +} + +QStringList ModelManagerInterface::filesAtQrcPath(const QString &path, const QLocale *locale, + ProjectExplorer::Project *project, + QrcResourceSelector resources) +{ + QString normPath = QrcParser::normalizedQrcFilePath(path); + QStringList res; + iterateQrcFiles(project, resources, [&](QrcParser::ConstPtr qrcFile) { + qrcFile->collectFilesAtPath(normPath, &res, locale); + }); + return res; +} + +QMap ModelManagerInterface::filesInQrcPath(const QString &path, + const QLocale *locale, + ProjectExplorer::Project *project, + bool addDirs, + QrcResourceSelector resources) +{ + QString normPath = QrcParser::normalizedQrcDirectoryPath(path); + QMap res; + iterateQrcFiles(project, resources, [&](QrcParser::ConstPtr qrcFile) { + qrcFile->collectFilesInPath(normPath, &res, addDirs, locale); + }); return res; } diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h index 690b178ec8a..ceeacc94f22 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.h +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h @@ -153,6 +153,9 @@ public: bool emitDocumentOnDiskChanged); void fileChangedOnDisk(const QString &path); void removeFiles(const QStringList &files); + QStringList qrcPathsForFile(const QString &file, const QLocale *locale = 0, + ProjectExplorer::Project *project = 0, + QrcResourceSelector resources = AllQrcResources); QStringList filesAtQrcPath(const QString &path, const QLocale *locale = 0, ProjectExplorer::Project *project = 0, QrcResourceSelector resources = AllQrcResources); @@ -250,6 +253,9 @@ protected: private: void cleanupFutures(); + void iterateQrcFiles(ProjectExplorer::Project *project, + QrcResourceSelector resources, + std::function callback); mutable QMutex m_mutex; QmlJS::Snapshot m_validSnapshot; diff --git a/src/libs/qmljs/qmljsqrcparser.cpp b/src/libs/qmljs/qmljsqrcparser.cpp index 7439343f71a..6b07fc1d135 100644 --- a/src/libs/qmljs/qmljsqrcparser.cpp +++ b/src/libs/qmljs/qmljsqrcparser.cpp @@ -74,6 +74,9 @@ public: bool hasDirAtPath(const QString &path, const QLocale *locale = 0) const; void collectFilesInPath(const QString &path, QMap *res, bool addDirs = false, const QLocale *locale = 0) const; + void collectResourceFilesForSourceFile(const QString &sourceFile, QStringList *res, + const QLocale *locale = 0) const; + QStringList errorMessages() const; QStringList languages() const; private: @@ -81,6 +84,7 @@ private: QStringList allUiLanguages(const QLocale *locale) const; SMap m_resources; + SMap m_files; QStringList m_languages; QStringList m_errorMessages; }; @@ -130,6 +134,11 @@ QString QrcParser::normalizedQrcDirectoryPath(const QString &path) { return normPath; } +QString QrcParser::qrcDirectoryPathForQrcFilePath(const QString &file) +{ + return file.left(file.lastIndexOf(QLatin1Char('/'))); +} + QrcParser::QrcParser() { d = new Internal::QrcParserPrivate(this); @@ -181,6 +190,12 @@ void QrcParser::collectFilesInPath(const QString &path, QMapcollectFilesInPath(path, res, addDirs, locale); } +void QrcParser::collectResourceFilesForSourceFile(const QString &sourceFile, QStringList *res, + const QLocale *locale) const +{ + d->collectResourceFilesForSourceFile(sourceFile, res, locale); +} + /*! \brief returns the errors found while parsing */ QStringList QrcParser::errorMessages() const @@ -297,13 +312,12 @@ bool QrcParserPrivate::parseFile(const QString &path) accessPath = language + prefix + alias; else accessPath = language + prefix + fileName; - if (m_resources.contains(accessPath)) { - QStringList &val = m_resources[accessPath]; - if (!val.contains(filePath)) - val.append(filePath); - } else { - m_resources.insert(accessPath, QStringList(filePath)); - } + QStringList &resources = m_resources[accessPath]; + if (!resources.contains(filePath)) + resources.append(filePath); + QStringList &files = m_files[filePath]; + if (!files.contains(accessPath)) + files.append(accessPath); } } return true; @@ -388,6 +402,24 @@ void QrcParserPrivate::collectFilesInPath(const QString &path, QMapcontains(resource)) + results->append(resource); + } + } +} + QStringList QrcParserPrivate::errorMessages() const { return m_errorMessages; diff --git a/src/libs/qmljs/qmljsqrcparser.h b/src/libs/qmljs/qmljsqrcparser.h index 19bd4d0f78c..653cf4c0cf3 100644 --- a/src/libs/qmljs/qmljsqrcparser.h +++ b/src/libs/qmljs/qmljsqrcparser.h @@ -53,6 +53,9 @@ public: bool hasDirAtPath(const QString &path, const QLocale *locale = 0) const; void collectFilesInPath(const QString &path, QMap *res, bool addDirs = false, const QLocale *locale = 0) const; + void collectResourceFilesForSourceFile(const QString &sourceFile, QStringList *results, + const QLocale *locale = 0) const; + QStringList errorMessages() const; QStringList languages() const; bool isValid() const; @@ -60,6 +63,7 @@ public: static Ptr parseQrcFile(const QString &path); static QString normalizedQrcFilePath(const QString &path); static QString normalizedQrcDirectoryPath(const QString &path); + static QString qrcDirectoryPathForQrcFilePath(const QString &file); private: QrcParser(); QrcParser(const QrcParser &); From 34b18c699c8ab85437031e3b02841cdf3275a854 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 29 Mar 2016 11:59:36 +0200 Subject: [PATCH 19/72] CMake: Normalize file paths before comparing them On windows we got false negatives due to one path starting with "C:" and the other with "c:". Use Utils::FileName which should do the right thing. Change-Id: I7dcf8ad3f61caca7ac7c183d492ebfd57fe1b669 Reviewed-by: Cristian Adam Reviewed-by: Tobias Hunger --- src/plugins/cmakeprojectmanager/builddirmanager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 181ca556a7c..df106d5d224 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -280,7 +280,9 @@ CMakeConfig BuildDirManager::parsedConfiguration() const CMakeConfig result = parseConfiguration(cacheFile, &errorMessage); if (!errorMessage.isEmpty()) emit errorOccured(errorMessage); - if (CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", result) != sourceDirectory().toString().toUtf8()) + const Utils::FileName sourceOfBuildDir + = Utils::FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", result)); + if (sourceOfBuildDir != sourceDirectory()) // Use case-insensitive compare where appropriate emit errorOccured(tr("The build directory is not for %1").arg(sourceDirectory().toUserOutput())); return result; From 4115a028edee2a00543db13162314ab10d8269bb Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 29 Mar 2016 15:58:42 +0200 Subject: [PATCH 20/72] Qmake: Small cleanup Change-Id: I94808212d5bde61935c1e21d62cda7ea56c0a1be Reviewed-by: Tim Jenssen --- src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp | 4 ---- src/plugins/qmakeprojectmanager/qmakeprojectmanager.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp index d83879e6da9..2bdf16f76c7 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp @@ -53,10 +53,6 @@ using namespace TextEditor; namespace QmakeProjectManager { -QmakeManager::~QmakeManager() -{ -} - void QmakeManager::registerProject(QmakeProject *project) { m_projects.append(project); diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h index ece682f76d5..28b8014bb6f 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h @@ -48,8 +48,6 @@ class QMAKEPROJECTMANAGER_EXPORT QmakeManager : public ProjectExplorer::IProject Q_OBJECT public: - ~QmakeManager(); - void registerProject(QmakeProject *project); void unregisterProject(QmakeProject *project); void notifyChanged(const Utils::FileName &name); From 26bc22adc5505a38878acfc4a6ee4565502649b3 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 29 Mar 2016 16:09:16 +0200 Subject: [PATCH 21/72] QMake: Modernize Change-Id: I05dd2cb4923ad2c72c0c79d24baa2c12677eff06 Reviewed-by: Tim Jenssen --- .../qmakeprojectmanagerplugin.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 97c691c4f6d..43a8d57030c 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -125,7 +125,7 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString ActionManager::actionContainer(ProjectExplorer::Constants::M_FILECONTEXT); //register actions - Command *command; + Command *command = nullptr; m_buildSubProjectContextMenu = new Utils::ParameterAction(tr("Build"), tr("Build \"%1\""), Utils::ParameterAction::AlwaysEnabled/*handled manually*/, @@ -303,7 +303,7 @@ void QmakeProjectManagerPlugin::updateRunQMakeAction() bool enable = true; if (BuildManager::isBuilding(m_previousStartupProject)) enable = false; - QmakeProject *pro = qobject_cast(m_previousStartupProject); + auto pro = qobject_cast(m_previousStartupProject); m_runQMakeAction->setVisible(pro); if (!pro || !pro->activeTarget() @@ -317,20 +317,20 @@ void QmakeProjectManagerPlugin::updateContextActions(ProjectExplorer::Node *node { m_addLibraryActionContextMenu->setEnabled(dynamic_cast(node)); - QmakeProFileNode *proFileNode = dynamic_cast(node); - QmakeProject *qmakeProject = qobject_cast(project); - QmakeProFileNode *subProjectNode = 0; + auto proFileNode = dynamic_cast(node); + auto qmakeProject = qobject_cast(project); + QmakeProFileNode *subProjectNode = nullptr; if (node) { - if (QmakePriFileNode *subPriFileNode = dynamic_cast(node->projectNode())) + if (auto subPriFileNode = dynamic_cast(node->projectNode())) subProjectNode = subPriFileNode->proFileNode(); } - ProjectExplorer::FileNode *fileNode = node ? node->asFileNode() : 0; + ProjectExplorer::FileNode *fileNode = node ? node->asFileNode() : nullptr; bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == ProjectExplorer::SourceType); m_qmakeProjectManager->setContextNode(subProjectNode); m_qmakeProjectManager->setContextProject(qmakeProject); - m_qmakeProjectManager->setContextFile(buildFilePossible ? fileNode : 0); + m_qmakeProjectManager->setContextFile(buildFilePossible ? fileNode : nullptr); bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode()); @@ -344,8 +344,8 @@ void QmakeProjectManagerPlugin::updateContextActions(ProjectExplorer::Node *node m_buildSubProjectContextMenu->setParameter(subProjectName); m_buildFileAction->setParameter(buildFilePossible ? fileNode->filePath().fileName() : QString()); - QmakeBuildConfiguration *buildConfiguration = (qmakeProject && qmakeProject->activeTarget()) ? - static_cast(qmakeProject->activeTarget()->activeBuildConfiguration()) : 0; + auto buildConfiguration = (qmakeProject && qmakeProject->activeTarget()) ? + static_cast(qmakeProject->activeTarget()->activeBuildConfiguration()) : nullptr; bool isProjectNode = qmakeProject && proFileNode && buildConfiguration; bool isBuilding = BuildManager::isBuilding(project); bool enabled = subProjectActionsVisible && !isBuilding; From 610176358ba4d97fd60e63a0517dc1dc2e0ed8c7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 23 Mar 2016 14:06:08 +0100 Subject: [PATCH 22/72] version bump Change-Id: Ie8f7806fd40af9da5c60f851ef6db5226199bfc0 Reviewed-by: Eike Ziller --- qtcreator.pri | 6 +++--- qtcreator.qbs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/qtcreator.pri b/qtcreator.pri index 4728785fa2d..45b90c9f02c 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,9 +1,9 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 3.6.82 -QTCREATOR_COMPAT_VERSION = 3.6.82 -BINARY_ARTIFACTS_BRANCH = master +QTCREATOR_VERSION = 3.6.83 +QTCREATOR_COMPAT_VERSION = 3.6.83 +BINARY_ARTIFACTS_BRANCH = 4.0 # enable c++11 CONFIG += c++11 diff --git a/qtcreator.qbs b/qtcreator.qbs index e096281d503..34047843737 100644 --- a/qtcreator.qbs +++ b/qtcreator.qbs @@ -7,11 +7,11 @@ Project { property bool withAutotests: qbs.buildVariant === "debug" property string ide_version_major: '3' property string ide_version_minor: '6' - property string ide_version_release: '82' + property string ide_version_release: '83' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '3' property string ide_compat_version_minor: '6' - property string ide_compat_version_release: '82' + property string ide_compat_version_release: '83' property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release property path ide_source_tree: path property string ide_app_path: qbs.targetOS.contains("osx") ? "" : "bin" From 063c8d45c81239670ee29808aaad639714b362d8 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 29 Mar 2016 18:52:35 +0200 Subject: [PATCH 23/72] Theming: Fix menu item highlight for the themed (flat) menu bar Since StyleHelper::baseColor now returns a themed color and QColor::lighter() lightens up dark colors relatively little, we should to use a themed color for the background instead. Task-number: QTCREATORBUG-15930 Change-Id: I256ddcf946a14af6937c324a76e3f3a24919ae3b Reviewed-by: Orgad Shaneh --- src/plugins/coreplugin/manhattanstyle.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index 735eb9e83e3..519fbaefcc2 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -666,11 +666,15 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt if (act) { // Fill| - QColor baseColor = StyleHelper::baseColor(); - QLinearGradient grad(option->rect.topLeft(), option->rect.bottomLeft()); - grad.setColorAt(0, baseColor.lighter(120)); - grad.setColorAt(1, baseColor.lighter(130)); - painter->fillRect(option->rect, grad); + if (creatorTheme()->flag(Theme::FlatMenuBar)) { + painter->fillRect(option->rect, creatorTheme()->color(Theme::FancyToolButtonHoverColor)); + } else { + QColor baseColor = StyleHelper::baseColor(); + QLinearGradient grad(option->rect.topLeft(), option->rect.bottomLeft()); + grad.setColorAt(0, baseColor.lighter(120)); + grad.setColorAt(1, baseColor.lighter(130)); + painter->fillRect(option->rect, grad); + } QPalette pal = mbi->palette; uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; From af0b93196b85b9014d27c1e1b0ae7334142eed8e Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 29 Mar 2016 18:37:50 +0200 Subject: [PATCH 24/72] VariableChooser: Create widgets before assigning models With Qt 5.7 the currentChanged() callback is called immediately on QTreeView::setModel(), which leads to the label text being set. That crashes if the label hasn't been created, yet. Change-Id: I73763e1ac1c86215090a8f4b0118bc0cd286cf47 Reviewed-by: Tobias Hunger --- src/plugins/coreplugin/variablechooser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index a420301303f..ecab68fdfaa 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -245,9 +245,9 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) m_defaultDescription = VariableChooser::tr("Select a variable to insert."); m_variableTree = new VariableTreeView(q, this); - m_variableTree->setModel(&m_model); - m_variableDescription = new QLabel(q); + + m_variableTree->setModel(&m_model); m_variableDescription->setText(m_defaultDescription); m_variableDescription->setMinimumSize(QSize(0, 60)); m_variableDescription->setAlignment(Qt::AlignLeft|Qt::AlignTop); From 110959bef614c617d92cd0c57ee8771a069420a9 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 30 Mar 2016 10:47:47 +0200 Subject: [PATCH 25/72] Doc: Update CMake information - Add and remove screen shots - Remove info about an obsolete wizard - Add information about using wizards to create CMake projects - Describe new fields in the Kits tab - Describe the new build settings Change-Id: I156e3b1a6cb35a284da5e25eabb134cc52b4d84e Reviewed-by: Tobias Hunger --- doc/images/qtcreator-cmake-build-settings.png | Bin 47305 -> 25118 bytes doc/images/qtcreator-cmake-build-steps.png | Bin 0 -> 7998 bytes doc/images/qtcreator-cmake-clean-steps.png | Bin 0 -> 8315 bytes doc/images/qtcreator-cmake-import-wizard1.png | Bin 10253 -> 0 bytes doc/images/qtcreator-cmake-import-wizard2.png | Bin 19627 -> 0 bytes doc/images/qtcreator-cmake-run-cmake.png | Bin 0 -> 28948 bytes doc/images/qtcreator-cmake-run-settings.png | Bin 0 -> 10735 bytes doc/images/qtcreator-cmakeexecutable.png | Bin 10327 -> 11981 bytes doc/images/qtcreator-kits.png | Bin 18015 -> 22880 bytes doc/src/overview/creator-issues.qdoc | 2 - doc/src/projects/creator-projects-cmake.qdoc | 161 ++++++++++++------ .../projects/creator-projects-targets.qdoc | 10 ++ 12 files changed, 121 insertions(+), 52 deletions(-) create mode 100644 doc/images/qtcreator-cmake-build-steps.png create mode 100644 doc/images/qtcreator-cmake-clean-steps.png delete mode 100644 doc/images/qtcreator-cmake-import-wizard1.png delete mode 100644 doc/images/qtcreator-cmake-import-wizard2.png create mode 100644 doc/images/qtcreator-cmake-run-cmake.png create mode 100644 doc/images/qtcreator-cmake-run-settings.png diff --git a/doc/images/qtcreator-cmake-build-settings.png b/doc/images/qtcreator-cmake-build-settings.png index 512d002df90f4f60e7432e0244e26bb3fda45e5b..2c2af74c6d01eabb54486e09bb47e613004ac0fa 100644 GIT binary patch literal 25118 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 z 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

cQiC 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 E02_$~QUCw| diff --git a/doc/images/qtcreator-cmake-build-steps.png b/doc/images/qtcreator-cmake-build-steps.png new file mode 100644 index 0000000000000000000000000000000000000000..1679217c51e9db9f297c71f4c2b0baf20e8a9a17 GIT binary patch literal 7998 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 g1FVdQ&MBb@03V7T^8f$< literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-cmake-clean-steps.png b/doc/images/qtcreator-cmake-clean-steps.png new file mode 100644 index 0000000000000000000000000000000000000000..9ecfbc74f1196946ace91b87f57528cdee746755 GIT binary patch literal 8315 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 Str!>>7(8A5T-G@yGywn+9J8+g literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-cmake-import-wizard1.png b/doc/images/qtcreator-cmake-import-wizard1.png deleted file mode 100644 index 9749ed9ffa658896f2e44c8d9eea185a4de4cf95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10253 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 diff --git a/doc/images/qtcreator-cmake-import-wizard2.png b/doc/images/qtcreator-cmake-import-wizard2.png deleted file mode 100644 index 574bb9a0553930b08104f72bc119cebdb7c0d866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19627 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%0A9) ze0+I-#J#tdDe!6v8G9HfobGll&%lfGeMx&6wd$wk4hPZsrmJ$ATm>+HnB zdG39iDzu*l{f#q=6Dz#tlg_8mpRGHahws?cs<)o(o$o zGhu4}j-umm=-omF(Z@oAlX>gB{h3H|x<3zzGk`}`q<(Wk27;RK(fG1lGRkW|lbIlWewRVM($9b2Xn~nVX}9zxvC7UvbBNE=`*} zgXx=g63=^{sg{qG%;Ikddmj5{WAON7uHUj5fmdY~9j*>psbi5Yp^<)!`S!d3(IDlC zhdJA0bzMY*?z7B(x1{%AzeebcojKb+uecNWa>Gr2Q9tQm`E_l^r{}EQEb3Dm)L$EZ zC9O1d;x~7L(~X|~vWLI7uDYMTdPYP_o2<;5pS(Q&DKk&lHg8*nF*_u#ty zId`J6vcEC=T{Sk#TvK}^{IvFtbBC7oFZsLA)_=|NEBz6#U9u#&1QscsIX~r=^?^C5 zEzZZH&b(kg{rK~{Nrr}U9QM~9F)o{RbJm^Ij<;J><@EgzXB_lP(K=-JDf{76uT0yg zc>%s30vE7M+!o09d)~FCyV@;hBMmnmiauy19r>EyQJHbE!cvj}c(Ww`<$XN$s!EwQIxjNzXeh0p&^i6)ycVf%mLDBWtUD4Gy6sK6 zEPHm|!UJ<{UH)F|+1P(hK&aSLwL?|%i|*IpnTm~NiRDuwq*XKzRU9eT<(?5V^UC^~ zU2`^F72sX9`CF&Xw}}gKCw zuV$_A0)vLhY-jRsL@(x=$`_Q?ZM&6+CudXCbJkd;bIjUS5{E;go=us*V+tp;)+dI_ zP#evaq7m#@4VF|2NX&gE_$l~YQ$_Kan;~%*7OtCm>c$R^Z4SZPSh+43ZoA=F_o}!f zu_c#3ui+DWiCg*=$*BQ1Lp&w)7Uf&5{qbkYX{}bdX;CXVrXGIKUVKi;xL14I$%*z0 zr4pwZCuYm1t}U6cKzw1}Dyv1}B@2VLeVe(#ymNuqjYI7m2|;0jGxH`bp8lpX%l!Eb zse&`HHEPLI%9ibY>zc~yJ7e0Jn|#L`-dnHlKh@=u8yhQJ8!b9}1)J}+Jhv@d=V#W2 z`aBNWlw!Hr$V&8yeG@?TZ-l)KGaR?TXQPIX4eTi()Zb`O4kK6c~Sl$NQz zJ?UR<&TmkDdvjmlmqjmm{oTIhCq|TfmdWUTadmU)xsK(hBlXXO+gp_^IdJ0j`EveZ z8?7_m*UzravS_WGcemvEwGFeMTYBF(`rOjnLiCpYqvxD*cW-cQtn%t-NijSOH)pWGy=C|lMtZQHYT6v*vB96Lbr=RBCn=y;_rT`%&sNm9Df7 z<22nB)pd*^(&n>VX3lW|u z<>n+z71=*YYsumL-Vd2=melU||LrXO?AQ@IYXPNO!J8}MJ1!I~P`XhcEvBL+Z2dlF z*XO-cE}!6xcVd3CyCbnPaew%$hBb5hO`pE>-gyGH7C=Vwk(tsY)i9?l=G#RlgOA6t zd^;w~pr4%mT&VbHQOc2&L)uF%%k9)7^{*>iZ$Gzg+a9&nsdl1E_jRtUQ(W%VCbyos zeWJma8v#k1EMFWd+~B|EzjuGYETyh~fqL}^6B(L+yv>-O8GdZ1nNyvcgh-Uow2i;c zd|tk@#dh<-HG4AeE?axoXz5m+;s<-q@n7ot$)L7ArN=ToSvLNrbdrjf^P6OQrwOKs zwlg+XILY{@wmk2;ySUMaIpomlCcQ*P=S}L?(r=1x7)k_w-;h6jyOwBDr5EGxrA~8A zuWg$W`)}EikBcgE4(gil|9VFvu)^i{ zp(Pv)5eHZ&|7e-M+)i-rtiWxW*NRqtlG(D~z4FMFXDR1`pZ%MXvV7ySrK?Z5e$;A} zJNsrvpcT`*Ir>J^PKJcA?Kr4DnC^P!=?r?ht{f86MC z{)YLqZ;A8z#E$ZO&Gv6SGCjz2xmSuNbL$`V*W8;AR5~@D-TI<^f02KZY}CaAA0{u< zeOrDbenaBAw>9QVpNamTf7|j^nctq73%76nRJwl2T<7H}j$7ix&5|UTB>uH%Z3x_B zNvJVwFo{AJ?myu>kR(PrN zOt=taw($;6VgJ8H-s?(Jt1My}s;#0+Pj2B)DA$@l^Iqb$(^2I&;v#Q$I%aO1 zzv6A;f$#ox^VGdQ+nnEYCU4OkQ+cbvC6!iZe`x8MgirMPye{CH*y+oQcFsukZ8Ph) zoo$*LyYh~2`qs5(%h~r@F7)qPz{|n(i=$xHmiynMBX>OtMGwrj%u0T)&ZlRYfBu{C)(z3Ot-NoneLYY0O-=YYp|ZMYf4NQHo)%kWN2l+- zP{@3?8=x8Fwmb6PjeTvuu_ zQ*lDJ*+Tul{F|$cW?l)(^2={~-t&!l=_AFaLO0iy+n#ScVYK9L+X3;+_zx~*nj-HcVI_Q z-^LmZ`5OvnWd3<~)b>fWemId-Hf8RaVz=K)Uaik8b~^>k3RqR&Z5YT@_}sHK555<_5Cxnj;#9i^3Jz#7BS2I z0N!sKOQa3ug`}JxdG1u-_)mB5u?t$SYHo=Cuv>Mut0=GJ$;-^HfLMy|#IdnK7{znS7`IX?$BZ?eFEg|C<-H*ZxU}t6th0Vzp-FoAUENg4bz> zx}Pyl&8qM@R3V`M^<&Bcv&xyvEbD{yHGXfoKe@8$+THrKm#Yj+vNu$(YRM@>F<%-mg9^2!?(mhkn>80<5FBY$w zxPQ94RyPmdW5I717kRyS_vnn;ik!|LEz0x1t9^T@JIiu;#kmVIw@gx(wF&Go?(g|> z*_QLX)%`SQ`^mL0r?brzlqp^GV$V12(EeJJF1&&y$GI$$(K}je4^WVO2(aTG9eV%XOn;)LDv-RcgNSR8<1-5H$e%P0? za(R=8@o)B$N5-0a4)xdR2CXzUJ-0!7^}XPw4XdrUd9`sXhdnkiYn~PKk~#Oa{OTalUTrzKlcV3+$X*?npMJ zE$TgCoT(!pV7^C0dxPRa`PB~#B{Th3#%QkHkUo2N$)p1}!cSeSD=u?<_S187weRaK zahz}R<=&l))M=SRo3?ungI>n>cVbuP9NYJZVbjJbaS=D}E?s4L{EAz=cAl)? zmjibBKYg5IHS@S9YhUW-@+nrVGCKZc?FQL$t3&IKOzjegid2j#Jp1q3p4}fimF8#8 zm$1~gYdxfav9Ja?d+`T$hqHZu4#zaiG(5J%pYMFH z-0x@EXXO5K>cT~gm&JawE$uMA_3(+>$~w6RoHCnMu9tZ?edBxAO+Nk=)sByT-w4U^ z*S%O5|19&q#X^OBKNhrI{>5m$HvL>?>_L;G1#GX+_py|1S$Fh|c(n>sYSTYO1vAyA zAg=mXo)tSjuX{1YeVX1abEQLe3+8cFN>vbgRNRU zU&xu=cjqfKd|O-~rk?`x!E#Vftc`QMbS z2y=WYw!wO1xBlEUfoz}us>B}r-frYyZvI-v{<=KtD~;g!U-x}DE%|$DdGbER4Q~_J z%4ZZG8v*>m>DEw%92 z*T+@j&KOvjJbh4Qxo69wtzTs=<(Am`e_gm|{`v{u!yC-B%_StA_LrL>cgmbS zc1XLn<&RdSvPjDw&D0h~YkB4N%jc<%goV65B z79C4V_!xcaLbs~`$Gsj`mW94Ic>A)q>wD?G@l&i3Tcz2~t*oW~()8Z)Re^d!!O0cR zr`7VF^-%H?&E|hN=Zftm;}xRJx2`LHQOtW*|H5Ef|H{S(`CmC#9cfDxa$}b>VGH`n zCCauq=1gIl{)1Y_D=$hS>W{wb?fIkhcI~S5)4o?q=PzvuTkLUR^`Vj*?S693i&qwN z8b81E#puIT+e^h2^Jke|e77TL>y78NAv)ib`Cf-zlR3vd``Lm+PKt*X%H7N@@ygh6 zpzftfkmx(@H*$w0SMX2#6x?2GpL031yY}7!4&7sKB$9lbZZU3)n7Jjrf<5Ocdv@h} z!v$}4_B{J+TC;!Zch|saU(`=YniXh%Xj{~NO>6a1FYnHiZoXPPueUtqdC$!^QS4%9 zVp@=Ea8TarNx}!}5(DNtH{RvnqvCr?AZqIwWof-N1vm85irn5X`hNH(BlP$z<8_YT ziJ9!{H8!5*Ub)7^VA+|}6KzHzw@Y4Kx)HHr(fy!|^Y=m(EoLlSaH~>$+LjMO)ojKp z#=qFq*F23XNXfT6&o=Y8q3Xk>l1@d9iUG4`IH(!DxtG!rwz?_VUipmpwd9VSpKKQG z_OfJUFY@+GUu)qQzL(+ajvU7HZc)`h~<#*n7?WwAFojQ+KX8KofXdaU-W?dO&=WKh@ za?Pzzc4yTYL)-r>`hP8UO69C42blKTzJBu4&+UyQyXnJQF~`2;tnaG4%ToSw%B^|7 ztn#_^G-ss+q$tLQa_6n?CEawx9X)Q@s=Y!yo-DDY?h^JW~5}&b3nABYW?wM!Y?55&br$ zYRc!w)2ch?sXZ{;{P^;%hR<6T@AJDC&m8C$e~`1Wbrs_i;j5XU6W@PM;#_b3v96xC zXO;!iD!$!PN%x=6`I&NoanhCF?aKF0Z;X4kTzQR8@1HA2lp}Aq#IAmoGr35fJ1*vw z{5`RJZ>iwal|=`air;=~6|lQ?-{XT5KFgTyk3Y{fWx@VUPeNKBu70}YOuCAJ#ILhn zK}&OZ%6_%`SSC$4S0Uwo+T^c#mF~3aOBWtYpJA^=`Ua$bC~m!^73aK za;y<-TYYD}?%DO|S(BIiKgH_ArQa%ko=onS^<`S-rgSu6Rl~1C#n!5Nx1Wl?oi%4? ztkXu{r3bu%HKjbQKAu{o^+s>;l->y`!c77Toi2s;x7Y4kICai){m&(z>U=((l;HMx z#BgiEgIH_Zdt65MgyVV+?EN@zI+uAkvw8N}$2#=2}!MWyBQZB zd^bNraI)Pu{$EY(>xO`^^z)zoOZJzAKUK?k<1xlb;rDf6S)Ih8EZrZ3U_VXc)4q{ zK?vj1DN%=nJXjX;TxHoNB5cpmJA2iVxYl3i*E)5t6nLfZG~A2T%+M@t(W4G2rEf;x zUlzHVioP(|dtNPOA#YyX;h0W6$u(adb*fyOzDR45xW(*)+ZHYqU!=Y*{rD_~SH<&u zx4fUCy0mL$klXXhB&L^_oo5N>uQ=rJ-|yp31z+x|>64Zk&Q0#WctgW?#-^aYASuP) z_3g6Wq3cdhxz{(rz*)pU;FQu;zttiu=13i7n;Vi9zp_hUrSF74e0MwEX3crH>cz{R zHzu17@hv%%uQ72!+btg^y^IaN)u$>Q)DB+J>*wMXe#g@3yNbh`IIXGI%A_y21YSOK zC)ey%#F2yIAyZTKY<^X^!G1!e*^6Dwd)Y2m;s})OE{F~+?C$_EXxXvXWZ@nv5#KOI!rB|-lUz1&NURG>H zjiMTxcUr{HEa5%TRd1JWz8YIsb0cfs^3BgVnFyV8_jdQ8R3uqM6evy6f+Tn6gDCYg#AXTCqXXcGaW3nMI2HOlyp` ziJZOhd};B)=xjmx+z;XPp0i`%Z`@)7JmNyXDOMIx@5y0{zBqC?;4h}Z)mw& zJag5vRlyTmZlss4Ig(VhV$Yd%3Pye=+scfDEjM%T+_>f7jJi+Cq1p zwfS=5z`NOB_62p-&iHa`)hmaJMvDgv4;}Nm<~G^SsjECotK^y0_of9|Vs+e-2|+F_ z^BG_E)Sk~+KWn*J(;*ovlkY#DEc?a&*~b0WXO3$bR$Di7efQXLB&KPjG1n~pk5L-y z%u=5mS+Y}GX>rJ;X`;6$B$;+EH?A^BNled_GjQI%ZOe(7H)rYuww_vXtZthBL4jF2 zCdVtfNxoN`77*Ggtfl=ltkZNueuR16*?iCCtrH#`4%z!ncwST2mTxYtFWZei&bgT0 zwL>e<%<;@!vpDtE-@4B$qblvcRCFzCyWhzE?%_(N&o)ix+xHzmzkPnx885pfYg|I+ zoq2nqQfbq&)2F^WiQQPqW;M$p_LvUu^~s$rTN0kEnbRw>u;Gi5$n)Ac3_EQCG{OVZ z?BqSOmZ$#d$$t9#$iZ(**~=Cl@mO{x&mq~tRcW%*4CCNkk~fT`)hh3;b9V2ja@*=U zB_P$gDyFRP@v-CsVV`a0?wPN)^sX;EpF8W{DW8>mmrJUyTI6Nx_%G;`_yS*8zIU6*%jUDKNJ zt^N8A_L-X(#}|a&-LhXQAYRp5OnRD`>C|4eyDJX(t$(+A%jZ_TIZH%8H++`K-Cw_J zgGqW3)2hu|%i^ugR(H>tRkWKSdTnm6dE)(Z##8@sEtg8NQQzHsdox?~+0P~4Y_t^~ zVIM5+0HfL@18?tpKW^gtp6jRWOY&{a>=U`oA)i+mu~JHVwYlLbw+hRBfLXQ74wQxKBAB9=Upw^`rQ< zh1;&qiB*5k9jCd)Y`+dG*-`LfAYxPa3+cTa^{E~jMX8!Y+dzMbU zW+be1<&s6b-%(+UBN1u6ztz(Zi)}X!sw>rSX?vNp*8j%&f07Nk&nka?s@vRhBYI`_ zvPeSuHW9vEgelWE-vc#WsGHWzuPoxnf@I=@3VD_OD%<}4VQi{%sEyNx#eeWanvaVE({QS`2ZK!-<7+FP}^`A54Q54{uC zd&}h+<1Uu!^xu=K-v8vaLj{*iu6^lJK6PTF_`$a!pHw-E?OqpnwTC$KOW$Fc=ULHl zZo{4U1CNSTv@9R~Fxh&dNy2Q_o0V39##1ATgSJmw?fdADRO`2AEBU_%Ntj<+p*b(& zq3Ma>wp9gl>JJuYwC;Jo$2wV3LqEOM`@^LlcDu{0-rR0|S$Q^Y+8WNyV$0s%dUBr+${$nNYs|m>mX18M4gYEe*Qq z51pef9XQax{)t_Pz@nQBchlb}f8kyuxnkAINk)nPFQ_;Ey|l1y*MZ8gGw-+G&^JDl z@odo<*N377&)4YOOO6v;ZhS_JYmI&Jk|mm}_gyocto!;i#};|fFLL@^wuiE2&S1RT zT55e%wMEwXV2xTx%m?ZHCtOUoy?5&0;*!|qP<8ao$-~8x1(69dTN8bpDmul2Gr3se znx?;SG&`(i8M?H#V%suf{cl`qQX!!NmyIqroSk=c&8cb5LUU9~<}9~4HLpF^K6@rx z(1y~UC+j~5WKP&W>8@_)?!%iJXRwC#IY|XcyomnQb~rQO;AP>M1G@^UMBi-8_Byds z=~y)D%7@->(zCwVtXckO!Ug3`R$KPYI(*hxM1@PfBP~?pim0i$TH2(Pd8#p0hnHBk z=TF)e5>WYOWz~bFp)C)X1=uFm&5>}r3<`OVG3jc>1QE4yJY`yx9! z`rLc*%}HA;Klbcr{!q5*lG=?^`PmBZ&kG1Arp6w+(tXT5sr|3-hO@V>1>BQY{1yN9 zXXZ1-B3>ck)Caa&dpu0l6F<3U1|HPv=f8R`vxKuMJNk0(=ij3DPO~a~R(Sf-BV#68 zmvHsQlN)zCgzcED`94|WQ^*R1sZmRAHagw8Z@lZ|dYva_`N=g+1vipZ zu$O6L(dik&D@}}#q-@*Q!*S4h{^qIK&$n3|kDGsQ@zF)qdNKc<#TjlfS3^ zKEc`UylTo;@#QVk)Y<}fa34HfegDhG^VP=>bkwx}Wqt8&+O>PTYOl6`vTJ8L-P$2= z!h2_nwdJwm1L_ln{T5$4$oPk=Q@uJrzV^kpNFV;D%;Ikx)pFTSvzRa3`d=zOmEGM@ zVfGE1w{7#T`o+gJ9Xxk0JEQ*VpSs7}b|2yqdN^zLlXLMUwqL$U$iBIEYQDN_v|&(8kUk8`?v?cxsCj}8+&!S z&hjca9$M;B<$7uR+4!eLn*;CYOuE4%>-V~(qhDc$$+JI>6K>0ZPLI#! z%It}K+kU+?YkpgQb54B2LE9}4KW>Wo!oR)!ZAQJp@tygyOJ7wT5}f$vT)wN)ufCbu zH_n{;;K?g;>uAoKr}8f@D?c?85S5v@HAVl<)En1VUsIYjIcD0wc;=1#rirE_ZHjruPFTctDV56)Y@ zfL+w)_?t@hS>-W;MtR?uTQ|se2Y6XCANg0Rx$RwVQ2gT>*DNNMdQlF|dZ$Y7-JN-F zmX|EJeb@299m_|xPX#})AGEO4SvXfONL90N+N)HS^Bw~F)eDO*KW@1D%|q4XYhA!W z%Zu+`F)k08d`iQE<@x%x_cN|8yBJ&X@tyXMBT}ZG8|L@j<(a&C(JEga^|0!Em#jzu zO_z#oYcJG>-pG3xc+vjB@7EdfpXwG~>51ektJ`QbrKoUHaz?a*&{E~r+|4(l!?ZNL zorLGFU;FySe1$uk);BG>IpxHzxx1pD8tgvxF5%=)!Hk|()r*#0M(#oq%!d9~98)%~ zKQ`-h-;G3xSFWvhD;sJn`XB9)UwI_g;n5ro- z=`(q6qn~^^v(%`!Mt|*!wOse^zbG?!%{jAGtBY0@?l=HK#TsR(_Ieex?{7_>^(9wbq zJ`dBSq$cg)yD`_e`L?D;z_l(vqvwVz%N3q?-8fg17oZbuQEuS8d*NpJl<@>cU-j!>3)*wu|3t zH=}0NtNh}m?u+Gd=2078KFxVGGq@;jl|b~3r9y@N87ea*PMtC{%(uQAy!z~gt5eo( zh|iLio4UO?@qOt%v8kVv>eY{==&ihTwAO32C2#%XIX4$Q*l2q4pN;??nJ?A41$dlHs}S~lrgzfEhE+q!F(Z%tx=XQ+Yi6L)cIy)PN@@;sUUSLYqBsalo-5YdGO@Hs(t%6-?uNlG3ovLH{bo)uYLY|y!ZU(=Cz60x9%tYH%ZXmw}0|?e|Dc$ zQ?|%!9x63D?|08$^}wh3`jSU>S)K#cb_tto=8IjHF_@8h`{!#r&I8NZ`1W}2jC*$T zGb`@L0R^1y*mb_elef{fq zPyPloCB$>{uSs{jcmM4B`BpQ&zTUO_hs|>S*L&2KV@$0dv6{f`}p{+ zd9usf(%&EduuZl2M%%e+wyE5oZLBS9Gs=12ru;J9vcFlKiMytr-Csm3WuB}};Ejv_ zA`kVwpRf8RW!`2M_uqwEn$`JRAO8*xI(F*rbIy7#_0Mk}I5#PILqq_Wiep;5mfU)`{#53E8>`b=6MFte*xsAV?j*PPW9N%Y{+9Rcz2DfYU3IH{V}IA^ zd~&jUkA0QTo7Kq|>z;hQbl&jo|6i*eexFyme?9PfmiN(1Prq)FKRQvg8ZLFVdViSqlkH|Pt-UVjv}PH)z_`qx?y*Phrf`1`!f zTW*h%l6Hp#}6{Gns&#p-&%pTneC z^^N`En)oh`4%WBAWr7Ea3Q(=AIDqpN%-d}kx zWuESWiIvkb>a{JFZTsqT+UB-{^Y4E5^5e6gS58Zv_x3@>mir0y=I1w`4Abd3G~u7d z*V(Py)4tWOzT|uKznp7*^P`LF5B+03UiqnJrR|@;MLTU@xv&4S+4;9hG{60qb&u!U z3+G;1`tx?0^TQVhQeXc6m^x*nYfdcp&zz4gT}Q9Y*89R$oO@WV%t>U!f04`olrpBh zSzB>_|9;QeB~SE}rl+yEIQYx^Px}Ancwd}x(_2Yvfv`t^zP_?^@vY8%?LGbWmhT~_ zZTu~5lDGVy!l-gi_U(L8hugO<{)+^qIGd**ro7(eZ)x-NvyHzcC{?%2JySf*Vat5A z*=g4E*dB1sz2Nt1hyRUvFZ}|~#V08plS{T!`*oGmd{NkR*?;1vZ-17) z>{|Zzvftw^#@csV&Ocbc^U*1uw1it$w_Yw1{r~I!y4>~Qzk_CU<}}3W?*1gwtwkv1_ow^0G|-o|NsAg`t<4j z`wuVPeXXpleEs_My*J;UJ$ruR#`V`uZ){B=ezW@LK|KG1)zkNOb=>4)~OaJ`*{Ote#FTegCIdbg!y=Ny+ zoc#agZd%fW|KFZxWM-c|ck$l+dq2Otjfsi*_vZNj_gB`gUGwe3v;V)}?%%ub_T!hq z0lxRY{JXGmQbfR z%GTUqNBcvo`tSVzf9URqleeCIdwaKQ;m-FjpI!a%Z^!l5NvU(}?So#PTUb>wp{uQL z@1bkoUR+vOm9YQP!}@c_~ltUc0_y-pvEkTa&}zKDjet$E{rp`!>#P zs%+VQWJyCvRA2qn^-m8^? z@=8zt`*-rm=Nl(>bd>hFJEoP)-uv_3s*IG{rpX8Q&M2E%6ciI$wP8}({g>~0=AAgV zw7b2kbXs%H`SKgo4wrb)0EfXg#nbzK#*SpRmu(oB| z+(omxBlCJ2*5CO5az}aRBtvzr)xN!c~-i(f>ITdlK z;q}Win&z*aJCcf)vDcTMdi=0pGxyfnYCtZRnLOmtLC|c=Jc;Sn&Rs_G0`QZ ze43`7&Gf_1HZ+Ep1~#nUx6i$B{=UiWH`Z4BrxaKE`~Ls;DB0R<)#0;ES>-*gn_G6j znm%RM@pIdkx6E@)?y8TmfBES~e{aR_2fH7hynO54q4`Ts8F*ICI`egQ^|ZAYZe*=` zwx+)R`^7n%ZvWn~>eSws@BaNgKP55Gz$~^SrnS~PdB>rZ557LVvg63UiznlqOQOxA zd~5d{S+JoaXVI%Ytw*OO+i1IOow9oN%D!4(EiWB4v)FZ>6K_dNsojcsFUG)-d*0K< zF{I+wo0}W6r2=IRe2n)^nk84bqd8=0*A%B+5=jnum-N>5UQ+GOWoyl5|12M|=?I^B ztYeeHi%CcI*sM}GZ#orbn)_Q#QMRd=5G@-g)?WT4(|N*@Da9M({?uCRsLuaa^q!qR zOkA)iQB;gkQQSbZWu<}->(0iN3eyclp9n2$ia8WA!FvW*5ofTYUZU2CrIy~Vw_+Gg zl$Xu!idh??mA|+k{KC4Bu8BFDSe(pewoMF}%`i*wvhP#R_477KHd=4GTcuTcaf3zZ zkyl;9KB>=qtVM&l_%w8K8GroQ@T5QW&!vp{&lpusCPi^7Yxzg9{D4N{0S?Id8P{Yxp>nkJH{`vfOncI@RdtP|us`DDhU(k28vv}Zl=Jv`N z`_>gt?yBfq?9OPBy!3U*qo~7KKTU;JyqXjIReQNm&9kP>tQk&n{;sE9rC6*xkf1Yl zjpG#il_zSmCbLUfK0X^TeO2x;sm1ktzuqsK-*qQl|LEsg{Y!;5{8ViS-6T_ycBNRc zH)2i51Er~bXQd(!hfF(cvD)XoySXjSoQ?X8t`03+XJ3f`L zA3tkZXgzgtSnPr=`(&FI-u--JyG)O@kIJd{{)-AC>U6^5dpH*CEU=zxR4QY2#Y#%n zDKz)}Q(t>Da{F{*$rdbynhA!MKZes`uYC6<(pS zT7%(#hv5N^&8fx)hh>ru%w%LMoFSPaQQ*)hI3aPetHOoE;6{Zq0T;90xhx9}!c-l6 z7>gOp1(n3tSS(#urln=7v2=3fipwwe)i;Pm`_1)>YOj8F;P?IA@BhBP_p{>r|MyP= zLkfcKRX(44Xj#M#vvZ4Xu34|S^!-y24;676gUQwt7!2>u2)I&vcJr%Qk+nx zn&#Q~x$wn*z5Tsh6O3*=X?D6Wsr~f1T`3A7>qKXnu_Zloe#bHO;(I-xX>p}dW#zvf zMjn18dwz1&^T!wd$I8`){j4}I$MAILGF6sRhFdmYD%+L^ww=0nuw*fF*~@bZyr1vB z*zoSHl%Hc*!Q+y1hYn0wx7J@W;qxc^>G6v%tz^iI+U>EiCBY$teL?BW!@_S_->(cj z_~h@~6x-^IH(%ex-H5P$yVLTd(U!lV|9>)ksh=LdIO)LEt5-w6l-c!qFkUoJ+Z4oe zT4#FLt1QE&tqYc)xpc|iLTph$YDDu={_T^dKB_u%>C)7Wv#0+@*Y$D*GN+Wx_&w#{ zpK^Qs`Z;S=n7Rxw15{xwmuw)%{I2r{BodG`L-BbWGfW!nFq*PrpXh)rKHqu;YpLoo8+HNBpx zx{vlZt=-{Sy@C6;tl{%B>&~B$ZF%$1=l$w?Mm&f0pC5S=+k3Q4^Y=5Wz{RK9)%LH5 zVvRq_w(rG`g0ND3o=Dx&qjj3nE{hz`{E4lxO1`TWxP&h+sBz|TpZ;A=YW?L0r)|&Q z`tW*PiA(pz2T6?IcAPNpoVQu(Vfw*c^D`ZpbzF*KgZS!M0*~)Ls4e!MtIy()m03-o zWn4$|marxK)oGva{nNBt)3U&|zi85=fRX8e2;HzSi2@6)_0LZ^!8V$R_O9<=@jR$AhbeWa29?#gi&D3{6 zZq9~xxjSa+RWr`sf*anF@$LSYLpw0PIfSmo*xe=>USHB)i+(+SlRP@>mF7m$G=@uA>n_iVqbM<}{+tKstpYQfZQyd+;+7vwHuX`3=jXFH>g1G#Ja@(VwFf75Jo$2tchRqH->a2f zgf22XcWYHCzOvrTecPRTdA&0~E9LV~K4#JP-FE-2U*<1ooOGLc^4Jbj$FI9rmCNM* zesM<1_WUD-lQ;RkuJFD0c46oSZyr?{-L`iNm(Iz`-W|Ah^}pW63%BMxoVVce`-6px z*R|i=JGXY-c|mv8&F2K~zdI_XwlDvuxm(%mmmE`7o73p46FiT; z-x9re{PEQ9_u`u;XK*bmTW`4fe(Ri!ng#dI#62uOw??w^;o`rGe7E;(;PI=wup9bLr$1?U@nHKO=m$}I6rKItSl+*$#|3Hp_7qeWSw(+gSU z)VB1RukZ6I)(Rol*mJxearmmm9h8@0>+H#mG@X|fVshhCh@xLd!M2TBF14%Hte1SG z6`Lzrc3)!d`^hH{%1vv`{IPr6?N263AA(y`9e6S?I`*r+-;^uDa_X5(wV}4SyKBAa z(+M-4&6YZDxGdw{*F8~%t90bb-XERme6(wKQP!@GxXbk+K8h#e&1X3-t=?<6ux;}z zt3Iwxk!_699HQUY@*P;){&BCU$n#g?mpCLJR_SEybX4p2nk~i^rwdn>x>lD@s=cJL zWB$g4zJH63oU--$CfCZqa=uNwf6{u*yVJjSGf#Wn`pxsGdC>d2nmaEAU0CC$sx)~| zK|}DJ%R%PTysi}=kdyIMey%U2nZL%BQR7PmV~fO&%xvAhQ&%sDEzOyGbIbEKpO<-h zcDt0mG`%@+FvH@8@7z--ecbA-*z2vGOC z6chK)Tx1|{QK(m5Ezj@X&&pTF4lZ!yS;%xCLPLG>lIvWVSI@q)QBOG^%^$sF^3QMX zwh?CMx7*zIIH#Yo_{G%x`cz%s+owHGs7&{-s*AkHr|ws#_H))EtuH%5!XE!jZ7M%> z^5nc}FU*$i?~PRWw_%o7+>NmpdvN{SA4rnGRqYvtR&uPNHzdFlSAx6YM%K3P!4 z;ow)x>R-ZOw06lu`8dPR9f~d0-rn;csCwrZUKTzhbT-+?`@870W12qlj;g%Lt~yDp z)j6eRxXUOqB&x0ar^%UVIOE^0z-^wd3?}c?-!ZB7OsR44M*j_4qgC@cEx4aaEiouB zH!*N8Jz!pXMrfAwF7Kz8XQiG=j1UiwzvQEpd0MyDgq8R3RGS@*Vs^WlPJa1rTgVb~ zLL=Fz_Qs2Jcf-vpYbJ%hc~pI9YtPQ}+n48US8Vf+%$BN((PUgQai1!mz}8ns1n172 zu!W!BG;f_r#dg&>2~PGAZEs#)i8_}OCDpXjB+T&grCp7dYvwVVb2#Kx37REw{oYvO z^4dZDPsn$J#LJpz5;q*r-OXbkdLU%|?@P)h!CUlJlu9(~PY`G0sXb_Fa)xD!llvxvWb<<>EX9MxZ)41;FEoSPGm3W3sKUvP;a$QQz?it@s_X$QkmKW=8c4+xy z)VU>1aN@4{S5%JZSx)p&3FTRqXYxPo@%g8hBm-I>zsmPylZn}{{{ODXojrfdpKe_A z=xDpZXLX?<^99D`iIWn{s=XY<_>^`l*+kBb=F%$v|M|A7QT@dG+P}q(HmJF$^>bEM zng8>PedGTp-RWo2@ttOy;;YU7%HMdG_e;3*)Z5O7&3*k(qIR!)_pkDK^S11BOJrX% zzWQ-F)#miIia_7#7k|v&IsehcU&5@7w%ZTAcI#(ZR;poOTd|p8+AT?g+u4)de^1@C z?{4NLR{qP*Ml9D-Cvkm9cA0ofMsU;g_jP@VS2K;WPOz>Me%U*z`CZujiWBA&{i;H& zCztK~IkBtd%Btq5>3=-bQ(aDI$-hfI>>X2W<1_94nwN|E_e(Y!Y`5C-?K{KN^o#YI z+b=%&5dD-RfBH_d8}fR8Z@%Wqw(q>My7~684^eJeW`A1sAMAbk-T3b65BDE59q;8* zcD35`>quVs_ND4GqOS74_R2ZEBxt^>RhW0vbiI2~I<`tZUeY&~N2={zxp9eOSJ92r z-j5WfZ%FNb$+>d>?U~$>*3h?8>}@Qa zWFv9gX0_Al*nm9Wxl^7$DBp1F)2HV3nGstx?w);r?TPuJ)l={D%__h9f>VV}`gHt0 zTgR|9`<@-JE;xPh(EWtlno{2wRHN?{iEBMx8uWj|saIRhZQ6R&>CCDfSAAkiGqzvg z+9n;K_V!An)0wiB+%dm4e4ih4`q-L;;spytV|dR0yb!E*H&Z@-1mBvHX#KyJe#Vw%GDqF`B**`zS^9){L3q6PR{aIJze_&aX(a2U z$_dVrnY8Orld6?kyU?utITM&>>|6MB-3F<@hKqux>Bqh)*|zbz+FHG;>Aq5tree2( z3dBBXt-PDb<*+otKjc=)pNJP9Uj#3F%b9!9`2F<&SId<9tKM+<>M+hN$rnE{Ss^6t z@ySpBzJ(bVU3&8Jgk*@0`M2Eo#XB1B)%zcC2`@OG!<+J6K)C9d+N*Uw`=bg^S+>@>H#?s!*lMB0YJK?RIo%hg z@$!})wRfKEzjgQWy%`eI!?v@22}Y|7G1%heQ8v?OG5#|H{^HOP6>_d!PHRYLf52%6bP^z`@TyiNXm>yT}*odxcE$ciszQs^p=;gx;&jy-SA9D%hY*x*@Sne4sloB zJZF7tiiMWxiz9Qj=dL}Ioc?-cOP1WU_&bH-e2aO06gVX&DX46I?v?KBc)_?}=gOkP zhf8KzraYAK(OPEPd*=P|1haw%_y0Zm+}oio_Vic)k4oZ!li8gdQ*U!jU6aqxe>}VO zrtSXc-vo+9Qg1li(PDBxvPRHU>&k|SHs6+7FHUtnd|$Ti?VYtLpBH8th~C#u;je68 zW_hURH|zR|a@S(ttiIB?K7>Q^q|-h1%D4@)IB)RSUVndE-09r?)h85=R32ZOXY}F# z*NGqNKTcrzHe*RuM9fS*(^ZYN%D+#}iHR_lg9+Puzdt>^WcTIu6Zxj6@0wk_&42Etr3+WF{Ya9|d9iWfrXM0+&(@!K z6X*Z^P++Hq>8GG$yVrE|NBj3b;#ked;Gh~8aW-(*pO&uBvJ^Xka~%3#f;i>3Xxi3@ zD}{tTbT8Z_HPz#GOn!m-r;F1?&;NXN)Nx*zYRi;wQ61-RH!zxNh5eo_b=2VSjkK(& zN)yQ`!bkFc-d$P}QgBOV{+SKce@`EC2zetM#UojlYP~3-ch0I+drH*P_Dttn@nc`D z>Au4PhlKyu%#D-F|F#7){Rn0YVTt~lt8_C=v~gLv!eZ&AJ>@Rf4#gFQ z9O7o>yliRs`0U!s9F0deefKu4oP0gtj7ES4?5zkX)5#^r9g* zPUa!A2G@ptx3U&D7~6QE@aTyik*U*4>9OTrE;=-;!NemDKm! z#;9a*&2)Vlw<04lUoZX=&x$oWPD~f!JSP)+_qLKy@3M0XADx*lQ@-Zi^ZBMc`fIA@ z>udHp{94e-bY*F`yi$nGw05V7g7)b?=T)A4R#j&dy{xFU3qt%pt9l(@ zQCD~ShRFW4*7{n<>%Eh-HFD}sysz(T`*=vT#+dzBTdF|SJ)x`bKkfa0s4K(n_|avj zGwT0eQD9qfVZj&U%31kh9;=^mL`who!@Vj0{8c&GzGw4GpU7HF-(kWLrjYc>_s{iK zj;X$jZhe{XwdwoENlI7!4y}J{qcH21a{H_oPgv{?Bj@gyd;M^`>iQM=mlnEx{Mp5< zba7EZi&toEyv7Zy?k;_acovJhoGjVmpIo>4DsFi1c#B8N`~WLok?04;QssY<<(GAH z^$LVO{_K3v?OmtTsl@b0Y4d9T@4~*ld2?J@U$y;-Gbu0mFFh&x!8$cro)`mxQ|CWc z^e}epn&oYF?x&uDX>%TaOiQQ^bCGI>G=D!SZ63l?rz@0n6K zk?FjcSR{j3gtJ*Cqu`gsLPqhhSl+A+>|8y$tgc!*UPm0#O~togI~$eD-6)-X;IY)= zw?(Fhc0_kdC{N?)JFvX{pz00DZV{85l~UU-Y?k`z#{5#?DqmB)|H79dOlxf3-DI?O z{PtPwfYOV&jVJi-b^m-6F{|N_n_A;m1MW8mW!d*Rm^1uOIwALC!;YA2B|GtVtXftX z3_48C^QKIHDu2^je8;j?7JbTjhOB#n1LC5NsR##1^dAkrG0mXzly>Js3I6nhY!NKH z5|`X~3xFcF-nxP-AQkyDdZRr8BucfTz!#|r3@?m zy4MVDa3r(-3I26IPiI%f$3NC@BEBC9aSeEzdq00xRQaLE%WLilyqdG_0aKpY1GYx% zcjw>p9k1->;hCV?Dt5?&`S5Y$?kfr|eC4VCjtc%P^j&E*q4+VAMdVMm7hgIBxC+kt z-rOuc^=abd`D$I^2N!#NRZH@07Fu$uQ_Ze_&)hT1WG-1qo6J7+x~FaVnXauD9Qx8u z1z)P?oVWP>gFlR6Q;kF;?$#Zcwd{cHYED6pfahCSH$UTioO$Jp4v|wJPV-ePWFQ>*Ac2v#N%$h3o6QY+c;m-4wQN`L?d@k?FZT z9)Es5EPnaTWTCO~-F2m3MJI1tUht#s+uGY(`#inh8BcO4EZ#m-t7Z1Xce#%)+UV|h zSi4beTiNmEKh3SPzdDQT+#2~&_R(WUtJhQXH_qF{z0@^whwkzDB#)8^tj^ZAZ`Rd#oU+V3-;d=%Ck z<;mAwsq(B=I_yE%tP7k07wb89O*GG5{C(GwQ)0(2MX_rr_n!O4_0UX2f9Z-kmz+z_ ztU9|k)El$BjuE^iwdd*Dr8>#scc$#NwJ4v>@4G|t%~|9AQ~qzYXMXiQT@+-g^4ewj zjC`vdC$r^k1Gie4trE}qk^JfX%LU=KT8hCtN*B9nD`;6hk2HG9GKcBm()jJET+GS$ z|0QnktMj_LZbOf&k5O}Qf#TX%hMugfvXS|P0VyB5UqoJ;a!8ze-SXYhE+t0hb0@}Y z-g^JKv)t0&?55pev0t8D$BGwCei0b|+#_&C#G?n1kp(|rZJFicq_CYS^;_59u-lz( zpQGd>S8dmN@Zwdu_w=mt2>MCYwPFl=;SmAhN@m)dPpt|r2580}IPUIGxEA(f@ zyuI@eq_c>Y6up+ycHYZ%f4leTeOVHw5;Dp+e{b!TaQqo7Qct}$6NfF{QBz76eSXN6(Z=xe#Rs$MuV0^-q%9C*(mGZ- zJCHr9Fer=2<6g%dXzWYvCeyWn)xhagw5dnYV`e9+~X@dH1!Xz+H!isriV-4PSl7hx~w_d^g(CCzaOhVmZ`sJ3x8TT zWoFHtR-+`{9L_6^dX=FJR}6RrZ;7aCr92NUInnrBpppI7vo{AKT8*tM`CDaJ+}HcC zUX_-rWSDe{v4ek~h4KAc*=DULKit&J*>m!Np(|@a$ev#d=1%3AZ7Q<#x$d96HjXEq zGZ=0$ryiR(TcV+cW#NZu98;tAd^BJ%jEu=h)LjtttS8{)kB_f3mQGI>4nI4g_NUUF z%O6BD7_RXzbaZ(qqNSX8{h--7?oEE-(`HIEtXVuG;P#0%5)BMfrxd(!bpEawQqv+Q zu=C4F;>`o66xR$VqRsawD9aoi;qC11?3Cv@9`sZXv)%C0=doUOgfZhi#gmqlxC zWy;2$j(xM{%$D`rnfAZ@l`0jUwT5A8Y39jU8DFd%G`Wk!O zIzw{C{q%_^{?F<8sifx&Cf%_y4e&I>^7SnzRQ2eZSwpD&K@b*JU{*{ zy!qxDt3#_j(ZtkABZqX2+l16sIbh zeW|KKcJAVuC)>M^J(7JDHsjjITyam?4~yU4G~cARzG1=Pj5RBl^6|V}T5d4gqwd(e zw9k4z&pPk?e$RT~_Yd}jiOi+Sy^V^wc06yGN?g__cQ*I>dB54U=d^f)`rFYS_!(5xXyMBTZ*VfNGTKMsg6?=MW-?K^Lk`X~HWu*dgyqCT^?5q7WPfByj z%C#4*1DK}^^`|-f`St5-+SekhtS3UhlXUK_$ZP$VxZ_Ss(v=>&jOU6RX)o5a9%Ik_ zY57k??$?8V#mtinMQ1by7ajf@b2!#NantjwYPa_&HC^P>ZIQbW#(rm0e!|>>_yi;RrJEtw*OO;dXm1cIxBhBGUU#5 z+dt;t=f&*$mv=pI{q6dkgSNL;T%T9-PjRc|;+d|god;!YBY*k-dF=H(bJ6C1Q@?b& z%-tWiBy0KAnGQ#9+*x70|FNR!cXu%duC=RoH&1x}az5vLmbX*R|7UNQ@XTK#I=3%> z_sQmM*>BgXu>`NTvyix(9P;P$s+0TvWaqL8cAo#ge?^bq{%m*SqnwYuj-9 z^ZV5DwbL>qp1i8k-dq)=#kSG^+ilmwFRcuheqDLvo$ku-SIhQ&w@NT_X3v$IBp&lH z`^U0M2j~8>qWcws;xSCo2bqnoDJ|4!da;}P*8aS;qE~~Ggq}7*VZC>;g1@#B=l4Ub zDm$ld?b*JhQCT9(BHH8ck%|=^+R|_DPdFs>fmKfPDigmkV|~uyIt_vM2mP)k|90D- zE5&bFu=9KGJ5#Nf{EJohU)v?}3vqUpI4#gJS+Od67k9_y1RjNi$rZWkt1v0Lea^+E%S|xe; zVW{1jSJy5DE;{62FPJN;P^2U4=INmNKeF)Cl=DWCH9JEM-ZeDxJDjkc-LX!{_25l@ z*Ql9Vt7Omjo0Qd9DLhbrEy}T)L9}wQ#GZKvIDZ|K&C_tdy82J_-b-&>{>+ol+aU31 z-RrVH5l^!f<=)=%sd3_6_~_Of&oA|i3xlSwat-+&xM)-H@rR!nY*v2Xn7b`${;c{9 z&yRKNnkv*T9iYg~d(%S8)p`A<)Zi6cyeDVELs@bFqAJA;69$!8YdRBu>l1vM_* z#ogx>7riXr>HId%kQ+|URjjE(Q;mySP8D2V{X&cTP`S&Kpf&fZyPZR>e|h-URM?|c zx^K(8k6Whm$~Q?BguE(~$#h@g(C5Tw`15<`J43Av3ntu}P{4U-gQ|A$%B!lX)=rC( z`~n{u9(*^cZ{Jr<>9Ee!v;}un{|97+zE`ck@j&ad$X3VmJ?)dMmc@pAIPbjCbY7;} z!`kQ9XGy2&9qm8YzVi6t>bc^o7Q34kE`L^ZZ_oEh^Ioc!%bC_OA2}J+fBlQxCBtRG z8}~*R-Zr`Wch9fgR}M}4T=ijUoll9Yc-QjS?N@Z4O*prUA3H& zrj~`>`MAaJ-e@&mlAoi>&R$R7eDSHw_1xR6vR|%93_GT(as0>P zuUX$apUvTZm-j^9P_XJ=DDRsm?B&fr*tw=Y{SYs8_o_RuU>g5BwTJv7T3Rau0$;8V zTDa(v$=8O3Ne)*6GMBl=n1}~lRL~8{Jhs$MJfO1Sx%6gtwqj;c)2V4O-61Phn4AvW z>FjY+$yZcsvyZVUgJiksnjMF`LPWJTdmCR}T@xnyr)J;8$G-#&6_+Rf)9TLIv}1N& zc7p!8?OPrQ-P#tDvnf?*()GIij;*J1F7hl~G(U;^wT>|VQH`P<`+np#D&;K-w25lH zB^9gJJN()3;SvYfTit*3M*KI2)Kv`XXA-ZO0)%L?{(-evljyDuxgzuVbUWX-1Z z6<7WJO&QM0ofXjfW|Di4)o#I~)TfWN|6Foi;nM2wnC&O1^?up&-K{3|E2SFJdec^g z|76O|cp$Ov`Mh6lVa_aWQ#Au89)5Kp?8<71HiM%3$EALSFkg6ck>_{lGJ> zg`es<0s{AYMwhMpADmm0^3>P#&wHgwVSW-f^UU{~`L~|>k`lh`ZrSMUW`5RHz_w=BY$};qiMUy)SE(AKlj_#=9GF(UC1@HUUm9gU2kvsUBw}9 zMYPrx?rh6RESS7J_TxEO7o~~3$2m8i-#X*E^Q-lzu9xjo6uhOjZbh%(EFWgABY!r% zlRka<_F2`Bd4dlEZqEBSEqPi&(7lU&Q$L*Qf4Xt5l*{~VcipvnquaW&4)0u}yD``O zQM63gji-N}$#@2?5c_!I>bB)OU8nAAbFp>}Y*#gWvM48*ZQ_p9>2nY0+D~;3>1t@) z(&-|qb@}r5lNXlmxV-VmyLm6xoV)6!d}m&lsmd7yU+T0YJReC8>`TuLP2-TSk+bWAczUK8(w$f74&MrTpzg$}{ z?PQx`=E{v<4>go+Z(F@WoU3Gi@vm2<`f0(Z^_MSp3S>O?dhRr-4M*p=)!jTezdrlI z1%{A63vQixAl5xqO6sTcyt4E=CN(ZCbGAQf z&-eB%&ovYMQ2034^l^IS^zcLb;zas4haQ~p=VY>w=%T$DGY*JyMc=aze|dGbc&+KT zSsP}{r90`WtA2Ts(iQ#kp4yeig^oEhT{3liUUcreb9?gSYyTn`7$p2mlGxel+lSg7xRO1}Y3F+OD6K=$5sk0ur$i*LLBU!s^rH%Cz zft%VgF%bofSx3KWwAr%l7h4@LGi|+*zDtDn%MCA%GG|Y1D~!9sxlnomQ{$B6x90Cs zx&tJAl{;E2^S2s5uG~4b_3ypsZZDnK+xddZG_)0cugSlEa6tUzTi3r%cRXHX^-lfz zO{S;!($d){o~Q_My0?lLw|SM#nb70Rdw0U*u*KfXPd;Iel?giYLqRk84x6RQ1qY3G z77+&KMwJIDZYCZ{?p~7YM|FbA-rmS?C>7D-pEU0zqu-%d0$LO9$iG=LTYT#quh*RI z5&6PlX8a2;`D(pT@jdlOuq0%m(cSc^%|VXqA3adM$uaez;vEA$>k~FFzvY>#Fi%Rj z{Fu3($HB#{=9m3^k!LSn8M)rpPMZB|@1;k{+}%BY6dtDpuIb@6>+?!2o_LXSqRr-= z9z~TVTdcP2G`SV1a{cO6Ue7li>&iHE`!n=RC;hVe@Jo5;bDfHvD;!FVuP~%Ct&&l3 z+HWGb=k(3RQ zQYv%&|Es14o6c-HeW++Ri^qlyn;LZ26m3@M(AnN3Q`k1eLm_1Wn_Bn^0Zxvl4z`(! z8XSujO_G|oVy4hE_oYkAZYCaI{r#1>F}IFK*Vn3bM)Q|{POJO#{EoiynR+{($1X<} z$Tr>ol_a}z=EhyG&PAU6bEHD|?4Q`pd%ACRZ`~#SgZ;_& zd%9jR`((Q|EKu5e@9O4h^RMdcstcdIUCL}h!nHM#_b%=(yVn|e?vQzA`?6(WJuexJ zeKYPGoW3IctjPcN{s`Y<72_2v{_s15Z24!+y7FFB^5p%G*5&9dUauVYy1rq0#mjdq zghZ$QXI*xRXX^jHWzX#EQY(D2d))q?-j!~!a>XBh2}4VN*}gyOArfJ4R;=(3u6#Aa zjMH|eMp=l42#1!INJxmriWLDp>{?nPk6XI9j#?~Syulu>EX-D_-^T8J=b3G8;r9+0GcyN=k3+ceV(_l(RgOpsUywj z=5+0!zGmslmq7-5Vl|RnZz)z>zPV+JeA9B@=85(X-j?2%)3Y(Uu;pu>cksiB+scE3oTXlhpQ{5E&iIHS<1vvy5kQx+^-eK+SD&w-swKbEYTyIqY@ zbSh_uj#gUQtSGlMn?}L@^kqklo4NcI9z0ZzvXN-sB=)C$l9=e!PA(VM*B2KqGGbiV zZEA8>PIT%@uuW>|w|d-NUHkoAQy(ona=p65qC`teWD2W$qqA#k(wu<6g%axiRUt3V z`!1|FRN?n`ql>GhOYb93h3tweao<0>q;f5)V4AUHp-JSiB{Lz3Cm?X)5BC)-0&L_? ztkCcc-LRtLfunQ&#p$;^htn31}-qqVnp0*S$SjWrzCBb9Te$VNB97?+v zzW8eF6Lp+g~;RM}TZo)oUAKK+XK zDu1`vcYghT!KwPZ0uw$>I$m)0)(cjNqW$Gf0>`#lRVh85cyY@O#^#Hz2_+Mwr$yE7 zT(30$SWJyV;r60;n~!ei=eZ%{YN6M|Z!_WgB;85_PoMQ`Z?EYpSQF;G@W!4;0@8m! zUE0m2vBB@n`|PK`4u@y#Sei69@8b%eq@-nilhtg`ttfczH}_YQ70)uMN$i(iJ-TwT zZTspCxjN#~`_}|4`f=K9+fKHRrPrQbzOh-}O8=1G-ph~6H~d#vypLVmT&K92ng7Ua zedW($I-k|DHddQ`RXbGpZa>#ig*TUs`dj$+=QeiV+2HMW)>oFjHqx^EkU&5z0xYTsDTDWuPor?9l zm+v|joqTIb>ujDNv%4z{o@7mEG?@Qq8T+i;>!KBAe{NY{s4dA*%G-P6{KV_ikLIM9 zzFoxlt8TYndBd+e-OYiPfwj+mX)W=15GZ&-=BLc&<5HrhU95MfFI!)8Ew5QW(xzB& z-_vTlEjKcM`X(P{;|#R^sW_=H?XJw^sfy}x>Fx8&XH1_PdZF5iOLli#$-3$ZfjbMA z7k%9m@K?^%Y!c(qc&!U3clg(@iJ7Env-7q}<*tp&8~5ASvt2xWO!;V2zv-iz70zo7 zwi~@D{^DhMs4?l?>RXy?56xMe|K6oxjl_;!MW&VOcFg&jJv)2r#?^O&;@6kmy^*~^ zDPhOb&7qieyBGum z8_$2gW_vm|C{4GrURDb zJNd$i6&;W4wk8{ybLKj)xxHN4Sd}l_$=y};50kWFckvmSj#E;PyEias+;UqOdm^6p`r4D}OQ$p^X4}PGx$;q1X_oNO zot6=4t7?tguI|5F|26M^Vc444vVSH7-q?6``O=k-C!O?~Vav77G~)Iuxiudixc#-~ zy6zMAlFc>Hew(`1LW9*$&jqqXq(447#V+T3pp{`{gy22#?Yji5pLXhn*LLjKnRg>E z^ybo4Fa0{g`L->WI;Xpv_u|vTKjhAAU+os>c*8Ni%gcbwiAm+E3DrKR;f_|cB}U8nvA1TL)5(UAO@T2K)Zq9NDN zc2T9`@Z~EjrHoB}US7E(z(zyMYO2*Et@&f$yN2x z_eE~K=V$-^x$DG?!_z0Ym;duyc*6c~_kp_S;d+Nhh{|AK=INRmVYU@ce@h=T|8;@hnnZUfj+o z`El)}IcpEin=N)aZ41{<^(Oy4>)y-xue11eDAMfI+HD!i<=0p1**b}RyR+hS?x{uh z*2lYr>ECN!krH2>YTmVBzeac0RiX1OTwi_!PFNAK&e-(pe97FbU3Y@_Z7+NI%2Z8V z>h-NFxGYQc?Hv&fFH*v##*L(tLjX*gXm56Xs8O_;=24_RS|(M9hzf ze!gGJ==l1NIU0vNBcH9!y`+%(N8*`-u<^5wJJZ(bna5QI$TZE7p4aI2V?pp%#+=*y zP7_Sm?07%Rc=Nl4^MBH>hgm7^$@t^?_&||o_x%I+5?mNut+cY&+}2VtFMRu|T)O4v zvSsFh?@YUYoM7`eIr3d#D$C`_*(aYkY@dDFHrGYKFnhDsMQ@L?gO2APUuUaeb}{(5 z>tOVSPa7921YQikcxl$M%>mxt!J&FuulMaLJ-_Ic$HR#RH;omnyxnX6ty{b6#82in z+qoLMZ1OYg4lkW^_OGeWo_k*xpM5CKGk3ej;`^zA8{gPB$#yzzyO-m_aMbtKIUn`U z-ScICb8E*emfCXhk=&Puo7FaU-iw;DK<)M0?Kf7Qid|u~f7OSCU7d?v;@kVg_4E0j zn#FT}-5NbCEJqQIRmK8kIrd86SG;IQ$y`b-9LVBd;Lg!!ArF{ z#l4JS`C*@a8YjbK zc(497H_JW3m#1BymQWU%>ceWm`Fk68s;>6Jr;ptO7eCTV`_(bS+GxhUbG(nDJ|(A3 zRWYvh{!oAPt>VPDiYXTzb?)i6G}eZ1sy%o&@0r!Jy5$E_HdgEo+8z<3&C_zT)O*s= zsZY+$oN)A8)bY1rcOTtK2z>kIkC%VgmI||fKFhC_=k4ARmeg~8U6!I)_vD1Pk8XZh z*Y?+Gkw%GNH~&oWIrDGUb#!pW-7#6}ro*SGetYlKyV>uzbsycwG4It1rO8qow+kz2 z2z0MM@YBbpy?2i6<%21W>46^m58M-oG@7~jCAV}!wwi1AQR^*pCqG;m&Y9C|bWx~G zI?Aq2#6;`A)MxuXjYItn{>uK*AsTH9U|oaBoI;{u;>*jU0vo<*OpmIp*wd!($lo^m zVJE}tuQ?`CuWR`HKP`x~Z#1?6@yCx~KSke8~jmgnR9y-r|YjGgjDSiIQs$7G` z`$AlkHyDI$Yi8op%Sr#xd{ue*1no&BZ!bJ7W6gNH*}lVr@3?1Pc=c4*KM99Vy!`&Y zCnJM@XTcu#cWW&zj$gCMJ=*W};O(&^yuaNuZ%liBXaY~b^rgiYnm3+Xr|@jo{l(92 zU3w+TtR5^H1Az} zp;-%KlWUG!%#prx_|nx&vAKuzI_F&4r^hn=x~RUEPDR>E=k|jtRx?>lxBWB;bvj(f zYLespSmDgM>Z0=9XMa0=`uy{=$1;71Z12lwe_sxouBNzP$ttCSi-j8Vysp3W+#EUU z%c zU9+rtwr|83LXjJW%`TJ?-;fFRl zr%#J+-hJ|yXqd><-0cjz(>9)X|FhqJ`L*vls&mgrKhM6l{{fSj`OVwMtU7;&DtBM5 zD-@89G*{l0Bm90=m2vsD&y1;p#u8Q^n6f|SFFW9s+TA$U^nOd{uh+H;{2y#|UfyVn zTxqU<`@peAySV)Imz$P`UG6t6y>kA)wQk; zGiFP&+SlH(z~hyONF%Ld+i&mkEnl$7hyQ2rJd4^NPBVC>&)dGeC}#D=^~ZSwZhpR{cUtD! zg2|r~UT@wqaq~R6!<%!`yJy82NKUoeFPpI=`P)?a@5hg{PCI&h%Sxq5F(+1>-gIQK z#zD2x&8sp3U$t45EP5Vg|BLJPBBSc;A_>Fa+WH4SZ&3MMXS(gFQT%KDMJ}aP%va6t z8EmkazGVJhLB1EW9!~CguP;AoCC7cCyDwOjf5vah`M$kIPh50zj`VKJH%!$@x6j?- zPVr#!cb}*|E4|>^>|QRBsTa@G$6eiXp!3QG$xC6JdYhH=&g|3KxnhFUwycx?0yZ7_ zYnk!VhF7C&!3y@H(lg&{PY!%}DfsMvA(J;OMq0;C7Ed@GX{2SnRj}mxVWz_}s_V+H zyKGryCe%U7qwrxB`D+Mlzk>M?oM`3RLsm&d{M6c_>|_Nr>niT zwF}vmJ=mm@5@?xRt0yTsz5FBp&6-aBO>08jQUlfQ2K|@)yj}70ROyo|-fa1IQ(Q1* zi+5{^mX7q2fAi*FS#>OCqlJ2`inwUlNxrgUthu+fr_FB3&)Xv-uJP4mr<{}2ThR^b zT{5D=;Rfr99S`f>N$bwOvFND8wx5@4d0V|Fv*|m0T`l8qn6L0<_NUuz9729muV^iI zxEOck`jw4uea^r8*LQQrY}ukWemCU9Ll2y-n{H#Iw|ryslC*@{HOzVu#|_>D{g{8e zT8e-D+vc11Uu9cu3QY}6ygaw}VQ55J#F6>#-(*~!#TBN#Fxi&QSIC%jv~AY zl~L*cIS;R^JL7-WhU4%vNp{mxnd=+Z9-4LQ-;PBJ4<6!!IdZOwZpJ(AW^KPidKL5wJ zChjS}z}fo;yIr^<&idY%XHex9|IqC4Grl+Hy9%WD-`AUZP%SU4DRr8(Rzb)=aV5)j zPhT9|u<38}MdgIT#5Joz&z_opVgC`c%#zmM6Im2bbH9lH_~pLNfB6l&CS})NaPFAa zw&1@{LeXmBs#h}{0vCcRA+?YYjbkS-ONk2VY3@(joX)3oQepQ>z4W8Irgr}dPG?VC zc5fAjYR>6e`G+0nq!&0okPDRiD`RT*WsR;clX#YyPjr~o$yYNs3mz4gpZbjZXwK{V zmt(iBIJNrtHSzsM>q;NZ`*G&4>D)VJ2CeI=@9dg>aN+`ogH>j$JroR@o&~V1k1|lb zt1p{#k+{p7n&Rc`w!^ulzzMf|3C&P9h7DW~sX-}`l|@Va;Yhjzc- z?z8fzkmGZ$GdBW%Ox|d5zgPXcjDXJPmzI}GWEM^q%?UdwTD9a(WNXRh zo!iVJSDF8NrLpH#v&OtRD@0=Rc`jI%xeKi6+tV|}(e|F4aO<=A<_dA&OlOO}JD+Ls zp=r0R^xmuAS1Ei<6RZ#as1;qmeCl)co$-l>jnf^!eOzSndqMtmeai!pB{g1-y2k@K z{N1lkIC@>~!F|2gq8@8lo^M;jpIXW)J!{KrPL@-tE7N~(a?$5xc`fSDUe6RTWyKC- z3Gsce(+v0|mC~1~?@%k<>hyS*3QLDp>xo^nH@aS*sp)d!=tpk18KyST6WMNWdv&a$ zzDqoi#pnAq*{*lF{2ggm!u&pVrM+>`37osV^oxwszBGd_@7EGNzE0D0W3J4ZEV*{x z#zBYT)0ez9TQvB?o!J9zz6LG~01c%E1TLH*5STcX zt7nBblnCY8E3|9?(I|FX2ed-B2XtbL}=x1)lkZ8`LJ z?45i&RQYL8;}L_RXD{YXyzhL?$>N@}=^LfgCF_5>WZc-ox?HBdqB14W@33FQIgZL1 zZFhql&zQEg$v-7DDE`QXiPtxD zF7o5=y|5wtvD7!I3me{U2;TQf_r}UtXQ^#(Hf%U`$LQ#ewzboWetfw0@6(YztD5&| zs0S}gROY_0Ayj;xoW#n+^Uw6AoG{7ht_Ypkwl|;Q^roh_cRFTm48HG@n!i9$>f360 z{Y~A{*ESfNg!5+KSdp`(Z7zedOpG~c5SVqLiqLS z6WKS`9y;-IN!wl~lbk1;D$d(n*iabyTP5R0mxyThV}}ZmDk%Un%n5*7;?u(YAfnt_MfMr}bahkZ;ppC+mH9-yF5e8{&_fzWEg> z^{sK%7Rv>R`~M{HMsN5e^~>~Ja>QXfzUX*9DYJIvuR61@PcmJScwcg5qWJFPt@FN= z-M4va$7?Nm*fi(O0-wXr`mSuaU*-8?(zF!QHHqDpOWOXLu1wr-yRGf6?TW;9@%}3t z!XF)aGNCQ^|53I{$`DBxidXpPw)5gY}nKG*JnY*_s)wOdYc_~pUc(ix7?&# z9&y<2&IOaG!`tK+CZ^{Es&y%8Jd!FCU6=UZbVcHKp6na#4|j_`j9_nUd)t|PgVl)l zc5c97zay$oKO9cZxS_Wov3-L0f*Xr>wEY!dm{=b3NhI{4RN1)=ZEww@4%@Y6->B!! zy5YE^?JiTK*V)`@nKulq_uPv1J8WmMCUN>?scohF zY}aj=o(oEqRfUU&MXdkH{_XkIK&dj0g^BG#Qrq5g@K%?vU~*^O_@cxr`-8l!qLl+5 zM_aefPbI0qCH*XNda2Wug=S2NzWCr)g1~Mcqa8}WUX&iF|9LZ!L+aawC3niAYUlqI zwmdc|`ftJMhpC&~-ib|^?Q-t0RMx4p{B9pEOqro1efqqn^zQc>Cv_*!khz)h=5c46 z*-V+99G1YqN0}chqSCrVr~YTYXjMPIedR6f%x^F3gLj>?m$fZ*2sxA1IkQjZ>~ec8 zk^iPzUbBotLPEBH2K>LQ`K05l^(;7Dw5#3CwK*o^tcYo%M?F)YAIWY%b zTw?ezed=+Usn5b45AS>N(qKvA?`fe2miJ}f*tMhW@2e*_9C>%2@DQ*3sFHKd$#~w) z1#P(^ALdM#^xy0ezW)Tr^$qvK!4-Nh`Hs#Tb+OF z_v%v~yw&fSf(~C>KhbE(KGjm5mwZard@HY>`y08fIy19asXFL;)oM4D_nqQuZ+v$z z;mBvJ<>C2f$tF5a$>r%2&d@7-1UKIQh;6DjdwGo@_* zIB2YSyj{oY7i(P2+CDXvu1l=fOAAj|%}oyPRe5!SD~9>=i_I5{q|D6sT-A^=d856f z?XQ&n#;S!6?%dRT*t&vUYSZ`EE=zAnqe`#bf* zhUoX7md*ZrE!2xAa;cE>IGo)WRTsVZ%c~_r>Z96PI^f zzv$$1C)4DALV5kkNfkkd^%h^u*jpKCxc6jwa>m-|xDQ>8>rBEtGakW z8VVhYnnYWa9t65JRxM!a(ufja$qbF^&s}|OtDJXk_}#l@D`)<%d2XM4aKq6fzgDy!K5D3H_(n59H0ZI{l2DI{VTz`zYn03n zEy`Z(VZju7CUo{vN7=6*4Xqto(w<(9U%oCqGPC$_PtS&o*%uvH4QpPkXPA9K-V9WjubZ7vIYgp5DV19&OXktYiP(Dkit^>GRVeg?ZT-UG7hgE&8I+ z%B|?EuCyiD+3n4g`sd#*wsuwA)cd*bZsCNFH*B^`7yX@;?~}cuZAN73*Hd%vX3o;^ z6UjYrcCzOs+a11{rRFlfAHGUrjmf=SxzOt2>n&R}*dv3&gTnqy_k1bWGw-k6--6N= zSB!tW>AbZ?Dx2vaXNI}UL&p!ZEM`QoQUUzZIymCp7 zmc5$-7Rt)M+|6b8U*q$+$?hLzcWyQpeG|XolS1f^%M3BHyVaE^)Ygy z&a)N@Gwfe+=0t&und4vK00%d>xsDYA&nu2D2o;&Id+kyG+Y{%j&3!O&`KQd(IZ>+b zCaf2cTQ$+6&TxMH?Y(~Y6+Md%hRvI;ruk8C_p^PTrv61QoIK87cGu5e>FRNbV|9Uy zl`7YcS@H~~Uzt^eWY*a!Xzo;7xn=8n9jm)ZQs>|7n~-@~^XB^MGN;ldU|C;R?^5ivJ(Bo;F|%W&4=#t#UxwKejh`b-~mrQz~vua&mW4 zwY8dUw1H2)GROADIRPz0jj}Hur)^kcc%$ERaJH`C$ zmp3LkesR2V?Xgy%#*ur!xi|V>V7$g2$MHB|)}?UA$5*tH#jSrHi+-5Z7R@&EeeV{o zmFAsWxK9IFc3ynr%8P)BKV%PVP`+AX(sXm8Rhv}VkNfHKb0ZlF4UdR9`^v?;w`+w38;6|c zPhOe1V)JQ+_02MN0=gRmE}vY^eKlf3@S>`Bp0#C;$LF^D@m&4B?`m*Q;I{vh(Lp`yh^E-8IPCW{oi+r|6GT@jNDq? z^P4P|c3ca45yfJoX4HPr;v-A^ghuw8^(Fjy{(CC~rU+z~CnVJLl>UdL~Ma>O*DtnOjGn-~N16PR{TOclEuRh&ey(5^g-w-gxB9 z(XyWz)e$QnPmP#6LnrUXWOwZsEENW|7ZZ0kMHD^?%yaDR`^3&`WySD&->UVmOLE@T z-?#HVo?Gs?ChL*8w^&q^l;5Q%w;o^7s$+7D=7>@fI8c5}#*zKJedva3oU_eu?QLaj z68IO?n6Ngv=VVjEtUnTsI#Gsir*Mhf?7tE4c|rM3hY3?&I#vfXfBDynh!?iH+`_WooHY%Kd^5GblMow{4 z;ej*eF|16&y2~vZ7r6CYUGp(YO+du&lKZJ+D?^Xzncb1w)#4`p-7Hvm;;dI;jxp;+ zZ{=^EEPj@6;;c_$ieK44wT_#w;OY%Wv!qtV9S+FWJDvBTc*d>U3E_TAjN*!0es&5k zI~c^b`B7`6>nyhFnSE{x3o>tAn0ajWGYiF@;Jx)1ylfI@%sO`CnUw{Dsk8Mq@hf84 zPqO<%nw{SNkCix7mN>)Bz&-NfM4@cfN3*mpA3c@-Q*=e7AzP)PskYuW;aT4}78_of zw;*id^iwV`FSn&0Hj|$8Q03hm9j@MW{?)4lPCVUwy)n04c+V&pQ+ScgOR6 z$5*^hH+T5dJ7Ig7OXQBwu9WG&*ll$$|C<#eX1#33sXqTDo8sKh$$13Hs%M)xtnb`g zsoh_YJUQoXUdkQy?AxjLa(bt$)YX67RC=dBu;;8pSO22j>M0vfCI0M^)hk^8VgKD- zr+;++T+golfJ1#n=%Y=|e|4wMZ|TxoxO?H$R-3wc8i%J9)wyL@AM|aH&yIbbI7dtC zqu88 z)JUqGedXunxq&|2#%nBYWPMI&IhAdES8U~$x4X23Ge5;V(hkjv_;@+x?X|*1PtQG+ zR2OR#5_=vYRqGsFxAB~(^!eWnXUw~j7)``y$^=?OSDa~<4ldU}G`Z}Q)jF=J>DtN? z%=d1T?)?^@e^w{-qg|Zj65j3mw6;2(ySGC0=q=HX2j_0yT~f;X`K*)c##ia_^VV%C zP5sqXrY-cFt>|37ez*Bd{%xL7?{-=~?e~tJAo-`R^dX0OSLnS7yw=(~FaGI#K5c88 znYrnwtSQf@&Qm#*?D6B#b(6hIH!kzeU)8>wT`;)k=c34E;W^w%zRv|)_n2y`Hr{f& z9Qyet-_-8ubx&^{c(wD4^qID^obkMKZ_dB)rvA`jW1R)3)NU1cZ$A9$%Cz{pAD*nM zpEFMXmSdMVmH*$C(tEpaJ(@n7r+MN8w%>s+*@m6r1{-$FH-9w$)~=$y@7w0iGWnn0 ze`;RKoL|c&AB?_$yT5H1tD{GnXcdW zUvo)F{ERKJRzZ z*X^h3)VL?jSCx6+v2wz6w$`t%h3nHUzG*pb711Sm&Hr+JpYdVtS;lwzp8N^>ac}*Z zpb4k1eP*AdJ^|D$DF_eh%(aW$PN^g6teRG3u-K&?i(@phL45YvH zuTMRk7m#we%q6w)+v;=EU)0~)9)8q)B9pDaG_&aeH|IR*D!8rdK2K%A>IXNzi-i5$ z6|I)N!7Xq11%ZQ+tZR?dwDWLenE z?d@0Zt(LG@eL()c<{BoG4L%90&HdFP*5CDCq^?jnPiNYyFRkldSA9tmes#Mwx-~d} zUvBO86i2N$@6WxEvX8kizwmFijr6wFKHuKW%}Rg6Bf@TaGdkz#eHP*1Pu0`hn?5!t z-ae6XbJzQ~w-OI+Y+PBV6zwXfAhb1K^VF>Gi*tKCw!FKYtL~z7epB(*yX<>^t1s9k z%IB%nu)2KSx*n$;r>f1j2Y);y8}V>Cqx$3}cBfrj_bU4O%jz?2(4A!Rr9QmTOZ@%o z{d+_&)UJHKQaMgSPpEUzq=l8G=P&cV?%Vp-M&0Xryq47!=_eCHN)BGuj#KH{_xM}! zYtLg3SW+IUiCz^HzHoQ;joG5>mtH-rxyfTy=0tU&udmwGJEO#R$1&fVT_5=5UR3mz zqTl&Jd*1fV%?vdt-(kF)=kpTRy>tKZHuZejZUT8rf(AOe%_iZez_vX!W2!DP1i)5QlY zEiD^Z=Qrq_%U^z2U_&Thn5?|g+~_^-M?E|E1#b(-?5NNb%yM^M~Pw|1DI=6CWoQaZ*derzYHZo>nrQbB^vukFG zsD{qEHDv?W%KGbCt5%uJjdU|kpA@EOIxE9CQYZLwd0Jz5+T<`r)2=B!%d}H6zx?0Q z<$YwA>%EK>N!MN%eY42ie@J>siqaGHS5b`|t%q6V|2(|4(MRm5cvZmKEk#ixPIJ!M zg>!xU)x6Q?$D7Yt6-DxEjyufYx~V^h|8?4|u1^dc0TZP>MW(Hqh7yh@pyvz!GU+5Ne;&pT4) z!;1BbEw(eQvi(x_S8>wPz9SO*-yStOdZ_GB`#q1Gtfjoy6-}mDz4_ejF7UO<_g~bF zx6I!@zb*((^xFK`%})A6OF~zy-;?6VQ#m(`JTGqJ%$T}|x!C9|^DfuOEfv1ki{0Nk zyNXNk_N~8mWt)aT=PM(@h4X6?4%YwE-N*D%{ocI%EtU_zax4l?S(>7nfBWL?x2WN-^F^<;#+5Lm;U>#M{n1xuP?>hPKa_z`cAd3&rbXF z^UjlXJI_73B=CEQYjOXLy*aw8+~3ITsGa&RFvH&&jCWQWdfzNd{$5^vzf)gled1A_<(KA#N1yzjmmbR*cp!&=y|%I5wU-*g zjvF>_zS?J5n6tt9_@f4~j*I0Rl1zTq22`G%FMIWo?Vfq>O|Nvn6j0AQ&i#H_gjwj# z^0jlO-C4Tz$D7Wo$F<$z^8)*I{{7AS^R4&j)U^U_LYwCO(73#Dd&2CstQ>dpPPW=I z$$4@fb2rG9g?s22Tr-@a9VigiU_BLo#k_UN`$f+T6PNb?qhB>csyl# ziqb!$z};Kx7n%QC#Kz%0dwN&Yij(h?Uw$z5>nJjxZ%`V1c4R^&G)Oqi2+VKATqNnZ5)9ULMIlWU` zHD^u1*Otwv_UrvDGYNTPpluQpkkR2LTyLmk`g5(*t6rtGPFX!*VwO}`B6p?EeHvzS;IZx%dE6J15w3p2K#|wTqNE9MiOzqUGvm zCOj-X_4B6I#=jEZSSR~D4tXQ^>{6yAJ138|o!7i5=2rH-JM%7w@KvqvjGH!Tg3PS7 zr#k`#r=)C3W?>KisnOv1E^Yay(9Pa+Zq{Da;#%%-+EwwwMaRF|s@%ceXN6Q;q^z~rSH^JIPqboH@gZmF?R*C}Jl}e!`+b0_!JCLz0zA>v z4{TV!?x?|=po5FxTEx8#W%etLRm${`);x^KKZ@x?k=+vSNDcGFr1FzIn4Lv z{txa08)Th)`_{z#I9|znqULZ^bgspr&ZMd42{%N&@0qgkSRXyLta4g(_ots%PItLC zAMyPvHKplB`Lxv4w|A7!_#|+m{$km!seBqNX3|`|hCIJD{QvN^C3dg7Ubl5w;PU62 z?q*1o73NL#J^Zlptan)b&C)f$CQr87$={OYZ1~3aR-C@ST$p@fqI325*)rTZTSL-+yc2feoOB+@THKQ#pC8eWN%f z%w(D8*4}SQjF;$3)ZX8fxcgi34Z9UNjodbO9_Cy$_dR&>({rBV8}?qjdY|v;hNYME z-d{I(ldz@NO60KL>MchN-|V(%oBQhUdR2p*x`r#YAw07+*Rlj3Ogf;&*^tzoG&TPC z2GjV18)kp~ZTQAQ=J3BLt=jE58f~>#Dn2r_)w(q%ihC@*xy#`VbK6{%ou(7lK8ol1 zX}E1idhSQwrauyDGjA(AbalVkdF%4qdw+!kPIIwqY}xw1MRP|>$Dw=nGE0(LW%VK+ zF1OY7oGRy?>iV+JcQxbTed78rj&C^Z&mkhQ?RLMS?f2RaC&rYc9&OLA+J4`E#4yKk z*S|d%7JZrU=|u5A1N3S+{lCk00(1-}>yo zak9L>r8|}LQthFs*u9$Xo$ zd*9nPvLm(Taf{dD-ZnR2%YD>70IN`E7&u`Al8=8B$UNA@{o?U3=eVE(eP2|srUzV~G9AEs}Z6gg6 zWZJ$QCxLxOKVzW zr?ts#bDb;AHg!ip@q>-mrbbsLN_l0q^?1l`O<;+9wq`=44u9dc1PL>~1OoH)1Z|Edr10{$JcJWZ+lIe$pmw8-*QjtqSJ$eHtU(x#aG5ht3il{p|3OuKmEB6VB zDETCr3-cVVyJFIi82yepyWrQp(zT0EF|SMBxPoiW4!?hl^^N{BMCbY{&T>|Kv`XvZ z*9R6;D`Zrq5^h+=zK{5L=DVOonZTj@zna-sa1@42t;ks@Bp$sg=tYJK=R($P)}gjX z0v4@!b@DmeA?wbL?-IUdz2d8Pgq|;JGmrAh$`G7&^3q~G!Aacq5_>*ez4GjqhwA#I z8)A!-Z_H`(Zb*FJqTT;^U*xWTg3A>TwTN#jz7$qJ`|@11!u7M%Co#3f{(gA;uf#U) zgc~P4CoPoN=IS_WNz?nX`jh8peG|-lUDM%Y!~Hp->#?|h?Vm2I1!>}?PfY`7Eh}*I zF)z`HtgZZ{dQV&)*L>yPv&6WbuIwn(;Q5lAm9b{M6x+nSMTEZu=a8 z`K-wjW!4Edwt1P&5|b$0`*;q&?mxq)yT7mOVY=pDTmZ0>>A5(&399X8DIxO}gA-`U4!CCt zN|-HnSIWG7J+k;QzvSl0OPcgj=7&^@EL(Oir&~tmFkh>oL;j^V36&0F{}#>s+g|*= z{@+Q@$_AHRbtyc%4_te1sMRi>z?G~r$%_B?6x&JD><B3)|^}xp!Qn&x!SVO2d@7oIXzn6V*f^ac`Gz4_doef;bXv!-VD{aGr>{%O5TPFz_*S&pBZVo~d}4h8nZ#$r{_ifj!@nAX1#w-RxzJKb{Ia{Rp5LqFXi#Q+ZOk0;*TxyWV3j<#)#*zT3oT^Z{-vA zXM0y08$HoGs_<0y{JP^IRY$f+SSni{*>S^ct^9lISGz7~Oz+q&a4|}cEqwF#xzY`* zlg;n1+m!jg?xyeTtJ1r&RL+rCH_HTUk z($D*{Pv0@6Wpy{j+zuYe*0bMoyLs=kOYhYTy?s7A{A<%Y-&Y#=v$pthXS3nFZ48Qh z8*b_qPgcB3>CIiZ|HS<1 z2X#1eb_vXgF4vD!)s#wnbR*?}va@);P)c?HFjBg#KKN&CW-?@DC6pPy@E{QlWUGcG> z^d?Sz^DXs1QTe>(a&OLcZaMX1L)V=XCpx;6dV98IFW&4XaV{riihq0Q+yu9cf(wpq zh_%d_R#dp)UgYULzJEWr1TKg({8n5hwr%2!ze)WX zDLzm+<=M0Nmre<5AC|7VxUXcP`L*4r^hDMzx?~W)@%j8`{3S7~Hc9vDeAJwOvL@2R zZ|x(Y`X|%vBQ{I&SQ$n0b00}C5Lk5B>h3+UYd4b?TuLymQJLnlCHMT>{d4+bCrXFb zC_i*)#Cj@cUv3?I603vl1QfBWNk z)6U&EF8I!ib3ezT-?DyLThEv z&v-fW7^Ba9Gw<(tX`%(``)8czwK$SfIw?M7*-xuS-&P&FHEViXnBqCno1QJ*lkc1? zS-;6Y$!mT5n{Rh-u6k5GJ2G8%d+|;smgDWUaZbLjLeG*H{rh}ge%0bT%KP_pvN;$0 z6MvW&cxT~d*HDe;7he9o$0wAgU&!?Ea7U*J^PCUow)}NW6+E*=V@(?C_J)&dW`>xH z9q$b75#GAx+q3!CFJ+yR;dvwfd!ug2R?}l?(O0oP7ePp%i7yfyXpd*=(?3oqV!x2@yp zwKv^?x46Pxws`6->{gYQ+S~4)T`XU7!NVn6Sk}_)^~)o*>bh&suMzavciuTBD|+7A z?ENRKzfX!>9GM>d;<9IHtexK)Bd3J;Ilq2dy_x@pz4utHU*%Z_r``V&9F{BZ&)A&K zS+cbK^UI0^d%an8rNR%pE(uiaOsjZoE$wt>9;?~HSx$!{olXnHemcing9 zxqlxS&b3cxw5_Q~xL+|}d4EW;r=snqYtpMTx0UUBdd9QVzi>{JY9FV1QOVSkEuD+n zBZc1x9sIKO>ghzI%fc<&X9gb2D@Zn6k^WWLfv;*trn#WriR_}&AC$fc*B{*YvPrp7 zTE%eYSH0~s#n(NL`%!dP|Mt1sLu(#9-)UUC_*CM=rT31c?5kF9I=QFE;P1Q1f4TL3 zPe?H|D9y&&zZ(ET@iu6YMkbU)lax$^Z^;kMdI`KhrtT+?1J-Ld6O>e|4< z%rjRxGlVkdM5Vq-%Gb6H>_4W%UcSRf$y9Z1(-Y%#w#A0pMawQOnI-x!U1^PzqKV^L zr&sk#hqN}&bj_5!?74bE)$hooM#<-NKCN-e;<+EH;pX=E&F)k2{BzUXK5{&{$hB7~ z@t?Fo&bD~<&7bx44SB4;uk?TSLgE`g+li;&40x)~n(lZfDRQ4{qLdOB@Bej+%+Kvx zEg-RN?=>aFGi_?VH`_`B2jDD6CYF(VWW!3%@AueV* z+gQFP--xp7syME>*3$0J=cubcy`R5}txDLH-V-LUsr?xj&uz!mH=_@F-P?Ed4Wp^z zl4lF9CM3MOwklQI{^`ct{C(k%N?ypV&)m2E=jM~&pZta9o$fxp(%B$Kn&)tt?2!$( zzcaM${qXq8Y{S*&SKhAPcP&-&V?^FeqmD%Vvu-<-s)!sFHdUz5_9g-O0|h#z38}sfj8mC*5iDQ^#(lFJ=ZRu z{c_dk+_kjJhCI>FLwRm*l|OvWrAT{v`c~ajfA-bBJa@!1^*xiz^CZnp_gfN;XO?zd zK6RB{V0*h=c1ZC|`~PBVS3daX_V;IL-J>#*Jn!S#df(%i4_aN)`ftAaMR5G&t0nxa zU$$QlcFcP1`@AK>DsjG@cSCAnV#Md7J7Zn(-?=Mh_V3$2??*$`E5@rodA6-Kz9017QU33(KMYxNt^5Hy z-U{jX&X$j6%M7s&N_YD1;=AbTlqsA4EfD)tzvfV|x~X6ayFK&&k8Eq5x~{BHTI>lqjr7(8A5T-G@yGywoTQJ(n# literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-cmake-run-settings.png b/doc/images/qtcreator-cmake-run-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..229bdae6dd1c2d1abc60d81fd7d6a4e7bc67ce4d GIT binary patch literal 10735 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 literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-cmakeexecutable.png b/doc/images/qtcreator-cmakeexecutable.png index 711c2f708ce766a147f2943b810cb93da8e5ce35..c50c05a20bbbce5b79332487698e6cad444b9871 100644 GIT binary patch literal 11981 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 G5}E+WX}PKZ literal 10327 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 Jvd$@?2>?v6@NfVC diff --git a/doc/images/qtcreator-kits.png b/doc/images/qtcreator-kits.png index 13bc784a763926a981092727356e1a0c9d17f563..1a3d5e1336c1b77112abd2322a35aef6b3ce8b50 100644 GIT binary patch literal 22880 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 literal 18015 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 - \uicontrol Options > \uicontrol {Build & Run} > \uicontrol CMake > - \uicontrol Add. + \QC supports CMake version 2.9, or later. - \image qtcreator-cmakeexecutable.png + To specify paths to CMake executables and to add them to kits: + + \list 1 + + \li Select \uicontrol Tools > \uicontrol Options > + \uicontrol {Build & Run} > \uicontrol CMake > \uicontrol Add. + + \image qtcreator-cmakeexecutable.png + + \li In the \uicontrol Name field, specify a name for the tool. + + \li In the \uicontrol Path field, specify the path to the CMake + executable. + + \li Select \uicontrol Apply to save your changes. + + \li Select the \uicontrol Kits tab to add the CMake tool to a build and + run kit. The kit also specifies the CMake Generator that is used for + producing project files for \QC and the configuration variables that + are used: + + \image qtcreator-kits.png + + For more information, see \l {Adding Kits}. + + \endlist + + \section1 Creating CMake Projects + + To create a CMake project: + + \list 1 + + \li Select \uicontrol File > \uicontrol {New File or Project} > + \uicontrol {Non-Qt Project} > \uicontrol {Plain C Application} or + \uicontrol {Plain C++ Application} > \uicontrol Choose. + + \li In the \uicontrol Name field, enter a name for the project. + + \li In the \uicontrol {Create in} field, enter the path for the project + files, and then select \uicontrol Next (or \uicontrol Continue on + OS X). + + \li In the \uicontrol {Build system} field, select \uicontrol CMake, and + then select \uicontrol Next. + + \li Select CMake kits for the platforms that you want to build the + application for, and then select \uicontrol Next. + + \li Review the project settings, and click \uicontrol{Finish} (or + \uicontrol Done on OS X). + + \li Select \uicontrol {Run CMake} to generate a .cbp file. + + \image qtcreator-cmake-run-cmake.png + + Some projects require command line arguments to the initial CMake + call. CMake will remember the arguments during subsequent calls. + + \endlist + + \QC generates a \c {main.cpp} and \c {CMakeLists.txt} file that you can + modify in the \uicontrol Edit mode. \section1 Opening CMake Projects - \note Before you open a CMake project, you must modify the \c {PATH} - environment variable to include the bin folders of \c mingw and Qt. - - For instance, if Qt 5.5 is installed in \c {C:\Qt}, you would use the - following command to set the environment variables in the command line - prompt: - \code - set PATH=C:\Qt\Tools\mingw\bin;C:\Qt\5.5\\bin; - \endcode - Then start \QC by typing: - \code - C:\Qt\Tools\QtCreator\qtcreator.exe - \endcode - - To open a CMake project: + To open an existing CMake project: \list 1 @@ -82,28 +125,22 @@ \li Select the \c {CMakeLists.txt} file from your CMake project. + \li Select a kit that is configured to use CMake for building the + project. + + \li In \uicontrol Projects, right-click the project name to open the + context menu, and then select \uicontrol {Run CMake} to have the + project contents listed in the view. + \endlist - A wizard guides you through the rest of the process. - - \note If the CMake project does not have an in-place build, \QC - lets you specify the directory in which the project is built - (\l{glossary-shadow-build}{shadow build}). - - \image qtcreator-cmake-import-wizard1.png - - The screenshot below shows how you can specify command line arguments to - CMake for your project. - - \image qtcreator-cmake-import-wizard2.png - - Normally, there is no need to pass any command line arguments for projects - that are already built, as CMake caches that information. - \section1 Editing CMake Configuration Files - You can open CMake configuration files in \QC for editing. The following - features are supported: + To open a CMakeLists.txt file for editing, right-click it in the + \uicontrol Projects view and select \uicontrol {Open with} > + \uicontrol {CMake Editor}. + + The following features are supported: \list @@ -119,31 +156,55 @@ \section1 Building CMake Projects - \QC builds CMake projects by running \c make, \c mingw32-make, - \c nmake, or \c ninja depending on your platform. The build errors and - warnings are parsed and displayed in the \uicontrol Issues output pane. + To build CMake projects, select \uicontrol {Build Project} or press + \key Ctrl+B (or \key Cmd+B on OS X). - By default, \QC uses the \uicontrol All \l{glossary-build-config} + \QC builds CMake projects by running \c make, \c mingw32-make, \c nmake, or + \c ninja depending on the selected kit. + + By default, \QC uses the \uicontrol Default \l{glossary-build-config} {build configuration}. You can select another build configuration in - \uicontrol Projects > \uicontrol {Edit build configuration}. In addition to + \uicontrol Projects > \uicontrol {Build Settings} > + \uicontrol {Edit build configuration}. In addition to debug and release build configurations, you can create a release build that contains debug information or a release build with the smallest possible size. \image qtcreator-cmake-build-settings.png - You can change the build directory after the initial import. + In the \uicontrol {Build directory} field, you can specify the directory in + which the project is built (\l{glossary-shadow-build}{shadow build}). - The build and run kit that you select determines which CMake tool is used - for building. For more information, see \l {Adding Kits}. + To view all settings, select the \uicontrol Advanced check box. + + To modify the value of a build setting, select it, and then select + \uicontrol Edit. The new value is displayed in italics until you save the + changes by selecting \uicontrol {Apply Configuration Changes}. Any + configuration change might trigger a follow-up configuration change, so keep + saving until no more values are displayed in italics. + + You can add arguments and targets for the build command in + \uicontrol {Build Steps}. + + \image qtcreator-cmake-build-steps.png + + You can add arguments and targets for the clean command in + \uicontrol {Clean Steps}. + + \image qtcreator-cmake-clean-steps.png + + The build errors and warnings are parsed and displayed in the + \uicontrol Issues output pane. \section1 Running CMake Projects \QC automatically adds \uicontrol {Run Configurations} for all targets specified in the CMake project file. - For more information about known issues for the current version, see - \l{Known Issues}. + \image qtcreator-cmake-run-settings.png + + To run CMake projects, select \uicontrol Run or press \key Ctrl+R (or + \key Cmd+R on OS X). \section1 Deploying CMake Projects to Embedded Linux Devices diff --git a/doc/src/projects/creator-projects-targets.qdoc b/doc/src/projects/creator-projects-targets.qdoc index 2a34e6df341..d332355e5a7 100644 --- a/doc/src/projects/creator-projects-targets.qdoc +++ b/doc/src/projects/creator-projects-targets.qdoc @@ -126,6 +126,16 @@ CMake tools to the list. For more information, see \l{Adding CMake Tools}. + \li In the \uicontrol {CMake Generator} field, select the CMake + Generator to use for producing project files. Only the generators + with names beginning with the string \uicontrol CodeBlocks produce + all the necessary data for the \QC code model. \QC displays a + warning if you select a generator that is not supported. + + \li In the \uicontrol {CMake configuration} field, select + \uicontrol Change to edit the variables of the CMake configuration + for the kit. + \endlist */ From 5c030a4336a2774d02dbfa5b8b01f4e8fd983639 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 4 Mar 2016 15:33:16 +0100 Subject: [PATCH 26/72] ProjectExplorer: Retain original target triple for gcc toolchains The target triple will be used by the Clang Static Analyzer. Change-Id: Ibf33fef286a4d3ad3f40be4d6d5c9f35881d3d46 Reviewed-by: Tobias Hunger --- src/plugins/android/androidtoolchain.cpp | 2 +- src/plugins/android/androidtoolchain.h | 2 +- src/plugins/projectexplorer/gcctoolchain.cpp | 48 +++++++++++++++----- src/plugins/projectexplorer/gcctoolchain.h | 18 +++++++- src/plugins/projectexplorer/toolchain.h | 1 + src/plugins/qnx/qnxtoolchain.cpp | 2 +- src/plugins/qnx/qnxtoolchain.h | 2 +- 7 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 7ca07b54997..81ce2350cf3 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -234,7 +234,7 @@ void AndroidToolChain::setSecondaryToolChain(bool b) m_secondaryToolChain = b; } -QList AndroidToolChain::detectSupportedAbis() const +GccToolChain::DetectedAbisResult AndroidToolChain::detectSupportedAbis() const { return QList() << targetAbi(); } diff --git a/src/plugins/android/androidtoolchain.h b/src/plugins/android/androidtoolchain.h index c1ecc9fde22..97bf8dffacf 100644 --- a/src/plugins/android/androidtoolchain.h +++ b/src/plugins/android/androidtoolchain.h @@ -60,7 +60,7 @@ public: void setSecondaryToolChain(bool b); protected: - QList detectSupportedAbis() const override; + DetectedAbisResult detectSupportedAbis() const override; private: explicit AndroidToolChain(const ProjectExplorer::Abi &abi, const QString &ndkToolChainVersion, Detection d); diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index f1f3d5dbbdc..b65ee827766 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -62,6 +62,7 @@ static const char compilerCommandKeyC[] = "ProjectExplorer.GccToolChain.Path"; static const char compilerPlatformCodeGenFlagsKeyC[] = "ProjectExplorer.GccToolChain.PlatformCodeGenFlags"; static const char compilerPlatformLinkerFlagsKeyC[] = "ProjectExplorer.GccToolChain.PlatformLinkerFlags"; static const char targetAbiKeyC[] = "ProjectExplorer.GccToolChain.TargetAbi"; +static const char originalTargetTripleKeyC[] = "ProjectExplorer.GccToolChain.OriginalTargetTriple"; static const char supportedAbisKeyC[] = "ProjectExplorer.GccToolChain.SupportedAbis"; static QByteArray runGcc(const FileName &gcc, const QStringList &arguments, const QStringList &env) @@ -214,19 +215,20 @@ static QList guessGccAbi(const QString &m, const QByteArray ¯os) return abiList; } -static QList guessGccAbi(const FileName &path, const QStringList &env, - const QByteArray ¯os, - const QStringList &extraArgs = QStringList()) + +static GccToolChain::DetectedAbisResult guessGccAbi(const FileName &path, const QStringList &env, + const QByteArray ¯os, + const QStringList &extraArgs = QStringList()) { if (path.isEmpty()) - return QList(); + return GccToolChain::DetectedAbisResult(); QStringList arguments = extraArgs; arguments << QLatin1String("-dumpmachine"); QString machine = QString::fromLocal8Bit(runGcc(path, arguments, env)).trimmed(); if (machine.isEmpty()) - return QList(); // no need to continue if running failed once... - return guessGccAbi(machine, macros); + return GccToolChain::DetectedAbisResult(); // no need to continue if running failed once... + return GccToolChain::DetectedAbisResult(guessGccAbi(machine, macros), machine); } static QString gccVersion(const FileName &path, const QStringList &env) @@ -260,6 +262,11 @@ void GccToolChain::setSupportedAbis(const QList &m_abis) m_supportedAbis = m_abis; } +void GccToolChain::setOriginalTargetTriple(const QString &targetTriple) +{ + m_originalTargetTriple = targetTriple; +} + void GccToolChain::setMacroCache(const QStringList &allCxxflags, const QByteArray ¯os) const { if (macros.isNull()) @@ -318,6 +325,11 @@ Abi GccToolChain::targetAbi() const return m_targetAbi; } +QString GccToolChain::originalTargetTriple() const +{ + return m_originalTargetTriple; +} + QString GccToolChain::version() const { if (m_version.isEmpty()) @@ -620,7 +632,9 @@ void GccToolChain::resetToolChain(const FileName &path) setCompilerCommand(path); Abi currentAbi = m_targetAbi; - m_supportedAbis = detectSupportedAbis(); + const DetectedAbisResult detectedAbis = detectSupportedAbis(); + m_supportedAbis = detectedAbis.supportedAbis; + m_originalTargetTriple = detectedAbis.originalTargetTriple; m_targetAbi = Abi(); if (!m_supportedAbis.isEmpty()) { @@ -687,6 +701,7 @@ QVariantMap GccToolChain::toMap() const data.insert(QLatin1String(compilerPlatformCodeGenFlagsKeyC), m_platformCodeGenFlags); data.insert(QLatin1String(compilerPlatformLinkerFlagsKeyC), m_platformLinkerFlags); data.insert(QLatin1String(targetAbiKeyC), m_targetAbi.toString()); + data.insert(QLatin1String(originalTargetTripleKeyC), m_originalTargetTriple); QStringList abiList = Utils::transform(m_supportedAbis, &Abi::toString); data.insert(QLatin1String(supportedAbisKeyC), abiList); return data; @@ -701,6 +716,7 @@ bool GccToolChain::fromMap(const QVariantMap &data) m_platformCodeGenFlags = data.value(QLatin1String(compilerPlatformCodeGenFlagsKeyC)).toStringList(); m_platformLinkerFlags = data.value(QLatin1String(compilerPlatformLinkerFlagsKeyC)).toStringList(); m_targetAbi = Abi(data.value(QLatin1String(targetAbiKeyC)).toString()); + m_originalTargetTriple = data.value(QLatin1String(originalTargetTripleKeyC)).toString(); QStringList abiList = data.value(QLatin1String(supportedAbisKeyC)).toStringList(); m_supportedAbis.clear(); foreach (const QString &a, abiList) { @@ -730,11 +746,14 @@ ToolChainConfigWidget *GccToolChain::configurationWidget() void GccToolChain::updateSupportedAbis() const { - if (m_supportedAbis.isEmpty()) - m_supportedAbis = detectSupportedAbis(); + if (m_supportedAbis.isEmpty()) { + const DetectedAbisResult detected = detectSupportedAbis(); + m_supportedAbis = detected.supportedAbis; + m_originalTargetTriple = detected.originalTargetTriple; + } } -QList GccToolChain::detectSupportedAbis() const +GccToolChain::DetectedAbisResult GccToolChain::detectSupportedAbis() const { Environment env = Environment::systemEnvironment(); addToEnvironment(env); @@ -827,7 +846,10 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp GccToolChain::addCommandPathToEnvironment(compilerPath, systemEnvironment); QByteArray macros = gccPredefinedMacros(compilerPath, gccPredefinedMacrosOptions(), systemEnvironment.toStringList()); - QList abiList = guessGccAbi(compilerPath, systemEnvironment.toStringList(), macros); + const GccToolChain::DetectedAbisResult detectedAbis = guessGccAbi(compilerPath, + systemEnvironment.toStringList(), + macros); + QList abiList = detectedAbis.supportedAbis; if (!abiList.contains(requiredAbi)) { if (requiredAbi.wordWidth() != 64 || !abiList.contains(Abi(requiredAbi.architecture(), requiredAbi.os(), requiredAbi.osFlavor(), @@ -844,6 +866,7 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp tc->setCompilerCommand(compilerPath); tc->setSupportedAbis(abiList); tc->setTargetAbi(abi); + tc->setOriginalTargetTriple(detectedAbis.originalTargetTriple); tc->setDisplayName(tc->defaultDisplayName()); // reset displayname result.append(tc.take()); @@ -902,6 +925,7 @@ void GccToolChainConfigWidget::applyImpl() tc->setCompilerCommand(m_compilerCommand->fileName()); tc->setSupportedAbis(m_abiWidget->supportedAbis()); tc->setTargetAbi(m_abiWidget->currentAbi()); + tc->setOriginalTargetTriple(tc->detectSupportedAbis().originalTargetTriple); tc->setDisplayName(displayName); // reset display name tc->setPlatformCodeGenFlags(splitString(m_platformCodeGenFlagsLineEdit->text())); tc->setPlatformLinkerFlags(splitString(m_platformLinkerFlagsLineEdit->text())); @@ -975,7 +999,7 @@ void GccToolChainConfigWidget::handleCompilerCommandChange() QStringList args = gccPredefinedMacrosOptions() + splitString(m_platformCodeGenFlagsLineEdit->text()); m_macros = gccPredefinedMacros(path, args, env.toStringList()); abiList = guessGccAbi(path, env.toStringList(), m_macros, - splitString(m_platformCodeGenFlagsLineEdit->text())); + splitString(m_platformCodeGenFlagsLineEdit->text())).supportedAbis; } m_abiWidget->setEnabled(haveCompiler); diff --git a/src/plugins/projectexplorer/gcctoolchain.h b/src/plugins/projectexplorer/gcctoolchain.h index 849bee9f103..33c900537af 100644 --- a/src/plugins/projectexplorer/gcctoolchain.h +++ b/src/plugins/projectexplorer/gcctoolchain.h @@ -54,6 +54,7 @@ public: GccToolChain(Core::Id typeId, Detection d); QString typeDisplayName() const override; Abi targetAbi() const override; + QString originalTargetTriple() const override; QString version() const; QList supportedAbis() const; void setTargetAbi(const Abi &); @@ -89,6 +90,19 @@ public: static void addCommandPathToEnvironment(const Utils::FileName &command, Utils::Environment &env); + class DetectedAbisResult { + public: + DetectedAbisResult() = default; + DetectedAbisResult(const QList &supportedAbis, + const QString &originalTargetTriple = QString()) + : supportedAbis(supportedAbis) + , originalTargetTriple(originalTargetTriple) + {} + + QList supportedAbis; + QString originalTargetTriple; + }; + protected: typedef QList > GccCache; @@ -98,13 +112,14 @@ protected: void setCompilerCommand(const Utils::FileName &path); void setSupportedAbis(const QList &m_abis); + void setOriginalTargetTriple(const QString &targetTriple); void setMacroCache(const QStringList &allCxxflags, const QByteArray ¯oCache) const; QByteArray macroCache(const QStringList &allCxxflags) const; virtual QString defaultDisplayName() const; virtual CompilerFlags defaultCompilerFlags() const; - virtual QList detectSupportedAbis() const; + virtual DetectedAbisResult detectSupportedAbis() const; virtual QString detectVersion() const; // Reinterpret options for compiler drivers inheriting from GccToolChain (e.g qcc) to apply -Wp option @@ -139,6 +154,7 @@ private: Abi m_targetAbi; mutable QList m_supportedAbis; + mutable QString m_originalTargetTriple; mutable QList m_headerPaths; mutable QString m_version; diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index e00c2136aad..cac15dce6a8 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -80,6 +80,7 @@ public: Core::Id typeId() const; virtual QString typeDisplayName() const = 0; virtual Abi targetAbi() const = 0; + virtual QString originalTargetTriple() const { return QString(); } virtual bool isValid() const = 0; diff --git a/src/plugins/qnx/qnxtoolchain.cpp b/src/plugins/qnx/qnxtoolchain.cpp index 9c0970618cf..32245219771 100644 --- a/src/plugins/qnx/qnxtoolchain.cpp +++ b/src/plugins/qnx/qnxtoolchain.cpp @@ -116,7 +116,7 @@ void QnxToolChain::setNdkPath(const QString &ndkPath) } // qcc doesn't support a "-dumpmachine" option to get supported abis -QList QnxToolChain::detectSupportedAbis() const +GccToolChain::DetectedAbisResult QnxToolChain::detectSupportedAbis() const { return qccSupportedAbis(); } diff --git a/src/plugins/qnx/qnxtoolchain.h b/src/plugins/qnx/qnxtoolchain.h index b1bbac7d33d..2e989c73743 100644 --- a/src/plugins/qnx/qnxtoolchain.h +++ b/src/plugins/qnx/qnxtoolchain.h @@ -51,7 +51,7 @@ public: void setNdkPath(const QString &ndkPath); protected: - virtual QList detectSupportedAbis() const override; + virtual DetectedAbisResult detectSupportedAbis() const override; QStringList reinterpretOptions(const QStringList &args) const override; From 768c900990596b21289a2ee4737e188629b93a04 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 4 Mar 2016 15:33:33 +0100 Subject: [PATCH 27/72] ClangStaticAnalyzer: Set target explicitly for gcc toolchains The default target of clang.exe might be unfavorable since it depends on e.g. the tool chain used to build clang.exe: default target clang build with msvc: i686-pc-windows-msvc clang build with mingw: i686-pc-windows-gnu The correct target is important since it not only has implications on the built-in macros and include paths, but also on parsing options. For example, the msvc target silently adds the following parsing options -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 -fdelayed-template-parsing ...as can be seen by the output of $ clang.exe -### empty.cpp Change-Id: Icd8aaf11016e59f37025cbf1c97da81511ff249b Reviewed-by: Christian Kandeler --- .../clangstaticanalyzerruncontrol.cpp | 47 +++++++++++++++---- .../clangstaticanalyzerruncontrol.h | 1 + 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index e16c7a46c16..69ff061c833 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -80,6 +80,7 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( BuildConfiguration *buildConfiguration = target->activeBuildConfiguration(); QTC_ASSERT(buildConfiguration, return); m_environment = buildConfiguration->environment(); + m_targetTriple = ToolChainKitInformation::toolChain(target->kit())->originalTargetTriple(); } static void prependWordWidthArgumentIfNotIncluded(QStringList *arguments, unsigned char wordWidth) @@ -96,11 +97,29 @@ static void prependWordWidthArgumentIfNotIncluded(QStringList *arguments, unsign QTC_CHECK(!arguments->contains(m32Argument) || !arguments->contains(m64Argument)); } +static void prependTargetTripleIfNotIncludedAndNotEmpty(QStringList *arguments, + const QString &targetTriple) +{ + QTC_ASSERT(arguments, return); + + if (targetTriple.isEmpty()) + return; + + const QString targetOption = QLatin1String("-target"); + + if (!arguments->contains(targetOption)) { + arguments->prepend(targetTriple); + arguments->prepend(targetOption); + } +} + // Removes (1) filePath (2) -o . -// Adds -m64/-m32 argument if not already included. +// Prepends -m64/-m32 argument if not already included. +// Prepends -target if not already included. static QStringList tweakedArguments(const QString &filePath, const QStringList &arguments, - unsigned char wordWidth) + unsigned char wordWidth, + const QString &targetTriple) { QStringList newArguments; @@ -121,6 +140,7 @@ static QStringList tweakedArguments(const QString &filePath, QTC_CHECK(skip == false); prependWordWidthArgumentIfNotIncluded(&newArguments, wordWidth); + prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, targetTriple); return newArguments; } @@ -147,7 +167,8 @@ class ClangStaticAnalyzerOptionsBuilder : public CompilerOptionsBuilder public: static QStringList build(const CppTools::ProjectPart &projectPart, CppTools::ProjectFile::Kind fileKind, - unsigned char wordWidth) + unsigned char wordWidth, + const QString &targetTriple) { ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart); optionsBuilder.addLanguageOption(fileKind); @@ -172,6 +193,8 @@ public: QStringList options = optionsBuilder.options(); prependWordWidthArgumentIfNotIncluded(&options, wordWidth); + prependTargetTripleIfNotIncludedAndNotEmpty(&options, targetTriple); + return options; } @@ -217,7 +240,8 @@ private: static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( const ProjectInfo::CompilerCallData &compilerCallData, - unsigned char wordWidth) + unsigned char wordWidth, + const QString &targetTriple) { qCDebug(LOG) << "Taking arguments for analyzing from CompilerCallData."; @@ -229,7 +253,7 @@ static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( const QString file = it.key(); const QList compilerCalls = it.value(); foreach (const QStringList &options, compilerCalls) { - const QStringList arguments = tweakedArguments(file, options, wordWidth); + const QStringList arguments = tweakedArguments(file, options, wordWidth, targetTriple); unitsToAnalyze << AnalyzeUnit(file, arguments); } } @@ -238,7 +262,8 @@ static AnalyzeUnits unitsToAnalyzeFromCompilerCallData( } static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList projectParts, - unsigned char wordWidth) + unsigned char wordWidth, + const QString &targetTriple) { qCDebug(LOG) << "Taking arguments for analyzing from ProjectParts."; @@ -256,7 +281,8 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList const QStringList arguments = ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), file.kind, - wordWidth); + wordWidth, + targetTriple); unitsToAnalyze << AnalyzeUnit(file.path, arguments); } } @@ -273,9 +299,12 @@ AnalyzeUnits ClangStaticAnalyzerRunControl::sortedUnitsToAnalyze() const ProjectInfo::CompilerCallData compilerCallData = m_projectInfo.compilerCallData(); if (compilerCallData.isEmpty()) { units = unitsToAnalyzeFromProjectParts(m_projectInfo.projectParts(), - m_wordWidth); + m_wordWidth, + m_targetTriple); } else { - units = unitsToAnalyzeFromCompilerCallData(compilerCallData, m_wordWidth); + units = unitsToAnalyzeFromCompilerCallData(compilerCallData, + m_wordWidth, + m_targetTriple); } Utils::sort(units, [](const AnalyzeUnit &a1, const AnalyzeUnit &a2) -> bool { diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index 0293f4d3b19..17afdf2eee7 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -83,6 +83,7 @@ private: private: const CppTools::ProjectInfo m_projectInfo; const unsigned char m_wordWidth; + QString m_targetTriple; Utils::Environment m_environment; QString m_clangExecutable; From d7b648abdb4bb27dcd65df1545c0b11b4f9ed896 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 7 Mar 2016 16:20:50 +0100 Subject: [PATCH 28/72] Clang: Make translation unit and code completion options consistent ...otherwise we might run into the following assertion: Assertion failed: (IncludeBriefComments == this->IncludeBriefCommentsInCodeCompletion), function CodeComplete, file ASTUnit.cpp, line 2411. Change-Id: I4723b600c7ac5aa2b4c1cb1827f51156afb492b8 Reviewed-by: Erik Verbruggen --- .../clangbackend/ipcsource/clangtranslationunit.h | 3 ++- .../clangbackend/ipcsource/codecompleter.cpp | 15 ++++++++++++--- src/tools/clangbackend/ipcsource/codecompleter.h | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/tools/clangbackend/ipcsource/clangtranslationunit.h b/src/tools/clangbackend/ipcsource/clangtranslationunit.h index 467c9346523..9a311b62bfd 100644 --- a/src/tools/clangbackend/ipcsource/clangtranslationunit.h +++ b/src/tools/clangbackend/ipcsource/clangtranslationunit.h @@ -139,6 +139,8 @@ public: SkippedSourceRanges skippedSourceRanges() const; + static uint defaultOptions(); + private: void setDirty(); void checkIfNull() const; @@ -152,7 +154,6 @@ private: void reparseTranslationUnit() const; void reparseTranslationUnitIfFilesAreChanged() const; void updateIncludeFilePaths() const; - static uint defaultOptions(); static void includeCallback(CXFile included_file, CXSourceLocation * /*inclusion_stack*/, unsigned /*include_len*/, diff --git a/src/tools/clangbackend/ipcsource/codecompleter.cpp b/src/tools/clangbackend/ipcsource/codecompleter.cpp index 691686d0479..7381ac2d27f 100644 --- a/src/tools/clangbackend/ipcsource/codecompleter.cpp +++ b/src/tools/clangbackend/ipcsource/codecompleter.cpp @@ -84,15 +84,13 @@ ClangCodeCompleteResults CodeCompleter::complete(uint line, CXUnsavedFile *unsavedFiles, unsigned unsavedFileCount) { - const auto options = CXCodeComplete_IncludeMacros | CXCodeComplete_IncludeCodePatterns; - return clang_codeCompleteAt(translationUnit.cxTranslationUnitWithoutReparsing(), translationUnit.filePath().constData(), line, column, unsavedFiles, unsavedFileCount, - options); + defaultOptions()); } bool CodeCompleter::hasDotAt(uint line, uint column) const @@ -103,6 +101,17 @@ bool CodeCompleter::hasDotAt(uint line, uint column) const return unsavedFile.hasCharacterAt(location.offset(), '.'); } +uint CodeCompleter::defaultOptions() const +{ + uint options = CXCodeComplete_IncludeMacros + | CXCodeComplete_IncludeCodePatterns; + + if (translationUnit.defaultOptions() & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion) + options |= CXCodeComplete_IncludeBriefComments; + + return options; +} + ClangCodeCompleteResults CodeCompleter::completeWithArrowInsteadOfDot(uint line, uint column) { ClangCodeCompleteResults results; diff --git a/src/tools/clangbackend/ipcsource/codecompleter.h b/src/tools/clangbackend/ipcsource/codecompleter.h index 99749414f4b..260ac4d581c 100644 --- a/src/tools/clangbackend/ipcsource/codecompleter.h +++ b/src/tools/clangbackend/ipcsource/codecompleter.h @@ -50,6 +50,8 @@ public: // for tests bool hasDotAt(uint line, uint column) const; private: + uint defaultOptions() const; + ClangCodeCompleteResults complete(uint line, uint column, CXUnsavedFile *unsavedFiles, From c176771696c41201fbc7334b29900ed5c61254f0 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 30 Mar 2016 12:36:48 +0300 Subject: [PATCH 29/72] TextEditor: Correctly restore empty pattern Only default to first entry when the pattern was never set. Change-Id: I4d2a76218347adb4aa28ef3e8fd0e81485faf184 Reviewed-by: Tobias Hunger --- src/plugins/texteditor/basefilefind.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index facac8a9c05..66d1e1f4457 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -285,10 +285,11 @@ void BaseFileFind::writeCommonSettings(QSettings *settings) void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaultFilter) { QStringList filters = settings->value(QLatin1String("filters")).toStringList(); - d->m_filterSetting = settings->value(QLatin1String("currentFilter")).toString(); + const QVariant currentFilter = settings->value(QLatin1String("currentFilter")); + d->m_filterSetting = currentFilter.toString(); if (filters.isEmpty()) filters << defaultFilter; - if (d->m_filterSetting.isEmpty()) + if (!currentFilter.isValid()) d->m_filterSetting = filters.first(); d->m_filterStrings.setStringList(filters); if (d->m_filterCombo) From afa8351d9e7e762f8620168f28dfca0ba6922cf6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 30 Mar 2016 12:55:33 +0200 Subject: [PATCH 30/72] C++: Accept BUILD_CPLUSPLUS_TOOLS as qmake variable Change-Id: I3266261d14aef12d3db73a635f0b1c471f6a52b7 Reviewed-by: Orgad Shaneh --- src/tools/tools.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/tools.pro b/src/tools/tools.pro index be4170db1ae..fe9f3a73970 100644 --- a/src/tools/tools.pro +++ b/src/tools/tools.pro @@ -23,7 +23,7 @@ exists($$LLVM_INSTALL_DIR) { SUBDIRS += clangbackend } -BUILD_CPLUSPLUS_TOOLS = $$(BUILD_CPLUSPLUS_TOOLS) +isEmpty(BUILD_CPLUSPLUS_TOOLS):BUILD_CPLUSPLUS_TOOLS=$$(BUILD_CPLUSPLUS_TOOLS) !isEmpty(BUILD_CPLUSPLUS_TOOLS) { SUBDIRS += cplusplus-ast2png \ cplusplus-frontend \ From 04842be814635edc7f409a24e6925aac5d95f416 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 Mar 2016 13:16:14 +0200 Subject: [PATCH 31/72] ProjectExplorer: Rename local variable and add some consts Change-Id: If9cadcbb196a8b6350a654aca01b4a7ee59612b3 Reviewed-by: Tim Jenssen --- .../projectexplorer/projectexplorer.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 8e92a6613c2..10b2638edd7 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3232,32 +3232,32 @@ void ProjectExplorerPluginPrivate::handleRenameFile() void ProjectExplorerPlugin::renameFile(Node *node, const QString &newFilePath) { - QString orgFilePath = node->filePath().toFileInfo().absoluteFilePath(); + const QString oldFilePath = node->filePath().toFileInfo().absoluteFilePath(); FolderNode *folderNode = node->parentFolderNode(); - QString projectFileName = folderNode->projectNode()->filePath().fileName(); + const QString projectFileName = folderNode->projectNode()->filePath().fileName(); - if (!folderNode->canRenameFile(orgFilePath, newFilePath)) { - QTimer::singleShot(0, [orgFilePath, newFilePath, projectFileName] { + if (!folderNode->canRenameFile(oldFilePath, newFilePath)) { + QTimer::singleShot(0, [oldFilePath, newFilePath, projectFileName] { int res = QMessageBox::question(ICore::mainWindow(), tr("Project Editing Failed"), tr("The project file %1 cannot be automatically changed.\n\n" "Rename %2 to %3 anyway?") .arg(projectFileName) - .arg(QDir::toNativeSeparators(orgFilePath)) + .arg(QDir::toNativeSeparators(oldFilePath)) .arg(QDir::toNativeSeparators(newFilePath))); if (res == QMessageBox::Yes) - FileUtils::renameFile(orgFilePath, newFilePath); + FileUtils::renameFile(oldFilePath, newFilePath); }); return; } - if (FileUtils::renameFile(orgFilePath, newFilePath)) { + if (FileUtils::renameFile(oldFilePath, newFilePath)) { // Tell the project plugin about rename - if (!folderNode->renameFile(orgFilePath, newFilePath)) { + if (!folderNode->renameFile(oldFilePath, newFilePath)) { const QString renameFileError = tr("The file %1 was renamed to %2, but the project file %3 could not be automatically changed.") - .arg(QDir::toNativeSeparators(orgFilePath)) + .arg(QDir::toNativeSeparators(oldFilePath)) .arg(QDir::toNativeSeparators(newFilePath)) .arg(projectFileName); @@ -3269,7 +3269,7 @@ void ProjectExplorerPlugin::renameFile(Node *node, const QString &newFilePath) } } else { const QString renameFileError = tr("The file %1 could not be renamed %2.") - .arg(QDir::toNativeSeparators(orgFilePath)) + .arg(QDir::toNativeSeparators(oldFilePath)) .arg(QDir::toNativeSeparators(newFilePath)); QTimer::singleShot(0, [renameFileError]() { From 414d41ab3ca52262722db92633cd5e40875aac94 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 Mar 2016 13:16:52 +0200 Subject: [PATCH 32/72] ProjectExplorer: Do not needlessly try to rename files Task-number: QTCREATORBUG-15963 Change-Id: I925f7a69b0ae6a3e2eb5b8a7ceae1faccdfc5759 Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/projectexplorer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 10b2638edd7..6e1bfe6a2c1 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3236,6 +3236,9 @@ void ProjectExplorerPlugin::renameFile(Node *node, const QString &newFilePath) FolderNode *folderNode = node->parentFolderNode(); const QString projectFileName = folderNode->projectNode()->filePath().fileName(); + if (oldFilePath == newFilePath) + return; + if (!folderNode->canRenameFile(oldFilePath, newFilePath)) { QTimer::singleShot(0, [oldFilePath, newFilePath, projectFileName] { int res = QMessageBox::question(ICore::mainWindow(), From 2c822ae3c168ac6b45a31afea023d44920fbaf8b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 Mar 2016 13:06:21 +0200 Subject: [PATCH 33/72] CMake: Only allow one target in cmake build step CMake will silently ignore all but the last target (or fail to build anything). This allows to simplify our code. Change-Id: Ieee3931aca0788307107e2021d507073ef42a21f Task-number: QTCREATORBUG-15928 Reviewed-by: Tim Jenssen --- .../cmakebuildconfiguration.cpp | 6 +- .../cmakeprojectmanager/cmakebuildstep.cpp | 165 ++++++++---------- .../cmakeprojectmanager/cmakebuildstep.h | 14 +- .../cmakelocatorfilter.cpp | 6 +- 4 files changed, 85 insertions(+), 106 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 36046f91004..7f73a321f79 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -409,14 +409,14 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj auto cleanStep = new CMakeBuildStep(cleanSteps); cleanSteps->insertStep(0, cleanStep); - cleanStep->setBuildTarget(CMakeBuildStep::cleanTarget(), true); + cleanStep->setBuildTarget(CMakeBuildStep::cleanTarget()); bc->setBuildDirectory(copy.buildDirectory); bc->setCMakeConfiguration(copy.configuration); // Default to all - if (project->hasBuildTarget(QLatin1String("all"))) - buildStep->setBuildTarget(QLatin1String("all"), true); + if (project->hasBuildTarget(CMakeBuildStep::allTarget())) + buildStep->setBuildTarget(CMakeBuildStep::allTarget()); return bc; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 6d32868a9f1..b4376d86eaf 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -82,9 +82,8 @@ CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Core::Id id) : AbstractProces CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, CMakeBuildStep *bs) : AbstractProcessStep(bsl, bs), - m_buildTargets(bs->m_buildTargets), - m_toolArguments(bs->m_toolArguments), - m_addRunConfigurationArgument(bs->m_addRunConfigurationArgument) + m_buildTarget(bs->m_buildTarget), + m_toolArguments(bs->m_toolArguments) { ctor(bsl); } @@ -125,31 +124,34 @@ CMakeRunConfiguration *CMakeBuildStep::targetsActiveRunConfiguration() const void CMakeBuildStep::handleBuildTargetChanges() { - const QStringList filteredTargets - = Utils::filtered(static_cast(project())->buildTargetTitles(), - [this](const QString &s) { return m_buildTargets.contains(s); }); - setBuildTargets(filteredTargets); + if (static_cast(project())->buildTargetTitles().contains(m_buildTarget)) + setBuildTarget(m_buildTarget); + else + setBuildTarget(CMakeBuildStep::allTarget()); emit buildTargetsChanged(); } QVariantMap CMakeBuildStep::toMap() const { QVariantMap map(AbstractProcessStep::toMap()); - map.insert(QLatin1String(BUILD_TARGETS_KEY), m_buildTargets); + // Use QStringList for compatibility with old files + map.insert(QLatin1String(BUILD_TARGETS_KEY), QStringList(m_buildTarget)); map.insert(QLatin1String(TOOL_ARGUMENTS_KEY), m_toolArguments); - map.insert(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), m_addRunConfigurationArgument); return map; } bool CMakeBuildStep::fromMap(const QVariantMap &map) { if (map.value(QLatin1String(CLEAN_KEY), false).toBool()) { - m_buildTargets = QStringList(CMakeBuildStep::cleanTarget()); + m_buildTarget = CMakeBuildStep::cleanTarget(); } else { - m_buildTargets = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList(); + const QStringList targetList = map.value(QLatin1String(BUILD_TARGETS_KEY)).toStringList(); + if (!targetList.isEmpty()) + m_buildTarget = targetList.last(); m_toolArguments = map.value(QLatin1String(TOOL_ARGUMENTS_KEY)).toString(); } - m_addRunConfigurationArgument = map.value(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), false).toBool(); + if (map.value(QLatin1String(ADD_RUNCONFIGURATION_ARGUMENT_KEY), false).toBool()) + m_buildTarget = QLatin1String(ADD_RUNCONFIGURATION_TEXT); return BuildStep::fromMap(map); } @@ -178,7 +180,7 @@ bool CMakeBuildStep::init(QList &earlierSteps) } CMakeRunConfiguration *rc = targetsActiveRunConfiguration(); - if (m_addRunConfigurationArgument && (!rc || rc->title().isEmpty())) { + if ((m_buildTarget == QLatin1String(ADD_RUNCONFIGURATION_TEXT)) && (!rc || rc->title().isEmpty())) { emit addTask(Task(Task::Error, QCoreApplication::translate("ProjectExplorer::Task", "You asked to build the current Run Configuration's build target only, " @@ -196,7 +198,7 @@ bool CMakeBuildStep::init(QList &earlierSteps) QString arguments = allArguments(rc); - setIgnoreReturnValue(m_buildTargets.contains(CMakeBuildStep::cleanTarget())); + setIgnoreReturnValue(m_buildTarget == CMakeBuildStep::cleanTarget()); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); @@ -292,44 +294,27 @@ void CMakeBuildStep::stdOutput(const QString &line) AbstractProcessStep::stdOutput(line); } -QStringList CMakeBuildStep::buildTargets() const +QString CMakeBuildStep::buildTarget() const { - return m_buildTargets; + return m_buildTarget; } bool CMakeBuildStep::buildsBuildTarget(const QString &target) const { - if (target == tr(ADD_RUNCONFIGURATION_TEXT)) - return addRunConfigurationArgument(); - else - return m_buildTargets.contains(target); + return target == m_buildTarget; } -void CMakeBuildStep::setBuildTarget(const QString &buildTarget, bool on) +void CMakeBuildStep::setBuildTarget(const QString &buildTarget) { - if (buildTarget == tr(ADD_RUNCONFIGURATION_TEXT)) { - setAddRunConfigurationArgument(on); - } else { - QStringList old = m_buildTargets; - if (on && !old.contains(buildTarget)) - old << buildTarget; - else if (!on && old.contains(buildTarget)) - old.removeOne(buildTarget); - setBuildTargets(old); - } -} - -void CMakeBuildStep::setBuildTargets(const QStringList &targets) -{ - if (targets != m_buildTargets) { - m_buildTargets = targets; - emit targetsToBuildChanged(); - } + if (m_buildTarget == buildTarget) + return; + m_buildTarget = buildTarget; + emit targetToBuildChanged(); } void CMakeBuildStep::clearBuildTargets() { - m_buildTargets.clear(); + m_buildTarget.clear(); } QString CMakeBuildStep::toolArguments() const @@ -349,18 +334,20 @@ QString CMakeBuildStep::allArguments(const CMakeRunConfiguration *rc) const Utils::QtcProcess::addArg(&arguments, QLatin1String("--build")); Utils::QtcProcess::addArg(&arguments, QLatin1String(".")); - if (m_addRunConfigurationArgument) { - Utils::QtcProcess::addArg(&arguments, QLatin1String("--target")); + QString target; + + if (m_buildTarget == QLatin1String(ADD_RUNCONFIGURATION_TEXT)) { if (rc) - Utils::QtcProcess::addArg(&arguments, rc->title()); + target = rc->title(); else - Utils::QtcProcess::addArg(&arguments, QLatin1String("<") + tr(ADD_RUNCONFIGURATION_TEXT) + QLatin1String(">")); - } - foreach (const QString &t, m_buildTargets) { - Utils::QtcProcess::addArg(&arguments, QLatin1String("--target")); - Utils::QtcProcess::addArg(&arguments, t); + target = QLatin1String("<") + tr(ADD_RUNCONFIGURATION_TEXT) + QLatin1String(">"); + } else { + target = m_buildTarget; } + Utils::QtcProcess::addArg(&arguments, QLatin1String("--target")); + Utils::QtcProcess::addArg(&arguments, target); + if (!m_toolArguments.isEmpty()) { Utils::QtcProcess::addArg(&arguments, QLatin1String("--")); arguments += QLatin1Char(' ') + m_toolArguments; @@ -369,16 +356,6 @@ QString CMakeBuildStep::allArguments(const CMakeRunConfiguration *rc) const return arguments; } -bool CMakeBuildStep::addRunConfigurationArgument() const -{ - return m_addRunConfigurationArgument; -} - -void CMakeBuildStep::setAddRunConfigurationArgument(bool add) -{ - m_addRunConfigurationArgument = add; -} - QString CMakeBuildStep::cmakeCommand() const { CMakeTool *tool = CMakeKitInformation::cmakeTool(target()->kit()); @@ -390,6 +367,11 @@ QString CMakeBuildStep::cleanTarget() return QLatin1String("clean"); } +QString CMakeBuildStep::allTarget() +{ + return QLatin1String("all"); +} + // // CMakeBuildStepConfigWidget // @@ -407,7 +389,6 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep fl->addRow(tr("Tool arguments:"), m_toolArguments); m_toolArguments->setText(m_buildStep->toolArguments()); - m_buildTargetsList->setFrameStyle(QFrame::NoFrame); m_buildTargetsList->setMinimumHeight(200); @@ -420,22 +401,7 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep fl->addRow(tr("Targets:"), frame); - auto itemAddRunConfigurationArgument = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList); - itemAddRunConfigurationArgument->setFlags(itemAddRunConfigurationArgument->flags() | Qt::ItemIsUserCheckable); - itemAddRunConfigurationArgument->setCheckState(m_buildStep->addRunConfigurationArgument() ? Qt::Checked : Qt::Unchecked); - QFont f; - f.setItalic(true); - itemAddRunConfigurationArgument->setFont(f); - - CMakeProject *pro = static_cast(m_buildStep->project()); - QStringList targetList = pro->buildTargetTitles(); - targetList.sort(); - foreach (const QString &buildTarget, targetList) { - auto item = new QListWidgetItem(buildTarget, m_buildTargetsList); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(m_buildStep->buildsBuildTarget(item->text()) ? Qt::Checked : Qt::Unchecked); - } - + buildTargetsChanged(); updateDetails(); connect(m_toolArguments, &QLineEdit::textEdited, this, &CMakeBuildStepConfigWidget::toolArgumentsEdited); @@ -444,8 +410,9 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep this, &CMakeBuildStepConfigWidget::updateDetails); connect(m_buildStep, &CMakeBuildStep::buildTargetsChanged, this, &CMakeBuildStepConfigWidget::buildTargetsChanged); - connect(m_buildStep, &CMakeBuildStep::targetsToBuildChanged, this, &CMakeBuildStepConfigWidget::selectedBuildTargetsChanged); - connect(pro, &CMakeProject::environmentChanged, this, &CMakeBuildStepConfigWidget::updateDetails); + connect(m_buildStep, &CMakeBuildStep::targetToBuildChanged, this, &CMakeBuildStepConfigWidget::selectedBuildTargetsChanged); + connect(static_cast(m_buildStep->project()), &CMakeProject::environmentChanged, + this, &CMakeBuildStepConfigWidget::updateDetails); } void CMakeBuildStepConfigWidget::toolArgumentsEdited() @@ -456,7 +423,9 @@ void CMakeBuildStepConfigWidget::toolArgumentsEdited() void CMakeBuildStepConfigWidget::itemChanged(QListWidgetItem *item) { - m_buildStep->setBuildTarget(item->text(), item->checkState() & Qt::Checked); + const QString target = + (item->checkState() == Qt::Checked) ? item->data(Qt::UserRole).toString() : CMakeBuildStep::allTarget(); + m_buildStep->setBuildTarget(target); updateDetails(); } @@ -467,30 +436,44 @@ QString CMakeBuildStepConfigWidget::displayName() const void CMakeBuildStepConfigWidget::buildTargetsChanged() { - disconnect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); - - auto *addRunConfigurationArgumentItem = m_buildTargetsList->takeItem(0); + const bool wasBlocked = m_buildTargetsList->blockSignals(true); m_buildTargetsList->clear(); - m_buildTargetsList->insertItem(0, addRunConfigurationArgumentItem); - CMakeProject *pro = static_cast(m_buildStep->target()->project()); - foreach (const QString& buildTarget, pro->buildTargetTitles()) { + auto item = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList); + + item->setData(Qt::UserRole, QString::fromLatin1(ADD_RUNCONFIGURATION_TEXT)); + QFont f; + f.setItalic(true); + item->setFont(f); + + CMakeProject *pro = static_cast(m_buildStep->project()); + QStringList targetList = pro->buildTargetTitles(); + targetList.sort(); + + foreach (const QString &buildTarget, targetList) { auto item = new QListWidgetItem(buildTarget, m_buildTargetsList); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(m_buildStep->buildsBuildTarget(item->text()) ? Qt::Checked : Qt::Unchecked); + item->setData(Qt::UserRole, buildTarget); } - connect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); + + for (int i = 0; i < m_buildTargetsList->count(); ++i) { + QListWidgetItem *item = m_buildTargetsList->item(i); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(m_buildStep->buildsBuildTarget(item->data(Qt::UserRole).toString()) + ? Qt::Checked : Qt::Unchecked); + } + m_buildTargetsList->blockSignals(wasBlocked); updateSummary(); } void CMakeBuildStepConfigWidget::selectedBuildTargetsChanged() { - disconnect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); + const bool wasBlocked = m_buildTargetsList->blockSignals(true); for (int y = 0; y < m_buildTargetsList->count(); ++y) { QListWidgetItem *item = m_buildTargetsList->item(y); - item->setCheckState(m_buildStep->buildsBuildTarget(item->text()) ? Qt::Checked : Qt::Unchecked); + item->setCheckState(m_buildStep->buildsBuildTarget(item->data(Qt::UserRole).toString()) + ? Qt::Checked : Qt::Unchecked); } - connect(m_buildTargetsList, &QListWidget::itemChanged, this, &CMakeBuildStepConfigWidget::itemChanged); + m_buildTargetsList->blockSignals(wasBlocked); updateSummary(); } @@ -541,7 +524,7 @@ BuildStep *CMakeBuildStepFactory::create(BuildStepList *parent, Core::Id id) return 0; auto step = new CMakeBuildStep(parent); if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) - step->setBuildTarget(CMakeBuildStep::cleanTarget(), true); + step->setBuildTarget(CMakeBuildStep::cleanTarget()); return step; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h index 7f4260551b8..8249e1f1f25 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h @@ -61,10 +61,9 @@ public: ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override; - QStringList buildTargets() const; + QString buildTarget() const; bool buildsBuildTarget(const QString &target) const; - void setBuildTarget(const QString &target, bool on); - void setBuildTargets(const QStringList &targets); + void setBuildTarget(const QString &target); void clearBuildTargets(); QString toolArguments() const; @@ -72,18 +71,16 @@ public: QString allArguments(const CMakeRunConfiguration *rc) const; - bool addRunConfigurationArgument() const; - void setAddRunConfigurationArgument(bool add); - QString cmakeCommand() const; QVariantMap toMap() const override; static QString cleanTarget(); + static QString allTarget(); signals: void cmakeCommandChanged(); - void targetsToBuildChanged(); + void targetToBuildChanged(); void buildTargetsChanged(); protected: @@ -112,9 +109,8 @@ private: QRegExp m_percentProgress; QRegExp m_ninjaProgress; QString m_ninjaProgressString; - QStringList m_buildTargets; + QString m_buildTarget; QString m_toolArguments; - bool m_addRunConfigurationArgument = false; bool m_useNinja = false; }; diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp index 36b4ca661e7..341330c88ba 100644 --- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp @@ -111,13 +111,13 @@ void CMakeLocatorFilter::accept(Core::LocatorFilterEntry selection) const return; // Change the make step to build only the given target - QStringList oldTargets = buildStep->buildTargets(); + QString oldTarget = buildStep->buildTarget(); buildStep->clearBuildTargets(); - buildStep->setBuildTarget(selection.displayName, true); + buildStep->setBuildTarget(selection.displayName); // Build ProjectExplorerPlugin::buildProject(cmakeProject); - buildStep->setBuildTargets(oldTargets); + buildStep->setBuildTarget(oldTarget); } void CMakeLocatorFilter::refresh(QFutureInterface &future) From 82b9e9ed37fe15619c80d1a9f656bfe2ea6e1f94 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 Mar 2016 13:43:16 +0200 Subject: [PATCH 34/72] CMake: Do not crash when cloning cmake buildconfigurations Change-Id: I832981cdea16ab058f92758c9bae9b64b904d573 Task-number: QTCREATORBUG-15926 Reviewed-by: Tim Jenssen --- .../cmakebuildconfiguration.cpp | 63 ++++++++++--------- .../cmakebuildconfiguration.h | 1 + 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 7f73a321f79..d77e5efa90a 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -63,33 +63,7 @@ const char CONFIGURATION_KEY[] = "CMake.Configuration"; CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) : BuildConfiguration(parent, Core::Id(Constants::CMAKE_BC_ID)) { - auto project = static_cast(parent->project()); - setBuildDirectory(shadowBuildDirectory(project->projectFilePath(), - parent->kit(), - displayName(), BuildConfiguration::Unknown)); - - m_buildDirManager = new BuildDirManager(this); - connect(m_buildDirManager, &BuildDirManager::dataAvailable, - this, &CMakeBuildConfiguration::dataAvailable); - connect(m_buildDirManager, &BuildDirManager::errorOccured, - this, &CMakeBuildConfiguration::setError); - connect(m_buildDirManager, &BuildDirManager::configurationStarted, - this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); }); - - connect(this, &CMakeBuildConfiguration::environmentChanged, - m_buildDirManager, &BuildDirManager::forceReparse); - connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, - m_buildDirManager, &BuildDirManager::forceReparse); - connect(target(), &Target::kitChanged, this, [this]() { - ProjectExplorer::Kit *k = target()->kit(); - CMakeConfig config = cmakeConfiguration(); - config.append(CMakeConfigurationKitInformation::configuration(k)); // last value wins... - setCMakeConfiguration(config); - m_buildDirManager->maybeForceReparse(); - }); - - connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); - connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::parseCMakeOutput); + ctor(); } CMakeBuildConfiguration::~CMakeBuildConfiguration() @@ -112,7 +86,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent BuildConfiguration(parent, source), m_configuration(source->m_configuration) { - Q_ASSERT(parent); + ctor(); cloneSteps(source); } @@ -155,6 +129,37 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map) return true; } +void CMakeBuildConfiguration::ctor() +{ + auto project = static_cast(target()->project()); + setBuildDirectory(shadowBuildDirectory(project->projectFilePath(), + target()->kit(), + displayName(), BuildConfiguration::Unknown)); + + m_buildDirManager = new BuildDirManager(this); + connect(m_buildDirManager, &BuildDirManager::dataAvailable, + this, &CMakeBuildConfiguration::dataAvailable); + connect(m_buildDirManager, &BuildDirManager::errorOccured, + this, &CMakeBuildConfiguration::setError); + connect(m_buildDirManager, &BuildDirManager::configurationStarted, + this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); }); + + connect(this, &CMakeBuildConfiguration::environmentChanged, + m_buildDirManager, &BuildDirManager::forceReparse); + connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, + m_buildDirManager, &BuildDirManager::forceReparse); + connect(target(), &Target::kitChanged, this, [this]() { + ProjectExplorer::Kit *k = target()->kit(); + CMakeConfig config = cmakeConfiguration(); + config.append(CMakeConfigurationKitInformation::configuration(k)); // last value wins... + setCMakeConfiguration(config); + m_buildDirManager->maybeForceReparse(); + }); + + connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); + connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::parseCMakeOutput); +} + BuildDirManager *CMakeBuildConfiguration::buildDirManager() const { return m_buildDirManager; @@ -197,7 +202,7 @@ FileName CMakeBuildConfiguration::shadowBuildDirectory(const FileName &projectFi QList CMakeBuildConfiguration::completeCMakeConfiguration() const { - if (m_buildDirManager->isParsing()) + if (!m_buildDirManager && m_buildDirManager->isParsing()) return QList(); if (m_completeConfigurationCache.isEmpty()) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 1bd00c3b646..62f0913f7d3 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -92,6 +92,7 @@ protected: bool fromMap(const QVariantMap &map) override; private: + void ctor(); QList completeCMakeConfiguration() const; void setCurrentCMakeConfiguration(const QList &items); From 8799188be578ce640973a4134c77dbb5e752860e Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 Mar 2016 13:58:51 +0200 Subject: [PATCH 35/72] CMake: Force a cmake run if no data is available yet It makes no sense to not parse if we never parsed before. This got broken when I tried to reduce the number of cmake runs. Change-Id: Id70a6550faf248cc983b61f6d2456a93d8454a50 Task-number: QTCREATORBUG-15927 Reviewed-by: Tim Jenssen --- src/plugins/cmakeprojectmanager/builddirmanager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index df106d5d224..37a0b4c9218 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -607,8 +607,10 @@ void BuildDirManager::maybeForceReparse() const QByteArray EXTRA_GENERATOR_KEY = "CMAKE_EXTRA_GENERATOR"; const QByteArray CMAKE_COMMAND_KEY = "CMAKE_COMMAND"; - if (!m_hasData) + if (!m_hasData) { + forceReparse(); return; + } const CMakeConfig currentConfig = parsedConfiguration(); From 605952795139e3c42d0bf47d879c6aadd5e10aab Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 30 Mar 2016 14:00:14 +0200 Subject: [PATCH 36/72] CMake: Trigger reparse when target changed Change-Id: I47959361a345e372265a19982c1b1e6ea778dd89 Task-number: QTCREATORBUG-15927 Reviewed-by: Tim Jenssen --- .../cmakebuildconfiguration.cpp | 18 +++++++++++------- .../cmakebuildconfiguration.h | 1 + 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index d77e5efa90a..e427fecf627 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -148,18 +148,22 @@ void CMakeBuildConfiguration::ctor() m_buildDirManager, &BuildDirManager::forceReparse); connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, m_buildDirManager, &BuildDirManager::forceReparse); - connect(target(), &Target::kitChanged, this, [this]() { - ProjectExplorer::Kit *k = target()->kit(); - CMakeConfig config = cmakeConfiguration(); - config.append(CMakeConfigurationKitInformation::configuration(k)); // last value wins... - setCMakeConfiguration(config); - m_buildDirManager->maybeForceReparse(); - }); + connect(target(), &Target::kitChanged, this, &CMakeBuildConfiguration::maybeForceReparse); + connect(project, &Project::activeTargetChanged, this, &CMakeBuildConfiguration::maybeForceReparse); connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::parseCMakeOutput); } +void CMakeBuildConfiguration::maybeForceReparse() +{ + ProjectExplorer::Kit *k = target()->kit(); + CMakeConfig config = cmakeConfiguration(); + config.append(CMakeConfigurationKitInformation::configuration(k)); // last value wins... + setCMakeConfiguration(config); + m_buildDirManager->maybeForceReparse(); +} + BuildDirManager *CMakeBuildConfiguration::buildDirManager() const { return m_buildDirManager; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 62f0913f7d3..1a43980fe19 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -93,6 +93,7 @@ protected: private: void ctor(); + void maybeForceReparse(); QList completeCMakeConfiguration() const; void setCurrentCMakeConfiguration(const QList &items); From 01c91fc8f970d6ed090dc80a47e2c95990e123ca Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 30 Mar 2016 12:07:09 +0300 Subject: [PATCH 37/72] ProjectExplorer: Provide run configuration name for macro expander Change-Id: If04b824f4de18532d7561b86244464f8718fb8d7 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/runconfiguration.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 14fb83641ba..2fc8554d56c 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -256,6 +256,9 @@ void RunConfiguration::ctor() BuildConfiguration *bc = target()->activeBuildConfiguration(); return bc ? bc->macroExpander() : target()->macroExpander(); }); + expander->registerVariable("RunConfiguration:Name", + QCoreApplication::translate("ProjectExplorer", "Name of run configuration"), + [this] { return displayName(); }); } /*! From d2b32d135d8eb46b23da37d34e3a59d8b6d5c348 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 30 Mar 2016 13:29:08 +0200 Subject: [PATCH 38/72] QtQuickDesigner: Flat item selection in navigator tree ...for "flat" themes. Also, a small HighDPI fix for the non-flat variant. Change-Id: I5ae401bd59627a957f621e1111b2ab277127b2b5 Reviewed-by: Tim Jenssen --- .../navigator/navigatortreeview.cpp | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index 40ee9645dcb..72de3a7cd0d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -34,6 +34,7 @@ #include "metainfo.h" #include +#include #include #include @@ -169,18 +170,23 @@ NavigatorTreeView::NavigatorTreeView(QWidget *parent) void NavigatorTreeView::drawSelectionBackground(QPainter *painter, const QStyleOption &option) { painter->save(); - QLinearGradient gradient; - - QColor highlightColor = Utils::StyleHelper::notTooBrightHighlightColor(); - gradient.setColorAt(0, highlightColor.lighter(130)); - gradient.setColorAt(1, highlightColor.darker(130)); - gradient.setStart(option.rect.topLeft()); - gradient.setFinalStop(option.rect.bottomLeft()); - painter->fillRect(option.rect, gradient); - painter->setPen(highlightColor.lighter()); - painter->drawLine(option.rect.topLeft(),option.rect.topRight()); - painter->setPen(highlightColor.darker()); - painter->drawLine(option.rect.bottomLeft(),option.rect.bottomRight()); + if (Utils::creatorTheme()->widgetStyle() == Utils::Theme::StyleFlat) { + painter->setOpacity(0.5); + painter->fillRect(option.rect, option.palette.color(QPalette::Highlight)); + } else { + const QColor highlightColor = Utils::StyleHelper::notTooBrightHighlightColor(); + QLinearGradient gradient; + gradient.setColorAt(0, highlightColor.lighter(130)); + gradient.setColorAt(1, highlightColor.darker(130)); + gradient.setStart(option.rect.topLeft()); + gradient.setFinalStop(option.rect.bottomLeft()); + painter->fillRect(option.rect, gradient); + painter->setPen(highlightColor.lighter()); + const QRectF innerRect = QRectF(option.rect).adjusted(0.5, 0.5, -0.5, -0.5); + painter->drawLine(innerRect.topLeft(), innerRect.topRight()); + painter->setPen(highlightColor.darker()); + painter->drawLine(innerRect.bottomLeft(), innerRect.bottomRight()); + } painter->restore(); } From a44f86ed04896517b6bb5502ffd26f90fe1eb6b6 Mon Sep 17 00:00:00 2001 From: Sergey Belyashov Date: Mon, 28 Mar 2016 12:19:56 +0300 Subject: [PATCH 39/72] Update Russian translation Change-Id: Idc6cca38846741086f378bcb0df605727fffe8a4 Reviewed-by: Denis Shienkov Reviewed-by: Oswald Buddenhagen --- share/qtcreator/translations/qtcreator_ru.ts | 4200 ++++++++++++------ 1 file changed, 2823 insertions(+), 1377 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index ddd6ece543f..06a6914e404 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -32,6 +32,37 @@ Файл «%1» не является файлом документации. + + AddSignalHandlerDialog + + Implement Signal Handler + Реализация обработчика сигналов + + + Frequently used signals + Популярные сигналы + + + Property changes + Изменение свойств + + + All signals + Все сигналы + + + Signal: + Сигнал: + + + Choose the signal you want to handle: + Выберите сигнал для обработки: + + + The item will be exported automatically. + Элемент будет автоматически экспортирован. + + AdvancedSection @@ -82,153 +113,6 @@ Анализатор - - Analyzer::AnalyzerManager - - Debug - Отладка - - - Profile - Профилирование - - - Release - Выпуск - - - in Debug mode - она создана для режима отладки - - - in Profile mode - она создана для режима профилирования - - - in Release mode - она создана для режима выпуска - - - with debug symbols (Debug or Profile mode) - ей требуются отладочные символы (отладка или профилирование) - - - on optimized code (Profile or Release mode) - ей требуется оптимизированный код (профилирование или выпуск) - - - <html><head/><body><p>You are trying to run the tool "%1" on an application in %2 mode. The tool is designed to be used %3.</p><p>Run-time characteristics differ significantly between optimized and non-optimized binaries. Analytical findings for one mode may or may not be relevant for the other.</p><p>Running tools that need debug symbols on binaries that don't provide any may lead to missing function names or otherwise insufficient output.</p><p>Do you want to continue and run the tool in %2 mode?</p></body></html> - <html><head/><body><p>Вы пытаетесь запустить утилиту «%1» для приложения в режиме %2, а %3.</p><p>Характер работы приложения сильно зависит от оптимизации. Выводы, сделанные для одного режима, могут быть неверны для другого.</p><p>Запуск утилиты требующей отладочные символы для программ их не имеющих приведёт к проблемам определения имён функций или некорректному выводу информации.</p><p>Запустить утилиту в режиме %2?</p></body></html> - - - Run %1 in %2 Mode? - Выполнить %1 в режиме %2? - - - Analyze - Анализ - - - &Analyze - &Анализ - - - Start - Запустить - - - Stop - Остановить - - - Analyzer Toolbar - Панель анализатора - - - An analysis is still in progress. - Производится анализ. - - - No analyzer tool selected. - Инструмент анализа не выбран. - - - - Analyzer::AnalyzerRunConfigWidget - - Use Customized Settings - Используются особые настройки - - - Use Global Settings - Используются глобальные настройки - - - - Analyzer::DetailedErrorView - - Copy - Копировать - - - - Analyzer::Internal::AnalyzerPlugin - - Analyzer - Category under which Analyzer tasks are listed in Issues view - Анализатор - - - - Analyzer::StartRemoteDialog - - Start Remote Analysis - Запуск удалённой отладки - - - Kit: - Комплект: - - - Executable: - Программа: - - - Arguments: - Параметры: - - - Working directory: - Рабочий каталог: - - - - AnalyzerManager - - Memory Analyzer Tool finished, %n issues were found. - - Анализ памяти завершён, найдена %n проблема. - Анализ памяти завершён, найдено %n проблемы. - Анализ памяти завершён, найдено %n проблем. - - - - Memory Analyzer Tool finished, no issues were found. - Анализ памяти завершён, проблем не найдено. - - - Log file processed, %n issues were found. - - Файл журнала обработан, найдена %n проблема. - Файл журнала обработан, найдено %n проблемы. - Файл журнала обработан, найдено %n проблем. - - - - Log file processed, no issues were found. - Файл журнала обработан, проблем не найдено. - - AnchorRow @@ -545,10 +429,6 @@ Do you want to uninstall the existing package? Create Android Virtual Device Создать виртуальное устройство - - Always use this device for architecture %1 - Всегда использовать для архитектуры %1 - ABI: ABI: @@ -605,6 +485,14 @@ Do you want to uninstall the existing package? Cancel Отмена + + This can be later reset in deployment settings in the Projects mode. + Можно в любой момент выключить в настройках установки в режиме Проекты. + + + Always use this device for architecture %1 for this project + Всегда использовать это устройство для архитектуры %1 в этом проекте + Android::Internal::AndroidDeviceFactory @@ -1418,6 +1306,495 @@ Deploying local Qt libraries is incompatible with Android 5. Непрозрачность + + Autotest::Constants + + <unnamed> + <безымянный> + + + + Autotest::Internal::AutotestPlugin + + &Tests + &Тесты + + + Run &All Tests + Запустить &все + + + Alt+Shift+T,Alt+A + Alt+Shift+T,Alt+A + + + &Run Selected Tests + &Запустить выбранные + + + Alt+Shift+T,Alt+R + Alt+Shift+T,Alt+R + + + Re&scan Tests + &Пересканировать + + + Alt+Shift+T,Alt+S + Alt+Shift+T,Alt+S + + + + Autotest::Internal::GTestOutputReader + + You have %n disabled test(s). + + Имеется %n отключённый тест. + Имеется %n отключённых теста. + Имеется %n отключённых тестов. + + + + Test execution took %1 + Выполнение теста заняло %1 + + + Repeating test case %1 (iteration %2) + Повторное тестирование %1 (повтор %2) + + + Executing test case %1 + Выполнение теста %1 + + + Entering test set %1 + Вход в набор тестов %1 + + + Execution took %1. + Выполнение заняло %1. + + + + Autotest::Internal::QtTestOutputReader + + Executing test case %1 + Выполнение теста %1 + + + Entering test function %1::%2 + Вход в тестовую функцию %1::%2 + + + Qt version: %1 + Версия Qt: %1 + + + Qt build: %1 + Сборка Qt: %1 + + + QTest version: %1 + Версия QTest: %1 + + + Execution took %1 ms. + Выполнение заняло %1 мс. + + + Test finished. + Тест завершён. + + + Test execution took %1 ms. + Выполнение теста заняло %1 мс. + + + + Autotest::Internal::TestCodeParser + + Scanning for Tests + Поиск тестов + + + + Autotest::Internal::TestNavigationWidget + + Tests + Тесты + + + Run This Test + Запустить этот тест + + + Select All + Выбрать все + + + Deselect All + Отменить выбор + + + Filter Test Tree + Отфильтровать дерево тестов + + + Sort Naturally + Отсортировать по порядку + + + Expand All + Развернуть всё + + + Collapse All + Свернуть всё + + + Sort Alphabetically + Сортировать по алфавиту + + + Show Init and Cleanup Functions + Показывать функции Init и Cleanup + + + Show Data Functions + Показывать функции Data + + + + Autotest::Internal::TestNavigationWidgetFactory + + Tests + Тесты + + + + Autotest::Internal::TestResultsPane + + Expand All + Развернуть всё + + + Run All Tests + Запуск всех тестов + + + Run Selected Tests + Запуск выбранных тестов + + + Stop Test Run + Остановка тестов + + + Filter Test Results + Фильтрация результатов тестирования + + + Test Results + Результаты тестирования + + + Pass + Успешно + + + Fail + Ошибка + + + Expected Fail + Ожидаемая ошибка + + + Unexpected Pass + Неожиданный успех + + + Skip + Пропущен + + + Benchmarks + Производительность + + + Debug Messages + Отладочные сообщения + + + Warning Messages + Предупреждающие сообщения + + + Internal Messages + Внутренние сообщения + + + Check All Filters + Включить все фильтры + + + passes + успехов + + + fails + ошибок + + + unexpected passes + неожиданных успехов + + + expected fails + ожиданных ошибок + + + fatals + фатальных + + + blacklisted + исключённых + + + , %1 disabled + , %1 отключенных + + + Copy + Копировать + + + Copy All + Копировать всё + + + Save Output to File... + Сохранить вывод в файл... + + + Save Output To... + Сохранение вывода в... + + + Error + Ошибка + + + Failed to write "%1". + +%2 + Не удалось записать «%1»: + +%2 + + + + Autotest::Internal::TestRunner + + Project's run configuration was guessed for "%1". +This might cause trouble during execution. + Конфигурация запуска проекта соответствует «%1». +Это может вызвать проблемы при запуске. + + + No tests selected. Canceling test run. + Тесты не выбраны. Отмена теста. + + + Project is null. Canceling test run. +Only desktop kits are supported. Make sure the currently active kit is a desktop kit. + Проект пуст. Отмена теста. +Поддерживаются только комплекты для десктопов. Убедитесь, что текущий комплект для десктопа. + + + Project is not configured. Canceling test run. + Проект не настроен. Отмена теста. + + + Running Tests + Выполнение тестов + + + Build failed. Canceling test run. + Сборка не удалась. Отмена теста. + + + + Autotest::Internal::TestSettingsPage + + Form + + + + General + Основное + + + Hides internal messages by default. You can still enable them by using the test results filter. + Скрывать внутренние сообщения по умолчанию. Их можно включить используя фильтр результатов тестирования. + + + Omit internal messages + Опускать внутренние сообщения + + + Hides warnings related to a guessed run configuration. + Скрывать предупреждения связанные с выбранной конфигурацией запуска. + + + Omit run configuration warnings + Опускать предупреждения конфигурации запуска + + + Limit result output to 100000 characters. + Ограничить вывод результата 100000 символами. + + + Limit result output + Ограничить вывод результата + + + Automatically scroll down when new items are added and scrollbar is at bottom. + Автоматически пролистывать при добавлении новых элеметов, если ползунок внизу. + + + Automatically scroll results + Автоматически пролистывать результаты + + + Parse for tests even when no Tests related widget is displayed. + Искать тесты даже, если тестируемый виджет не отображается. + + + Always parse current project for tests + Всегда искать тесты в текущем проекте + + + Timeout used when executing each test case. + Таймаут, используемый при выполнении каждого теста. + + + Timeout: + Таймаут: + + + Timeout used when executing test cases. This will apply for each test case on its own, not the whole project. + Таймаут, используемый при выполнении тестов. Он применяется для каждого теста, а не всего проекта. + + + s + с + + + Google Test + Google Test + + + Executes disabled tests when performing a test run. + Запускать отключённые тесты при выполнении тестового запуска. + + + Run disabled tests + Запускать отключённые тесты + + + Repeats a test run (you might be required to increase the timeout to avoid canceling the tests). + Повторяет запуск теста (возможно, потребуется увеличить таймаут для предотвращения отмены тестирования). + + + Repeat tests + Повторять тесты + + + Iterations: + Повторов: + + + Shuffle tests automatically on every iteration by the given seed. + Автоматически перемешивать тесты при кажом повторе согласно заданной Seed. + + + Shuffle tests + Перемешать тесты + + + Seed: + Seed: + + + A seed of 0 generates a seed based on the current timestamp. + 0 приводит к генерации на основе текущего времени. + + + Benchmark Metrics + Метрика аттестации + + + Uses walltime metrics for executing benchmarks (default). + Использовать обычное время при выполнении тестирования производительности (по умолчанию). + + + Walltime + Время + + + Uses tick counter when executing benchmarks. + Использовать счётчик тиков при тестировании производительности. + + + Tick counter + Счётчик тиков + + + Uses event counter when executing benchmarks. + Использовать счётчик событий при тестировании производительности. + + + Event counter + Счётчик событий + + + Uses Valgrind Callgrind when executing benchmarks (it must be installed). + Использовать Valgrind Callgrind при тестировании производительности (должен быть установлен). + + + Callgrind + Callgrind + + + Uses Perf when executing benchmarks (it must be installed). + Использовать Perf при тестировании производительности (должен быть установлен). + + + Perf + Perf + + + Test Settings + Настройки тестов + + + + Autotest::Internal::TestTreeModel + + Auto Tests + Автотесты + + + Qt Quick Tests + Тесты Qt Quick + + + Google Tests + Тесты Google + + AutotoolsProjectManager::Internal::AutogenStep @@ -1629,10 +2006,6 @@ Deploying local Qt libraries is incompatible with Android 5. Executable: Программа: - - Arguments: - Параметры: - Work directory: Рабочий каталог: @@ -1750,10 +2123,6 @@ Deploying local Qt libraries is incompatible with Android 5. Executable: Программа: - - Arguments: - Параметры: - <default> <по умолчанию> @@ -2012,6 +2381,10 @@ Deploying local Qt libraries is incompatible with Android 5. BaseQtVersion + + Device type is not supported by Qt version. + Устройства этого типа не поддерживается профилем Qt. + The compiler "%1" (%2) cannot produce code for the Qt version "%3" (%4). Компилятор «%1» (%2) не может создавать код для профиля Qt «%3» (%4). @@ -2416,7 +2789,7 @@ Local commits are not pushed to the master branch until a normal commit is perfo Timeout: - Время ожидания: + Таймаут: s @@ -2622,26 +2995,10 @@ For example, "Revision: 15" will leave the branch at revision 15. Beautifier::Internal::BeautifierPlugin - - Cannot create temporary file "%1": %2. - Невозможно создать временный файл «%1»: %2. - - - Cannot call %1 or some other error occurred. - Не удалось вызвать %1 или возникла другая ошибка. - - - Cannot read file "%1": %2. - Невозможно прочитать файл «%1»: %2. - File was modified. Файл изменился. - - Time out reached while formatting file %1. - Время форматирования файла %1 истекло. - Could not format file %1. Не удалось переформатировать файл %1. @@ -2692,10 +3049,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Clang Format command: Команда Clang Format: - - Format entire file if no text was selected. (For action Format Selected Text) - Форматировать файл целиком, если текст не выделен (для «Форматировать выделенное») - Clang Format Clang Format @@ -2708,6 +3061,14 @@ For example, "Revision: 15" will leave the branch at revision 15.Use customized style: Использовать особый стиль: + + For action Format Selected Text + Для операции «Форматировать выделенное» + + + Format entire file if no text was selected + Форматировать весь файл, если ничего не выбрано + Beautifier::Internal::ConfigurationDialog @@ -2790,6 +3151,14 @@ For example, "Revision: 15" will leave the branch at revision 15.Use customized style: Использовать особый стиль: + + For action Format Selected Text + Для операции «Форматировать выделенное» + + + Format entire file if no text was selected + Форматировать весь файл, если ничего не выбрано + BinEditor::BinEditorWidget @@ -3261,6 +3630,71 @@ For example, "Revision: 15" will leave the branch at revision 15.Показывать информацию о событии при наведении курсора. + + CMakeProjectManager::CMakeBuildStep + + Qt Creator needs a cmake tool set up to build. Configure a cmake tool in the kit options. + Для сборки необходимо, чтобы была задана утилита cmake. Задайте её в настройках комлекта. + + + + CMakeProjectManager::CMakeConfigurationKitInformation + + CMake configuration has no path to qmake binary set, even though the kit has a valid Qt version. + В конфигурации CMake не указан путь к qmake, даже при заданном профиле Qt комплекта. + + + CMake configuration has a path to a qmake binary set, even though the kit has no valid Qt version. + В конфигурации CMake указан путь к qmake, при незаданном верном профиле Qt комплекта. + + + CMake configuration has a path to a qmake binary set, which does not match up with the qmake binary path configured in the Qt version. + В конфигурации CMake указан путь к qmake, но он не совпадает с заданным в профиле Qt комплекта. + + + CMake configuration has no path to a C++ compiler set, even though the kit has a valid tool chain. + В конфигурации CMake не указан путь к компилятору С++, при заданном верном инструментарии комплекта. + + + CMake configuration has a path to a C++ compiler set, even though the kit has no valid tool chain. + В конфигурации CMake указан путь к компилятору С++, при незаданном верном инструментарии комплекта. + + + CMake configuration has a path to a C++ compiler set, that does not match up with the compiler path configured in the tool chain of the kit. + В конфигурации CMake указан путь к компилятору С++, но он не совпадает с заданным в инструментарии комплекта. + + + CMake Configuration + Конфигурация CMake + + + + CMakeProjectManager::CMakeGeneratorKitInformation + + No CMake Tool configured, CMake generator will be ignored. + Утилита CMake не задана, генератор CMake игнорируется. + + + CMake Tool is unconfigured, CMake generator will be ignored. + Утилита CMake не настроена, генератор CMake игнорируется. + + + CMake Tool does not support the configured generator. + Утилита CMake не поддерживает выбранный генератор. + + + CMake generator does not generate CodeBlocks file. Qt Creator will not be able to parse the CMake project. + Генератор CMake не создает файл CodeBlocks. Qt Creator не сможет обрабатывать проект CMake. + + + CMake Generator + Генератор CMake + + + <Use Default Generator> + <Генератор по умолчанию> + + CMakeProjectManager::CMakeKitInformation @@ -3275,8 +3709,8 @@ For example, "Revision: 15" will leave the branch at revision 15. CMakeProjectManager::CMakeProject - Internal Error: No build configuration found in settings file. - Внутренняя ошибка: Не удалось обнаружить конфигурацию сборки в файле настроек. + No cmake tool set. + Программа cmake не указана. @@ -3321,6 +3755,52 @@ For example, "Revision: 15" will leave the branch at revision 15.Системная CMake в %1 + + CMakeProjectManager::ConfigModel + + <UNSET> + <не задано> + + + Setting + Настройка + + + Value + Значение + + + Advanced + Дополнительно + + + + CMakeProjectManager::Internal::BuildDirManager + + The build directory is not for %1 + Каталог сборки не для %1 + + + Running "%1 %2" in %3. + Выполнение "%1 %2" в %3. + + + Configuring "%1" + Настройка «%1» + + + *** cmake process crashed! + *** процесс cmake завершился крахом! + + + *** cmake process exited with exit code %1. + *** процесс cmake завершился с кодом %1. + + + Failed to open %1 for reading. + Не удалось открыть %1 для чтения. + + CMakeProjectManager::Internal::CMakeBuildConfigurationFactory @@ -3352,20 +3832,24 @@ For example, "Revision: 15" will leave the branch at revision 15. CMakeProjectManager::Internal::CMakeBuildSettingsWidget - Run CMake... - Запустить CMake... + Build directory: + Каталог сборки: - Reconfigure project: - Перенастроить проект: - - - &Change + &Edit &Изменить - Build directory: - Каталог сборки: + &Reset + &Вернуть + + + Advanced + Дополнительно + + + Apply Configuration Changes + Применить изменения CMake @@ -3373,14 +3857,85 @@ For example, "Revision: 15" will leave the branch at revision 15. - CMakeProjectManager::Internal::CMakeEditor + CMakeProjectManager::Internal::CMakeBuildStep - Changes to cmake files are shown in the project tree after building. - Изменения в файлах cmake будут отображены в дереве проекта после сборки. + Make + Default display name for the cmake make step. + Сборка - Build now - Собрать + Persisting CMake state... + Фиксация состояния CMake... + + + + CMakeProjectManager::Internal::CMakeBuildStepConfigWidget + + Tool arguments: + Параметры утилиты: + + + Targets: + Цели: + + + Build + CMakeProjectManager::CMakeBuildStepConfigWidget display name. + Сборка + + + <b>No build configuration found on this kit.</b> + <b>Для этого комплекта отсутствует конфигурация сборки.</b> + + + + CMakeProjectManager::Internal::CMakeBuildStepFactory + + Build + Display name for CMakeProjectManager::CMakeBuildStep id. + Сборка + + + + CMakeProjectManager::Internal::CMakeConfigurationKitConfigWidget + + Change... + Изменить... + + + CMake Configuration + Конфигурация CMake + + + <No Changes to Apply> + <Нет изменений> + + + Default configuration passed to CMake when setting up a project. + Конфигурация по умолчанию, передаваемая CMake при настройке проекта. + + + Edit CMake Configuration + Изменение конфигурации CMake + + + Enter one variable per line with the variable name separated from the variable value by "=".<br>You may provide a type hint by adding ":TYPE" before the "=". + Задавайте значения переменных по одной в строке, отделяя значение от имени символом "=".<br>Можно указывать тип, добавляя «:ТИП» перед "=".<br>Например: CMAKE_BUILD_TYPE:STRING=DebWithRelInfo. + + + + CMakeProjectManager::Internal::CMakeGeneratorKitConfigWidget + + CMake Generator: + Генератор CMake: + + + <Use Default Generator> + <Генератор по умолчанию> + + + CMake generator defines how a project is built when using CMake.<br>This setting is ignored when using other build systems. + Генератор CMake определяет, как проект будет собираться при использовании CMake.<br>Он игнорируется при использовании других систем сборки. @@ -3411,18 +3966,15 @@ For example, "Revision: 15" will leave the branch at revision 15.Run CMake Запустить CMake + + Clear CMake Configuration + Очистить конфигурацию + Failed opening project "%1": Project is not a file Не удалось открыть проект «%1»: проект не является файлом - - CMakeProjectManager::Internal::CMakeOpenProjectWizard - - CMake Wizard - Мастер CMake - - CMakeProjectManager::Internal::CMakeRunConfiguration @@ -3438,68 +3990,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Приложение собрано не текущей конфигурацией сборки - - CMakeProjectManager::Internal::CMakeRunConfigurationWidget - - Select Working Directory - Выбор рабочего каталога - - - Reset to Default - Сбросить в исходное состояние - - - Working directory: - Рабочий каталог: - - - - CMakeProjectManager::Internal::CMakeRunPage - - Run CMake - Запустить CMake - - - The build directory "%1" for build configuration "%2" for target "%3" contains an outdated .cbp file. Qt Creator needs to update this file by running CMake. You can add command line arguments below. Note that CMake remembers command line arguments from the previous runs. - Каталог сборки «%1» конфигурации «%2» для цели «%3» содержит устаревший файл *.cbp. Qt Creator должен его обновить путём запуска CMake. Можно передать дополнительные параметры командной строки ниже. Следует иметь в виду, что CMake запоминает параметры командной строки каждого запуска. - - - The directory "%1" specified in build configuration "%2", for target "%3" does not contain a .cbp file. Qt Creator needs to recreate this file by running CMake. Some projects require command line arguments to the initial CMake call. Note that CMake remembers command line arguments from the previous runs. - Каталог сборки «%1» конфигурации «%2» цели «%3» не содержит файл *.cbp. Qt Creator должен его создать путём запуска CMake. Некоторым проектам требуется передать параметры командной строки при первом запуске CMake. Следует иметь в виду, что CMake запоминает параметры командной строки каждого запуска. - - - Qt Creator needs to run CMake in the new build directory. Some projects require command line arguments to the initial CMake call. - Qt Creator должен запустить CMake в новом каталоге сборки. Некоторые проекты требуют указания дополнительных параметров командной строки при первом запуске CMake. - - - Refreshing the .cbp file in "%1" for build configuration "%2" for target "%3". - Обновление файла *.cbp в «%1» конфигурации «%2» для цели «%3». - - - Selected kit has no valid CMake executable specified. - У выбранного комплекта не задана программа CMake. - - - Open project with errors. - Открывать проекты с ошибками. - - - No generator selected. - Генератор не выбран. - - - CMake exited with errors. Please check CMake output. - CMake завершился с ошибкой. Проверьте сообщения CMake. - - - Arguments: - Параметры: - - - Generator: - Генератор: - - CMakeProjectManager::Internal::CMakeSettingsPage @@ -3537,10 +4027,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Set as the default CMake Tool to use when creating a new kit or when no value is set. Задание утилиты CMake по умолчанию, используемой при создании новых комплектов. - - Prefer Ninja generator (CMake 2.8.9 or higher required) - Предпочитать генератор Ninja (требуется CMake не ниже 2.8.9) - Clone of %1 Копия %1 @@ -3550,125 +4036,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Новая CMake - - CMakeProjectManager::Internal::GeneratorInfo - - Ninja (%1) - Ninja (%1) - - - NMake Generator (%1) - Генератор для NMake (%1) - - - MinGW Generator (%1) - Генератор для MinGW (%1) - - - Unix Generator (%1) - Генератор для Unix (%1) - - - - CMakeProjectManager::Internal::InSourceBuildPage - - Qt Creator has detected an <b>in-source-build in %1</b> which prevents shadow builds. Qt Creator will not allow you to change the build directory. If you want a shadow build, clean your source directory and re-open the project. - Qt Creator обнаружил <b>сборку в каталоге с исходниками (%1)</b>, что препятствует теневой сборке. Qt Creator не позволит изменить каталог сборки. Если требуется теневая сборка, необходимо очистить каталог исходников и открыть проект снова. - - - Build Location - Каталог сборки - - - - CMakeProjectManager::Internal::MakeStep - - Make - Default display name for the cmake make step. - Сборка - - - - CMakeProjectManager::Internal::MakeStepConfigWidget - - Override command: - Заменяющая команда: - - - Additional arguments: - Дополнительные параметры: - - - Targets: - Цели: - - - <b>No build configuration found on this kit.</b> - <b>Для этого комплекта отсутствует конфигурация сборки.</b> - - - Make - CMakeProjectManager::MakeStepConfigWidget display name. - Сборка - - - - CMakeProjectManager::Internal::MakeStepFactory - - Make - Display name for CMakeProjectManager::MakeStep id. - Сборка - - - - CMakeProjectManager::Internal::NoCMakePage - - Check CMake Tools - Проверка утилит CMake - - - There are CMake Tools registered. - Обнаружена утилита CMake. - - - Qt Creator has no CMake Tools that are required for CMake projects. Please configure at least one. - У Qt Creator не настроены утилиты CMake, необходимые для сборки проектов на базе CMake. Настройте хотя бы одну. - - - - CMakeProjectManager::Internal::NoKitPage - - Check Kits - Проверить комплекты - - - There are compatible kits. - Имеются совместимые комплекты. - - - Qt Creator has no kits that are suitable for CMake projects. Please configure a kit. - У Qt Creator нет комплектов, подходящих для проектов CMake. Настройте комплект. - - - - CMakeProjectManager::Internal::ShadowBuildPage - - Please enter the directory in which you want to build your project. - Укажите каталог, в котором желаете собирать проект. - - - Please enter the directory in which you want to build your project. Qt Creator recommends to not use the source directory for building. This ensures that the source directory remains clean and enables multiple builds with different settings. - Укажите каталог, в котором желаете собирать проект. Qt Creator рекомендует не использовать каталог с исходниками для сборки. Это позволит поддерживать каталог с исходниками в чистоте, а также даст возможность делать несколько сборок с различными настройками. - - - Build directory: - Каталог сборки: - - - Build Location - Каталог сборки - - CPlusPlus::CheckSymbols @@ -3752,6 +4119,21 @@ For example, "Revision: 15" will leave the branch at revision 15.Находится в %1 + + ClangCodeModel::Internal::ClangProjectSettingsWidget + + Warnings + Предупреждения + + + Clang Code Model + Модель кода Clang + + + Global setting (%1) + Глобальная настройка (%1) + + ClangCodeModel::Internal::ModelManagerSupport @@ -3760,6 +4142,25 @@ For example, "Revision: 15" will leave the branch at revision 15.Clang + + ClangDiagnosticConfigsModel + + Warnings for questionable constructs + Предупреждать о сомнительных конструкциях + + + Pedantic Warnings + Педантичные предупреждения + + + Warnings for almost everything + Предупреждать обо всём + + + %1 [built-in] + %1 [встроенный] + + ClangFormatSettings @@ -3767,6 +4168,252 @@ For example, "Revision: 15" will leave the branch at revision 15.Описание недоступно. + + ClangStaticAnalyzer + + The chosen file "%1" seems to point to an icecc binary not suitable for analyzing. +Please set a real clang executable. + Кажется, выбранный файл «%1» указывает на программу icecc непригодную для анализа. +Укажите реальную программу clang. + + + + ClangStaticAnalyzer::Diagnostic + + Category: + Категория: + + + Type: + Тип: + + + Context: + Контекст: + + + Location: + Размещение: + + + + ClangStaticAnalyzer::ExplainingStep + + Message: + Сообщение: + + + Extended Message: + Подробное сообщение: + + + Location: + Размещение: + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerConfigWidget + + Form + + + + General + Основное + + + Clang executable: + Исполняемый файл Clang: + + + Simultaneous processes: + Одновременных процессов: + + + Clang Command + Команда Clang + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerDiagnosticModel + + Issue + Проблема + + + Location + Размещение + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerDiagnosticView + + Suppress this diagnostic + Подавить эту диагностику + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerOptionsPage + + Clang Static Analyzer + Статический анализатор Clang + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerPlugin + + Clang Static Analyzer Settings + Настройки статического анализатора Clang + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerRunControl + + Running Clang Static Analyzer on %1 + Выполнения статического анализа Clang для %1 + + + Clang Static Analyzer: Invalid executable "%1", stop. + Статический анализатор Clang: Неверная программа «%1», остановлено. + + + Clang Static Analyzer: Failed to create temporary dir, stop. + Статический анализатор Clang: Не удалось создать временный каталог, остановлено. + + + Analyzing + Анализ + + + Clang Static Analyzer stopped by user. + Статический анализатор Clang остановлен пользователем. + + + Analyzing "%1". + Анализ «%1». + + + Failed to analyze "%1": %2 + Не удалось проанализировать «%1»: %2 + + + Clang Static Analyzer finished: Processed %1 files successfully, %2 failed. + Работа статического анализатора Clang завершена: Успешно обработано %1 файлов и %2 не удалось. + + + Clang Static Analyzer: Not all files could be analyzed. + Статический анализатор Clang: Не все файлы удалось проанализовать. + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerRunControlFactory + + The project configuration changed since the start of the Clang Static Analyzer. Please re-run with current configuration. + Конфигурация проекта изменилась с момента запуска статического анализатора Clang. Перезапустите его. + + + + ClangStaticAnalyzer::Internal::ClangStaticAnalyzerTool + + Clang Static Analyzer Issues + Если перевести буквально, то будет очень длинно + Статический анализатор Clang + + + Go to previous bug. + К предыдущей проблеме. + + + Go to next bug. + К следующей проблеме. + + + Clang Static Analyzer uses the analyzer from the clang project to find bugs. + Статический анализатор Clang использует анализатор из проекта clang для поиска проблем. + + + Clang Static Analyzer + Статический анализатор Clang + + + Release + Выпуск + + + Run %1 in %2 Mode? + Выполнить %1 в режиме %2? + + + <html><head/><body><p>You are trying to run the tool "%1" on an application in %2 mode. The tool is designed to be used in Debug mode since enabled assertions can reduce the number of false positives.</p><p>Do you want to continue and run the tool in %2 mode?</p></body></html> + <html><head/><body><p>Вы пытаетесь запустить «%1» для приложения в режиме %2. Этот инструмент разработан для использования в отладочном режиме, так как включённые утверждения могут уменьшить число ложных срабатываний.</p><p>Продолжить запуск в режиме %2?</p></body></html> + + + Clang Static Analyzer is still running. + Статический анализатор Clang ещё работает. + + + Start Clang Static Analyzer. + Запустить статический анализатор Clang. + + + Clang Static Analyzer running. + Статический анализатор Clang работает. + + + Clang Static Analyzer finished. + Статический анализ Clang завершён. + + + No issues found. + Проблем не найдено. + + + %n issues found (%1 suppressed). + + найдена %n проблема (%1 подавлено). + найдено %n проблемы (%1 подавлено). + найдено %n проблем (%1 подавлено). + + + + + ClangStaticAnalyzer::Internal::ProjectSettingsWidget + + Form + + + + Suppressed Diagnostics: + Подавляемые диагностики: + + + Remove Selected + Удалить выбранное + + + Remove All + Удалить всё + + + + ClangStaticAnalyzer::Internal::SuppressedDiagnosticsModel + + File + Файл + + + Context + Контекст + + + Diagnostic + Диагностика + + + Function "%1" + Функция «%1» + + ClassView::Internal::NavigationWidget @@ -4191,7 +4838,7 @@ For example, "Revision: 15" will leave the branch at revision 15. &Timeout: - В&ремя ожидания: + Та&ймаут: s @@ -5014,6 +5661,22 @@ Continue? Opening File Открытие файла + + Split + Разделить + + + Split Side by Side + Разделить вертикально + + + Open in New Window + Открыть в новом окне + + + Close Document + Закрыть документ + Core::EditorToolBar @@ -5351,6 +6014,10 @@ Continue? The current time (QTime formatstring). Текущее время (строка форматирования QTime). + + Generate a new UUID. + Создать новый UUID. + A comment. Комментарий. @@ -5552,6 +6219,18 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Ctrl+E,1 Ctrl+E,1 + + Go to Previous Split or Window + Перейти к предыдущему разделению или окну + + + Meta+E,i + Meta+E,i + + + Ctrl+E,i + Ctrl+E,i + Go to Next Split or Window Перейти к следующему разделению или окну @@ -6127,10 +6806,6 @@ Do you want to kill it? Find: Искать: - - ... - ... - Replace with: Заменить на: @@ -6159,12 +6834,12 @@ Do you want to kill it? <Системный> - Interface - Интерфейс + Restart Required + Требуется перезапуск - Restart required - Требуется перезапуск + Interface + Интерфейс The language change will take effect after a restart of Qt Creator. @@ -6814,6 +7489,14 @@ Do you want to kill it? Previous Item Предыдущий + + Ctrl+Shift+9 + Ctrl+Shift+9 + + + Alt+Shift+9 + Alt+Shift+9 + Maximize Output Pane Развернуть панель вывода @@ -6830,14 +7513,6 @@ Do you want to kill it? F6 F6 - - Ctrl+9 - Ctrl+9 - - - Alt+9 - Alt+9 - Minimize Output Pane Свернуть панель вывода @@ -7193,10 +7868,6 @@ Do you want to kill it? Terminal Сбросить в исходное состояние. - - <html>Influences how file names are matched to decide if they are the same. - <html>Определяет, как сравнивать похожие именя файлов. - File system case sensitivity: Будет: "При стравнении имён файлов: учитывать регистр" @@ -7226,124 +7897,20 @@ Do you want to kill it? Variables Переменные - - - Core::Internal::ThemeEditor::ThemeEditorWidget - Theme Editor - Редактор тем - - - Filter: - Фильтр: + Influences how file names are matched to decide if they are the same. + Определяет способ сравнения имён файлов. - Core::Internal::ThemeEditor::ThemeSettingsItemDelegate + Core::Internal::ThemeChooser - <Unnamed> (Current) - <Без имени> (текущая) + Restart Required + Требуется перезапуск - (Current) - (текущая) - - - Remove Variable Name - Удалить имя переменной - - - Add Variable Name... - Добавить имя переменной... - - - Variable name: - Имя переменной: - - - Add Variable Name - Добавление имени переменной - - - - Core::Internal::ThemeEditor::ThemeSettingsTableModel - - Widget Style - Стиль виджета - - - Colors - Цвета - - - Flags - Флаги - - - Role - Роль - - - Value - Значение - - - - Core::Internal::ThemeSettings - - Rename... - Переименовать... - - - Copy... - Копировать... - - - Delete - Удалить - - - Theme - Тема - - - - Core::Internal::ThemeSettingsWidget - - Delete Theme - Удаление темы - - - Are you sure you want to delete the theme "%1" permanently? - Удалить тему «%1» навсегда? - - - Delete - Удалить - - - Copy Theme - Копирование темы - - - Theme name: - Имя темы: - - - Theme Changed - Тема изменена - - - The theme "%1" was modified, do you want to save the changes? - Тема «%1» была изменена, сохранить изменения? - - - Discard - Отказаться - - - Rename Theme - Переименование темы + The theme change will take effect after a restart of Qt Creator. + Изменение темы вступит в силу только после перезапуска Qt Creator. @@ -8036,6 +8603,41 @@ to version control (%2) Имя класса. + + CppTools::ClangDiagnosticConfigsWidget + + Form + + + + Configuration to use: + Использовать конфигурацию: + + + Copy... + Копировать... + + + Remove + Удалить + + + For appropriate options, consult the GCC or Clang manual pages or the <a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">GCC online documentation</a>. + Описание параметров можно найти страницах man GCC или Clang или в <a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">Документации GCC</a>. + + + Copy Diagnostic Configuration + Копирование конфигурации диагностики + + + Diagnostic configuration name: + Имя конфигурации диагностики: + + + %1 (Copy) + %1 (копия) + + CppTools::CppClassesFilter @@ -8189,7 +8791,7 @@ In addition, Shift+Enter inserts an escape character at the cursor position and Timeout in ms: - Время ожидания в мс: + Таймаут в мс: @@ -8215,16 +8817,8 @@ In addition, Shift+Enter inserts an escape character at the cursor position and <i>Включите модуль Clang Code Model, чтобы менять настройки.</i> - Use Clang Code Model - Использовать модель кода Clang - - - Append additional command line options to Clang, one per line. <i>Use this with care.</i> - Дополнительные параметры командной строки Clang, по одной на строке.<br><i>Используйте их с осторожностью.</i> - - - Reset Options - Сбросить + Clang Code Model Warnings + Предупреждения модели кода Clang @@ -9224,7 +9818,7 @@ Flags: %3 Timeout: - Время ожидания: + Таймаут: s @@ -9254,6 +9848,29 @@ Flags: %3 Команда CVS + + DebugMessagesModel + + Debug Message + Отладочное сообщение + + + Warning Message + Предупреждающее сообщение + + + Critical Message + Критическое сообщение + + + Fatal Message + Фатальное сообщение + + + Info Message + Информационное сообщение + + Debugger @@ -9278,6 +9895,64 @@ Flags: %3 Ctrl+Shift+F11 + + Debugger::AnalyzerAction + + Cannot start %1 without a project. Please open the project and try again. + Невозможно запустить %1 без проекта. Откройте проект и попробуйте снова. + + + Debug + отладки + + + Profile + профилирования + + + Release + выпуска + + + in Debug mode + она создана для режима отладки + + + in Profile mode + она создана для режима профилирования + + + in Release mode + она создана для режима выпуска + + + with debug symbols (Debug or Profile mode) + ей требуются отладочные символы (отладка или профилирование) + + + on optimized code (Profile or Release mode) + ей требуется оптимизированный код (профилирование или выпуск) + + + Run %1 in %2 Mode? + Выполнить %1 в режиме %2? + + + <html><head/><body><p>You are trying to run the tool "%1" on an application in %2 mode. The tool is designed to be used %3.</p><p>Run-time characteristics differ significantly between optimized and non-optimized binaries. Analytical findings for one mode may or may not be relevant for the other.</p><p>Running tools that need debug symbols on binaries that don't provide any may lead to missing function names or otherwise insufficient output.</p><p>Do you want to continue and run the tool in %2 mode?</p></body></html> + <html><head/><body><p>Вы пытаетесь запустить утилиту «%1» для приложения в режиме %2, а %3.</p><p>Характер работы приложения сильно зависит от оптимизации. Выводы, сделанные для одного режима, могут быть неверны для другого.</p><p>Запуск утилиты требующей отладочные символы для программ их не имеющих приведёт к проблемам определения имён функций или некорректному выводу информации.</p><p>Запустить утилиту в режиме %2?</p></body></html> + + + + Debugger::AnalyzerRunConfigWidget + + Use Customized Settings + Используются особые настройки + + + Use Global Settings + Используются глобальные настройки + + Debugger::DebuggerItemManager @@ -9356,21 +10031,6 @@ Flags: %3 Debugger Отладчик - - No kit found. - Комплект не найден. - - - - Debugger::DebuggerMainWindow - - Memory... - Память... - - - Debugger Toolbar - Панель отладчика - Debugger::DebuggerOptionsPage @@ -9506,6 +10166,13 @@ Flags: %3 Закрытие сессии отладки + + Debugger::DetailedErrorView + + Copy + Копировать + + Debugger::Internal::AddressDialog @@ -10419,6 +11086,44 @@ Flags: %3 <бесконечна> + + Debugger::Internal::Console + + Show debug, log, and info messages. + Показывать сообщения уровней: отладка, журнал и информация. + + + Show warning messages. + Показывать предупреждения. + + + Show error messages. + Показывать сообщения об ошибках. + + + Can only evaluate during a debug session. + Вычислится только при отладке. + + + Debugger Console + Консоль отладчика + + + + Debugger::Internal::ConsoleView + + &Copy + &Копировать + + + &Show in Editor + &Показать в редакторе + + + C&lear + &Очистить + + Debugger::Internal::DebuggerEngine @@ -10511,6 +11216,18 @@ Flags: %3 Exception Triggered Возникло исключение + + The inferior is in the Portable Executable format. +Selecting CDB as debugger would improve the debugging experience for this binary format. + Программа имеет формат Portable Executable. +Рекомендуется использовать отладчик CDB для улучшения отладочных возможностей. + + + The inferior is in the ELF format. +Selecting GDB or LLDB as debugger would improve the debugging experience for this binary format. + Программа имеет формает ELF. +Рекомендуется использовать отладчик GDB или LLDB для улучшения отладочных возможностей. + Found. Найдена. @@ -10527,6 +11244,14 @@ Flags: %3 Warning Предупреждение + + The selected debugger may be inappropiate for the inferior. +Examining symbols and setting breakpoints by file name and line number may fail. + + Выбранный отладчик возможно не подходит для отлаживаемой программы. +Обзор символов и установка точек останова по имени файла и строке может не работать. + + This does not seem to be a "Debug" build. Setting breakpoints by file name and line number may fail. @@ -10657,6 +11382,11 @@ Setting breakpoints by file name and line number may fail. Sections in "%1" Секции в «%1» + + Debugger + Category under which Analyzer tasks are listed in Issues view + Отладчик + Some breakpoints cannot be handled by the debugger languages currently active, and will be ignored. Affected are breakpoints %1 @@ -10675,6 +11405,14 @@ Affected are breakpoints %1 Unable to create a debugger engine of the type "%1" Не удалось создать отладчик типа «%1» + + Install &Debug Information + Установить &отладочную информацию + + + Tries to install missing debug information. + Попытка установить отсутствующую отладочную информацию. + Debugger::Internal::DebuggerPluginPrivate @@ -10894,6 +11632,10 @@ Qt Creator не может подключиться к нему. Debugger Runtime Программа отладчика + + Debugger + Отладчик + Cannot attach to process with PID 0 Невозможно подключиться к процессу с PID равным 0 @@ -10978,6 +11720,14 @@ Qt Creator не может подключиться к нему. Breakpoints Точки останова + + &Analyze + &Анализ + + + Memory... + Память... + Modules Модули @@ -11093,10 +11843,6 @@ Qt Creator не может подключиться к нему. Debugger::Internal::DebuggerSettings - - Verbose Log - Расширенное журналирование - Use Alternating Row Colors Использовать чередующиеся цвета строк @@ -11129,10 +11875,6 @@ Qt Creator не может подключиться к нему. Dereference Pointers Automatically Автоматически разыменовывать указатели - - <p>This switches the Locals&&Watchers view to automatically dereference pointers. This saves a level in the tree view, but also loses data for the now-missing intermediate level. - <p>Переключает обзор переменных в режим автоматического разыменования указателей. Позволяет сохранить уровень древовидного отображения, но при этом недоступны данные промежуточного уровня. - Show "std::" Namespace in Types Показывать пространство имён «std::» в типах @@ -11157,6 +11899,14 @@ Qt Creator не может подключиться к нему. <p>Shows Qt namespace prefix for Qt types. This is only relevant if Qt was configured with "-qtnamespace". <p>Отображать приставку пространтсва имён Qt для типов Qt. Имеет смысл только тогда, когда Qt собран с параметром «-qtnamespace». + + Show QObject names if available + Показывать доступные имена QObject + + + <p>Displays the objectName property of QObject based items. Note that this can negatively impact debugger performance even if no QObjects are present. + <p>Отображает свойство objectName производных от QObject объектов. Может негативно сказаться на скорости работы отладчика даже если нет подобных объектов. + Sort Members of Classes and Structs Alphabetically Сортировать члены классов и структур по алфавиту @@ -11213,6 +11963,10 @@ Qt Creator не может подключиться к нему. Synchronize Breakpoints Согласовывать точки останова + + <p>This switches the Locals and Expressions view to automatically dereference pointers. This saves a level in the tree view, but also loses data for the now-missing intermediate level. + <p>Переключает обзор Переменных и выражений в режим автоматического разыменовывания указателей. Позволяет сократить размер дерева, но при этом теряются данные промежуточного уровня. + Adjust Breakpoint Locations Подстраивать размещение точек останова @@ -11473,6 +12227,10 @@ Qt Creator не может подключиться к нему. Attach to core "%1" failed: Не удалось подключиться к дампу «%1»: + + Continuing nevertheless. + Всё же продолжаем. + Debugger::Internal::GdbEngine @@ -11722,6 +12480,10 @@ You can choose between waiting longer or aborting debugging. Value changed from %1 to %2. Значение изменилось с %1 на %2. + + The selected build of GDB supports Python scripting, but the used version %1.%2 is not sufficient for Qt Creator. Supported versions are Python 2.7 and 3.x. + Выбранная сборка GDB поддерживает сценарии Python, но версия Python %1.%2 не подходит Qt Creator. Поддерживается Python версий 2.7 и 3.x. + Execution Error Ошибка выполнения @@ -11807,7 +12569,7 @@ You can choose between waiting longer or aborting debugging. GDB timeout: - Время ожидания ответа GDB: + Таймаут ответа GDB: The number of seconds Qt Creator will wait before it terminates @@ -12505,12 +13267,6 @@ Stepping into the module or setting breakpoints by file and line is expected to Do you want to retry? Не удалось подключиться к внутрипроцессному отладчику QML. Повторить? - - - Could not connect to the in-process QML debugger. -%1 - Не удалось подключиться к внутрипроцессному отладчику QML. -%1 QML Debugger: Remote host closed connection. @@ -12520,6 +13276,10 @@ Do you want to retry? JS Source for %1 Исходник JS для %1 + + Could not connect to the in-process QML debugger. %1 + Не удалось подключиться к внутрипроцессному отладчику QML. %1 + Starting %1 %2 Запускается %1 %2 @@ -12587,7 +13347,7 @@ Do you want to retry? В виде %1-битных двоичных целых - Contents as %1-bit Floating Point Values + Content as %1-bit Floating Point Values В виде %1-битных действительных @@ -13176,6 +13936,10 @@ Do you want to retry? Attach to Process Not Yet Started Подключение процессу ещё не началось + + Reset + Сбросить + Reopen dialog when application finishes Открыть диалог при завершении приложения @@ -13221,19 +13985,6 @@ Do you want to retry? Подключить - - Debugger::Internal::WatchData - - <not in scope> - Value of variable in Debugger Locals display for variables out of scope (stopped above initialization). - <вне области> - - - %1 <shadowed %2> - Display of variables shadowed by variables of the same name in nested scopes: Variable %1 is the variable name, %2 is a simple count. - %1 <затеняет %2> - - Debugger::Internal::WatchHandler @@ -13244,10 +13995,6 @@ Do you want to retry? Internal Type Внутренний тип - - Displayed Type - Отображаемый тип - ... <cut off> ... <обрезано> @@ -13264,6 +14011,10 @@ Do you want to retry? Pointer Address Адрес указателя + + Array Index + Индекс массива + Static Object Size Размер статического объекта @@ -13341,6 +14092,19 @@ Do you want to retry? Имя + + Debugger::Internal::WatchItem + + <not in scope> + Value of variable in Debugger Locals display for variables out of scope (stopped above initialization). + <вне области> + + + %1 <shadowed %2> + Display of variables shadowed by variables of the same name in nested scopes: Variable %1 is the variable name, %2 is a simple count. + %1 <затеняет %2> + + Debugger::Internal::WatchModel @@ -13702,6 +14466,29 @@ Do you want to retry? Переменные и выражения + + Debugger::StartRemoteDialog + + Start Remote Analysis + Запуск удалённой отладки + + + Kit: + Комплект: + + + Executable: + Программа: + + + Arguments: + Параметры: + + + Working directory: + Рабочий каталог: + + DebuggerEngine @@ -13709,17 +14496,6 @@ Do you want to retry? Отладка сложных командных строк под Windows пока не поддерживаеться. - - DebuggerPlugin - - Install &Debug Information - Установить &отладочную информацию - - - Tries to install missing debug information. - Попытка установить отсутствующую отладочную информацию. - - Delegate @@ -13863,13 +14639,6 @@ Rebuilding the project might help. Невозможно добавить определение метода. - - DeviceProcessesDialog - - &Attach to Process - &Подключиться к процессу - - Diff @@ -14173,33 +14942,6 @@ Rebuilding the project might help. Перерегулирование перехода кубической кривой. - - EditorManager - - Go Back - Перейти назад - - - Go Forward - Перейти вперёд - - - Split - Разделить - - - Split Side by Side - Разделить вертикально - - - Open in New Window - Открыть в новом окне - - - Close Document - Закрыть документ - - EditorSettingsPanelFactory @@ -15023,6 +15765,45 @@ will also disable the following plugins: Имя шаблона: + + FlameGraphView + + Details + Подробнее + + + Various Events + Разные события + + + Type + Тип + + + Calls + Вызовы + + + Total Time + Общее время + + + Mean Time + Среднее время + + + In Percent + В процентах + + + Location + Размещение + + + No data available + Нет данных + + FlickableSection @@ -15269,26 +16050,6 @@ will also disable the following plugins: Files Файлы - - Hide files matching: - Скрыть файлы соответствующие: - - - Show files matching: - Показывать совпадения файлов: - - - Apply Filter - Применить фильтр - - - Generating file list... - -%1 - Создание списка файлов... - -%1 - GenericProjectManager::Internal::GenericBuildConfigurationFactory @@ -15808,6 +16569,10 @@ Would you like to terminate it? Git::Internal::BranchDialog + + Include branches and tags that have not been active for %1 days. + Включение веток и тегов неактивных в течение %1 дней. + Checkout Смена ветки @@ -15916,6 +16681,10 @@ Would you like to terminate it? Set current branch to track the selected one. Сделать текущую ветку связанной с выбранной. + + &Include old entries + В&ключая старые элементы + Git::Internal::BranchModel @@ -15934,10 +16703,6 @@ Would you like to terminate it? Git::Internal::ChangeSelectionDialog - - Browse &Directory... - Открыть &каталог... - Browse &History... Открыть &историю... @@ -17118,14 +17883,6 @@ Commit now? Git::Internal::MergeTool - - Error - Ошибка - - - File input for the merge tool requires Git 1.7.8, or later. - Для задания файлов mergetool требуется Git не ниже 1.7.8. - Normal Обычный @@ -17292,7 +18049,7 @@ Remote: %4 Timeout: - Время ожидания: + Таймаут: s @@ -17475,6 +18232,41 @@ You can choose between stashing the changes or discarding them. Ошибка восстановления %1 + + GitGrep + + &Use Git Grep + &Использовать Git Grep + + + Use Git Grep for searching. This includes only files that are managed by Git. + Использовать для поиска Git Grep. Включает только файлы под управлением Git. + + + Tree (optional) + Дерево (опционально) + + + Can be HEAD, tag, local or remote branch, or a commit hash. +Leave empty to search through the file system. + Может быть HEAD, тегом, хешем фиксации, локальной или внешней веткой. +Оставьте пустым для поиска по файловой системе. + + + Git Grep + Git Grep + + + Ref: %1 +%2 + Ссылка: %1 +%2 + + + Git Show %1:%2 + Git Show %1:%2 + + GlslEditor::Internal::GlslEditorPlugin @@ -18250,6 +19042,47 @@ Add, modify, and remove document filters, which determine the documentation set Открыть просмотр изображений + + ImageViewer::Internal::ExportDialog + + File: + Файл: + + + x + Multiplication, as in 32x32 + x + + + Size: + Размер: + + + %1 already exists. +Would you like to overwrite it? + %1 уже существует. +Перезаписать его? + + + + ImageViewer::Internal::ImageView + + Export %1 + Экспорт %1 + + + Exported "%1", %2x%3, %4 bytes + Экспорт «%1», %2х%3, %4 байт + + + Export Image + Экспорт изображения + + + Could not write file "%1". + Не удалось записать файл «%1». + + ImageViewer::Internal::ImageViewer @@ -18261,65 +19094,6 @@ Add, modify, and remove document filters, which determine the documentation set Приостановить анимацию - - ImageViewer::Internal::ImageViewerActionHandler - - Zoom In - Увеличить - - - Ctrl++ - - - - Zoom Out - Уменьшить - - - Ctrl+- - - - - Original Size - Исходный размер - - - Ctrl+0 - - - - Meta+0 - Meta+0 - - - Fit To Screen - На весь экран - - - Ctrl+= - - - - Switch Background - Включить/отключить фон - - - Switch Outline - Включить/отключить обзор - - - Toggle Animation - Воспроизвести/приостановить анимацию - - - Ctrl+[ - - - - Ctrl+] - - - ImageViewer::Internal::ImageViewerFile @@ -18335,6 +19109,69 @@ Add, modify, and remove document filters, which determine the documentation set Не удалось прочитать изображение. + + ImageViewer::Internal::ImageViewerPlugin + + Zoom In + Увеличить + + + Ctrl++ + Ctrl++ + + + Zoom Out + Уменьшить + + + Ctrl+- + Ctrl+- + + + Original Size + Исходный размер + + + Meta+0 + Meta+0 + + + Ctrl+0 + Ctrl+0 + + + Fit To Screen + На весь экран + + + Ctrl+= + Ctrl+= + + + Switch Background + Включить/отключить фон + + + Ctrl+[ + Ctrl+[ + + + Switch Outline + Включить/отключить обзор + + + Ctrl+] + Ctrl+] + + + Toggle Animation + Воспроизвести/приостановить анимацию + + + Export Image + Экспортировать изображение + + ImageViewer::Internal::ImageViewerToolbar @@ -18361,6 +19198,10 @@ Add, modify, and remove document filters, which determine the documentation set Original Size Исходный размер + + Export as Image + Экспортировать как изображение + ImportManagerComboBox @@ -18651,6 +19492,14 @@ Ids must begin with a lowercase letter. %1 is not connected. %1 не подключён. + + Device type: + Тип устройства: + + + Executable: + Программа: + Ios::Internal::IosRunConfigurationWidget @@ -18724,41 +19573,6 @@ Ids must begin with a lowercase letter. - - IosRunConfiguration - - Form - - - - Executable: - Программа: - - - Arguments: - Параметры: - - - iPad - iPad - - - iPhone 3.5-inch Retina Display - iPhone с экраном Ретина 3.5" - - - iPhone 4-inch Retina Display - iPhone с экраном Ретина 4" - - - iPad Retina Display - iPad с экраном Ретина - - - Device type: - Тип устройства: - - IosSettingsWidget @@ -18836,7 +19650,7 @@ Ids must begin with a lowercase letter. Предпочтительный размер - Preferred height of an item in a layout. If the preferred height is -1, it will be ignored. + Preferred size of an item in a layout. If the preferred height or width is -1, it is ignored. Предпочтительный резмер элемента в компоновщике. Если он -1, то игнорируется. @@ -18883,13 +19697,6 @@ Ids must begin with a lowercase letter. Привязки - - LinksBar - - Qt Creator - Qt Creator - - ListViewSpecifics @@ -19180,10 +19987,110 @@ Ids must begin with a lowercase letter. Input Events События ввода + + Debug Messages + Отладочные сообщения + JavaScript JavaScript + + GUI Thread + Поток GUI + + + Render Thread + Поток рендера + + + Render Thread Details + Подробности потока рендера + + + Polish + Полировка + + + Wait + Ожидание + + + GUI Thread Sync + Синхронизация с потоком GUI + + + Render Thread Sync + Синхронизация с потоком рендера + + + Render + Рендер + + + Swap + Переключение + + + Render Preprocess + Рендер - преобработка + + + Render Update + Рендер - обновление + + + Render Bind + Рендер - привязка + + + Render Render + Рендер - рендеринг + + + Material Compile + Компиляция материала + + + Glyph Render + Отрисовка глифов + + + Glyph Upload + Выгрузка глифов + + + Texture Bind + Текстуры - привязка + + + Texture Convert + Текстуры - преобразование + + + Texture Swizzle + не знаю, как выбор/обмен цветовых каналов перевести на русский + Текстуры - смешивание + + + Texture Upload + Текстуры - выгрузка + + + Texture Mipmap + Текстуры - мипмамминг + + + Texture Delete + Текстуры - удаление + + + + MainWindow + + MainWindow + + Mercurial::Internal::AuthenticationDialog @@ -19525,7 +20432,7 @@ Ids must begin with a lowercase letter. Timeout: - Время ожидания: + Таймаут: s @@ -19620,6 +20527,10 @@ Ids must begin with a lowercase letter. C++ source code Файл исходных текстов C++ + + Qt documentation file + Файл документации Qt + Objective-C++ source code Файл исходных текстов Objective-C++ @@ -19791,6 +20702,14 @@ Ids must begin with a lowercase letter. &Delete &Удалить + + Model Editor + Редактор моделей + + + Export Diagram... + Экспорт диаграммы... + Open Parent Diagram Открыть родительскую диаграмму @@ -19799,36 +20718,32 @@ Ids must begin with a lowercase letter. Edit Element Properties Изменить свойства элемента + + Shift+Return + Shift+Return + + + Edit Item on Diagram + Изменить элемент диаграммы + Return Ввод - ModelEditor::Internal::FileWizardFactory + ModelEditor::Internal::ExtPropertiesMView - Model - Модель + Select Custom Configuration Folder + Выбор особого каталога настроек - Creates an empty model - Создаёт пустую модель + Config Path: + Путь к настройкам: - New %1 - Новая %1 - - - Model Name and Location - Имя модели и размещение - - - Model name: - Имя модели: - - - Location: - Размещение: + <font color=red>Model file must be reloaded.</font> + <font color=red>Файл модели должен быть перезагружен.</font> @@ -19837,10 +20752,6 @@ Ids must begin with a lowercase letter. No model loaded. Cannot save. Модель не загружена. Сохранить невозможно. - - model.qmodel - model.qmodel - Cannot reload model file. Не удалось загрузить файл модели. @@ -19872,6 +20783,26 @@ Ids must begin with a lowercase letter. Add Canvas Diagram Добавить диаграмму холста + + Images (*.png *.jpeg *.jpg *.tif *.tiff);;PDF (*.pdf) + Изображения (*.png *.jpeg *.jpg *.tif *.tiff);;PDF (*.pdf) + + + ;;SVG (*.svg) + ;;SVG (*.svg) + + + Export Diagram + Экспорт диаграммы + + + Exporting Diagram Failed + Не удалось экспортировать диаграмму + + + Exporting the diagram into file<br>"%1"<br>failed. + Не удалось экспортировать диаграмму в файл «%1». + Package Пакет @@ -19948,6 +20879,10 @@ Ids must begin with a lowercase letter. Go to Implementation Перейти к реализации + + Invalid item. + Неверный элемент. + Cannot find an implementation. Не удалось найти реализацию. @@ -20638,7 +21573,7 @@ Ids must begin with a lowercase letter. Timeout: - Время ожидания: + Таймаут: s @@ -20744,6 +21679,10 @@ Ids must begin with a lowercase letter. The plugin "%1" does not exist. Модуль «%1» не существует. + + The plugin "%1" is not tested. + Модуль «%1» не тестировался. + Unknown option %1 Неизвестный параметр: %1 @@ -21082,6 +22021,13 @@ Ids must begin with a lowercase letter. + + ProjectExplorer::ClangToolChainFactory + + Clang + Clang + + ProjectExplorer::CustomWizard @@ -21124,6 +22070,46 @@ Ids must begin with a lowercase letter. Qt Creator Plugin Модуль Qt Creator + + Creates a new project including auto test skeleton. + Создание нового проекта с заготовкой под автотест. + + + Auto Test + Автотест + + + Project and Test Information + Информация о проекте и тестах + + + GUI Application + Приложение с GUI + + + Test Case Name: + Имя теста: + + + Requires QApplication + Требуется QApplication + + + Generate initialization and cleanup code + Создать код инициализации и очистки + + + Build auto tests + Собирать автотесты + + + always + всегда + + + debug only + только при отладке + Creates a qmake-based test project for which a code snippet can be entered. Создание тестового проекта на базе qmake с возможностью вставки фрагмента кода. @@ -21845,6 +22831,13 @@ Ids must begin with a lowercase letter. Этапы очистки + + ProjectExplorer::Internal::ClangClToolChainConfigWidget + + LLVM: + LLVM: + + ProjectExplorer::Internal::ClangToolChainFactory @@ -21923,10 +22916,6 @@ Ids must begin with a lowercase letter. &Error message capture pattern: Шаблон захвата сообщений об &ошибках: - - #error (.*):(\d+): (.*)$ - - Capture Positions Положения захвата @@ -21951,10 +22940,6 @@ Ids must begin with a lowercase letter. E&rror message: &Сообщение об ошибке: - - #error /home/user/src/test.c:891: Unknown identifier `test` - - File name: Имя файла: @@ -21980,8 +22965,40 @@ Ids must begin with a lowercase letter. Шаблон пуст. - Pattern does not match the error message. - Шаблон не соответствует сообщению об ошибке. + No message given. + Сообщение не передано. + + + Pattern does not match the message. + Шаблон не соответствует сообщению. + + + Error + Ошибка + + + Capture Output Channels + Захват выходных каналов + + + Standard output + Стандартный ввод + + + Standard error + Вывод ошибок + + + Warning + Предупреждение + + + Warning message capture pattern: + Шаблон захвата предупреждений: + + + Warning message: + Предупреждающее сообщение: @@ -22271,10 +23288,6 @@ Ids must begin with a lowercase letter. Open Project in "%1" Открыть проект в «%1» - - Open With - Открыть с помощью - Choose Folder... Выбрать каталог... @@ -22454,6 +23467,29 @@ Ids must begin with a lowercase letter. + + ProjectExplorer::Internal::LocalApplicationRunControl + + No executable specified. + Программа не указана. + + + Executable %1 does not exist. + Программа %1 отсутствует. + + + Starting %1... + Запускается %1... + + + %1 crashed + %1 завершился крахом + + + %1 exited with code %2 + %1 завершился с кодом %2 + + ProjectExplorer::Internal::MingwToolChainFactory @@ -22545,7 +23581,7 @@ Ids must begin with a lowercase letter. - ProjectExplorer::Internal::MsvcToolChainConfigWidget + ProjectExplorer::Internal::MsvcBasedToolChainConfigWidget Initialization: Инициализация: @@ -23060,34 +24096,6 @@ to project "%2". No kit defined in this project. Для данного проекта не задан комплект. - - Incompatible Kit - Комплект не подходит - - - Kit %1 is incompatible with kit %2. - Комплекты %1 и %2 несовместимы. - - - Build configurations: - Конфигурации сборки: - - - Deploy configurations: - Конфигурации установки: - - - Run configurations - Конфигурации запуска - - - Partially Incompatible Kit - Комплект частично несовместим - - - Some configurations could not be copied. - Некоторые конфигураций не удалось скопировать. - Cancel Build && Remove Kit Отменить сборку и удалить комплект @@ -23229,12 +24237,12 @@ to project "%2". Компилятор, используемый для сборки.<br>Убедитесь, что компилятор создаёт код, совместимый с целевым устройством, профилем Qt и другими используемыми библиотеками. - Compiler: - Компилятор: + <No compiler> + <Нет компилятора> - <No compiler available> - <Компилятор недоступен> + Compiler: + Компилятор: @@ -23634,6 +24642,10 @@ to project "%2". "data" must be empty or a JSON object for "Project" pages. Объект «data» должен быть пустым или иметь тип JSON для страниц «Проект». + + Invalid regular expression "%1" in "%2". %3 + Неверное регулярное выражение «%1» в «%2». %3 + "data" for a "Summary" page can be unset or needs to be an object. «data» для страницы «Общее» может быть не задан или должен быть объектом. @@ -23884,6 +24896,30 @@ to project "%2". JS File Файл JS + + Model name: + Имя модели: + + + Location: + Размещение: + + + Model Name and Location + Имя модели и размещение + + + Creates a new empty model with an empty diagram. + Создание новой пустой модели с пустой диаграммой. + + + Modeling + Моделирование + + + Model + Модель + Creates an empty Python script file using UTF-8 charset. Создание пустого файла сценария Python с использованием кодировки UTF-8. @@ -24044,6 +25080,14 @@ Preselects a desktop Qt for building the application if available. Qt Canvas 3D Application Приложение Qt Canvas 3D + + Creates a deployable Qt Quick 2 application using Qt Labs Controls. + Создание устанавливаемого приложения Qt Quick 2 с использованием Qt Labs Controls. + + + Qt Labs Controls Application + Приложение Qt Labs Controls + Qt 5.6 Qt 5.6 @@ -24124,6 +25168,14 @@ Preselects a desktop Qt for building the application if available. Directory: Каталог: + + Creates a vertex shader in the Desktop OpenGL Shading Language (GLSL). Vertex shaders transform the positions, normals and texture coordinates of triangles, points and lines rendered with OpenGL. + Создание вершинного шейдера на языке Desktop OpenGL Shading Language (GLSL). Вершинные шейдеры изменяют положение, нормали и текстурные координаты теугольников, точек и линий, отрисовываемых с помощью OpenGL. + + + Creates a vertex shader in the OpenGL/ES 2.0 Shading Language (GLSL/ES). Vertex shaders transform the positions, normals and texture coordinates of triangles, points and lines rendered with OpenGL. + Создание вершинного шейдера на языке OpenGL/ES 2.0 Shading Language (GLSL/ES). Вершинные шейдеры изменяют положение, нормали и текстурные координаты теугольников, точек и линий, отрисовываемых с помощью OpenGL. + "%{JS: Util.toNativeSeparators('%{TargetPath}')}" exists in the filesystem. «%{JS: Util.toNativeSeparators('%{TargetPath}')}» уже существует. @@ -24308,10 +25360,6 @@ Preselects a desktop Qt for building the application if available. Fragment Shader (Desktop OpenGL) Фрагментный шейдер (Desktop OpenGL) - - Creates a vertex shader in the Desktop OpenGL Shading Language (GLSL). Vertex shaders transform the positions, normals and texture co-ordinates of triangles, points and lines rendered with OpenGL. - Создание вершинного шейдера на языке Desktop OpenGL Shading Language (GLSL). Вершинные шейдеры изменяют положение, нормали и текстурные координаты теугольников, точек и линий, отрисовываемых с помощью OpenGL. - Vertex Shader (Desktop OpenGL) Вершинный шейдер (Desktop OpenGL) @@ -24324,10 +25372,6 @@ Preselects a desktop Qt for building the application if available. Fragment Shader (OpenGL/ES 2.0) Фрагментный шейдер (OpenGL/ES 2.0) - - Creates a vertex shader in the OpenGL/ES 2.0 Shading Language (GLSL/ES). Vertex shaders transform the positions, normals and texture co-ordinates of triangles, points and lines rendered with OpenGL. - Создание вершинного шейдера на языке OpenGL/ES 2.0 Shading Language (GLSL/ES). Вершинные шейдеры изменяют положение, нормали и текстурные координаты теугольников, точек и линий, отрисовываемых с помощью OpenGL. - Vertex Shader (OpenGL/ES 2.0) Вершинный шейдер (OpenGL/ES 2.0) @@ -24415,6 +25459,10 @@ Preselects a desktop Qt for building the application if available. "kind" value "%1" is not "class" (deprecated), "file" or "project". «kind» имеет значение «%1», не являющееся «class» (устарело), «file» или «project». + + "kind" is "file" or "class" (deprecated) and "%1" is also set. + «kind» это «file» или «class» (устарело) и «%1» установлен. + Icon file "%1" not found. Файл значка «%1» не найден. @@ -24471,18 +25519,6 @@ Preselects a desktop Qt for building the application if available. When parsing "pages": %1 При обработке «pages»: %1 - - List element of "options" is not an object. - Списочный элемент записей типа «options» не является объектом. - - - No "key" given for entry in "options". - Не задан «key» для элемента в «options». - - - When parsing "options": Key "%1" set more than once. - При обработке «options»: Ключ «%1» задан более одного раза. - ProjectExplorer::JsonWizardGenerator @@ -24585,29 +25621,6 @@ Preselects a desktop Qt for building the application if available. Сделать по умолчанию - - ProjectExplorer::LocalApplicationRunControl - - No executable specified. - Программа не указана. - - - Executable %1 does not exist. - Программа %1 отсутствует. - - - Starting %1... - Запускается %1... - - - %1 crashed - %1 завершился крахом - - - %1 exited with code %2 - %1 завершился с кодом %2 - - ProjectExplorer::LocalEnvironmentAspect @@ -24642,6 +25655,34 @@ Please close all running instances of your application before starting a build.< Project Name Имя проекта + + Incompatible Kit + Комплект не подходит + + + Kit %1 is incompatible with kit %2. + Комплекты %1 и %2 несовместимы. + + + Build configurations: + Конфигурации сборки: + + + Deploy configurations: + Конфигурации установки: + + + Run configurations: + Конфигурации запуска: + + + Partially Incompatible Kit + Комплект частично несовместим + + + Some configurations could not be copied. + Некоторые конфигураций не удалось скопировать. + ProjectExplorer::ProjectConfiguration @@ -24696,10 +25737,6 @@ Please close all running instances of your application before starting a build.< Recent P&rojects Недавние п&роекты - - Sessions - Сессии - Close Project Закрыть проект @@ -24792,6 +25829,10 @@ Please close all running instances of your application before starting a build.< Cancel Build Отменить сборку + + S&essions + С&ессии + Add New... Добавить новый... @@ -25255,6 +26296,16 @@ Reason: %2 Add Existing Directory Добавление существующего каталога + + + ProjectExplorer::SelectableFilesDialogEditFiles + + Edit Files + Изменить файлы + + + + ProjectExplorer::SelectableFilesWidget Source directory: Каталог исходников: @@ -25263,21 +26314,14 @@ Reason: %2 Start Parsing Начать обработку - - - ProjectExplorer::SelectableFilesDialogEditFiles - Edit Files - Изменить файлы + Show files matching: + Показывать совпадения файлов: Hide files matching: Скрыть файлы соответствующие: - - Show files matching: - Показывать совпадения файлов: - Apply Filter Применить фильтр @@ -25471,6 +26515,10 @@ These files are preserved. Qt Creator needs a build configuration set up to build. Configure a build configuration in the project settings. Для сборки проекта необходимо в настройках проекта задать конфигурацию сборки. + + You asked to build the current Run Configuration's build target only, but it is not associated with a build target. Update the Make Step in your build settings. + Запрос на сборку только цели текущей конфигурации запуска, но она не связана с целью. Обновите шаги сборки в настройках сборки. + ProjectExplorer::TerminalAspect @@ -25507,6 +26555,10 @@ These files are preserved. None Не задан + + Path to the compiler executable + Путь к компилятору + No compiler set in kit. У комплекта не задан компилятор. @@ -25657,10 +26709,6 @@ These files are preserved. unnamed без имени - - %1 (built-in) - %1 (встроенная) - QDockWidget @@ -25695,64 +26743,122 @@ These files are preserved. <Введите регулярное выражение> - Show Definition - Показать определение + %1 %2 per iteration (total: %3, iterations: %4) + %1 %2 за итерацию (всего: %3, итераций: %4) - Open Diagram - Открыть диаграмму + Test run canceled by user. + Тест прерван пользователем. - Create Diagram - Создать диаграмму + Project is null for "%1". Removing from test run. +Check the test environment. + Нулевой проект для «%1». Исключается из тестирования. +Проверьте среду тестирования. - Remove - Убрать + Could not find command "%1". (%2) + Не удалось найти команду «%1». (%2) - Delete - Удалить + Test case canceled due to timeout. +Maybe raise the timeout? + Текст был отменён по таймауту. +Может его увеличить? - Align Objects - Выровнить объекты + (none) + (нет) - Align Left - По левому краю + <p>Give all test cases a name to ensure correct behavior when running test cases and to be able to select them.</p> + <p>Задайте имена всем тестам, чтобы быть уверенным в корректности поведения при прохождении тестов и для их выбора.</p> - Center Vertically - По центру вертикально + parameterized + параметрический - Align Right - По правому краю + typed + типизированный - Align Top - По верху + Cannot create temporary file "%1": %2. + Невозможно создать временный файл «%1»: %2. - Center Horizontally - По центру горизонтально + Cannot call %1 or some other error occurred. Time out reached while formatting file %2. + Не удалось вызвать %1 или возникла другая ошибка. Истекло время форматирования файла %2. - Align Bottom - По низу + Cannot read file "%1": %2. + Невозможно прочитать файл «%1»: %2. - Same Width - По ширине + Cannot call %1 or some other error occurred. + Не удалось вызвать %1 или возникла другая ошибка. - Same Height - По высоте + Inspect available fixits + Проверить доступные запросы на исправление (fixit) - Same Size - По размеру + File "%1" does not exist or is not readable. + Файл «%1» не существует или не читается. + + + Could not read file "%1": UnexpectedElementError. + Не удалось прочитать файл «%1»: UnexpectedElementError. + + + Could not read file "%1": CustomError. + Не удалось прочитать файл «%1»: CustomError. + + + Could not read file "%1": NotWellFormedError. + Не удалось прочитать файл «%1»: NotWellFormedError. + + + Could not read file "%1": PrematureEndOfDocumentError. + Не удалось прочитать файл «%1»: PrematureEndOfDocumentError. + + + File is not a plist version 1.0 file. + Файл не является plist версии 1.0. + + + Expected a string element. + Ожидается строковый элемент. + + + Expected an array element. + Ожидается элемент типа массив. + + + Expected an integer element. + Ожидается целочисленный элемент. + + + An error occurred with the clang static analyzer process. + Возникла ошибка при статическом анализе Clang. + + + Clang static analyzer crashed. + Статический анализ Clang завершился крахом. + + + Clang static analyzer finished with exit code: %1. + Статический анализ Clang завершился с кодом %1. + + + Command line: "%1" +Process Error: %2 +Output: +%3 + Командная строка: «%1» +Ошибка: %2 +Вывод: +%3 @@ -25925,7 +27031,7 @@ These files are preserved. Timeout waiting for reply from server. - Вышло время ожидания ответа от сервера. + Истекло время ожидания ответа от сервера. No private key file given. @@ -26104,6 +27210,10 @@ These files are preserved. Profiles Профили + + Version Info + Информация о версии + QbsProjectManager::Internal::CustomQbsPropertiesDialog @@ -26184,10 +27294,6 @@ These files are preserved. QbsProjectManager::Internal::QbsBuildStepConfigWidget - - Dry run - Только проверка - Debug Отладка @@ -26244,10 +27350,6 @@ These files are preserved. Properties to pass to the project. Свойства, передаваемые проекту. - - No commands will be executed and no permanent changes to the build graph will be done. - Не будут выполняться команды и вноситься постоянные изменения в граф сборки. - Keep going when errors occur (if at all possible). Продолжать сборку при ошибках (если возможно). @@ -26285,10 +27387,6 @@ These files are preserved. QbsProjectManager::Internal::QbsCleanStepConfigWidget - - Clean all artifacts - Очистить всё - Dry run Тестовое выполнение @@ -26317,6 +27415,17 @@ These files are preserved. Очистка Qbs + + QbsProjectManager::Internal::QbsInfoWidget + + Form + + + + Qbs version: + Версия Qbs: + + QbsProjectManager::Internal::QbsInstallStep @@ -26407,6 +27516,10 @@ These files are preserved. &Edit... &Изменить... + + Store profiles in Qt Creator settings directory + Хранить профили в каталоге настроек Qt Creator + QbsProjectManager::Internal::QbsProject @@ -26976,26 +28089,6 @@ The files in the Android package source directory are copied to the build direct Executable: Программа: - - Arguments: - Параметры: - - - Select Working Directory - Выбор рабочего каталога - - - Reset to Default - По умолчанию - - - Working directory: - Рабочий каталог: - - - Run in terminal - Запускать в терминале - Run on QVFb Запускать в QVFb @@ -27847,6 +28940,10 @@ Neither the path to the library nor the path to its includes is added to the .pr Forms Формы + + StateCharts + Диаграммы состояний + Resources Ресурсы @@ -27929,22 +29026,6 @@ Neither the path to the library nor the path to its includes is added to the .pr QmlDebug::QmlDebugConnection - - Connecting to debug server at %1:%2 ... - Подключение к серверу отладки %1:%2 ... - - - - QmlDebug::QmlDebugConnectionPrivate - - Error: (%1) %2 - %1=error code, %2=error message - Ошибка: (%1) %2 - - - <device is gone> - <устройство отсутствует> - Network connection dropped Разорвано сетевое подключение @@ -27973,6 +29054,18 @@ Neither the path to the library nor the path to its includes is added to the .pr Socket state changed to ListeningState. This should not happen! Состояние сокета изменилось на ListeningState. Это не должно было произойти! + + Unknown state %1 + Неверное состояние %1 + + + Error: Remote host closed the connection + Ошибка: Удалённый узел закрыл соединение + + + Error: Unknown socket error %1 + Ошибка: Неизвестная ошибка сокета %1 + QmlDebug::QmlOutputParser @@ -28485,8 +29578,8 @@ Neither the path to the library nor the path to its includes is added to the .pr Требуется перезапуск - The QML emulation layer path changes will take effect after a restart of the QML Emulation layer or Qt Creator. - Изменения в путях слоя эмуляции QML требуют перезапуска эмулятора QML или Qt Creator. + The made changes will take effect after a restart of the QML Emulation layer or Qt Creator. + Изменения вступят в силу после перезапуска слоя эмуляции QML или Qt Creator. Canvas @@ -28600,6 +29693,34 @@ Neither the path to the library nor the path to its includes is added to the .pr Path where Qt Creator can find the QML emulation layer executable (qmlpuppet). Путь, по которому Qt Creator сможет найти программу слоя эмуляции QML (qmlpuppet). + + Internationalization + Интернационализация + + + qsTr() + qsTr() + + + qsTrId() + qsTrId() + + + Show property editor warnings + Показывать предупреждения редактора свойств + + + Forward puppet output: + Перенаправление вывода: + + + Show warn exceptions + Предупреждающие исключения + + + Debug puppet: + Отладка эмулятора: + QmlDesigner::InvalidArgumentException @@ -29167,13 +30288,6 @@ This is independent of the visibility property in QML. Сбросить - - QmlDumpBuildTask - - Building QML Helpers - Сборка помощников QML - - QmlEditorWidgets::ContextPaneWidget @@ -30163,70 +31277,6 @@ Qt Creator know about a likely URI. Функции QML - - QmlJSTools::Internal::QmlConsoleEdit - - Cu&t - Выре&зать - - - &Copy - &Копировать - - - &Paste - В&ставить - - - Select &All - Вы&делить всё - - - C&lear - &Очистить - - - - QmlJSTools::Internal::QmlConsoleModel - - Can only evaluate during a QML debug session. - Можно вычислить только во время сессии отладки QML. - - - - QmlJSTools::Internal::QmlConsolePane - - Show debug, log, and info messages. - Показывать сообщения уровней: отладка, журнал и информация. - - - Show warning messages. - Показывать предупреждения. - - - Show error messages. - Показывать сообщения об ошибках. - - - QML/JS Console - Консоль QML/JS - - - - QmlJSTools::Internal::QmlConsoleView - - &Copy - &Копировать - - - &Show in Editor - &Показать в редакторе - - - C&lear - &Очистить - - QmlJSTools::Internal::QmlJSToolsPlugin @@ -30402,10 +31452,6 @@ Do you want to retry? Debug connection closed Отладочное соединение закрыто - - Debug connection error %1 - Ошибка отладочного подключения %1 - Failed to connect! Не удалось подключиться! @@ -30417,36 +31463,106 @@ Do you want to retry? Flush data while profiling: Передавать данные при профилировании: - - Periodically flush pending data to Qt Creator. This reduces the delay when loading the -data and the memory usage in the application. It distorts the profile as the flushing -itself takes time. - Периодически передавать очередные данные Qt Creator. Это уменьшает задержку -загрузки данных и использование памяти приложением, но искажает результат -профилирования, так как передача сама по себе занимает время. - Flush interval (ms): Интервал передачи (мс): - - - QmlProfiler::Internal::QmlProfilerEventRelativesView - <bytecode> - <байтовый код> + Periodically flush pending data to Qt Creator. This reduces the delay when loading the +data and the memory usage in the application. It distorts the profile as the flushing +itself takes time. + Периодически сбрасывать ожидающие данные в Qt Creator. Это уменьшает +задержку при загрузке данных и объём используемой приложением памяти. +Но портит профилирование, так как сброс данных занимает время. - Source code not available - Исходники недоступны + Process data only when process ends: + Обрабатывать данные после завершения: - Part of binding loop. - Часть закольцованных связей. + Only process data when the process being profiled ends, not when the current recording +session ends. This way multiple recording sessions can be aggregated in a single trace, +for example if multiple QML engines start and stop sequentially during a single run of +the program. + Обрабатывать данные только после завершения профилируемого процесса, а не +при окончании сессии записи. Это позволяет объединять несколько сессий записи +в единую трассировку. Применимо при последовательном запуске/остановке +нескольких движков QML в рамках одного запуска программы. - QmlProfiler::Internal::QmlProfilerEventsMainView + QmlProfiler::Internal::QmlProfilerFileReader + + Error while parsing trace data file: %1 + Ошибка разбора файла данных трассировки: %1 + + + + QmlProfiler::Internal::QmlProfilerOptionsPage + + QML Profiler + Профайлер QML + + + Analyzer + Анализатор + + + + QmlProfiler::Internal::QmlProfilerRangeModel + + Duration + Продолжительность + + + Details + Подробнее + + + Location + Размещение + + + + QmlProfiler::Internal::QmlProfilerRunControlFactory + + No executable file to launch. + Нет программы для запуска. + + + + QmlProfiler::Internal::QmlProfilerStateWidget + + Profiling application + Профилируемое приложение + + + No QML events recorded + События QML не записаны + + + Processing data + Обработка данных + + + Waiting for more data + Ожидание данных + + + Clearing old trace + Очистка старой трассировки + + + Application stopped before loading all data + Приложение остановлено до загрузки всех данных + + + Waiting for data + Ожидание данных + + + + QmlProfiler::Internal::QmlProfilerStatisticsMainView <program> <программа> @@ -30455,6 +31571,10 @@ itself takes time. Main Program Основная программа + + Binding loop detected. + Обнаружена закольцованность связей. + <bytecode> <байтовый код> @@ -30477,10 +31597,6 @@ references to elements in other files, loops, and so on.) Source code not available Исходники недоступны - - Binding loop detected. - Обнаружена закольцованность связей. - Paint Отрисовка @@ -30507,7 +31623,26 @@ references to elements in other files, loops, and so on.) - QmlProfiler::Internal::QmlProfilerEventsWidget + QmlProfiler::Internal::QmlProfilerStatisticsRelativesView + + <bytecode> + <байтовый код> + + + Source code not available + Исходники недоступны + + + Part of binding loop. + Часть закольцованных связей. + + + + QmlProfiler::Internal::QmlProfilerStatisticsView + + Statistics + Статистика + Copy Row Скопировать строку @@ -30520,82 +31655,11 @@ references to elements in other files, loops, and so on.) Extended Event Statistics Расширенная статистика событий - - Limit to Current Range - Ограничить текущим диапазоном - Show Full Range Показать весь диапазон - - QmlProfiler::Internal::QmlProfilerFileReader - - Error while parsing trace data file: %1 - Ошибка разбора файла данных трассировки: %1 - - - - QmlProfiler::Internal::QmlProfilerOptionsPage - - QML Profiler - Профайлер QML - - - Analyzer - Анализатор - - - - QmlProfiler::Internal::QmlProfilerPlugin - - QML Profiler - Профайлер QML - - - QML Profiler (External) - Профайлер QML (внешний) - - - - QmlProfiler::Internal::QmlProfilerRangeModel - - Duration - Продолжительность - - - Details - Подробнее - - - Location - Размещение - - - - QmlProfiler::Internal::QmlProfilerStateWidget - - Loading data - Загрузка данных - - - Profiling application - Профилируемое приложение - - - No QML events recorded - События QML не записаны - - - Application stopped before loading all data - Приложение остановлено до загрузки всех данных - - - Waiting for data - Ожидание данных - - QmlProfiler::Internal::QmlProfilerTool @@ -30618,6 +31682,18 @@ references to elements in other files, loops, and so on.) Save QML Trace Сохранить трассировку QML + + QML Profiler (External) + Профайлер QML (внешний) + + + A Qml Profiler analysis is still in progress. + Выполняется профилирование QML. + + + Start Qml Profiler analysis. + Начать профилирование QML. + %1 s %1 сек @@ -30670,12 +31746,12 @@ Do you want to save the data first? QmlProfiler::Internal::QmlProfilerTraceView - Limit Events Pane to Current Range - Ограничить панель событий текущим диапазоном + Analyze Current Range + Анализировать текущий диапазон - Show Full Range in Events Pane - Показать весь диапазон в панели событий + Analyze Full Range + Анализировать весь диапазон Reset Zoom @@ -30684,20 +31760,13 @@ Do you want to save the data first? QmlProfiler::Internal::QmlProfilerViewManager - - Events - События - Timeline Временная шкала - - - QmlProfiler::LocalQmlProfilerRunner - No executable file to launch. - Нет программы для запуска. + QML Profiler + Профайлер QML @@ -30764,6 +31833,274 @@ Do you want to save the data first? %1 + + QmlProfilerExtension::Internal::DebugMessagesModel + + Unknown Message %1 + Неизвестное сообщение %1 + + + Timestamp + Время + + + Message + Сообщение + + + Location + Размещение + + + + QmlProfilerExtension::Internal::FlameGraphModel + + Paint + Отрисовка + + + Compile + Компиляция + + + Create + Создание + + + Binding + Привязка + + + Signal + Сигналы + + + JavaScript + JavaScript + + + Source code not available + Исходники недоступны + + + + QmlProfilerExtension::Internal::FlameGraphView + + Show Full Range + Показать весь диапазон + + + + QmlProfilerExtension::Internal::InputEventsModel + + Mouse Events + События мыши + + + Keyboard Events + События клавиатуры + + + Timestamp + Время + + + Key Press + Нажатие клавиши + + + Key Release + Отжатие клавиши + + + Key + Клавиша + + + Modifiers + Модификатор + + + Double Click + Двойной клик + + + Mouse Press + Нажатие мыши + + + Mouse Release + Отпускание мыши + + + Button + Кнопка + + + Result + Результат + + + Mouse Move + Движение мыши + + + X + X + + + Y + Y + + + Mouse Wheel + Колесо мыши + + + Angle X + Угол X + + + Angle Y + Угол Y + + + Keyboard Event + Событие клавиатуры + + + Mouse Event + Событие мыши + + + + QmlProfilerExtension::Internal::MemoryUsageModel + + Memory Allocation + Выделение памяти + + + Memory Usage + Использование памяти + + + Memory Allocated + Памяти выделено + + + Memory Freed + Памяти освобождено + + + Total + Всего + + + Allocated + Выделено + + + Allocations + Выделений + + + Deallocated + Освобождено + + + Deallocations + Освобождений + + + Type + Тип + + + Location + Размещение + + + Heap Allocation + Выделение в куче + + + Large Item Allocation + Выделение под большие объекты + + + Heap Usage + Использование кучи + + + Unknown + Неизвестно + + + + QmlProfilerExtension::Internal::PixmapCacheModel + + Image Cached + Изображение закэшировано + + + Image Loaded + Изображение загружено + + + Result + Результат + + + Load Error + Ошибка загрузки + + + Duration + Продолжительность + + + Cache Size + Размер кэша + + + File + Файл + + + Width + Ширина + + + Height + Высота + + + + QmlProfilerExtension::Internal::QmlProfilerExtensionPlugin + + Action triggered + Действие сработало + + + This is an action from QmlProfilerExtension. + Это действие из QmlProfilerExtension. + + + + QmlProfilerExtension::Internal::SceneGraphTimelineModel + + Stage + Этап + + + Duration + Продолжительность + + + Glyphs + Глифы + + QmlProfilerRunConfiguration @@ -31107,10 +32444,6 @@ Are you sure you want to continue? Qt Version is meant for QNX QNX %1 - - QNX - QNX - No SDK path was set up. Путь к SDK не задан. @@ -31413,34 +32746,6 @@ For more details, see /etc/sysctl.d/10-ptrace.conf Qt Class Generation Создание класса Qt - - Desktop - Desktop - - - Embedded Linux - Встраиваемый Linux - - - Windows CE - Windows CE - - - Windows Runtime - WinRT - - - Windows Phone - Windows Phone - - - Android - Android - - - iOS - iOS - QtSupport::CustomExecutableRunConfiguration @@ -31522,37 +32827,6 @@ cannot be found in the path. Рабочий каталог: - - QtSupport::Internal::DebuggingHelper - - Used to extract QML type information from library-based plugins. - Используется для извлечения информации о типах QML из модулей. - - - QML Dump: - Дампер QML: - - - Build - Собрать - - - Show compiler output of last build. - Показывать вывод компилятора последней сборки. - - - Show Log - Показать журнал - - - Build All - Собрать всё - - - Compiler: - Компилятор: - - QtSupport::Internal::ExamplesWelcomePage @@ -31673,27 +32947,6 @@ cannot be found in the path. Qmake Not Executable Qmake не запускается - - Helpers: None available - Помощники отсутствуют - - - Helpers: %1. - %1 is list of tool names. - Помощники: %1. - - - <i>Not yet built.</i> - <i>Ещё не создан.</i> - - - <i>Not needed.</i> - <i>Не нужен.</i> - - - <i>Cannot be compiled.</i> - <i>Собрать невозможно.</i> - Qt version %1 for %2 Qt версии %1 для %2 @@ -31714,10 +32967,6 @@ cannot be found in the path. The following ABIs are currently not supported:<ul><li>%1</li></ul> Следующие ABI пока не поддерживаются:<ul><li>%1</li></ul> - - Building Helpers - Сборка помощников - Debugging Helper Build Log for "%1" Журнал помощника отладчика для «%1» @@ -31864,6 +33113,10 @@ cannot be found in the path. unknown неизвестно + + Path to the qmake executable + Путь к программе qmake + QtSupport::QtVersionFactory @@ -31951,24 +33204,6 @@ cannot be found in the path. No qmlscene installed. qmlscene не установлен. - - Cannot determine the installation path for Qt version "%1". - Невозможно определить путь, куда установлена Qt из профиля «%1». - - - Building helper(s) with toolchain "%1"... - - Сборка помощника(ов) инструментарием «%1»... - - - - Build failed. - Сборка не удалась. - - - Build succeeded. - Сборка успешно завершена. - Qt for WinCE Qt Version is meant for WinCE @@ -31999,33 +33234,6 @@ cannot be found in the path. Доступ - - QuickFixFactory - - Create Getter and Setter Member Functions - Создать методы получения и установки значения - - - Create Getter Member Function - Создать метод получения значения - - - Create Setter Member Function - Создать метод установки значения - - - Convert to Stack Variable - Преобразовать в стековую переменную - - - Convert to Pointer - Преобразовать в указатель - - - Generate Missing Q_PROPERTY Members... - Создание отсутствующих членов Q_PROPERTY... - - RadioButtonSpecifics @@ -32277,7 +33485,7 @@ cannot be found in the path. Timeout: - Время ожидания: + Таймаут: s @@ -33146,6 +34354,13 @@ In addition, device connectivity will be tested. Продолжительность + + SessionActionLabel + + Clone + Копировать + + SessionItem @@ -33190,10 +34405,6 @@ In addition, device connectivity will be tested. Qt Account Учётная запись Qt - - Qt Cloud Services - Облачные сервисы Qt - Online Community Онлайн сообщество @@ -33402,7 +34613,7 @@ with a password, which you can enter below. Timeout: - Время ожидания: + Таймаут: s @@ -33974,8 +35185,12 @@ with a password, which you can enter below. Файлы в системе - Directory "%1": - Каталог «%1»: + Directory + Каталог + + + %1 "%2": + %1 «%2»: Path: %1 @@ -33991,12 +35206,12 @@ Filter: %2 &Каталог: - Fi&le pattern: - Ш&аблон: + Directory to Search + Каталог поиска - Directory to search - Каталог поиска + Fi&le pattern: + Ш&аблон: @@ -34005,6 +35220,10 @@ Filter: %2 Font && Colors Шрифт и цвета + + Color Scheme for Qt Creator Theme "%1" + Цветовая схема темы Qt Creator «%1» + Copy Color Scheme Копировать цветовую схему @@ -34282,6 +35501,14 @@ Specifies how backspace interacts with indentation. Pressing Alt displays context-sensitive help or type information as tooltips. При нажатии на Alt показывать справку о контексте или информацию о типе в виде подсказки. + + Using Select Block Up / Down actions will now provide smarter selections. + При использовании выделения блока вверх/вниз использовать умное выделение. + + + Enable smart selection changing + Использовать умное выделение + TextEditor::Internal::CodeStyleDialog @@ -34547,13 +35774,6 @@ Specifies how backspace interacts with indentation. %1 - - TextEditor::Internal::FontSettings - - Customized - Настроенная - - TextEditor::Internal::FontSettingsPage @@ -35289,6 +36509,10 @@ Influences the indentation of continuation lines. Select Block Down Выделить блок вниз + + Ctrl+Shift+Alt+U + Ctrl+Shift+Alt+U + Go to Line Start Перейти в начало строки @@ -35417,6 +36641,33 @@ Influences the indentation of continuation lines. Размер шрифта в точках в текущем документе. + + TextEditor::QuickFixFactory + + Create Getter and Setter Member Functions + Создать методы получения и установки значения + + + Create Getter Member Function + Создать метод получения значения + + + Create Setter Member Function + Создать метод установки значения + + + Convert to Stack Variable + Преобразовать в стековую переменную + + + Convert to Pointer + Преобразовать в указатель + + + Generate Missing Q_PROPERTY Members... + Создание отсутствующих членов Q_PROPERTY... + + TextEditor::TextDocument @@ -35737,10 +36988,6 @@ Applied to text, if no other rules matching. Applied to removed lines in differences (in diff editor). Применяется к удаляемым строкам при сравнении (в редакторе изменений). - - Zoom: %1% - Масштаб: %1% - Disabled Code Отключённый код @@ -35934,6 +37181,10 @@ Will not be applied to whitespace in comments and strings. Select Encoding Выбрать кодировку + + Zoom: %1% + Масштаб: %1% + Delete UTF-8 BOM on Save Удалить UTF-8 BOM при сохранении @@ -36447,6 +37698,25 @@ Will not be applied to whitespace in comments and strings. Не удалось получить код завершения подчинённого процесса: %1 + + Utils::DebuggerMainWindow + + Views + Обзоры + + + Toolbar + Панель инструментов + + + Start + Запустить + + + Stop + Остановить + + Utils::DetailsButton @@ -36842,10 +38112,6 @@ Will not be applied to whitespace in comments and strings. The path must not be empty. Путь не должен быть пустым. - - The path <b>%1</b> is not a directory. - Путь <b>%1</b> не является каталогом. - The path <b>%1</b> is not a file. Путь <b>%1</b> не является файлом. @@ -36888,6 +38154,14 @@ Will not be applied to whitespace in comments and strings. A file with that name already exists. Файл с таким именем уже существует. + + Name is empty. + Имя задано пустым. + + + Name does not match "%1". + Имя не соответствует «%1». + Invalid character "%1" found. Обнаружен недопустимый символ «%1». @@ -37152,6 +38426,10 @@ Will not be applied to whitespace in comments and strings. The file <i>%1</i> has changed outside Qt Creator. Do you want to reload it? Файл <i>%1</i> был изменён вне Qt Creator. Желаете перезагрузить его? + + &Close + &Закрыть + VCS @@ -37509,30 +38787,38 @@ Will not be applied to whitespace in comments and strings. - Valgrind::Internal::CallgrindToolPrivate + Valgrind::Internal::CallgrindTool - Callers - Вызывающие + Valgrind Function Profile uses the Callgrind tool to record function calls when a program runs. + Профайлер функций Valgrind использует утилиту Callgrind для записи вызовов функций при работе программы. - Functions - Функции + Valgrind Function Profiler + Профайлер функций Valgrind - Callees - Вызывемые + Valgrind Function Profiler (External Application) + Профайлер функций Valgrind (внешняя программа) + + + Profile Costs of This Function and Its Callees + Цены функций и тех, кого они вызывают Visualization Визуализация - Go back one step in history. This will select the previously selected item. - Назад на шаг в истории. Выберет предыдущий выбранный элемент. + Callers + Вызывающие - Reset all event counters. - Сбросить все счётчики событий. + Callees + Вызывемые + + + Functions + Функции Load External Log File @@ -37542,10 +38828,18 @@ Will not be applied to whitespace in comments and strings. Request the dumping of profile information. This will update the Callgrind visualization. Запрос на получение данных профилирования. Приведёт к обновлению визуализации Callgrind. + + Reset all event counters. + Сбросить все счётчики событий. + Pause event logging. No events are counted which will speed up program execution during profiling. Приостановить запись событий. События не будут записываться, что повысит скорость выполнения программы при профилировании. + + Go back one step in history. This will select the previously selected item. + Перейти на шаг назад по истории. Выберет предыдущий выбранный элемент. + Go forward one step in history. Перейти на шаг вперёд по истории. @@ -37602,6 +38896,18 @@ Will not be applied to whitespace in comments and strings. Filter... Фильтр... + + Callgrind + Callgrind + + + A Valgrind Callgrind analysis is still in progress. + Анализ Valgrind Callgrind уже выполняется. + + + Start a Valgrind Callgrind analysis. + Запуск анализа Valgrind Callgrind. + Profiling aborted. Профилирование прервано. @@ -37687,10 +38993,48 @@ Will not be applied to whitespace in comments and strings. Invalid Calls to "free()" Неверный вызов «free()» + + Memcheck + Memcheck + Load External XML Log File Загрузить внешний XML файл журнала + + Valgrind Analyze Memory uses the Memcheck tool to find memory leaks. + Анализатор памяти Valgrind использует утилиту Memcheck для обнаружения утечек памяти. + + + Valgrind Memory Analyzer + Анализатор памяти Valgrind + + + Valgrind Memory Analyzer with GDB + Анализатор памяти Valgrind с GDB + + + Valgrind Analyze Memory with GDB uses the Memcheck tool to find memory leaks. +When a problem is detected, the application is interrupted and can be debugged. + Анализатор памяти Valgrind с GDB использует утилиту Memcheck для поиска утечек памяти. +При обнаружении проблем программа останавливается для отладки. + + + Valgrind Memory Analyzer (External Application) + Анализатор памяти Valgrind (внешняя программа) + + + A Valgrind Memcheck analysis is still in progress. + Анализатор памяти Valgrind уже выполняется. + + + Start a Valgrind Memcheck analysis. + Запуск анализатора памяти Valgrind. + + + Start a Valgrind Memcheck with GDB analysis. + Запуск анализатора памяти Valgrind c GDB. + Memcheck: Failed to open file for reading: %1 Memcheck: Не удалось открыть файл для чтения: %1 @@ -37699,6 +39043,22 @@ Will not be applied to whitespace in comments and strings. Memcheck: Error occurred parsing Valgrind output: %1 Memcheck: Ошибка при разборе вывода Valgrind: %1 + + Memory Analyzer Tool finished, %n issues were found. + + Анализ памяти завершён, найдена %n проблема. + Анализ памяти завершён, найдено %n проблемы. + Анализ памяти завершён, найдено %n проблем. + + + + Log file processed, %n issues were found. + + Файл журнала обработан, найдена %n проблема. + Файл журнала обработан, найдено %n проблемы. + Файл журнала обработан, найдено %n проблем. + + Memory Issues Проблемы памяти @@ -37926,47 +39286,6 @@ With cache simulation, further event counters are enabled: Valgrind - - Valgrind::Internal::ValgrindPlugin - - Valgrind Function Profile uses the Callgrind tool to record function calls when a program runs. - Профайлер функций Valgrind использует утилиту Callgrind для записи вызовов функций при работе программы. - - - Valgrind Analyze Memory uses the Memcheck tool to find memory leaks. - Анализатор памяти Valgrind использует утилиту Memcheck для обнаружения утечек памяти. - - - Valgrind Analyze Memory with GDB uses the Memcheck tool to find memory leaks. -When a problem is detected, the application is interrupted and can be debugged. - Анализатор памяти Valgrind с GDB использует утилиту Memcheck для поиска утечек памяти. -При обнаружении проблем программа останавливается для отладки. - - - Valgrind Memory Analyzer - Анализатор памяти Valgrind - - - Valgrind Memory Analyzer with GDB - Анализатор памяти Valgrind с GDB - - - Valgrind Function Profiler - Профайлер функций Valgrind - - - Valgrind Memory Analyzer (External Remote Application) - Анализатор памяти Valgrind (внешняя программа) - - - Valgrind Function Profiler (External Remote Application) - Профайлер функций Valgrind (внешняя программа) - - - Profile Costs of This Function and Its Callees - Цены функций и тех, кого они вызывают - - Valgrind::Internal::ValgrindRunConfigurationAspect @@ -38269,6 +39588,14 @@ should a repository require SSH-authentication (see documentation on SSH and the Файл списка ников в 4-х столбцовом формате mailmap: «имя <email> алиас <email>». + + Reset information about which version control system handles which directory. + Сбросить информацию о системе контроля версий, управляющей этим каталогом. + + + Reset VCS Cache + Сбросить кэш VCS + VcsBase::Internal::EmailTextCursorHandler @@ -38829,17 +40156,13 @@ should a repository require SSH-authentication (see documentation on SSH and the WinRt::Internal::WinRtRunConfigurationWidget - - Arguments: - Параметры: - Launch App Запуск приложения - Uninstall package after stop - Удалить пакет после завершения + Uninstall package after application stops + Удалить пакет после завершения приложения @@ -38934,6 +40257,13 @@ should a repository require SSH-authentication (see documentation on SSH and the Поиск по примерам... + + qmt::ClassItem + + Show Definition + Показать определение + + qmt::DiagramController @@ -39003,6 +40333,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Add Element Добавление элемента + + Relocate Relation + Переместить отношение + qmt::DocumentController @@ -39023,6 +40357,41 @@ should a repository require SSH-authentication (see documentation on SSH and the Создать диаграмму + + qmt::FileCreationException + + Unable to create file. + Не удалось создать файл. + + + + qmt::FileNotFoundException + + File not found. + Файл не найден. + + + + qmt::FileReadError + + Reading from file failed. + Не удалось прочитать из файла. + + + + qmt::FileWriteError + + Writing to file failed. + Не удалось записать в файл. + + + + qmt::IllegalXmlFile + + Illegal XML file. + Неверный файл XML. + + qmt::ModelController @@ -39085,6 +40454,72 @@ should a repository require SSH-authentication (see documentation on SSH and the Удалить + + qmt::NullPointerException + + Unacceptable null object. + Недопустимый нулевой объект. + + + + qmt::ObjectItem + + Open Diagram + Открыть диаграмму + + + Create Diagram + Создать диаграмму + + + Remove + Убрать + + + Delete + Удалить + + + Align Objects + Выровнять объекты + + + Align Left + По левому краю + + + Center Vertically + По центру вертикально + + + Align Right + По правому краю + + + Align Top + По верху + + + Center Horizontally + По центру горизонтально + + + Align Bottom + По низу + + + Same Width + По ширине + + + Same Height + По высоте + + + Same Size + По размеру + + qmt::ProjectController @@ -39214,10 +40649,6 @@ should a repository require SSH-authentication (see documentation on SSH and the Stereotypes: Стереотипы: - - Reverese engineered: - Реконструировано: - Name: Имя: @@ -39238,6 +40669,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Template: Шаблон: + + Clean Up + Очистить + Members: Члены: @@ -39362,6 +40797,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Box Коробкой + + Reverse engineered: + Реконструировано: + Angle Brackets Угловыми скобками @@ -39410,6 +40849,13 @@ should a repository require SSH-authentication (see documentation on SSH and the [без имени] + + qmt::UnknownFileVersion + + Unable to handle file version %1. + Не удалось обработать файл версии %1. + + text From 26be0a57639f6d5fe088dd32c36671b2f55c020f Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 29 Mar 2016 18:23:33 +0200 Subject: [PATCH 40/72] Update qbs submodule. To HEAD of 1.5 branch. Change-Id: I82829fcfced9aab6787bc16b14dfeb50afe500a5 Reviewed-by: Jake Petroules --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 0741b2c662b..ed37fd99438 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 0741b2c662babaeb19983259c659c52fb78bbfeb +Subproject commit ed37fd99438a2053d18b31ecd2366305bbc3ae03 From 9905eb6f7537e81784758171d61501d0496a33d7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 22 Mar 2016 08:06:35 +0100 Subject: [PATCH 41/72] Dumper: Fix fileName offset for Qt5.5 on 32bit Change-Id: Iffd6d70c7d283b932f8946447b27f3e7ba1f5e98 Reviewed-by: hjk --- share/qtcreator/debugger/qttypes.py | 2 +- tests/auto/debugger/tst_offsets.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index b2b0ffd4eb3..0d8908730a4 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -426,7 +426,7 @@ def qdump__QFile(d, value): if d.isWindowsTarget(): offset = 164 if is32bit else 248 else: - offset = 156 if is32bit else 248 + offset = 164 if is32bit else 248 elif qtVersion >= 0x050400: if d.isWindowsTarget(): offset = 188 if is32bit else 272 diff --git a/tests/auto/debugger/tst_offsets.cpp b/tests/auto/debugger/tst_offsets.cpp index 545a7df5a7d..0886ec60e4f 100644 --- a/tests/auto/debugger/tst_offsets.cpp +++ b/tests/auto/debugger/tst_offsets.cpp @@ -126,7 +126,7 @@ void tst_offsets::offsets_data() data << 164 << 248; # endif #else - data << 156 << 248; + data << 164 << 248; #endif else if (qtVersion >= 0x50400) #ifdef Q_OS_WIN From 4de62a7349a55776d81d21a73a567c731fc5cf9b Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 29 Mar 2016 12:26:25 +0200 Subject: [PATCH 42/72] C++: Fix completion for doxygen tags I There are three cases that must be handled: 1. Completion in C++ style comment 2. Completion in first line of a C style comment 3. Completion in non-first line of a C style comment This change fixes case 1 + 2. Case 3 will be addressed in a follow-up change, same goes for the duplication. Task-number: QTCREATORBUG-15143 Change-Id: I449711f965ddcbbe6158870a8a5ae33218e0d238 Reviewed-by: David Schulz --- .../clangcompletionassistprocessor.cpp | 5 ++- src/plugins/cpptools/cppcompletion_test.cpp | 35 +++++++++++++++++++ src/plugins/cpptools/cppcompletionassist.cpp | 3 +- .../cpptools/cppcompletionassistprocessor.cpp | 6 ++++ .../cpptools/cppcompletionassistprocessor.h | 2 ++ src/plugins/cpptools/cpptoolsplugin.h | 3 ++ 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index a535656c737..9fa20e4fab9 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -322,6 +322,8 @@ int ClangCompletionAssistProcessor::startOfOperator(int positionInDocument, const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); // get the token at the left of the cursor const Token tk = (tokenIdx == -1) ? Token() : tokens.at(tokenIdx); + const QChar characterBeforePositionInDocument + = m_interface->characterAt(positionInDocument - 1); if (*kind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) { *kind = T_EOF_SYMBOL; @@ -329,7 +331,8 @@ int ClangCompletionAssistProcessor::startOfOperator(int positionInDocument, } // Don't complete in comments or strings, but still check for include completion else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) - || tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT) + || ((tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT)) + && !isDoxygenTagCompletionCharacter(characterBeforePositionInDocument)) || (tk.isLiteral() && (*kind != T_STRING_LITERAL && *kind != T_ANGLE_STRING_LITERAL && *kind != T_SLASH))) { diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index ad12c5b621d..e761004e8bc 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "cppcompletionassist.h" +#include "cppdoxygen.h" #include "cppmodelmanager.h" #include "cpptoolsplugin.h" #include "cpptoolstestcase.h" @@ -171,6 +172,17 @@ bool isProbablyGlobalCompletion(const QStringList &list) && list.contains(QLatin1String("bool")); } +bool isDoxygenTagCompletion(const QStringList &list) +{ + for (int i = 1; i < T_DOXY_LAST_TAG; ++i) { + const QString doxygenTag = QString::fromLatin1(doxygenTagSpell(i)); + if (!list.contains(doxygenTag)) + return false; + } + + return true; +} + } // anonymous namespace void CppToolsPlugin::test_completion_basic_1() @@ -384,6 +396,29 @@ void CppToolsPlugin::test_global_completion() QVERIFY(completions.toSet().contains(requiredCompletionItems.toSet())); } +void CppToolsPlugin::test_doxygen_tag_completion_data() +{ + QTest::addColumn("code"); + + QTest::newRow("C++ comment") + << _("/// @"); + + QTest::newRow("C comment single line") + << _("/*! @ */"); +} + +void CppToolsPlugin::test_doxygen_tag_completion() +{ + QFETCH(QByteArray, code); + + const QByteArray prefix = "\\"; + + CompletionTestCase test(code, prefix); + QVERIFY(test.succeededSoFar()); + const QStringList completions = test.getCompletions(); + QVERIFY(isDoxygenTagCompletion(completions)); +} + static void enumTestCase(const QByteArray &tag, const QByteArray &source, const QByteArray &prefix = QByteArray()) { diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index b5b986eed79..98a433015b3 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -991,7 +991,8 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, } // Don't complete in comments or strings, but still check for include completion else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) - || tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT) + || ((tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT)) + && !isDoxygenTagCompletionCharacter(ch)) || (tk.isLiteral() && (*kind != T_STRING_LITERAL && *kind != T_ANGLE_STRING_LITERAL && *kind != T_SLASH diff --git a/src/plugins/cpptools/cppcompletionassistprocessor.cpp b/src/plugins/cpptools/cppcompletionassistprocessor.cpp index bcc7e9507df..abda6e4a50f 100644 --- a/src/plugins/cpptools/cppcompletionassistprocessor.cpp +++ b/src/plugins/cpptools/cppcompletionassistprocessor.cpp @@ -70,4 +70,10 @@ void CppCompletionAssistProcessor::addSnippets() m_completions.append(m_snippetCollector.collect()); } +bool CppCompletionAssistProcessor::isDoxygenTagCompletionCharacter(const QChar &character) +{ + return character == QLatin1Char('\\') + || character == QLatin1Char('@') ; +} + } // namespace CppTools diff --git a/src/plugins/cpptools/cppcompletionassistprocessor.h b/src/plugins/cpptools/cppcompletionassistprocessor.h index 862d77f53f0..70fa2f75ecf 100644 --- a/src/plugins/cpptools/cppcompletionassistprocessor.h +++ b/src/plugins/cpptools/cppcompletionassistprocessor.h @@ -43,6 +43,8 @@ public: protected: void addSnippets(); + static bool isDoxygenTagCompletionCharacter(const QChar &character); + int m_positionForProposal; QList m_completions; QStringList m_preprocessorCompletions; diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index b0f86095d16..46c2a0622f0 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -109,6 +109,9 @@ private slots: void test_global_completion_data(); void test_global_completion(); + void test_doxygen_tag_completion_data(); + void test_doxygen_tag_completion(); + void test_completion_member_access_operator_data(); void test_completion_member_access_operator(); From da5309cbc62db905ed8f5c58401f814baf26d269 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 30 Mar 2016 10:35:17 +0200 Subject: [PATCH 43/72] C++: Fix completion for doxygen tags II For assist processors that run in a worker thread, the QTextDocument is recreated with AssistInterface::prepareForAsyncUse and AssistInterface::recreateTextDocument. Since some assist processors (C++, QmlJS) rely on the user states of the QTextBlocks, these must be recreated, too. In the referenced bug report the lexer state (user state) of the previous QTextBlock was invalid and thus the "Doxygen tag completion" failed. Task-number: QTCREATORBUG-9373 Change-Id: If668e98aa6f9fe9fc107c7476fc831e92a0d7572 Reviewed-by: David Schulz --- src/plugins/cpptools/cppcompletion_test.cpp | 7 +++++++ src/plugins/texteditor/codeassist/assistinterface.cpp | 11 +++++++++++ src/plugins/texteditor/codeassist/assistinterface.h | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index e761004e8bc..27cb35739ea 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -111,6 +111,8 @@ public: ExplicitlyInvoked, m_snapshot, ProjectPartHeaderPaths(), languageFeatures); + ai->prepareForAsyncUse(); + ai->recreateTextDocument(); InternalCppCompletionAssistProcessor processor; const Tests::IAssistProposalScopedPointer proposal(processor.perform(ai)); @@ -405,6 +407,11 @@ void CppToolsPlugin::test_doxygen_tag_completion_data() QTest::newRow("C comment single line") << _("/*! @ */"); + + QTest::newRow("C comment multi line") + << _("/*! text\n" + " * @\n" + " */\n"); } void CppToolsPlugin::test_doxygen_tag_completion() diff --git a/src/plugins/texteditor/codeassist/assistinterface.cpp b/src/plugins/texteditor/codeassist/assistinterface.cpp index 06e65d34d7e..42670678895 100644 --- a/src/plugins/texteditor/codeassist/assistinterface.cpp +++ b/src/plugins/texteditor/codeassist/assistinterface.cpp @@ -93,9 +93,12 @@ using namespace TextEditor; #include +#include #include #include +#include + namespace TextEditor { AssistInterface::AssistInterface(QTextDocument *textDocument, @@ -128,6 +131,9 @@ QString AssistInterface::textAt(int pos, int length) const void AssistInterface::prepareForAsyncUse() { m_text = m_textDocument->toPlainText(); + m_userStates.reserve(m_textDocument->blockCount()); + for (QTextBlock block = m_textDocument->firstBlock(); block.isValid(); block = block.next()) + m_userStates.append(block.userState()); m_textDocument = 0; m_isAsync = true; } @@ -136,6 +142,11 @@ void AssistInterface::recreateTextDocument() { m_textDocument = new QTextDocument(m_text); m_text.clear(); + + QTC_CHECK(m_textDocument->blockCount() == m_userStates.count()); + QTextBlock block = m_textDocument->firstBlock(); + for (int i = 0; i < m_userStates.count() && block.isValid(); ++i, block = block.next()) + block.setUserState(m_userStates[i]); } AssistReason AssistInterface::reason() const diff --git a/src/plugins/texteditor/codeassist/assistinterface.h b/src/plugins/texteditor/codeassist/assistinterface.h index 0431ff73639..77d1548c4b0 100644 --- a/src/plugins/texteditor/codeassist/assistinterface.h +++ b/src/plugins/texteditor/codeassist/assistinterface.h @@ -30,8 +30,8 @@ #include - #include +#include QT_BEGIN_NAMESPACE class QTextDocument; @@ -64,6 +64,7 @@ private: QString m_fileName; AssistReason m_reason; QString m_text; + QVector m_userStates; }; } // namespace TextEditor From 4b3a987c39cb92f01033255b0da51d534eb9d2cd Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 29 Mar 2016 13:53:55 +0200 Subject: [PATCH 44/72] C++: Equalize startOfOperator() There are two versions of startOfOperator: * InternalCppCompletionAssistProcessor::startOfOperator * ClangCompletionAssistProcessor::startOfOperator The latter started as a copy of the former, but the former got some bug fixes in the meantime. Adjust both versions to each other, so it's easy to diff them and to extract the duplication in a follow-up change. Change-Id: Icf48386bf1ad0fa473bec476c5412be9b1890139 Reviewed-by: David Schulz --- .../clangcompletionassistprocessor.cpp | 16 ++++----- src/plugins/cpptools/cppcompletionassist.cpp | 36 +++++++++++-------- src/plugins/cpptools/cppcompletionassist.h | 2 +- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 9fa20e4fab9..3887489d3db 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -335,16 +335,15 @@ int ClangCompletionAssistProcessor::startOfOperator(int positionInDocument, && !isDoxygenTagCompletionCharacter(characterBeforePositionInDocument)) || (tk.isLiteral() && (*kind != T_STRING_LITERAL && *kind != T_ANGLE_STRING_LITERAL - && *kind != T_SLASH))) { + && *kind != T_SLASH + && *kind != T_DOT))) { *kind = T_EOF_SYMBOL; start = positionInDocument; - } // Include completion: can be triggered by slash, but only in a string - else if (*kind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) { + } else if (*kind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) { *kind = T_EOF_SYMBOL; start = positionInDocument; - } - else if (*kind == T_LPAREN) { + } else if (*kind == T_LPAREN) { if (tokenIdx > 0) { const Token &previousToken = tokens.at(tokenIdx - 1); // look at the token at the left of T_LPAREN switch (previousToken.kind()) { @@ -362,14 +361,15 @@ int ClangCompletionAssistProcessor::startOfOperator(int positionInDocument, } } // Check for include preprocessor directive - else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL || *kind == T_SLASH) { + else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL|| *kind == T_SLASH + || (*kind == T_DOT && (tk.is(T_STRING_LITERAL) || tk.is(T_ANGLE_STRING_LITERAL)))) { bool include = false; if (tokens.size() >= 3) { if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) || tokens.at(2).is(T_ANGLE_STRING_LITERAL))) { const Token &directiveToken = tokens.at(1); - QString directive = tc.block().text().mid(directiveToken.bytesBegin(), - directiveToken.bytes()); + QString directive = tc.block().text().mid(directiveToken.utf16charsBegin(), + directiveToken.utf16chars()); if (directive == QLatin1String("include") || directive == QLatin1String("include_next") || directive == QLatin1String("import")) { diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 98a433015b3..a0baaf6aa63 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -941,19 +941,25 @@ IAssistProposal *InternalCppCompletionAssistProcessor::createHintProposal( return proposal; } -int InternalCppCompletionAssistProcessor::startOfOperator(int pos, +int InternalCppCompletionAssistProcessor::startOfOperator(int positionInDocument, unsigned *kind, bool wantFunctionCall) const { - const QChar ch = pos > -1 ? m_interface->characterAt(pos - 1) : QChar(); - const QChar ch2 = pos > 0 ? m_interface->characterAt(pos - 2) : QChar(); - const QChar ch3 = pos > 1 ? m_interface->characterAt(pos - 3) : QChar(); + const QChar ch = positionInDocument > -1 + ? m_interface->characterAt(positionInDocument - 1) + : QChar(); + const QChar ch2 = positionInDocument > 0 + ? m_interface->characterAt(positionInDocument - 2) + : QChar(); + const QChar ch3 = positionInDocument > 1 + ? m_interface->characterAt(positionInDocument - 3) + : QChar(); - int start = pos - CppCompletionAssistProvider::activationSequenceChar(ch, ch2, ch3, kind, + int start = positionInDocument - CppCompletionAssistProvider::activationSequenceChar(ch, ch2, ch3, kind, wantFunctionCall, /*wantQt5SignalSlots*/ true); - if (start != pos) { + if (start != positionInDocument) { QTextCursor tc(m_interface->textDocument()); - tc.setPosition(pos); + tc.setPosition(positionInDocument); // Include completion: make sure the quote character is the first one on the line if (*kind == T_STRING_LITERAL) { @@ -962,7 +968,7 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, QString sel = s.selectedText(); if (sel.indexOf(QLatin1Char('"')) < sel.length() - 1) { *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; } } @@ -970,7 +976,7 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, ExpressionUnderCursor expressionUnderCursor(m_interface->languageFeatures()); if (expressionUnderCursor.startOfFunctionCall(tc) == -1) { *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; } } @@ -984,10 +990,10 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, if (*kind == T_AMPER && tokenIdx > 0) { const Token &previousToken = tokens.at(tokenIdx - 1); if (previousToken.kind() == T_COMMA) - start = pos - (tk.utf16charOffset - previousToken.utf16charOffset) - 1; + start = positionInDocument - (tk.utf16charOffset - previousToken.utf16charOffset) - 1; } else if (*kind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) { *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; } // Don't complete in comments or strings, but still check for include completion else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) @@ -998,11 +1004,11 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, && *kind != T_SLASH && *kind != T_DOT))) { *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; // Include completion: can be triggered by slash, but only in a string } else if (*kind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) { *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; } else if (*kind == T_LPAREN) { if (tokenIdx > 0) { const Token &previousToken = tokens.at(tokenIdx - 1); // look at the token at the left of T_LPAREN @@ -1016,7 +1022,7 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, default: // that's a bad token :) *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; } } } @@ -1040,7 +1046,7 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, if (!include) { *kind = T_EOF_SYMBOL; - start = pos; + start = positionInDocument; } else { if (*kind == T_DOT) { start = findStartOfName(start); diff --git a/src/plugins/cpptools/cppcompletionassist.h b/src/plugins/cpptools/cppcompletionassist.h index 738840cd15f..78727590814 100644 --- a/src/plugins/cpptools/cppcompletionassist.h +++ b/src/plugins/cpptools/cppcompletionassist.h @@ -106,7 +106,7 @@ private: TextEditor::IAssistProposal *createHintProposal(QList symbols) const; bool accepts() const; - int startOfOperator(int pos, unsigned *kind, bool wantFunctionCall) const; + int startOfOperator(int positionInDocument, unsigned *kind, bool wantFunctionCall) const; int findStartOfName(int pos = -1) const; int startCompletionHelper(); bool tryObjCCompletion(); From fdfd5f23519547f9e772b4499cfe5ec626981ffb Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 29 Mar 2016 14:15:42 +0200 Subject: [PATCH 45/72] Debugger: Avoid setParent(0) on QDockWidgets This spells trouble as dock widgets which have a native window will assume they should be positioned relative to the outermost native window then. Change-Id: I5a8ce5870afacaabe26d4a2d7ac53ffee09328ed Task-number: QTCREATORBUG-15844 Reviewed-by: hjk --- src/plugins/debugger/debuggermainwindow.cpp | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 50778240bdf..ea9ed897c2b 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -79,20 +79,20 @@ DebuggerMainWindow::DebuggerMainWindow() DebuggerMainWindow::~DebuggerMainWindow() { - // as we have to setParent(0) on dock widget that are not selected, - // we keep track of all and make sure we don't leak any + // We keep track of widgets for operations that haven't been activated, yet, and make sure we + // don't leak any. foreach (const Perspective &perspective, m_perspectiveForPerspectiveId) { foreach (const Perspective::Operation &operation, perspective.operations()) { if (operation.widget) { // There are two possible states: Either addDockForWidget(widget) has - // been on operation.widget (e.g. when the perspective gets activated) - // for the first time, or not. In the first case we delete only the - // widget, in the second case its parent, which is the dock. - if (QWidget *parent = operation.widget->parentWidget()) { - QTC_CHECK(qobject_cast(parent)); - delete parent; - } else { - // These are from perspectives that never + // been called on an operation.widget (e.g. when the perspective gets + // activated for the first time), or not. In the first case we don't + // have to explicitly delete it as we have called setParent(this) on + // it. In the second case, if the widget didn't have a parent before, + // we have to delete it. + if (!operation.widget->parentWidget()) { + // These are from perspectives that were never activated and didn't + // have a parent to begin with. delete operation.widget; } } @@ -265,10 +265,10 @@ void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId, saveCurrentPerspective(); foreach (QDockWidget *dockWidget, m_dockForDockId) { QTC_ASSERT(dockWidget, continue); + dockWidget->setFloating(false); + dockWidget->setParent(this); removeDockWidget(dockWidget); dockWidget->hide(); - // Prevent saveState storing the data of the wrong children. - dockWidget->setParent(0); } ICore::removeAdditionalContext(Context(Id::fromName(m_currentPerspectiveId))); @@ -361,7 +361,7 @@ QDockWidget *DebuggerMainWindow::registerDockWidget(const QByteArray &dockId, QW { QTC_ASSERT(!widget->objectName().isEmpty(), return 0); QDockWidget *dockWidget = addDockForWidget(widget); - dockWidget->setParent(0); + dockWidget->setParent(this); m_dockForDockId[dockId] = dockWidget; return dockWidget; } From 4df4864b9b7dfe0f0943bb61ec186435b0c2bcec Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 31 Mar 2016 11:26:05 +0200 Subject: [PATCH 46/72] Help: New "Home" icon Change-Id: I5d6e0ee20ecb76cb90106041f78b504a695ad94a Reviewed-by: Alessandro Portale --- src/plugins/help/help.qrc | 1 + src/plugins/help/images/home.png | Bin 1493 -> 146 bytes src/plugins/help/images/home@2x.png | Bin 0 -> 251 bytes src/shared/help/helpicons.h | 4 ++-- src/tools/icons/qtcreatoricons.svg | 27 +++++++++++++++++++++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/plugins/help/images/home@2x.png diff --git a/src/plugins/help/help.qrc b/src/plugins/help/help.qrc index a0b727d945b..5cfbf8966be 100644 --- a/src/plugins/help/help.qrc +++ b/src/plugins/help/help.qrc @@ -3,6 +3,7 @@ images/find.png images/book.png images/home.png + images/home@2x.png images/bookmark.png images/category_help.png images/mode_help.png diff --git a/src/plugins/help/images/home.png b/src/plugins/help/images/home.png index 9cee3025d0722e36b371a0cbdcea447335fa5513..45b92a001e36b58bec61dbc209b7eec5a5cf6944 100644 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)RqM0&b7hDcma{?X4SQNU5- z-Tk*mryw%e*Y~rLQ-Wgoo9FqJGQta(<}dy^y>Ui%YmOJ#WBR=_|$2+IaAXm zkJn!>wtxTJQa|^6=1a{vmyHyJGM*=#jtP@8G3vbOVNmM!yuC}?dum3~vLl|;uDY1a z`r&G>Sa{OpvZ}XOYIKBI)5Ph$I(#<@9IqvsXK3oPdd2(s&o4gr`A(fhYBVp`?#chR z|Ni%X{p-%IZ<+WIW)+Pb=%Qf@QfPCa#Haz5|z^S1RZg=2q<5bp5VHr55~uoLtsruFc;4`>CN|mA9h){|Ehlgfz0(Dl?o;si7 zaL&Q4JU+RqO)kHct@j;D*w?tGW5$7S{a5;T5~XZ7L>S-ys(h^Wgg<=g(?Z=`*8AI! zp4LC^%~s*3b;3mF{p;xS{f$00=Yx9-8f+fiyRztR^iut>?y?f^kf^IY7IoH|_{Ik(TyZcbW~NG4ao`ZG0WGHWi0>0kZml74-c(>6`j z!euA+-C^ZB5ym3+7aB zEVe5@|K{nr^JP^^h4~NU^!9(0+b=XxaO53V~sXZ4Ha(YHRG%n1(Ci<$Ru>fysz%+ycbGTV9Jn9pyK+eIv#)5XpwynH0H z?zvF5#_}8;)~PEFZ44Ig*pim~-Dui2@wXd`|Nr{cwoaSVX(uw?<*-=>b(*GLm*i zA0JKZw0~=T(3Ek`?d~o7IbY)EtuZwZQ=R?e%(wm4+Y%>!742Q;cu6dVwXNY=KPz=t}A?#F0B+Qt6h2Q#~b6{>2=kQdh8hIh^;kMO47|-^tN$pO?BjIn=Q|t zC$=xhC};`)zQ@Tux^Kz*OU3@`)&IZs_Zz*4xO*~1VzKJ8ukLRzmY;v+-0t`B*9X^o z>~;+2q#2@Kzd9j$&i<>Ef0SC{slXjx0c{C0)%Lxg^dVM>m-D>pht~m2(}Zfg6`TGY zW{i{CcOvkCO6hekd0UgUr5Z|)xnfJF2xL3H-lZzl(Qs2rBluwzpM=vA$Ib-l1wCA1KW6@fJL)(D1QPeih?Xf4)W1 z+cbh-v5Gc&IGe5$H|t4E+T;?kdLiSp?=wGXs?SQkrhM(QV2u2#wgVSd2G6ni$F}vA zO!?O}&%ar}KNd9KX+g}xqvC8wR=eK#{CDp@mSXB_8yibYnOo1WeHo|}Q?fK~$Yho}D!{q1{fvpM(nw!=#=^~hOT8{NKryZS`w z-RF((naUYfveuXj1bkMCT=0}_M}BPi_s#G5d8eN5?|u0>Il1cmJlk}3Hnwk!{EVIs z>pq`cTNlmXvSjJ*-POMzJa};Z)6bf^#;s3_cBGx16?bP0l+XkKuXxxO diff --git a/src/plugins/help/images/home@2x.png b/src/plugins/help/images/home@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..72629cb719ce2150e7579fc04af1f8437310ef87 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=L!K^25sRLXh0Ha1uh zdmv=PgziSgZ`vJSZTkgJO08(}59Hxdl1^;0R*{fsx~HsdvHaA52VYncKXUuCv9$_w zusS@BeDz;x_uu<0W^CU$16bviB_u@p7q&l;G-YdRC{JMZa@b#gjOX!rheXv4O~&aG z8;)@>AD(F(VE!P8p + + + + + + Date: Tue, 29 Mar 2016 16:26:39 +0200 Subject: [PATCH 47/72] C++: Extract base startOfOperator() ...in order to remove some duplication. Change-Id: Ie974b6ed9418967ad80b4604088b0e1c293b59d0 Reviewed-by: David Schulz --- .../clangcompletionassistprocessor.cpp | 97 +------------ src/plugins/cpptools/cppcompletionassist.cpp | 134 +++--------------- .../cpptools/cppcompletionassistprocessor.cpp | 121 +++++++++++++++- .../cpptools/cppcompletionassistprocessor.h | 20 ++- 4 files changed, 166 insertions(+), 206 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 3887489d3db..c0e8904d1b4 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -280,7 +280,6 @@ IAssistProposal *ClangCompletionAssistProcessor::startCompletionHelper() return 0; } -// TODO: Extract duplicated logic from InternalCppCompletionAssistProcessor::startOfOperator int ClangCompletionAssistProcessor::startOfOperator(int positionInDocument, unsigned *kind, bool wantFunctionCall) const @@ -291,99 +290,13 @@ int ClangCompletionAssistProcessor::startOfOperator(int positionInDocument, wantFunctionCall); *kind = activationSequenceProcessor.completionKind(); - int start = activationSequenceProcessor.operatorStartPosition(); - if (start != positionInDocument) { - QTextCursor tc(m_interface->textDocument()); - tc.setPosition(positionInDocument); - // Include completion: make sure the quote character is the first one on the line - if (*kind == T_STRING_LITERAL) { - QTextCursor s = tc; - s.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); - QString sel = s.selectedText(); - if (sel.indexOf(QLatin1Char('"')) < sel.length() - 1) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - - if (*kind == T_COMMA) { - ExpressionUnderCursor expressionUnderCursor(m_interface->languageFeatures()); - if (expressionUnderCursor.startOfFunctionCall(tc) == -1) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - - SimpleLexer tokenize; - tokenize.setLanguageFeatures(m_interface->languageFeatures()); - tokenize.setSkipComments(false); - const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); - const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); // get the token at the left of the cursor - const Token tk = (tokenIdx == -1) ? Token() : tokens.at(tokenIdx); - const QChar characterBeforePositionInDocument - = m_interface->characterAt(positionInDocument - 1); - - if (*kind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - // Don't complete in comments or strings, but still check for include completion - else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) - || ((tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT)) - && !isDoxygenTagCompletionCharacter(characterBeforePositionInDocument)) - || (tk.isLiteral() && (*kind != T_STRING_LITERAL - && *kind != T_ANGLE_STRING_LITERAL - && *kind != T_SLASH - && *kind != T_DOT))) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - // Include completion: can be triggered by slash, but only in a string - } else if (*kind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } else if (*kind == T_LPAREN) { - if (tokenIdx > 0) { - const Token &previousToken = tokens.at(tokenIdx - 1); // look at the token at the left of T_LPAREN - switch (previousToken.kind()) { - case T_IDENTIFIER: - case T_GREATER: - case T_SIGNAL: - case T_SLOT: - break; // good - - default: - // that's a bad token :) - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - } - // Check for include preprocessor directive - else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL|| *kind == T_SLASH - || (*kind == T_DOT && (tk.is(T_STRING_LITERAL) || tk.is(T_ANGLE_STRING_LITERAL)))) { - bool include = false; - if (tokens.size() >= 3) { - if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) || - tokens.at(2).is(T_ANGLE_STRING_LITERAL))) { - const Token &directiveToken = tokens.at(1); - QString directive = tc.block().text().mid(directiveToken.utf16charsBegin(), - directiveToken.utf16chars()); - if (directive == QLatin1String("include") || - directive == QLatin1String("include_next") || - directive == QLatin1String("import")) { - include = true; - } - } - } - - if (!include) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - } + CppCompletionAssistProcessor::startOfOperator(m_interface->textDocument(), + positionInDocument, + kind, + start, + m_interface->languageFeatures()); return start; } diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index a0baaf6aa63..c801fd71003 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -945,121 +945,31 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int positionInDocument unsigned *kind, bool wantFunctionCall) const { - const QChar ch = positionInDocument > -1 - ? m_interface->characterAt(positionInDocument - 1) - : QChar(); - const QChar ch2 = positionInDocument > 0 - ? m_interface->characterAt(positionInDocument - 2) - : QChar(); - const QChar ch3 = positionInDocument > 1 - ? m_interface->characterAt(positionInDocument - 3) - : QChar(); + const QChar ch = m_interface->characterAt(positionInDocument - 1); + const QChar ch2 = m_interface->characterAt(positionInDocument - 2); + const QChar ch3 = m_interface->characterAt(positionInDocument - 3); - int start = positionInDocument - CppCompletionAssistProvider::activationSequenceChar(ch, ch2, ch3, kind, - wantFunctionCall, /*wantQt5SignalSlots*/ true); - if (start != positionInDocument) { - QTextCursor tc(m_interface->textDocument()); - tc.setPosition(positionInDocument); + int start = positionInDocument + - CppCompletionAssistProvider::activationSequenceChar(ch, ch2, ch3, kind, + wantFunctionCall, + /*wantQt5SignalSlots*/ true); - // Include completion: make sure the quote character is the first one on the line - if (*kind == T_STRING_LITERAL) { - QTextCursor s = tc; - s.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); - QString sel = s.selectedText(); - if (sel.indexOf(QLatin1Char('"')) < sel.length() - 1) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - - if (*kind == T_COMMA) { - ExpressionUnderCursor expressionUnderCursor(m_interface->languageFeatures()); - if (expressionUnderCursor.startOfFunctionCall(tc) == -1) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - - SimpleLexer tokenize; - tokenize.setLanguageFeatures(m_interface->languageFeatures()); - tokenize.setSkipComments(false); - const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); - const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); // get the token at the left of the cursor - const Token tk = (tokenIdx == -1) ? Token() : tokens.at(tokenIdx); - - if (*kind == T_AMPER && tokenIdx > 0) { - const Token &previousToken = tokens.at(tokenIdx - 1); - if (previousToken.kind() == T_COMMA) - start = positionInDocument - (tk.utf16charOffset - previousToken.utf16charOffset) - 1; - } else if (*kind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - // Don't complete in comments or strings, but still check for include completion - else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) - || ((tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT)) - && !isDoxygenTagCompletionCharacter(ch)) - || (tk.isLiteral() && (*kind != T_STRING_LITERAL - && *kind != T_ANGLE_STRING_LITERAL - && *kind != T_SLASH - && *kind != T_DOT))) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - // Include completion: can be triggered by slash, but only in a string - } else if (*kind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } else if (*kind == T_LPAREN) { - if (tokenIdx > 0) { - const Token &previousToken = tokens.at(tokenIdx - 1); // look at the token at the left of T_LPAREN - switch (previousToken.kind()) { - case T_IDENTIFIER: - case T_GREATER: - case T_SIGNAL: - case T_SLOT: - break; // good - - default: - // that's a bad token :) - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } - } - } - // Check for include preprocessor directive - else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL|| *kind == T_SLASH - || (*kind == T_DOT && (tk.is(T_STRING_LITERAL) || tk.is(T_ANGLE_STRING_LITERAL)))) { - bool include = false; - if (tokens.size() >= 3) { - if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) || - tokens.at(2).is(T_ANGLE_STRING_LITERAL))) { - const Token &directiveToken = tokens.at(1); - QString directive = tc.block().text().mid(directiveToken.utf16charsBegin(), - directiveToken.utf16chars()); - if (directive == QLatin1String("include") || - directive == QLatin1String("include_next") || - directive == QLatin1String("import")) { - include = true; - } - } - } - - if (!include) { - *kind = T_EOF_SYMBOL; - start = positionInDocument; - } else { - if (*kind == T_DOT) { - start = findStartOfName(start); - const QChar ch4 = start > -1 ? m_interface->characterAt(start - 1) : QChar(); - const QChar ch5 = start > 0 ? m_interface->characterAt(start - 2) : QChar(); - const QChar ch6 = start > 1 ? m_interface->characterAt(start - 3) : QChar(); - start = start - CppCompletionAssistProvider::activationSequenceChar( - ch4, ch5, ch6, kind, wantFunctionCall, false); - } - } - } - } + const auto dotAtIncludeCompletionHandler = [this](int &start, unsigned *kind) { + start = findStartOfName(start); + const QChar ch4 = m_interface->characterAt(start - 1); + const QChar ch5 = m_interface->characterAt(start - 2); + const QChar ch6 = m_interface->characterAt(start - 3); + start = start - CppCompletionAssistProvider::activationSequenceChar( + ch4, ch5, ch6, kind, false, false); + }; + CppCompletionAssistProcessor::startOfOperator(m_interface->textDocument(), + positionInDocument, + kind, + start, + m_interface->languageFeatures(), + /*adjustForQt5SignalSlotCompletion=*/ true, + dotAtIncludeCompletionHandler); return start; } diff --git a/src/plugins/cpptools/cppcompletionassistprocessor.cpp b/src/plugins/cpptools/cppcompletionassistprocessor.cpp index abda6e4a50f..5dd52285388 100644 --- a/src/plugins/cpptools/cppcompletionassistprocessor.cpp +++ b/src/plugins/cpptools/cppcompletionassistprocessor.cpp @@ -27,6 +27,17 @@ #include +#include +#include +#include +#include + +#include +#include +#include + +using namespace CPlusPlus; + namespace CppTools { CppCompletionAssistProcessor::CppCompletionAssistProcessor() @@ -70,10 +81,118 @@ void CppCompletionAssistProcessor::addSnippets() m_completions.append(m_snippetCollector.collect()); } -bool CppCompletionAssistProcessor::isDoxygenTagCompletionCharacter(const QChar &character) +static bool isDoxygenTagCompletionCharacter(const QChar &character) { return character == QLatin1Char('\\') || character == QLatin1Char('@') ; } +void CppCompletionAssistProcessor::startOfOperator(QTextDocument *textDocument, + int positionInDocument, + unsigned *kind, + int &start, + const CPlusPlus::LanguageFeatures &languageFeatures, + bool adjustForQt5SignalSlotCompletion, + DotAtIncludeCompletionHandler dotAtIncludeCompletionHandler) +{ + if (start != positionInDocument) { + QTextCursor tc(textDocument); + tc.setPosition(positionInDocument); + + // Include completion: make sure the quote character is the first one on the line + if (*kind == T_STRING_LITERAL) { + QTextCursor s = tc; + s.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); + QString sel = s.selectedText(); + if (sel.indexOf(QLatin1Char('"')) < sel.length() - 1) { + *kind = T_EOF_SYMBOL; + start = positionInDocument; + } + } + + if (*kind == T_COMMA) { + ExpressionUnderCursor expressionUnderCursor(languageFeatures); + if (expressionUnderCursor.startOfFunctionCall(tc) == -1) { + *kind = T_EOF_SYMBOL; + start = positionInDocument; + } + } + + SimpleLexer tokenize; + tokenize.setLanguageFeatures(languageFeatures); + tokenize.setSkipComments(false); + const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); + const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); // get the token at the left of the cursor + const Token tk = (tokenIdx == -1) ? Token() : tokens.at(tokenIdx); + const QChar characterBeforePositionInDocument + = textDocument->characterAt(positionInDocument - 1); + + if (adjustForQt5SignalSlotCompletion && *kind == T_AMPER && tokenIdx > 0) { + const Token &previousToken = tokens.at(tokenIdx - 1); + if (previousToken.kind() == T_COMMA) + start = positionInDocument - (tk.utf16charOffset - previousToken.utf16charOffset) - 1; + } else if (*kind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) { + *kind = T_EOF_SYMBOL; + start = positionInDocument; + // Do not complete in comments, except in doxygen comments for doxygen commands. + // Do not complete in strings, except it is for include completion. + } else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) + || ((tk.is(T_CPP_DOXY_COMMENT) || tk.is(T_DOXY_COMMENT)) + && !isDoxygenTagCompletionCharacter(characterBeforePositionInDocument)) + || (tk.isLiteral() && (*kind != T_STRING_LITERAL + && *kind != T_ANGLE_STRING_LITERAL + && *kind != T_SLASH + && *kind != T_DOT))) { + *kind = T_EOF_SYMBOL; + start = positionInDocument; + // Include completion: can be triggered by slash, but only in a string + } else if (*kind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) { + *kind = T_EOF_SYMBOL; + start = positionInDocument; + } else if (*kind == T_LPAREN) { + if (tokenIdx > 0) { + const Token &previousToken = tokens.at(tokenIdx - 1); // look at the token at the left of T_LPAREN + switch (previousToken.kind()) { + case T_IDENTIFIER: + case T_GREATER: + case T_SIGNAL: + case T_SLOT: + break; // good + + default: + // that's a bad token :) + *kind = T_EOF_SYMBOL; + start = positionInDocument; + } + } + } + // Check for include preprocessor directive + else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL || *kind == T_SLASH + || (*kind == T_DOT + && (tk.is(T_STRING_LITERAL) || tk.is(T_ANGLE_STRING_LITERAL)))) { + bool include = false; + if (tokens.size() >= 3) { + if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) || + tokens.at(2).is(T_ANGLE_STRING_LITERAL))) { + const Token &directiveToken = tokens.at(1); + QString directive = tc.block().text().mid(directiveToken.utf16charsBegin(), + directiveToken.utf16chars()); + if (directive == QLatin1String("include") || + directive == QLatin1String("include_next") || + directive == QLatin1String("import")) { + include = true; + } + } + } + + if (!include) { + *kind = T_EOF_SYMBOL; + start = positionInDocument; + } else if (*kind == T_DOT && dotAtIncludeCompletionHandler){ + dotAtIncludeCompletionHandler(start, kind); + } + } + } +} + } // namespace CppTools diff --git a/src/plugins/cpptools/cppcompletionassistprocessor.h b/src/plugins/cpptools/cppcompletionassistprocessor.h index 70fa2f75ecf..a550d66742f 100644 --- a/src/plugins/cpptools/cppcompletionassistprocessor.h +++ b/src/plugins/cpptools/cppcompletionassistprocessor.h @@ -33,6 +33,16 @@ #include +#include + +QT_BEGIN_NAMESPACE +class QTextDocument; +QT_END_NAMESPACE + +namespace CPlusPlus { +struct LanguageFeatures; +} + namespace CppTools { class CPPTOOLS_EXPORT CppCompletionAssistProcessor : public TextEditor::IAssistProcessor @@ -43,7 +53,15 @@ public: protected: void addSnippets(); - static bool isDoxygenTagCompletionCharacter(const QChar &character); + using DotAtIncludeCompletionHandler = std::function; + static void startOfOperator(QTextDocument *textDocument, + int positionInDocument, + unsigned *kind, + int &start, + const CPlusPlus::LanguageFeatures &languageFeatures, + bool adjustForQt5SignalSlotCompletion = false, + DotAtIncludeCompletionHandler dotAtIncludeCompletionHandler + = DotAtIncludeCompletionHandler()); int m_positionForProposal; QList m_completions; From db2ab9280112468d6595a407c9263848c771c79e Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 29 Mar 2016 13:10:37 +0200 Subject: [PATCH 48/72] Squish: Remove outdated code Creator can't be built with Qt 5.4 anymore. Change-Id: Ic3c014e8384c72c10a48c65117c53daecaa683ab Reviewed-by: Christian Stenger --- tests/system/objects.map | 3 --- tests/system/shared/project.py | 10 ++-------- tests/system/shared/qtcreator.py | 2 -- tests/system/suite_WELP/tst_WELP01/test.py | 5 +---- tests/system/suite_WELP/tst_WELP02/test.py | 5 +---- tests/system/suite_WELP/tst_WELP03/test.py | 5 +---- tests/system/suite_WELP/tst_WELP04/test.py | 5 +---- .../system/suite_general/tst_session_handling/test.py | 5 +---- 8 files changed, 7 insertions(+), 33 deletions(-) diff --git a/tests/system/objects.map b/tests/system/objects.map index fc44e46139c..d052714d652 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -133,8 +133,6 @@ :Qt Creator.Replace All_QToolButton {name='replaceAllButton' text='Replace All' type='QToolButton' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.Replace_QToolButton {name='replaceButton' text='Replace' type='QToolButton' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.Stop_QToolButton {text='Stop' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.WelcomePageStyledBar_QWindowContainer {aboveWidget=':Qt Creator.WelcomePageStyledBar_Utils::StyledBar' type='QWindowContainer' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.WelcomePageStyledBar_Utils::StyledBar {name='WelcomePageStyledBar' type='Utils::StyledBar' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.WelcomePage_QQuickWidget {name='WelcomePage' type='QQuickWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.replaceEdit_Utils::FilterLineEdit {name='replaceEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.scrollArea_QScrollArea {type='ProjectExplorer::PanelsWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} @@ -202,7 +200,6 @@ :Session Manager_ProjectExplorer::Internal::SessionDialog {name='ProjectExplorer__Internal__SessionDialog' type='ProjectExplorer::Internal::SessionDialog' visible='1' windowTitle='Session Manager'} :Startup.contextHelpComboBox_QComboBox {container=':Form.Startup_QGroupBox' name='contextHelpComboBox' type='QComboBox' visible='1'} :User Interface.languageBox_QComboBox {container=':Core__Internal__GeneralSettings.User Interface_QGroupBox' name='languageBox' type='QComboBox' visible='1'} -:WelcomePageStyledBar.WelcomePage_QQuickView {container=':Qt Creator.WelcomePageStyledBar_QWindowContainer' name='WelcomePage' type='QQuickView' visible='true'} :Widget Box_qdesigner_internal::WidgetBoxTreeWidget {container=':*Qt Creator.Widget Box_QDockWidget' type='qdesigner_internal::WidgetBoxTreeWidget' unnamed='1' visible='1'} :Working Copy_Utils::BaseValidatingLineEdit {type='Utils::FancyLineEdit' unnamed='1' visible='1' window=':New Text File_ProjectExplorer::JsonWizard'} :WritePermissions_Core::Internal::ReadOnlyFilesDialog {name='Core__Internal__ReadOnlyFilesDialog' type='Core::ReadOnlyFilesDialog' visible='1' windowTitle='Files Without Write Permissions'} diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index d3515afb71f..6cfda639cab 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -34,10 +34,7 @@ def openQbsProject(projectPath): def openQmakeProject(projectPath, targets=Targets.desktopTargetClasses(), fromWelcome=False): cleanUpUserFiles(projectPath) if fromWelcome: - if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" - else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" + welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" mouseClick(waitForObject("{clip='false' container='%s' enabled='true' text='Open Project' " "type='Button' unnamed='1' visible='true'}" % welcomePage), 5, 5, 0, Qt.LeftButton) @@ -87,10 +84,7 @@ def openCmakeProject(projectPath, buildDir): # this list can be used in __chooseTargets__() def __createProjectOrFileSelectType__(category, template, fromWelcome = False, isProject=True): if fromWelcome: - if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" - else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" + welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" mouseClick(waitForObject("{clip='false' container='%s' enabled='true' text='New Project' " "type='Button' unnamed='1' visible='true'}" % welcomePage), 5, 5, 0, Qt.LeftButton) diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index 797235904f7..116826df391 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -34,8 +34,6 @@ import sys import errno; from datetime import datetime,timedelta; -isQt54Build = os.getenv("SYSTEST_ISQT54BUILD") != "0" - srcPath = '' SettingsPath = '' tmpSettingsDir = '' diff --git a/tests/system/suite_WELP/tst_WELP01/test.py b/tests/system/suite_WELP/tst_WELP01/test.py index 69f99419ea2..2f9a02a9bf6 100755 --- a/tests/system/suite_WELP/tst_WELP01/test.py +++ b/tests/system/suite_WELP/tst_WELP01/test.py @@ -26,10 +26,7 @@ source("../../shared/qtcreator.py") source("../../shared/suites_qtta.py") -if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" -else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" +welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" gettingStartedText = getQmlItem("Button", welcomePage, False, "text='Get Started Now' id='gettingStartedButton'") diff --git a/tests/system/suite_WELP/tst_WELP02/test.py b/tests/system/suite_WELP/tst_WELP02/test.py index 0dcc5aaf780..4b4f2e84624 100644 --- a/tests/system/suite_WELP/tst_WELP02/test.py +++ b/tests/system/suite_WELP/tst_WELP02/test.py @@ -26,10 +26,7 @@ source("../../shared/qtcreator.py") source("../../shared/suites_qtta.py") -if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" -else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" +welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" def checkTypeAndProperties(typePropertiesDetails): for (qType, props, detail) in typePropertiesDetails: diff --git a/tests/system/suite_WELP/tst_WELP03/test.py b/tests/system/suite_WELP/tst_WELP03/test.py index 8baa26b6356..724397cb9a8 100644 --- a/tests/system/suite_WELP/tst_WELP03/test.py +++ b/tests/system/suite_WELP/tst_WELP03/test.py @@ -45,10 +45,7 @@ def main(): test.log("Welcome mode is not scriptable with this Squish version") return global sdkPath - if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" - else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" + welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" # open Qt Creator startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): diff --git a/tests/system/suite_WELP/tst_WELP04/test.py b/tests/system/suite_WELP/tst_WELP04/test.py index 97e0794d2d3..7b185aa70e2 100644 --- a/tests/system/suite_WELP/tst_WELP04/test.py +++ b/tests/system/suite_WELP/tst_WELP04/test.py @@ -30,10 +30,7 @@ def main(): if not canTestEmbeddedQtQuick(): test.log("Welcome mode is not scriptable with this Squish version") return - if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" - else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" + welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" # open Qt Creator startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): diff --git a/tests/system/suite_general/tst_session_handling/test.py b/tests/system/suite_general/tst_session_handling/test.py index 89500e720e7..139cdc64f87 100644 --- a/tests/system/suite_general/tst_session_handling/test.py +++ b/tests/system/suite_general/tst_session_handling/test.py @@ -106,10 +106,7 @@ def createAndSwitchToSession(toSession): "window=%s}" % sessionInputDialog)) def checkWelcomePage(sessionName, isCurrent=False): - if isQt54Build: - welcomePage = ":WelcomePageStyledBar.WelcomePage_QQuickView" - else: - welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" + welcomePage = ":Qt Creator.WelcomePage_QQuickWidget" switchViewTo(ViewConstants.WELCOME) mouseClick(waitForObject("{container='%s' text='Projects' type='Button' " "unnamed='1' visible='true'}" % welcomePage)) From 39e8698290adb8accfdd0402783db8b4fbc08536 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 29 Mar 2016 14:15:53 +0200 Subject: [PATCH 49/72] Squish: Update suite_WELP Change-Id: Iba47a015eb87ad759933dc51bacceaf29d3da57c Reviewed-by: Christian Stenger --- tests/system/suite_WELP/tst_WELP01/test.py | 3 +-- tests/system/suite_WELP/tst_WELP02/test.py | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/tests/system/suite_WELP/tst_WELP01/test.py b/tests/system/suite_WELP/tst_WELP01/test.py index 2f9a02a9bf6..c752c65b1cc 100755 --- a/tests/system/suite_WELP/tst_WELP01/test.py +++ b/tests/system/suite_WELP/tst_WELP01/test.py @@ -80,11 +80,10 @@ def main(): textUrls = {'Online Community':'http://forum.qt.io', 'Blogs':'http://planet.qt.io', 'Qt Account':'https://account.qt.io', - 'Qt Cloud Services':'https://developer.qtcloudservices.com', 'User Guide':'qthelp://org.qt-project.qtcreator/doc/index.html' } for text, url in textUrls.items(): - qmlItem = getQmlItem("LinkedText", welcomePage, False, "text='%s'" % text) + qmlItem = getQmlItem("Text", welcomePage, False, "text='%s'" % text) if test.verify(checkIfObjectExists(qmlItem), "Verifying: Link to %s exists." % text): itemObj = findObject(qmlItem) diff --git a/tests/system/suite_WELP/tst_WELP02/test.py b/tests/system/suite_WELP/tst_WELP02/test.py index 4b4f2e84624..17aacc64978 100644 --- a/tests/system/suite_WELP/tst_WELP02/test.py +++ b/tests/system/suite_WELP/tst_WELP02/test.py @@ -50,7 +50,7 @@ def main(): typePropDet = (("Button", "text='Get Started Now' id='gettingStartedButton'", "Get Started Now button"), ("Text", "text='Sessions' id='sessionsTitle'", "Sessions section"), - ("Text", "text='default' id='text'", "default session listed"), + ("Text", "text='default'", "default session listed"), ("Text", "text='Recent Projects' id='recentProjectsTitle'", "Projects section"), ) checkTypeAndProperties(typePropDet) @@ -63,10 +63,10 @@ def main(): # go to "Welcome page" again and verify updated information switchViewTo(ViewConstants.WELCOME) typePropDet = (("Text", "text='Sessions' id='sessionsTitle'", "Sessions section"), - ("Text", "text='default (current session)' id='text'", + ("Text", "text='default (current session)'", "default session as current listed"), ("Text", "text='Recent Projects' id='recentProjectsTitle'", "Projects section"), - ("LinkedText", "text='SampleApp' id='projectNameText'", + ("Text", "text='SampleApp'", "current project listed in projects section") ) checkTypeAndProperties(typePropDet) @@ -80,10 +80,10 @@ def main(): "Verifying: The project is opened in 'Edit' mode after configuring.") # go to "Welcome page" again and check if there is an information about recent projects switchViewTo(ViewConstants.WELCOME) - test.verify(checkIfObjectExists(getQmlItem("LinkedText", welcomePage, False, - "text='propertyanimation' id='projectNameText'")) and - checkIfObjectExists(getQmlItem("LinkedText", welcomePage, False, - "text='SampleApp' id='projectNameText'")), + test.verify(checkIfObjectExists(getQmlItem("Text", welcomePage, False, + "text='propertyanimation'")) and + checkIfObjectExists(getQmlItem("Text", welcomePage, False, + "text='SampleApp'")), "Verifying: 'Welcome page' displays information about recently created and " "opened projects.") # exit Qt Creator From 93da73ffce09e37b5d424f5b7ec4451c0da8d7d3 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 30 Mar 2016 18:16:43 +0200 Subject: [PATCH 50/72] Squish: Update objects for tst_qml_locals Change-Id: Iddc266417f9e1d5ba1ecdddb46f62f820c921b20 Reviewed-by: Christian Stenger --- tests/system/objects.map | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/system/objects.map b/tests/system/objects.map index d052714d652..d2bd2f983ff 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -55,17 +55,17 @@ :Core__Internal__GeneralSettings.User Interface_QGroupBox {container=':qt_tabwidget_stackedwidget.Core__Internal__GeneralSettings_QWidget' name='interfaceBox' title='User Interface' type='QGroupBox' visible='1'} :CppTools__Internal__CompletionSettingsPage.Behavior_QGroupBox {container=':qt_tabwidget_stackedwidget.CppTools__Internal__CompletionSettingsPage_QWidget' name='groupBox' title='Behavior' type='QGroupBox' visible='1'} :DebugModeWidget.Debugger Log_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.OutputDockWidget' type='QDockWidget' visible='1'} -:DebugModeWidget.Debugger Toolbar_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger Toolbar' type='QDockWidget' visible='1' windowTitle='Debugger Toolbar'} :DebugModeWidget.Debugger.Docks.BreakDockWidget_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.BreakDockWidget' type='QDockWidget' visible='1'} -:DebugModeWidget.Locals and Expressions_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.LocalsAndWatchers' type='QDockWidget' visible='1' windowTitle='Locals and Expressions'} +:DebugModeWidget.Debugger.Docks.LocalsAndWatchersDockWidget_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.LocalsAndWatchersDockWidget' type='QDockWidget' visible='1'} :DebugModeWidget.OK_QPushButton {container=':Qt Creator.DebugModeWidget_QSplitter' text='OK' type='QPushButton' unnamed='1' visible='1'} :DebugModeWidget.Toolbar_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Toolbar' type='QDockWidget' visible='1'} :DebugModeWidget_QComboBox {container=':Qt Creator.DebugModeWidget_QSplitter' occurrence='2' type='QComboBox' unnamed='1' visible='1'} :DebugModeWidget_Debugger::Internal::ConsoleView {container=':Qt Creator.DebugModeWidget_QSplitter' type='Debugger::Internal::ConsoleView' unnamed='1' visible='1'} :Debugger Toolbar.Continue_QToolButton {container=':DebugModeWidget.Toolbar_QDockWidget' text='Continue' type='QToolButton' unnamed='1' visible='1'} -:Debugger Toolbar.Exit Debugger_QToolButton {container=':DebugModeWidget.Debugger Toolbar_QDockWidget' text='Stop Debugger' type='QToolButton' unnamed='1' visible='1'} +:Debugger Toolbar.Exit Debugger_QToolButton {container=':DebugModeWidget.Toolbar_QDockWidget' text='Stop Debugger' type='QToolButton' unnamed='1' visible='1'} :Debugger Toolbar.StatusText_Utils::StatusLabel {container=':DebugModeWidget.Toolbar_QDockWidget' type='Utils::StatusLabel' unnamed='1'} :Debugger.Docks.BreakDockWidget.Debugger.Docks.Break_QFrame {container=':DebugModeWidget.Debugger.Docks.BreakDockWidget_QDockWidget' name='Debugger.Docks.Break' type='QFrame' visible='1'} +:Debugger.Docks.LocalsAndWatchersDockWidget.Inspector_QFrame {container=':DebugModeWidget.Debugger.Docks.LocalsAndWatchersDockWidget_QDockWidget' name='Inspector' type='QFrame' visible='1'} :Description.description_Utils::CompletingTextEdit {container=':splitter.Description_QGroupBox' name='description' type='Utils::CompletingTextEdit' visible='1'} :Dialog.OK_QPushButton {text='OK' type='QPushButton' unnamed='1' visible='1' window=':Dialog_QmlJSEditor::Internal::ComponentNameDialog'} :Dialog.componentNameEdit_QLineEdit {name='componentNameEdit' type='Utils::ClassNameValidatingLineEdit' visible='1' window=':Dialog_QmlJSEditor::Internal::ComponentNameDialog'} @@ -99,7 +99,7 @@ :Hits_QCLuceneResultWidget {aboveWidget=':Hits_QLabel' type='QCLuceneResultWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Hits_QLabel {text~='\\\\d+ - \\\\d+ of \\\\d+ Hits' type='QLabel' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Kits_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' leftWidget=':QtVersionLabel_KitPage' type='QComboBox' unnamed='1' visible='1'} -:Locals and Expressions_Debugger::Internal::WatchTreeView {container=':DebugModeWidget.Locals and Expressions_QDockWidget' name='WatchWindow' type='Debugger::Internal::WatchTreeView' visible='1' windowTitle='Locals and Expressions'} +:Locals and Expressions_Debugger::Internal::WatchTreeView {container=':Debugger.Docks.LocalsAndWatchersDockWidget.Inspector_QFrame' name='WatchWindow' type='Debugger::Internal::WatchTreeView' visible='1'} :Minimal required Qt version:_QLabel {text='Minimal required Qt version:' type='QLabel' unnamed='1' visible='1' window=':New Text File_ProjectExplorer::JsonWizard'} :New Text File.Add to project:_QLabel {name='projectLabel' text='Add to project:' type='QLabel' visible='1' window=':New Text File_ProjectExplorer::JsonWizard'} :New Text File.nameLineEdit_Utils::FileNameValidatingLineEdit {name='nameLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1' window=':New Text File_ProjectExplorer::JsonWizard'} From 180c0a28830c3af8d677b951e60989a98163c0b3 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 30 Mar 2016 13:32:07 +0200 Subject: [PATCH 51/72] Squish: Expect more fails with clang code model Task-number: QTCREATORBUG-15710 Change-Id: I9a074921d6521fa11a281c0e2d296666ca86ef51 Reviewed-by: Christian Stenger --- tests/system/suite_CSUP/tst_CSUP06/test.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/system/suite_CSUP/tst_CSUP06/test.py b/tests/system/suite_CSUP/tst_CSUP06/test.py index 34ab0c98351..d721790e7e7 100644 --- a/tests/system/suite_CSUP/tst_CSUP06/test.py +++ b/tests/system/suite_CSUP/tst_CSUP06/test.py @@ -58,7 +58,7 @@ def performAutoCompletionTest(editor, lineToStartRegEx, linePrefix, testFunc, *f type(editor, bol) currentLine = moveDownToNextNonEmptyLine(editor) -def checkIncludeCompletion(editor): +def checkIncludeCompletion(editor, isClangCodeModel): test.log("Check auto-completion of include statements.") # define special handlings noProposal = ["vec", "detail/hea", "dum"] @@ -76,8 +76,12 @@ def checkIncludeCompletion(editor): missing, noProposal, specialHandling = args inclSnippet = currentLine.split("//#include")[-1].strip().strip('<"') propShown = waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", 2500) - test.compare(not propShown, inclSnippet in missing or inclSnippet in noProposal, - "Proposal widget is (not) shown as expected (%s)" % inclSnippet) + if isClangCodeModel and inclSnippet in noProposal and JIRA.isBugStillOpen(15710): + test.xcompare(propShown, False, ("Proposal widget should not be shown for (%s) " + "but because of QTCREATORBUG-15710 it currently is") % inclSnippet) + else: + test.compare(not propShown, inclSnippet in missing or inclSnippet in noProposal, + "Proposal widget is (not) shown as expected (%s)" % inclSnippet) if propShown: proposalListView = waitForObject(':popupFrame_Proposal_QListView') if inclSnippet in specialHandling: @@ -127,8 +131,12 @@ def checkSymbolCompletion(editor, isClangCodeModel): if isClangCodeModel and JIRA.isBugStillOpen(15639): timeout = 5000 propShown = waitFor("object.exists(':popupFrame_TextEditor::GenericProposalWidget')", timeout) - test.compare(not propShown, symbol in missing, - "Proposal widget is (not) shown as expected (%s)" % symbol) + if isClangCodeModel and symbol in missing and not "(" in symbol and JIRA.isBugStillOpen(15710): + test.xcompare(propShown, False, ("Proposal widget should not be shown for (%s) " + "but because of QTCREATORBUG-15710 it currently is") % symbol) + else: + test.compare(not propShown, symbol in missing, + "Proposal widget is (not) shown as expected (%s)" % symbol) found = [] if propShown: proposalListView = waitForObject(':popupFrame_Proposal_QListView') @@ -173,7 +181,7 @@ def main(): return editor = getEditorForFileSuffix("main.cpp") if editor: - checkIncludeCompletion(editor) + checkIncludeCompletion(editor, useClang) checkSymbolCompletion(editor, useClang) invokeMenuItem('File', 'Revert "main.cpp" to Saved') clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton")) From 0187dc493c781f9e52e25f7759af9039a7e54375 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 31 Mar 2016 12:00:57 +0200 Subject: [PATCH 52/72] Help: New "Bookmark" icon Change-Id: I43af280196912b1b4fd09f2e7823f54b4b37ee45 Reviewed-by: Diana de Sousa Reviewed-by: Alessandro Portale --- src/plugins/help/help.qrc | 1 + src/plugins/help/images/bookmark.png | Bin 1266 -> 134 bytes src/plugins/help/images/bookmark@2x.png | Bin 0 -> 162 bytes src/shared/help/helpicons.h | 4 ++-- src/tools/icons/qtcreatoricons.svg | 15 +++++++++++++++ 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 src/plugins/help/images/bookmark@2x.png diff --git a/src/plugins/help/help.qrc b/src/plugins/help/help.qrc index 5cfbf8966be..0532deb7822 100644 --- a/src/plugins/help/help.qrc +++ b/src/plugins/help/help.qrc @@ -5,6 +5,7 @@ images/home.png images/home@2x.png images/bookmark.png + images/bookmark@2x.png images/category_help.png images/mode_help.png images/mode_help@2x.png diff --git a/src/plugins/help/images/bookmark.png b/src/plugins/help/images/bookmark.png index 57e57e343ba5e5d710fe01b1720d06aacf97863d..4e2a562ac0163645bd1c08dc2870c604b2c566e8 100644 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdnK1d_r6q7#O&@xwW*k5)u;T z&!2zg%9Sr)zWo3HUu%0r3i8w93 jv?)`j?_M0m#mJD-soQ`3o1i-b0|SGntDnm{r-UW|I3OnW literal 1266 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANMUJ3U<-Ln`97POHrbO_e!r zf4=yfZTa(ayI-4?&3-d$c4yu!{RfAPczvWjw=7fA>u{U!FF7S3AmORJW4*`{*ZPdF z=e2sh%qI)Xi8KmSZ`1#BY+2rB-|2bY z|7mOEuCa7SWV?U-8|JP8l@Cf!#iC>TjwiEciG`XyaJ1SUcJI%r4T(RtNLOoks3^{C za5=T|q>9QW)5lxh=x@w@{qxzh$A=I65;g5#Va+DMv_vGuX4)D4LwA)$`rNd=UWTdI z+vt7&AmnB_W^_G!r1ta8ja6XDn3b&Q*db$Fu>Ml10nhTj9*1&s z28oNCGp=pme)v%A&TE?+W?#PSIQ!qu!S#!%SJXU*q=hF7*(4<2EYH909`V0yQMN)A z-^BRMQy!_OPw0ttxU6ug{z&+>izctXF>rNThZu3z_T~qEe8VtVZ_VL%wrv9D=T08k z*1M)oPbwl}Zq&sP>K;#$-XwG1DSJ*X76Trr?UI|y;7^UYuLrsF3o;FJH+O$ zV}`5jrGH`!i7%$C*KyOzET}Qvv{bQUso%LYo*M#LC?QO(Wc^Ad!K7Vd6@8ieG_jK+`@zd%*GOiZ0EHJs- zSTO6}y_NgF3H#Lc)c?!b&{)~8+)|Qs$@fCz4F%z>X&YW?{<(2wa@FF0m(s1Piq#by zuRBySP7tbAdCA9}&^+nZjFZQ_n&1ALw{1g^r}r~EruTej;=D{Y&HTJvZn5=a?%REf zf;2@OwEA|{i6)8(*k3vJef~WEH@B{BEq>p2wp6-|KjgWWgJrxcgIo{;*Yb0R*3CFt z@cFgK+USO`Aip=W--@h>bN%%F{skvt&TH!zwy8ay{yEfn>+dW4TjTCCv8UxQ?Rv+v z>fJiksO>>pd=|DYH`ubev+jq@L^f#d-LuDs(bGZ1g++;TM{|eJsYODZ3=D_1ZL>^u+Wvxp Pfq}u()z4*}Q$iB}&mT0H literal 0 HcmV?d00001 diff --git a/src/shared/help/helpicons.h b/src/shared/help/helpicons.h index 37860f12295..81230c2c787 100644 --- a/src/shared/help/helpicons.h +++ b/src/shared/help/helpicons.h @@ -31,8 +31,8 @@ namespace Help { namespace Icons { -const Utils::Icon BOOKMARK( - QLatin1String(":/help/images/bookmark.png")); +const Utils::Icon BOOKMARK({ + {QLatin1String(":/help/images/bookmark.png"), Utils::Theme::IconsBaseColor}}); const Utils::Icon HOME({ {QLatin1String(":/help/images/home.png"), Utils::Theme::IconsBaseColor}}); const Utils::Icon MODE_HELP_CLASSIC( diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 26a78130c52..099ccc78192 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -3104,6 +3104,21 @@ id="polygon5575-4" transform="translate(336,208)" /> + + + + Date: Tue, 29 Mar 2016 17:36:49 +0200 Subject: [PATCH 53/72] ManhattanStyle: Themable arrows This change makes arrows in e.g. ComboBoxes themable. This also improves the clear distinction between enabled and disabled state. Change-Id: If40dcd3e162ad71d1bc6507c047203aa60e09ee6 Reviewed-by: Alessandro Portale --- src/libs/utils/stylehelper.cpp | 37 ++++++++++------------- src/libs/utils/stylehelper.h | 2 ++ src/plugins/coreplugin/manhattanstyle.cpp | 2 +- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 8de43c24bb3..e5575e103c9 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -290,16 +290,9 @@ void StyleHelper::drawArrow(QStyle::PrimitiveElement element, QPainter *painter, int size = qMin(r.height(), r.width()); QPixmap pixmap; QString pixmapName; - pixmapName.sprintf("arrow-%s-%d-%d-%d-%lld-%f", - "$qt_ia", - uint(option->state), element, - size, option->palette.cacheKey(), - devicePixelRatio); + pixmapName.sprintf("StyleHelper::drawArrow-%d-%d-%d-%f", + element, size, (option->state & QStyle::State_Enabled), devicePixelRatio); if (!QPixmapCache::find(pixmapName, pixmap)) { - const QCommonStyle* const style = qobject_cast(QApplication::style()); - if (!style) - return; - QImage image(size * devicePixelRatio, size * devicePixelRatio, QImage::Format_ARGB32_Premultiplied); image.fill(Qt::transparent); QPainter painter(&image); @@ -307,20 +300,22 @@ void StyleHelper::drawArrow(QStyle::PrimitiveElement element, QPainter *painter, QStyleOption tweakedOption(*option); tweakedOption.state = QStyle::State_Enabled; - if (!(option->state & QStyle::State_Enabled)) { - tweakedOption.palette.setColor(QPalette::ButtonText, option->palette.mid().color()); - tweakedOption.rect = image.rect(); - style->QCommonStyle::drawPrimitive(element, &tweakedOption, &painter); - } else { - tweakedOption.palette.setColor(QPalette::ButtonText, Qt::black); - painter.setOpacity(0.2); - tweakedOption.rect = image.rect().adjusted(0, devicePixelRatio, 0, devicePixelRatio); + auto drawCommonStyleArrow = [&tweakedOption, element, &painter](const QRect &rect, const QColor &color) -> void + { + static const QCommonStyle* const style = qobject_cast(QApplication::style()); + if (!style) + return; + tweakedOption.palette.setColor(QPalette::ButtonText, color.rgb()); + tweakedOption.rect = rect; + painter.setOpacity(color.alphaF()); style->QCommonStyle::drawPrimitive(element, &tweakedOption, &painter); + }; - tweakedOption.palette.setColor(QPalette::ButtonText, QColor(220, 220, 220)); - painter.setOpacity(1); - tweakedOption.rect = image.rect(); - style->QCommonStyle::drawPrimitive(element, &tweakedOption, &painter); + if (!(option->state & QStyle::State_Enabled)) { + drawCommonStyleArrow(image.rect(), creatorTheme()->color(Theme::IconsDisabledColor)); + } else { + drawCommonStyleArrow(image.rect().translated(0, devicePixelRatio), toolBarDropShadowColor()); + drawCommonStyleArrow(image.rect(), creatorTheme()->color(Theme::IconsBaseColor)); } painter.end(); pixmap = QPixmap::fromImage(image); diff --git a/src/libs/utils/stylehelper.h b/src/libs/utils/stylehelper.h index 7e483c43f1d..18dd8d95ba1 100644 --- a/src/libs/utils/stylehelper.h +++ b/src/libs/utils/stylehelper.h @@ -66,6 +66,8 @@ public: static QColor sidebarHighlight() { return QColor(255, 255, 255, 40); } static QColor sidebarShadow() { return QColor(0, 0, 0, 40); } + static QColor toolBarDropShadowColor() { return QColor(0, 0, 0, 70); } + static QColor notTooBrightHighlightColor(); // Sets the base color and makes sure all top level widgets are updated diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index 519fbaefcc2..e25346785db 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -736,7 +736,7 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt if (creatorTheme()->flag(Theme::ComboBoxDrawTextShadow) && (option->state & State_Enabled)) { - painter->setPen(QColor(0, 0, 0, 70)); + painter->setPen(StyleHelper::toolBarDropShadowColor()); painter->drawText(editRect.adjusted(1, 0, -1, 0), Qt::AlignLeft | Qt::AlignVCenter, text); } if (!(option->state & State_Enabled)) From be32cdc6707a82f0353d0fcc2a18e554c26cef08 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 30 Mar 2016 12:19:26 +0200 Subject: [PATCH 54/72] C++: Import roberto's kwgen utility ...as src/tools/cplusplus-keywordgen so it will not get lost. Taken from [1] in its current revision (e7831d6). The utility generates code that classifies identifers/keywords. Most probably the following files from Qt Creator were generated by it or are at least based on its output: src/libs/3rdparty/cplusplus/Keywords.cpp src/libs/3rdparty/cplusplus/ObjectiveCTypeQualifiers.cpp src/libs/glsl/glslkeywords.cpp src/plugins/cpptools/cppdoxygen.cpp We will use the utility to update the known qdoc/doxygen keywords. The clang code model will also profits from this. [1] https://github.com/robertoraggi/cplusplus/blob/master/tools/kwgen.cpp Change-Id: I604f2028d32fd9a48bd6f84bef7264b6d2beed7d Reviewed-by: David Schulz --- .../cplusplus-keywordgen.cpp | 332 ++++++++++++++++++ .../cplusplus-keywordgen.pro | 3 + .../cplusplus-keywordgen.qbs | 7 + src/tools/cplusplustools.qbs | 1 + src/tools/tools.pro | 1 + 5 files changed, 344 insertions(+) create mode 100644 src/tools/cplusplus-keywordgen/cplusplus-keywordgen.cpp create mode 100644 src/tools/cplusplus-keywordgen/cplusplus-keywordgen.pro create mode 100644 src/tools/cplusplus-keywordgen/cplusplus-keywordgen.qbs diff --git a/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.cpp b/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.cpp new file mode 100644 index 00000000000..8219c390e9f --- /dev/null +++ b/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.cpp @@ -0,0 +1,332 @@ +// Copyright (c) 2007 Roberto Raggi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// ### TODO: Rewrite me. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class State; +class DottedItem; + +typedef std::list RuleList; +typedef RuleList::iterator RulePtr; +typedef std::list StateList; +typedef StateList::iterator StatePtr; +typedef std::string::iterator Dot; +typedef std::vector::iterator DottedItemPtr; + +class DottedItem { +public: + RulePtr rule; + Dot dot; + + DottedItem() {} + + DottedItem(RulePtr rule, Dot dot): + rule(rule), dot(dot) {} + + bool operator == (const DottedItem &other) const { + return rule == other.rule && dot == other.dot; + } + + bool operator != (const DottedItem &other) const { + return ! operator == (other); + } + + bool terminal() const { + return dot == rule->end(); + } + + DottedItem next() const { + DottedItem item; + item.rule = rule; + item.dot = dot; + ++item.dot; + return item; + } +}; + +struct State { +public: + State() {} + + template + State(_ForwardIterator first, _ForwardIterator last) { + _items.insert(_items.end(), first, last); + } + + static State &intern(const State &state) { + StatePtr ptr = std::find(first_state(), last_state(), state); + if (ptr == last_state()) + ptr = states().insert(last_state(), state); + return *ptr; + } + + State &next(char ch) { + std::vector n; + for (DottedItemPtr it = first_item(); it != last_item(); ++it) { + if (! it->terminal() && *it->dot == ch) + n.push_back(it->next()); + } + return intern(State(n.begin(), n.end())); + } + + std::set firsts() { + std::set s; + for (DottedItemPtr it = first_item(); it != last_item(); ++it) { + if (! it->terminal()) + s.insert(*it->dot); + } + return s; + } + + size_t item_count() const { return _items.size(); } + + DottedItemPtr first_item() { return _items.begin(); } + DottedItemPtr last_item() { return _items.end(); } + + static StatePtr first_state() { return states().begin(); } + static StatePtr last_state() { return states().end(); } + + bool operator == (const State &other) const { return _items == other._items; } + bool operator != (const State &other) const { return _items != other._items; } + + template + static State &start(_Iterator first, _Iterator last) { + std::vector items; + for (; first != last; ++first) + items.push_back(DottedItem(first, first->begin())); + return intern(State(items.begin(), items.end())); + } + + static void reset() { + states().clear(); + } + +private: + static StateList &states() { + static StateList _states; + return _states; + } + +private: + std::vector _items; +}; + +static bool option_no_enums = false; +static bool option_toupper = false; +static std::string option_namespace_name; +static std::string option_token_prefix = "Token_"; +static std::string option_char_type = "char"; +static std::string option_unicode_function = ""; + +std::string token_id(const std::string &id) +{ + std::string token = option_token_prefix; + + if (! option_toupper) + token += id; + else { + for (size_t i = 0; i < id.size(); ++i) + token += toupper(id[i]); + } + + return token; +} + +bool starts_with(const std::string &line, const std::string &text) { + if (text.length() < line.length()) { + return std::equal(line.begin(), line.begin() + text.size(), text.begin()); + } + return false; +} + +void doit(State &state) +{ + static int depth{0}; + + ++depth; + + std::string indent(depth * 2, ' '); + + std::set firsts = state.firsts(); + for (std::set::iterator it = firsts.begin(); it != firsts.end(); ++it) { + std::string _else = it == firsts.begin() ? "" : "else "; + std::cout << indent << _else << "if (s[" << (depth - 1) << "]" << option_unicode_function << " == '" << *it << "') {" << std::endl; + State &next_state = state.next(*it); + + bool found = false; + for (DottedItemPtr item = next_state.first_item(); item != next_state.last_item(); ++item) { + if (item->terminal()) { + if (found) { + std::cerr << "*** Error. Too many accepting states" << std::endl; + exit(EXIT_FAILURE); + } + found = true; + std::cout << indent << " return " << option_namespace_name << token_id(*item->rule) << ";" << std::endl; + } + } + + if (! found) + doit(next_state); + + std::cout << indent << "}" << std::endl; + } + + --depth; +} + +void gen_classify_n(State &start_state, int N) +{ + std::cout << "static inline int classify" << N << "(const " << option_char_type << " *s) {" << std::endl; + doit(start_state); + std::cout << " return " << option_namespace_name << token_id("identifier") << ";" << std::endl + << "}" << std::endl << std::endl; +} + +void gen_classify(const std::multimap &keywords) +{ + std::cout << "int " << option_namespace_name << "classify(const " << option_char_type << " *s, int n) {" << std::endl + << " switch (n) {" << std::endl; + std::multimap::const_iterator it = keywords.begin(); + while (it != keywords.end()) { + size_t size = it->first; + std::cout << " case " << size << ": return classify" << size << "(s);" << std::endl; + do { ++it; } while (it != keywords.end() && it->first == size); + } + std::cout << " default: return " << option_namespace_name << token_id("identifier") << ";" << std::endl + << " } // switch" << std::endl + << "}" << std::endl << std::endl; +} + +void gen_enums(const std::multimap &keywords) +{ + std::cout << "enum {" << std::endl; + std::multimap::const_iterator it = keywords.begin(); + for (; it != keywords.end(); ++it) { + std::cout << " " << token_id(it->second) << "," << std::endl; + } + std::cout << " " << token_id("identifier") << std::endl + << "};" << std::endl << std::endl; +} + +inline bool not_whitespace_p(char ch) { + return ! std::isspace(ch); +} + +int main(int argc, char *argv[]) { + const std::string ns = "--namespace="; + + for (int i = 0; i < argc; ++i) { + const std::string arg(argv[i]); + if (arg == "--no-enums") + option_no_enums = true; + else if (starts_with(arg, ns)) { + option_namespace_name.assign(arg.begin() + ns.size(), arg.end()); + option_namespace_name += "::"; + } + } + + std::multimap keywords; + std::string textline; + + bool readKeywords = false; + + const std::string opt_no_enums = "%no-enums"; + const std::string opt_toupper = "%toupper"; + const std::string opt_ns = "%namespace="; + const std::string opt_tok_prefix = "%token-prefix="; + const std::string opt_char_type = "%char-type="; + const std::string opt_unicode_function = "%unicode-function="; + + while (getline(std::cin, textline)) { + + // remove trailing spaces + textline.assign(textline.begin(), std::find_if(textline.rbegin(), textline.rend(), not_whitespace_p).base()); + + if (! readKeywords) { + if (textline.size() >= 2 && textline[0] == '%') { + if (textline[1] == '%') { + readKeywords = true; + } else if (textline == opt_no_enums) { + option_no_enums = true; + } else if (textline == opt_toupper) { + option_toupper = true; + } else if (starts_with(textline, opt_tok_prefix)) { + option_token_prefix.assign(textline.begin() + opt_tok_prefix.size(), textline.end()); + } else if (starts_with(textline, opt_char_type)) { + option_char_type.assign(textline.begin() + opt_char_type.size(), textline.end()); + } else if (starts_with(textline, opt_unicode_function)) { + option_unicode_function.assign(textline.begin() + opt_unicode_function.size(), textline.end()); + } else if (starts_with(textline, opt_ns)) { + option_namespace_name.assign(textline.begin() + opt_ns.size(), textline.end()); + option_namespace_name += "::"; + } + + continue; + } + std::cout << textline << std::endl; + } else { + if (textline.empty()) + continue; + + std::string::iterator start = textline.begin(); + while (start != textline.end() && std::isspace(*start)) + ++start; + + std::string::iterator stop = start; + while (stop != textline.end() && (std::isalnum(*stop) || *stop == '_')) + ++stop; + + if (start != stop) { + std::string keyword(start, stop); + if (keyword == "identifier") { + std::cerr << "*** Error. `identifier' is reserved" << std::endl; + exit(EXIT_FAILURE); + } + + keywords.insert(std::make_pair(keyword.size(), keyword)); + } + } + } + + if (! option_no_enums) + gen_enums(keywords); + + std::multimap::iterator it = keywords.begin(); + while (it != keywords.end()) { + size_t size = it->first; + RuleList rules; + do { rules.push_back(it->second); ++it; } + while (it != keywords.end() && it->first == size); + gen_classify_n(State::start(rules.begin(), rules.end()), size); + State::reset(); + } + + gen_classify(keywords); +} diff --git a/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.pro b/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.pro new file mode 100644 index 00000000000..7d647775398 --- /dev/null +++ b/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.pro @@ -0,0 +1,3 @@ +include(../cplusplus-shared/tool.pri) + +SOURCES += cplusplus-keywordgen.cpp diff --git a/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.qbs b/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.qbs new file mode 100644 index 00000000000..a101414e2e1 --- /dev/null +++ b/src/tools/cplusplus-keywordgen/cplusplus-keywordgen.qbs @@ -0,0 +1,7 @@ +import "../cplusplus-shared/CPlusPlusTool.qbs" as CPlusPlusTool + +CPlusPlusTool { + name: "cplusplus-keywordgen" + + files: "cplusplus-keywordgen.cpp" +} diff --git a/src/tools/cplusplustools.qbs b/src/tools/cplusplustools.qbs index 1b1bec39e08..766c150a74d 100644 --- a/src/tools/cplusplustools.qbs +++ b/src/tools/cplusplustools.qbs @@ -4,6 +4,7 @@ Project { references: [ "cplusplus-ast2png/cplusplus-ast2png.qbs", "cplusplus-frontend/cplusplus-frontend.qbs", + "cplusplus-keywordgen/cplusplus-keywordgen.qbs", "cplusplus-mkvisitor/cplusplus-mkvisitor.qbs", "cplusplus-update-frontend/cplusplus-update-frontend.qbs", ] diff --git a/src/tools/tools.pro b/src/tools/tools.pro index fe9f3a73970..6e82be45c60 100644 --- a/src/tools/tools.pro +++ b/src/tools/tools.pro @@ -27,6 +27,7 @@ isEmpty(BUILD_CPLUSPLUS_TOOLS):BUILD_CPLUSPLUS_TOOLS=$$(BUILD_CPLUSPLUS_TOOLS) !isEmpty(BUILD_CPLUSPLUS_TOOLS) { SUBDIRS += cplusplus-ast2png \ cplusplus-frontend \ + cplusplus-keywordgen \ cplusplus-mkvisitor \ cplusplus-update-frontend } From 6ed1a2b3c80c99ee568534b7f6ca62ac29f60aa9 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 30 Mar 2016 15:45:37 +0200 Subject: [PATCH 55/72] CppTools: Rewrite cppdoxygen.cpp with cplusplus-keywordgen Braces all over the place since the tool does not respect the coding style and cppdoxygen.cpp was changed with regard to the braces coding style in the meantime: commit 29a93998df8405e8799ad23934a56cd99fb36403 Remove braces for single lines of conditions Next step is to use the tool for updating the qdoc/doxygen keywords. Change-Id: Ib95b5991ebd794d144848ae052fa7f28a6d10850 Reviewed-by: David Schulz Reviewed-by: Orgad Shaneh --- src/plugins/cpptools/cppdoxygen.cpp | 658 +++++++++++++++++--------- src/plugins/cpptools/cppdoxygen.kwgen | 219 +++++++++ 2 files changed, 663 insertions(+), 214 deletions(-) create mode 100644 src/plugins/cpptools/cppdoxygen.kwgen diff --git a/src/plugins/cpptools/cppdoxygen.cpp b/src/plugins/cpptools/cppdoxygen.cpp index 64a92c4c553..d74446e77d4 100644 --- a/src/plugins/cpptools/cppdoxygen.cpp +++ b/src/plugins/cpptools/cppdoxygen.cpp @@ -23,6 +23,24 @@ ** ****************************************************************************/ +// +// W A R N I N G +// ------------- +// +// Main parts of this file are generated by "cplusplus-keywordgen". +// Use the tool to update new keywords/identifiers: +// +// 1. Update the input file cppdoxygen.kwgen with new keywords/identifiers. +// 2. Run the tool with the input file: +// $ INPUT_FILE=${QTC_SOURCE}/src/plugins/cpptools/cppdoxygen.kwgen +// $ OUTPUT_FILE=/tmp/new.cpp +// $ TOOL=${QTC_BUILD}/bin/cplusplus-keywordgen +// $ cat $INPUT_FILE | $TOOL > $OUTPUT_FILE +// 3. Copy over the classify* functions from $OUTPUT_FILE to this file, +// update the doxy_token_spell array in this file and the enums in the +// header. +// + #include "cppdoxygen.h" #include @@ -262,51 +280,66 @@ const char *CppTools::doxygenTagSpell(int index) { return doxy_token_spell[index]; } static inline int classify1(const QChar *s) { - if (s[0].unicode() == 'a') + if (s[0].unicode() == 'a') { return T_DOXY_A; - else if (s[0].unicode() == 'b') + } + else if (s[0].unicode() == 'b') { return T_DOXY_B; - else if (s[0].unicode() == 'c') + } + else if (s[0].unicode() == 'c') { return T_DOXY_C; - else if (s[0].unicode() == 'e') + } + else if (s[0].unicode() == 'e') { return T_DOXY_E; - else if (s[0].unicode() == 'i') + } + else if (s[0].unicode() == 'i') { return T_DOXY_I; - else if (s[0].unicode() == 'l') + } + else if (s[0].unicode() == 'l') { return T_DOXY_L; - else if (s[0].unicode() == 'n') + } + else if (s[0].unicode() == 'n') { return T_DOXY_N; - else if (s[0].unicode() == 'o') + } + else if (s[0].unicode() == 'o') { return T_DOXY_O; - else if (s[0].unicode() == 'p') + } + else if (s[0].unicode() == 'p') { return T_DOXY_P; + } return T_DOXY_IDENTIFIER; } static inline int classify2(const QChar *s) { if (s[0].unicode() == 'e') { - if (s[1].unicode() == 'm') + if (s[1].unicode() == 'm') { return T_DOXY_EM; + } } else if (s[0].unicode() == 'f') { - if (s[1].unicode() == 'n') + if (s[1].unicode() == 'n') { return T_DOXY_FN; + } } else if (s[0].unicode() == 'i') { - if (s[1].unicode() == 'f') + if (s[1].unicode() == 'f') { return T_DOXY_IF; + } } else if (s[0].unicode() == 'l') { - if (s[1].unicode() == 'i') + if (s[1].unicode() == 'i') { return T_DOXY_LI; + } } else if (s[0].unicode() == 's') { - if (s[1].unicode() == 'a') + if (s[1].unicode() == 'a') { return T_DOXY_SA; + } } else if (s[0].unicode() == 't') { - if (s[1].unicode() == 't') + if (s[1].unicode() == 't') { return T_DOXY_TT; + } } return T_DOXY_IDENTIFIER; } @@ -314,86 +347,103 @@ static inline int classify2(const QChar *s) { static inline int classify3(const QChar *s) { if (s[0].unicode() == 'a') { if (s[1].unicode() == 'r') { - if (s[2].unicode() == 'g') + if (s[2].unicode() == 'g') { return T_DOXY_ARG; + } } } else if (s[0].unicode() == 'b') { if (s[1].unicode() == 'u') { - if (s[2].unicode() == 'g') + if (s[2].unicode() == 'g') { return T_DOXY_BUG; + } } } else if (s[0].unicode() == 'd') { if (s[1].unicode() == 'e') { - if (s[2].unicode() == 'f') + if (s[2].unicode() == 'f') { return T_DOXY_DEF; + } } else if (s[1].unicode() == 'o') { - if (s[2].unicode() == 't') + if (s[2].unicode() == 't') { return T_DOXY_DOT; + } } } else if (s[0].unicode() == 'g') { if (s[1].unicode() == 'u') { - if (s[2].unicode() == 'i') + if (s[2].unicode() == 'i') { return T_DOXY_GUI; + } } } else if (s[0].unicode() == 'p') { if (s[1].unicode() == 'a') { - if (s[2].unicode() == 'r') + if (s[2].unicode() == 'r') { return T_DOXY_PAR; + } } else if (s[1].unicode() == 'r') { - if (s[2].unicode() == 'e') + if (s[2].unicode() == 'e') { return T_DOXY_PRE; + } } } else if (s[0].unicode() == 'r') { if (s[1].unicode() == 'a') { - if (s[2].unicode() == 'w') + if (s[2].unicode() == 'w') { return T_DOXY_RAW; + } } else if (s[1].unicode() == 'e') { - if (s[2].unicode() == 'f') + if (s[2].unicode() == 'f') { return T_DOXY_REF; + } } else if (s[1].unicode() == 'o') { - if (s[2].unicode() == 'w') + if (s[2].unicode() == 'w') { return T_DOXY_ROW; + } } } else if (s[0].unicode() == 's') { if (s[1].unicode() == 'e') { - if (s[2].unicode() == 'e') + if (s[2].unicode() == 'e') { return T_DOXY_SEE; + } } else if (s[1].unicode() == 'q') { - if (s[2].unicode() == 'l') + if (s[2].unicode() == 'l') { return T_DOXY_SQL; + } } else if (s[1].unicode() == 'u') { - if (s[2].unicode() == 'b') + if (s[2].unicode() == 'b') { return T_DOXY_SUB; - else if (s[2].unicode() == 'p') + } + else if (s[2].unicode() == 'p') { return T_DOXY_SUP; + } } else if (s[1].unicode() == 'v') { - if (s[2].unicode() == 'g') + if (s[2].unicode() == 'g') { return T_DOXY_SVG; + } } } else if (s[0].unicode() == 'v') { if (s[1].unicode() == 'a') { - if (s[2].unicode() == 'r') + if (s[2].unicode() == 'r') { return T_DOXY_VAR; + } } } else if (s[0].unicode() == 'x') { if (s[1].unicode() == 'm') { - if (s[2].unicode() == 'l') + if (s[2].unicode() == 'l') { return T_DOXY_XML; + } } } return T_DOXY_IDENTIFIER; @@ -403,146 +453,168 @@ static inline int classify4(const QChar *s) { if (s[0].unicode() == 'b') { if (s[1].unicode() == 'o') { if (s[2].unicode() == 'l') { - if (s[3].unicode() == 'd') + if (s[3].unicode() == 'd') { return T_DOXY_BOLD; + } } } } else if (s[0].unicode() == 'c') { if (s[1].unicode() == 'o') { if (s[2].unicode() == 'd') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_CODE; + } } else if (s[2].unicode() == 'n') { - if (s[3].unicode() == 'd') + if (s[3].unicode() == 'd') { return T_DOXY_COND; + } } } } else if (s[0].unicode() == 'd') { if (s[1].unicode() == 'a') { if (s[2].unicode() == 't') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_DATE; + } } } else if (s[1].unicode() == 'o') { if (s[2].unicode() == 't') { - if (s[3].unicode() == 's') + if (s[3].unicode() == 's') { return T_DOXY_DOTS; + } } } } else if (s[0].unicode() == 'e') { if (s[1].unicode() == 'l') { if (s[2].unicode() == 's') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_ELSE; + } } } else if (s[1].unicode() == 'n') { if (s[2].unicode() == 'u') { - if (s[3].unicode() == 'm') + if (s[3].unicode() == 'm') { return T_DOXY_ENUM; + } } } } else if (s[0].unicode() == 'f') { if (s[1].unicode() == 'i') { if (s[2].unicode() == 'l') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_FILE; + } } } } else if (s[0].unicode() == 'l') { if (s[1].unicode() == 'i') { if (s[2].unicode() == 'n') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_LINE; - else if (s[3].unicode() == 'k') + } + else if (s[3].unicode() == 'k') { return T_DOXY_LINK; + } } else if (s[2].unicode() == 's') { - if (s[3].unicode() == 't') + if (s[3].unicode() == 't') { return T_DOXY_LIST; + } } } } else if (s[0].unicode() == 'm') { if (s[1].unicode() == 'e') { if (s[2].unicode() == 't') { - if (s[3].unicode() == 'a') + if (s[3].unicode() == 'a') { return T_DOXY_META; + } } } } else if (s[0].unicode() == 'n') { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'm') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_NAME; + } } } else if (s[1].unicode() == 'o') { if (s[2].unicode() == 't') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_NOTE; + } } } } else if (s[0].unicode() == 'o') { if (s[1].unicode() == 'm') { if (s[2].unicode() == 'i') { - if (s[3].unicode() == 't') + if (s[3].unicode() == 't') { return T_DOXY_OMIT; + } } } else if (s[1].unicode() == 'n') { if (s[2].unicode() == 'l') { - if (s[3].unicode() == 'y') + if (s[3].unicode() == 'y') { return T_DOXY_ONLY; + } } } } else if (s[0].unicode() == 'p') { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'g') { - if (s[3].unicode() == 'e') + if (s[3].unicode() == 'e') { return T_DOXY_PAGE; + } } else if (s[2].unicode() == 'r') { - if (s[3].unicode() == 't') + if (s[3].unicode() == 't') { return T_DOXY_PART; + } } } else if (s[1].unicode() == 'o') { if (s[2].unicode() == 's') { - if (s[3].unicode() == 't') + if (s[3].unicode() == 't') { return T_DOXY_POST; + } } } } else if (s[0].unicode() == 's') { if (s[1].unicode() == 'k') { if (s[2].unicode() == 'i') { - if (s[3].unicode() == 'p') + if (s[3].unicode() == 'p') { return T_DOXY_SKIP; + } } } } else if (s[0].unicode() == 't') { if (s[1].unicode() == 'e') { if (s[2].unicode() == 's') { - if (s[3].unicode() == 't') + if (s[3].unicode() == 't') { return T_DOXY_TEST; + } } } else if (s[1].unicode() == 'o') { if (s[2].unicode() == 'd') { - if (s[3].unicode() == 'o') + if (s[3].unicode() == 'o') { return T_DOXY_TODO; + } } } } @@ -554,8 +626,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'r') { if (s[2].unicode() == 'i') { if (s[3].unicode() == 'e') { - if (s[4].unicode() == 'f') + if (s[4].unicode() == 'f') { return T_DOXY_BRIEF; + } } } } @@ -564,8 +637,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'l') { if (s[2].unicode() == 'a') { if (s[3].unicode() == 's') { - if (s[4].unicode() == 's') + if (s[4].unicode() == 's') { return T_DOXY_CLASS; + } } } } @@ -574,8 +648,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'n') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'i') { - if (s[4].unicode() == 'f') + if (s[4].unicode() == 'f') { return T_DOXY_ENDIF; + } } } } @@ -584,8 +659,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'r') { if (s[2].unicode() == 'o') { if (s[3].unicode() == 'u') { - if (s[4].unicode() == 'p') + if (s[4].unicode() == 'p') { return T_DOXY_GROUP; + } } } } @@ -594,24 +670,27 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'f') { if (s[2].unicode() == 'n') { if (s[3].unicode() == 'o') { - if (s[4].unicode() == 't') + if (s[4].unicode() == 't') { return T_DOXY_IFNOT; + } } } } else if (s[1].unicode() == 'm') { if (s[2].unicode() == 'a') { if (s[3].unicode() == 'g') { - if (s[4].unicode() == 'e') + if (s[4].unicode() == 'e') { return T_DOXY_IMAGE; + } } } } else if (s[1].unicode() == 'n') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'e') { - if (s[4].unicode() == 'x') + if (s[4].unicode() == 'x') { return T_DOXY_INDEX; + } } } } @@ -620,8 +699,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'c') { if (s[3].unicode() == 'r') { - if (s[4].unicode() == 'o') + if (s[4].unicode() == 'o') { return T_DOXY_MACRO; + } } } } @@ -630,8 +710,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'r') { if (s[3].unicode() == 'a') { - if (s[4].unicode() == 'm') + if (s[4].unicode() == 'm') { return T_DOXY_PARAM; + } } } } @@ -640,8 +721,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'e') { if (s[2].unicode() == 'i') { if (s[3].unicode() == 'm') { - if (s[4].unicode() == 'p') + if (s[4].unicode() == 'p') { return T_DOXY_REIMP; + } } } } @@ -650,16 +732,18 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'h') { if (s[2].unicode() == 'o') { if (s[3].unicode() == 'r') { - if (s[4].unicode() == 't') + if (s[4].unicode() == 't') { return T_DOXY_SHORT; + } } } } else if (s[1].unicode() == 'i') { if (s[2].unicode() == 'n') { if (s[3].unicode() == 'c') { - if (s[4].unicode() == 'e') + if (s[4].unicode() == 'e') { return T_DOXY_SINCE; + } } } } @@ -668,24 +752,27 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'b') { if (s[3].unicode() == 'l') { - if (s[4].unicode() == 'e') + if (s[4].unicode() == 'e') { return T_DOXY_TABLE; + } } } } else if (s[1].unicode() == 'h') { if (s[2].unicode() == 'r') { if (s[3].unicode() == 'o') { - if (s[4].unicode() == 'w') + if (s[4].unicode() == 'w') { return T_DOXY_THROW; + } } } } else if (s[1].unicode() == 'i') { if (s[2].unicode() == 't') { if (s[3].unicode() == 'l') { - if (s[4].unicode() == 'e') + if (s[4].unicode() == 'e') { return T_DOXY_TITLE; + } } } } @@ -694,14 +781,16 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'n') { if (s[2].unicode() == 'i') { if (s[3].unicode() == 'o') { - if (s[4].unicode() == 'n') + if (s[4].unicode() == 'n') { return T_DOXY_UNION; + } } } else if (s[2].unicode() == 't') { if (s[3].unicode() == 'i') { - if (s[4].unicode() == 'l') + if (s[4].unicode() == 'l') { return T_DOXY_UNTIL; + } } } } @@ -710,8 +799,9 @@ static inline int classify5(const QChar *s) { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'l') { if (s[3].unicode() == 'u') { - if (s[4].unicode() == 'e') + if (s[4].unicode() == 'e') { return T_DOXY_VALUE; + } } } } @@ -725,8 +815,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'c') { if (s[3].unicode() == 'h') { if (s[4].unicode() == 'o') { - if (s[5].unicode() == 'r') + if (s[5].unicode() == 'r') { return T_DOXY_ANCHOR; + } } } } @@ -735,8 +826,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 't') { if (s[3].unicode() == 'h') { if (s[4].unicode() == 'o') { - if (s[5].unicode() == 'r') + if (s[5].unicode() == 'r') { return T_DOXY_AUTHOR; + } } } } @@ -747,8 +839,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'm') { if (s[3].unicode() == 'p') { if (s[4].unicode() == 'a') { - if (s[5].unicode() == 't') + if (s[5].unicode() == 't') { return T_DOXY_COMPAT; + } } } } @@ -759,8 +852,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 's') { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'i') { - if (s[5].unicode() == 'f') + if (s[5].unicode() == 'f') { return T_DOXY_ELSEIF; + } } } } @@ -769,14 +863,16 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'd') { if (s[4].unicode() == 'o') { - if (s[5].unicode() == 't') + if (s[5].unicode() == 't') { return T_DOXY_ENDDOT; + } } } else if (s[3].unicode() == 'r') { if (s[4].unicode() == 'a') { - if (s[5].unicode() == 'w') + if (s[5].unicode() == 'w') { return T_DOXY_ENDRAW; + } } } } @@ -785,8 +881,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'p') { if (s[3].unicode() == 'i') { if (s[4].unicode() == 'r') { - if (s[5].unicode() == 'e') + if (s[5].unicode() == 'e') { return T_DOXY_EXPIRE; + } } } } @@ -797,8 +894,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'a') { if (s[3].unicode() == 'd') { if (s[4].unicode() == 'e') { - if (s[5].unicode() == 'r') + if (s[5].unicode() == 'r') { return T_DOXY_HEADER; + } } } } @@ -809,8 +907,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'u') { if (s[4].unicode() == 'l') { - if (s[5].unicode() == 'e') + if (s[5].unicode() == 'e') { return T_DOXY_MODULE; + } } } } @@ -821,8 +920,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'e') { if (s[3].unicode() == 'n') { if (s[4].unicode() == 'g') { - if (s[5].unicode() == 'l') + if (s[5].unicode() == 'l') { return T_DOXY_OPENGL; + } } } } @@ -833,14 +933,16 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 't') { if (s[3].unicode() == 'u') { if (s[4].unicode() == 'r') { - if (s[5].unicode() == 'n') + if (s[5].unicode() == 'n') { return T_DOXY_RETURN; + } } } else if (s[3].unicode() == 'v') { if (s[4].unicode() == 'a') { - if (s[5].unicode() == 'l') + if (s[5].unicode() == 'l') { return T_DOXY_RETVAL; + } } } } @@ -851,8 +953,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'i') { if (s[3].unicode() == 'p') { if (s[4].unicode() == 't') { - if (s[5].unicode() == 'o') + if (s[5].unicode() == 'o') { return T_DOXY_SKIPTO; + } } } } @@ -861,8 +964,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'r') { if (s[3].unicode() == 'u') { if (s[4].unicode() == 'c') { - if (s[5].unicode() == 't') + if (s[5].unicode() == 't') { return T_DOXY_STRUCT; + } } } } @@ -873,8 +977,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'r') { if (s[3].unicode() == 'g') { if (s[4].unicode() == 'e') { - if (s[5].unicode() == 't') + if (s[5].unicode() == 't') { return T_DOXY_TARGET; + } } } } @@ -883,8 +988,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'r') { if (s[3].unicode() == 'o') { if (s[4].unicode() == 'w') { - if (s[5].unicode() == 's') + if (s[5].unicode() == 's') { return T_DOXY_THROWS; + } } } } @@ -895,8 +1001,9 @@ static inline int classify6(const QChar *s) { if (s[2].unicode() == 'b') { if (s[3].unicode() == 'k') { if (s[4].unicode() == 'i') { - if (s[5].unicode() == 't') + if (s[5].unicode() == 't') { return T_DOXY_WEBKIT; + } } } } @@ -912,8 +1019,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'c') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'd') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_BADCODE; + } } } } @@ -926,8 +1034,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 't') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'o') { - if (s[6].unicode() == 'n') + if (s[6].unicode() == 'n') { return T_DOXY_CAPTION; + } } } } @@ -938,8 +1047,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'p') { if (s[4].unicode() == 't') { if (s[5].unicode() == 'e') { - if (s[6].unicode() == 'r') + if (s[6].unicode() == 'r') { return T_DOXY_CHAPTER; + } } } } @@ -950,8 +1060,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'y') { if (s[4].unicode() == 'd') { if (s[5].unicode() == 'o') { - if (s[6].unicode() == 'c') + if (s[6].unicode() == 'c') { return T_DOXY_COPYDOC; + } } } } @@ -960,8 +1071,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'l') { if (s[5].unicode() == 'i') { - if (s[6].unicode() == 'b') + if (s[6].unicode() == 'b') { return T_DOXY_CORELIB; + } } } } @@ -974,8 +1086,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'f') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'l') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_DOTFILE; + } } } } @@ -988,40 +1101,46 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'c') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'd') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_ENDCODE; + } } else if (s[5].unicode() == 'n') { - if (s[6].unicode() == 'd') + if (s[6].unicode() == 'd') { return T_DOXY_ENDCOND; + } } } } else if (s[3].unicode() == 'l') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'n') { - if (s[6].unicode() == 'k') + if (s[6].unicode() == 'k') { return T_DOXY_ENDLINK; + } } else if (s[5].unicode() == 's') { - if (s[6].unicode() == 't') + if (s[6].unicode() == 't') { return T_DOXY_ENDLIST; + } } } } else if (s[3].unicode() == 'o') { if (s[4].unicode() == 'm') { if (s[5].unicode() == 'i') { - if (s[6].unicode() == 't') + if (s[6].unicode() == 't') { return T_DOXY_ENDOMIT; + } } } } else if (s[3].unicode() == 'p') { if (s[4].unicode() == 'a') { if (s[5].unicode() == 'r') { - if (s[6].unicode() == 't') + if (s[6].unicode() == 't') { return T_DOXY_ENDPART; + } } } } @@ -1032,8 +1151,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'm') { if (s[4].unicode() == 'p') { if (s[5].unicode() == 'l') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_EXAMPLE; + } } } } @@ -1046,8 +1166,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'l') { if (s[4].unicode() == 'u') { if (s[5].unicode() == 'd') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_INCLUDE; + } } } } @@ -1056,8 +1177,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'r') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'u') { - if (s[6].unicode() == 'p') + if (s[6].unicode() == 'p') { return T_DOXY_INGROUP; + } } } } @@ -1070,8 +1192,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'w') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'r') { - if (s[6].unicode() == 'd') + if (s[6].unicode() == 'd') { return T_DOXY_KEYWORD; + } } } } @@ -1084,8 +1207,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'o') { if (s[4].unicode() == 'n') { if (s[5].unicode() == 'l') { - if (s[6].unicode() == 'y') + if (s[6].unicode() == 'y') { return T_DOXY_MANONLY; + } } } } @@ -1098,8 +1222,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'w') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'r') { - if (s[6].unicode() == 'k') + if (s[6].unicode() == 'k') { return T_DOXY_NETWORK; + } } } } @@ -1108,8 +1233,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'c') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'd') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_NEWCODE; + } } } } @@ -1122,8 +1248,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'c') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'd') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_OLDCODE; + } } } } @@ -1136,8 +1263,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'k') { if (s[4].unicode() == 'a') { if (s[5].unicode() == 'g') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_PACKAGE; + } } } } @@ -1148,8 +1276,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'n') { if (s[4].unicode() == 't') { if (s[5].unicode() == 't') { - if (s[6].unicode() == 'o') + if (s[6].unicode() == 'o') { return T_DOXY_PRINTTO; + } } } } @@ -1162,8 +1291,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'a') { if (s[4].unicode() == 't') { if (s[5].unicode() == 'e') { - if (s[6].unicode() == 's') + if (s[6].unicode() == 's') { return T_DOXY_RELATES; + } } } } @@ -1172,8 +1302,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'a') { if (s[4].unicode() == 'r') { if (s[5].unicode() == 'k') { - if (s[6].unicode() == 's') + if (s[6].unicode() == 's') { return T_DOXY_REMARKS; + } } } } @@ -1182,8 +1313,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'u') { if (s[4].unicode() == 'r') { if (s[5].unicode() == 'n') { - if (s[6].unicode() == 's') + if (s[6].unicode() == 's') { return T_DOXY_RETURNS; + } } } } @@ -1196,8 +1328,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 't') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'o') { - if (s[6].unicode() == 'n') + if (s[6].unicode() == 'n') { return T_DOXY_SECTION; + } } } } @@ -1206,8 +1339,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'v') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'c') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_SERVICE; + } } } } @@ -1218,8 +1352,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'b') { if (s[5].unicode() == 'a') { - if (s[6].unicode() == 'r') + if (s[6].unicode() == 'r') { return T_DOXY_SIDEBAR; + } } } } @@ -1230,8 +1365,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'p') { if (s[4].unicode() == 'p') { if (s[5].unicode() == 'e') { - if (s[6].unicode() == 't') + if (s[6].unicode() == 't') { return T_DOXY_SNIPPET; + } } } } @@ -1244,8 +1380,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'd') { if (s[5].unicode() == 'e') { - if (s[6].unicode() == 'f') + if (s[6].unicode() == 'f') { return T_DOXY_TYPEDEF; + } } } } @@ -1258,8 +1395,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'o') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'l') { - if (s[6].unicode() == 's') + if (s[6].unicode() == 's') { return T_DOXY_UITOOLS; + } } } } @@ -1270,8 +1408,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'c') { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'd') { - if (s[6].unicode() == 'e') + if (s[6].unicode() == 'e') { return T_DOXY_UNICODE; + } } } } @@ -1284,8 +1423,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 's') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'o') { - if (s[6].unicode() == 'n') + if (s[6].unicode() == 'n') { return T_DOXY_VERSION; + } } } } @@ -1298,8 +1438,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'n') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'n') { - if (s[6].unicode() == 'g') + if (s[6].unicode() == 'g') { return T_DOXY_WARNING; + } } } } @@ -1312,8 +1453,9 @@ static inline int classify7(const QChar *s) { if (s[3].unicode() == 'o') { if (s[4].unicode() == 'n') { if (s[5].unicode() == 'l') { - if (s[6].unicode() == 'y') + if (s[6].unicode() == 'y') { return T_DOXY_XMLONLY; + } } } } @@ -1331,8 +1473,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'r') { if (s[5].unicode() == 'a') { if (s[6].unicode() == 'c') { - if (s[7].unicode() == 't') + if (s[7].unicode() == 't') { return T_DOXY_ABSTRACT; + } } } } @@ -1345,8 +1488,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'n') { if (s[5].unicode() == 'd') { if (s[6].unicode() == 'e') { - if (s[7].unicode() == 'x') + if (s[7].unicode() == 'x') { return T_DOXY_ADDINDEX; + } } } } @@ -1361,8 +1505,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'n') { if (s[5].unicode() == 'a') { if (s[6].unicode() == 'm') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_BASENAME; + } } } } @@ -1377,8 +1522,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'l') { if (s[5].unicode() == 'i') { if (s[6].unicode() == 'n') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_CODELINE; + } } } } @@ -1393,8 +1539,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'r') { if (s[5].unicode() == 'o') { if (s[6].unicode() == 'u') { - if (s[7].unicode() == 'p') + if (s[7].unicode() == 'p') { return T_DOXY_DEFGROUP; + } } } } @@ -1409,8 +1556,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'a') { if (s[5].unicode() == 'b') { if (s[6].unicode() == 'l') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_ENDTABLE; + } } } } @@ -1425,8 +1573,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'n') { if (s[5].unicode() == 'o') { if (s[6].unicode() == 't') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_FOOTNOTE; + } } } } @@ -1441,8 +1590,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'o') { if (s[5].unicode() == 'n') { if (s[6].unicode() == 'l') { - if (s[7].unicode() == 'y') + if (s[7].unicode() == 'y') { return T_DOXY_HTMLONLY; + } } } } @@ -1457,8 +1607,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'd') { if (s[5].unicode() == 'u') { if (s[6].unicode() == 'l') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_INMODULE; + } } } } @@ -1469,8 +1620,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'r') { if (s[5].unicode() == 'n') { if (s[6].unicode() == 'a') { - if (s[7].unicode() == 'l') + if (s[7].unicode() == 'l') { return T_DOXY_INTERNAL; + } } } } @@ -1485,8 +1637,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'l') { if (s[5].unicode() == 'e') { if (s[6].unicode() == 's') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_LEGALESE; + } } } } @@ -1501,8 +1654,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'p') { if (s[5].unicode() == 'a') { if (s[6].unicode() == 'g') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_MAINPAGE; + } } } } @@ -1517,8 +1671,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'p') { if (s[5].unicode() == 'a') { if (s[6].unicode() == 'g') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_NEXTPAGE; + } } } } @@ -1533,8 +1688,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'l') { if (s[5].unicode() == 'e') { if (s[6].unicode() == 't') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_OBSOLETE; + } } } } @@ -1547,8 +1703,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'l') { if (s[5].unicode() == 'o') { if (s[6].unicode() == 'a') { - if (s[7].unicode() == 'd') + if (s[7].unicode() == 'd') { return T_DOXY_OVERLOAD; + } } } } @@ -1563,8 +1720,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'e') { if (s[5].unicode() == 'r') { if (s[6].unicode() == 't') { - if (s[7].unicode() == 'y') + if (s[7].unicode() == 'y') { return T_DOXY_PROPERTY; + } } } } @@ -1579,8 +1737,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 't') { if (s[5].unicode() == 'l') { if (s[6].unicode() == 'i') { - if (s[7].unicode() == 'b') + if (s[7].unicode() == 'b') { return T_DOXY_QTESTLIB; + } } } } @@ -1595,14 +1754,18 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'o') { if (s[6].unicode() == 'n') { - if (s[7].unicode() == '1') + if (s[7].unicode() == '1') { return T_DOXY_SECTION1; - else if (s[7].unicode() == '2') + } + else if (s[7].unicode() == '2') { return T_DOXY_SECTION2; - else if (s[7].unicode() == '3') + } + else if (s[7].unicode() == '3') { return T_DOXY_SECTION3; - else if (s[7].unicode() == '4') + } + else if (s[7].unicode() == '4') { return T_DOXY_SECTION4; + } } } } @@ -1615,8 +1778,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'l') { if (s[5].unicode() == 'i') { if (s[6].unicode() == 'n') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_SKIPLINE; + } } } } @@ -1629,8 +1793,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'i') { if (s[5].unicode() == 't') { if (s[6].unicode() == 'l') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_SUBTITLE; + } } } } @@ -1645,8 +1810,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'a') { if (s[5].unicode() == 'b') { if (s[6].unicode() == 'l') { - if (s[7].unicode() == 'e') + if (s[7].unicode() == 'e') { return T_DOXY_VARIABLE; + } } } } @@ -1659,8 +1825,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'a') { if (s[5].unicode() == 't') { if (s[6].unicode() == 'i') { - if (s[7].unicode() == 'm') + if (s[7].unicode() == 'm') { return T_DOXY_VERBATIM; + } } } } @@ -1675,8 +1842,9 @@ static inline int classify8(const QChar *s) { if (s[4].unicode() == 'i') { if (s[5].unicode() == 't') { if (s[6].unicode() == 'e') { - if (s[7].unicode() == 'm') + if (s[7].unicode() == 'm') { return T_DOXY_XREFITEM; + } } } } @@ -1696,8 +1864,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 't') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'o') { - if (s[8].unicode() == 'n') + if (s[8].unicode() == 'n') { return T_DOXY_ATTENTION; + } } } } @@ -1714,8 +1883,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'r') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'p') { - if (s[8].unicode() == 'h') + if (s[8].unicode() == 'h') { return T_DOXY_CALLGRAPH; + } } } } @@ -1732,8 +1902,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 't') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'o') { - if (s[8].unicode() == 'n') + if (s[8].unicode() == 'n') { return T_DOXY_EXCEPTION; + } } } } @@ -1750,8 +1921,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'p') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'g') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_INDEXPAGE; + } } } } @@ -1764,8 +1936,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'f') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'c') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_INTERFACE; + } } } } @@ -1778,8 +1951,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'i') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'n') { - if (s[8].unicode() == 't') + if (s[8].unicode() == 't') { return T_DOXY_INVARIANT; + } } } } @@ -1796,8 +1970,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'o') { if (s[6].unicode() == 'n') { if (s[7].unicode() == 'l') { - if (s[8].unicode() == 'y') + if (s[8].unicode() == 'y') { return T_DOXY_LATEXONLY; + } } } } @@ -1814,8 +1989,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'l') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 's') { - if (s[8].unicode() == 's') + if (s[8].unicode() == 's') { return T_DOXY_MAINCLASS; + } } } } @@ -1832,8 +2008,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'p') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'c') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_NAMESPACE; + } } } } @@ -1850,8 +2027,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'a') { if (s[6].unicode() == 'l') { if (s[7].unicode() == 'u') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_OMITVALUE; + } } } } @@ -1868,8 +2046,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'r') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'p') { - if (s[8].unicode() == 'h') + if (s[8].unicode() == 'h') { return T_DOXY_PARAGRAPH; + } } } } @@ -1884,8 +2063,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'l') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'n') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_PRINTLINE; + } } } } @@ -1902,8 +2082,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 't') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'o') { - if (s[8].unicode() == 'n') + if (s[8].unicode() == 'n') { return T_DOXY_QUOTATION; + } } } } @@ -1912,8 +2093,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'f') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'l') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_QUOTEFILE; + } } } } @@ -1930,8 +2112,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'r') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'n') { - if (s[8].unicode() == 't') + if (s[8].unicode() == 't') { return T_DOXY_REENTRANT; + } } } } @@ -1948,8 +2131,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'n') { if (s[6].unicode() == 't') { if (s[7].unicode() == 'i') { - if (s[8].unicode() == 'l') + if (s[8].unicode() == 'l') { return T_DOXY_SKIPUNTIL; + } } } } @@ -1964,8 +2148,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'p') { if (s[6].unicode() == 'a') { if (s[7].unicode() == 'g') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_STARTPAGE; + } } } } @@ -1982,8 +2167,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'l') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'n') { - if (s[8].unicode() == 'e') + if (s[8].unicode() == 'e') { return T_DOXY_UNDERLINE; + } } } } @@ -2000,8 +2186,9 @@ static inline int classify9(const QChar *s) { if (s[5].unicode() == 'r') { if (s[6].unicode() == 'o') { if (s[7].unicode() == 'u') { - if (s[8].unicode() == 'p') + if (s[8].unicode() == 'p') { return T_DOXY_WEAKGROUP; + } } } } @@ -2023,8 +2210,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'r') { if (s[7].unicode() == 'o') { if (s[8].unicode() == 'u') { - if (s[9].unicode() == 'p') + if (s[9].unicode() == 'p') { return T_DOXY_ADDTOGROUP; + } } } } @@ -2043,8 +2231,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'a') { if (s[7].unicode() == 't') { if (s[8].unicode() == 'e') { - if (s[9].unicode() == 'd') + if (s[9].unicode() == 'd') { return T_DOXY_DEPRECATED; + } } } } @@ -2063,8 +2252,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'p') { if (s[7].unicode() == 't') { if (s[8].unicode() == 'e') { - if (s[9].unicode() == 'r') + if (s[9].unicode() == 'r') { return T_DOXY_ENDCHAPTER; + } } } } @@ -2077,8 +2267,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'o') { if (s[7].unicode() == 'n') { if (s[8].unicode() == 'l') { - if (s[9].unicode() == 'y') + if (s[9].unicode() == 'y') { return T_DOXY_ENDMANONLY; + } } } } @@ -2091,8 +2282,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'e') { if (s[7].unicode() == 'b') { if (s[8].unicode() == 'a') { - if (s[9].unicode() == 'r') + if (s[9].unicode() == 'r') { return T_DOXY_ENDSIDEBAR; + } } } } @@ -2105,8 +2297,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'o') { if (s[7].unicode() == 'n') { if (s[8].unicode() == 'l') { - if (s[9].unicode() == 'y') + if (s[9].unicode() == 'y') { return T_DOXY_ENDXMLONLY; + } } } } @@ -2123,8 +2316,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'i') { if (s[7].unicode() == 'o') { if (s[8].unicode() == 'n') { - if (s[9].unicode() == 's') + if (s[9].unicode() == 's') { return T_DOXY_EXCEPTIONS; + } } } } @@ -2143,8 +2337,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'f') { if (s[7].unicode() == 'i') { if (s[8].unicode() == 'l') { - if (s[9].unicode() == 'e') + if (s[9].unicode() == 'e') { return T_DOXY_HEADERFILE; + } } } } @@ -2163,8 +2358,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'n') { if (s[7].unicode() == 't') { if (s[8].unicode() == 'i') { - if (s[9].unicode() == 'l') + if (s[9].unicode() == 'l') { return T_DOXY_PRINTUNTIL; + } } } } @@ -2183,8 +2379,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 'p') { if (s[7].unicode() == 'o') { if (s[8].unicode() == 'r') { - if (s[9].unicode() == 't') + if (s[9].unicode() == 't') { return T_DOXY_QT3SUPPORT; + } } } } @@ -2203,8 +2400,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 't') { if (s[7].unicode() == 'i') { if (s[8].unicode() == 'o') { - if (s[9].unicode() == 'n') + if (s[9].unicode() == 'n') { return T_DOXY_SUBSECTION; + } } } } @@ -2223,8 +2421,9 @@ static inline int classify10(const QChar *s) { if (s[6].unicode() == 's') { if (s[7].unicode() == 'a') { if (s[8].unicode() == 'f') { - if (s[9].unicode() == 'e') + if (s[9].unicode() == 'e') { return T_DOXY_THREADSAFE; + } } } } @@ -2248,8 +2447,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'l') { if (s[8].unicode() == 'u') { if (s[9].unicode() == 'd') { - if (s[10].unicode() == 'e') + if (s[10].unicode() == 'e') { return T_DOXY_DONTINCLUDE; + } } } } @@ -2270,8 +2470,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'r') { if (s[8].unicode() == 'a') { if (s[9].unicode() == 'c') { - if (s[10].unicode() == 't') + if (s[10].unicode() == 't') { return T_DOXY_ENDABSTRACT; + } } } } @@ -2286,8 +2487,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'n') { if (s[8].unicode() == 'o') { if (s[9].unicode() == 't') { - if (s[10].unicode() == 'e') + if (s[10].unicode() == 'e') { return T_DOXY_ENDFOOTNOTE; + } } } } @@ -2302,8 +2504,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'o') { if (s[8].unicode() == 'n') { if (s[9].unicode() == 'l') { - if (s[10].unicode() == 'y') + if (s[10].unicode() == 'y') { return T_DOXY_ENDHTMLONLY; + } } } } @@ -2318,8 +2521,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'l') { if (s[8].unicode() == 'e') { if (s[9].unicode() == 's') { - if (s[10].unicode() == 'e') + if (s[10].unicode() == 'e') { return T_DOXY_ENDLEGALESE; + } } } } @@ -2334,14 +2538,18 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'i') { if (s[8].unicode() == 'o') { if (s[9].unicode() == 'n') { - if (s[10].unicode() == '1') + if (s[10].unicode() == '1') { return T_DOXY_ENDSECTION1; - else if (s[10].unicode() == '2') + } + else if (s[10].unicode() == '2') { return T_DOXY_ENDSECTION2; - else if (s[10].unicode() == '3') + } + else if (s[10].unicode() == '3') { return T_DOXY_ENDSECTION3; - else if (s[10].unicode() == '4') + } + else if (s[10].unicode() == '4') { return T_DOXY_ENDSECTION4; + } } } } @@ -2356,8 +2564,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'a') { if (s[8].unicode() == 't') { if (s[9].unicode() == 'i') { - if (s[10].unicode() == 'm') + if (s[10].unicode() == 'm') { return T_DOXY_ENDVERBATIM; + } } } } @@ -2378,8 +2587,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'r') { if (s[8].unicode() == 'i') { if (s[9].unicode() == 't') { - if (s[10].unicode() == 'y') + if (s[10].unicode() == 'y') { return T_DOXY_GRANULARITY; + } } } } @@ -2400,8 +2610,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'l') { if (s[8].unicode() == 'u') { if (s[9].unicode() == 'd') { - if (s[10].unicode() == 'e') + if (s[10].unicode() == 'e') { return T_DOXY_HTMLINCLUDE; + } } } } @@ -2422,8 +2633,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'm') { if (s[8].unicode() == 'a') { if (s[9].unicode() == 'g') { - if (s[10].unicode() == 'e') + if (s[10].unicode() == 'e') { return T_DOXY_INLINEIMAGE; + } } } } @@ -2444,8 +2656,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'n') { if (s[8].unicode() == 'a') { if (s[9].unicode() == 'r') { - if (s[10].unicode() == 'y') + if (s[10].unicode() == 'y') { return T_DOXY_PRELIMINARY; + } } } } @@ -2466,8 +2679,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'a') { if (s[8].unicode() == 'l') { if (s[9].unicode() == 's') { - if (s[10].unicode() == 'o') + if (s[10].unicode() == 'o') { return T_DOXY_RELATESALSO; + } } } } @@ -2488,8 +2702,9 @@ static inline int classify11(const QChar *s) { if (s[7].unicode() == 'l') { if (s[8].unicode() == 'u') { if (s[9].unicode() == 'd') { - if (s[10].unicode() == 'e') + if (s[10].unicode() == 'e') { return T_DOXY_VERBINCLUDE; + } } } } @@ -2515,8 +2730,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'p') { if (s[9].unicode() == 'a') { if (s[10].unicode() == 'g') { - if (s[11].unicode() == 'e') + if (s[11].unicode() == 'e') { return T_DOXY_CONTENTSPAGE; + } } } } @@ -2539,8 +2755,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'o') { if (s[9].unicode() == 'n') { if (s[10].unicode() == 'l') { - if (s[11].unicode() == 'y') + if (s[11].unicode() == 'y') { return T_DOXY_ENDLATEXONLY; + } } } } @@ -2557,8 +2774,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 't') { if (s[9].unicode() == 'i') { if (s[10].unicode() == 'o') { - if (s[11].unicode() == 'n') + if (s[11].unicode() == 'n') { return T_DOXY_ENDQUOTATION; + } } } } @@ -2579,8 +2797,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'p') { if (s[9].unicode() == 'a') { if (s[10].unicode() == 'g') { - if (s[11].unicode() == 'e') + if (s[11].unicode() == 'e') { return T_DOXY_EXTERNALPAGE; + } } } } @@ -2603,8 +2822,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'l') { if (s[9].unicode() == 'i') { if (s[10].unicode() == 's') { - if (s[11].unicode() == 't') + if (s[11].unicode() == 't') { return T_DOXY_GENERATELIST; + } } } } @@ -2627,8 +2847,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'f') { if (s[9].unicode() == 'i') { if (s[10].unicode() == 'l') { - if (s[11].unicode() == 'e') + if (s[11].unicode() == 'e') { return T_DOXY_INHEADERFILE; + } } } } @@ -2651,8 +2872,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'r') { if (s[9].unicode() == 'a') { if (s[10].unicode() == 'n') { - if (s[11].unicode() == 't') + if (s[11].unicode() == 't') { return T_DOXY_NONREENTRANT; + } } } } @@ -2675,8 +2897,9 @@ static inline int classify12(const QChar *s) { if (s[8].unicode() == 'p') { if (s[9].unicode() == 'a') { if (s[10].unicode() == 'g') { - if (s[11].unicode() == 'e') + if (s[11].unicode() == 'e') { return T_DOXY_PREVIOUSPAGE; + } } } } @@ -2704,8 +2927,9 @@ static inline int classify13(const QChar *s) { if (s[9].unicode() == 'r') { if (s[10].unicode() == 'o') { if (s[11].unicode() == 'u') { - if (s[12].unicode() == 'p') + if (s[12].unicode() == 'p') { return T_DOXY_INPUBLICGROUP; + } } } } @@ -2730,8 +2954,9 @@ static inline int classify13(const QChar *s) { if (s[9].unicode() == 'p') { if (s[10].unicode() == 'i') { if (s[11].unicode() == 'n') { - if (s[12].unicode() == 'g') + if (s[12].unicode() == 'g') { return T_DOXY_NOSUBGROUPING; + } } } } @@ -2756,8 +2981,9 @@ static inline int classify13(const QChar *s) { if (s[9].unicode() == 'f') { if (s[10].unicode() == 'i') { if (s[11].unicode() == 'l') { - if (s[12].unicode() == 'e') + if (s[12].unicode() == 'e') { return T_DOXY_QUOTEFROMFILE; + } } } } @@ -2770,8 +2996,9 @@ static inline int classify13(const QChar *s) { if (s[9].unicode() == 't') { if (s[10].unicode() == 'i') { if (s[11].unicode() == 'o') { - if (s[12].unicode() == 'n') + if (s[12].unicode() == 'n') { return T_DOXY_QUOTEFUNCTION; + } } } } @@ -2796,8 +3023,9 @@ static inline int classify13(const QChar *s) { if (s[9].unicode() == 't') { if (s[10].unicode() == 'i') { if (s[11].unicode() == 'o') { - if (s[12].unicode() == 'n') + if (s[12].unicode() == 'n') { return T_DOXY_SUBSUBSECTION; + } } } } @@ -2828,8 +3056,9 @@ static inline int classify15(const QChar *s) { if (s[11].unicode() == 'i') { if (s[12].unicode() == 'z') { if (s[13].unicode() == 'e') { - if (s[14].unicode() == 'r') + if (s[14].unicode() == 'r') { return T_DOXY_HIDEINITIALIZER; + } } } } @@ -2858,8 +3087,9 @@ static inline int classify15(const QChar *s) { if (s[11].unicode() == 'i') { if (s[12].unicode() == 'z') { if (s[13].unicode() == 'e') { - if (s[14].unicode() == 'r') + if (s[14].unicode() == 'r') { return T_DOXY_SHOWINITIALIZER; + } } } } @@ -2888,8 +3118,9 @@ static inline int classify15(const QChar *s) { if (s[11].unicode() == 'e') { if (s[12].unicode() == 'n') { if (s[13].unicode() == 't') { - if (s[14].unicode() == 's') + if (s[14].unicode() == 's') { return T_DOXY_TABLEOFCONTENTS; + } } } } @@ -2926,4 +3157,3 @@ int CppTools::classifyDoxygenTag(const QChar *s, int n) { default: return T_DOXY_IDENTIFIER; } // switch } - diff --git a/src/plugins/cpptools/cppdoxygen.kwgen b/src/plugins/cpptools/cppdoxygen.kwgen new file mode 100644 index 00000000000..4159ceedc40 --- /dev/null +++ b/src/plugins/cpptools/cppdoxygen.kwgen @@ -0,0 +1,219 @@ +%token-prefix=T_DOXY_ +%toupper +%char-type=QChar +%unicode-function=.unicode() + +%% +arg +attention +author +callgraph +code +dot +else +endcode +endcond +enddot +endhtmlonly +endif +endlatexonly +endlink +endmanonly +endverbatim +endxmlonly +hideinitializer +htmlonly +interface +internal +invariant +latexonly +li +manonly +n +nosubgrouping +note +only +post +pre +remarks +return +returns +sa +see +showinitializer +since +test +todo +verbatim +warning +xmlonly +a +addtogroup +anchor +b +c +class +cond +copydoc +def +dontinclude +dotfile +e +elseif +em +enum +example +exception +exceptions +file +htmlinclude +if +ifnot +include +link +namespace +p +package +ref +relates +relatesalso +retval +throw +throws +verbinclude +version +xrefitem +param +image +defgroup +page +paragraph +section +struct +subsection +subsubsection +union +weakgroup +addindex +brief +bug +date +deprecated +fn +ingroup +line +mainpage +name +overload +par +short +skip +skipline +typedef +until +var +abstract +badcode +basename +bold +caption +chapter +codeline +dots +endabstract +endchapter +endfootnote +endlegalese +endlist +endomit +endpart +endquotation +endraw +endsection1 +endsection2 +endsection3 +endsection4 +endsidebar +endtable +expire +footnote +generatelist +granularity +header +i +index +inlineimage +keyword +l +legalese +list +meta +newcode +o +oldcode +omit +omitvalue +part +printline +printto +printuntil +quotation +quotefile +quotefromfile +quotefunction +raw +row +section1 +section2 +section3 +section4 +sidebar +skipto +skipuntil +snippet +sub +sup +table +tableofcontents +target +tt +underline +unicode +value +contentspage +externalpage +group +headerfile +indexpage +inheaderfile +macro +module +nextpage +previouspage +property +reimp +service +startpage +variable +compat +inmodule +mainclass +nonreentrant +obsolete +preliminary +inpublicgroup +reentrant +subtitle +threadsafe +title +corelib +uitools +gui +network +opengl +qt3support +svg +sql +qtestlib +webkit +xml From 24640a6e4e4a4f9ce2cf2ede089429160448c30e Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 31 Mar 2016 09:35:59 +0200 Subject: [PATCH 56/72] CppTools: Sort doxygen commands We will update them, so having them sorted is better for finding duplicates. Change-Id: I1159ed1f1fce1275d630935a297e85787947ba61 Reviewed-by: David Schulz Reviewed-by: Orgad Shaneh --- src/plugins/cpptools/cppdoxygen.cpp | 281 ++++++++++++------------- src/plugins/cpptools/cppdoxygen.h | 282 +++++++++++++------------- src/plugins/cpptools/cppdoxygen.kwgen | 278 ++++++++++++------------- 3 files changed, 420 insertions(+), 421 deletions(-) diff --git a/src/plugins/cpptools/cppdoxygen.cpp b/src/plugins/cpptools/cppdoxygen.cpp index d74446e77d4..f10e41c52e1 100644 --- a/src/plugins/cpptools/cppdoxygen.cpp +++ b/src/plugins/cpptools/cppdoxygen.cpp @@ -61,127 +61,58 @@ using namespace CppTools; static const char *doxy_token_spell[] = { "identifier", + + "a", + "abstract", + "addindex", + "addtogroup", + "anchor", "arg", "attention", "author", - "callgraph", - "code", - "dot", - "else", - "endcode", - "endcond", - "enddot", - "endhtmlonly", - "endif", - "endlatexonly", - "endlink", - "endmanonly", - "endverbatim", - "endxmlonly", - "hideinitializer", - "htmlonly", - "interface", - "internal", - "invariant", - "latexonly", - "li", - "manonly", - "n", - "nosubgrouping", - "note", - "only", - "post", - "pre", - "remarks", - "return", - "returns", - "sa", - "see", - "showinitializer", - "since", - "test", - "todo", - "verbatim", - "warning", - "xmlonly", - "a", - "addtogroup", - "anchor", "b", - "c", - "class", - "cond", - "copydoc", - "def", - "dontinclude", - "dotfile", - "e", - "elseif", - "em", - "enum", - "example", - "exception", - "exceptions", - "file", - "htmlinclude", - "if", - "ifnot", - "include", - "link", - "namespace", - "p", - "package", - "ref", - "relates", - "relatesalso", - "retval", - "throw", - "throws", - "verbinclude", - "version", - "xrefitem", - "param", - "image", - "defgroup", - "page", - "paragraph", - "section", - "struct", - "subsection", - "subsubsection", - "union", - "weakgroup", - "addindex", - "brief", - "bug", - "date", - "deprecated", - "fn", - "ingroup", - "line", - "mainpage", - "name", - "overload", - "par", - "short", - "skip", - "skipline", - "typedef", - "until", - "var", - "abstract", "badcode", "basename", "bold", + "brief", + "bug", + "c", + "callgraph", "caption", "chapter", + "class", + "code", "codeline", + "compat", + "cond", + "contentspage", + "copydoc", + "corelib", + "date", + "def", + "defgroup", + "deprecated", + "dontinclude", + "dot", + "dotfile", "dots", + "e", + "else", + "elseif", + "em", "endabstract", "endchapter", + "endcode", + "endcond", + "enddot", "endfootnote", + "endhtmlonly", + "endif", + "endlatexonly", "endlegalese", + "endlink", "endlist", + "endmanonly", "endomit", "endpart", "endquotation", @@ -192,88 +123,158 @@ static const char *doxy_token_spell[] = { "endsection4", "endsidebar", "endtable", + "endverbatim", + "endxmlonly", + "enum", + "example", + "exception", + "exceptions", "expire", + "externalpage", + "file", + "fn", "footnote", "generatelist", "granularity", + "group", + "gui", "header", + "headerfile", + "hideinitializer", + "htmlinclude", + "htmlonly", "i", + "if", + "ifnot", + "image", + "include", "index", + "indexpage", + "ingroup", + "inheaderfile", "inlineimage", + "inmodule", + "inpublicgroup", + "interface", + "internal", + "invariant", "keyword", "l", + "latexonly", "legalese", + "li", + "line", + "link", "list", + "macro", + "mainclass", + "mainpage", + "manonly", "meta", + "module", + "n", + "name", + "namespace", + "network", "newcode", + "nextpage", + "nonreentrant", + "nosubgrouping", + "note", "o", + "obsolete", "oldcode", "omit", "omitvalue", + "only", + "opengl", + "overload", + "p", + "package", + "page", + "par", + "paragraph", + "param", "part", + "post", + "pre", + "preliminary", + "previouspage", "printline", "printto", "printuntil", + "property", + "qt3support", + "qtestlib", "quotation", "quotefile", "quotefromfile", "quotefunction", "raw", + "reentrant", + "ref", + "reimp", + "relates", + "relatesalso", + "remarks", + "return", + "returns", + "retval", "row", + "sa", + "section", "section1", "section2", "section3", "section4", + "see", + "service", + "short", + "showinitializer", "sidebar", + "since", + "skip", + "skipline", "skipto", "skipuntil", "snippet", + "sql", + "startpage", + "struct", "sub", + "subsection", + "subsubsection", + "subtitle", "sup", + "svg", "table", "tableofcontents", "target", + "test", + "threadsafe", + "throw", + "throws", + "title", + "todo", "tt", + "typedef", + "uitools", "underline", "unicode", + "union", + "until", "value", - "contentspage", - "externalpage", - "group", - "headerfile", - "indexpage", - "inheaderfile", - "macro", - "module", - "nextpage", - "previouspage", - "property", - "reimp", - "service", - "startpage", + "var", "variable", - "compat", - "inmodule", - "mainclass", - "nonreentrant", - "obsolete", - "preliminary", - "inpublicgroup", - "reentrant", - "subtitle", - "threadsafe", - "title", - "corelib", - "uitools", - "gui", - "network", - "opengl", - "qt3support", - "svg", - "sql", - "qtestlib", + "verbatim", + "verbinclude", + "version", + "warning", + "weakgroup", "webkit", - "xml" + "xml", + "xmlonly", + "xrefitem", }; const char *CppTools::doxygenTagSpell(int index) diff --git a/src/plugins/cpptools/cppdoxygen.h b/src/plugins/cpptools/cppdoxygen.h index 29c258a3d1c..0a62b5a1f1d 100644 --- a/src/plugins/cpptools/cppdoxygen.h +++ b/src/plugins/cpptools/cppdoxygen.h @@ -34,130 +34,58 @@ namespace CppTools { enum DoxygenReservedWord { T_DOXY_IDENTIFIER, + + T_DOXY_A, + T_DOXY_ABSTRACT, + T_DOXY_ADDINDEX, + T_DOXY_ADDTOGROUP, + T_DOXY_ANCHOR, T_DOXY_ARG, T_DOXY_ATTENTION, T_DOXY_AUTHOR, - T_DOXY_CALLGRAPH, - T_DOXY_CODE, - T_DOXY_DOT, - T_DOXY_ELSE, - T_DOXY_ENDCODE, - T_DOXY_ENDCOND, - T_DOXY_ENDDOT, - T_DOXY_ENDHTMLONLY, - T_DOXY_ENDIF, - T_DOXY_ENDLATEXONLY, - T_DOXY_ENDLINK, - T_DOXY_ENDMANONLY, - T_DOXY_ENDVERBATIM, - T_DOXY_ENDXMLONLY, - T_DOXY_HIDEINITIALIZER, - T_DOXY_HTMLONLY, - T_DOXY_INTERFACE, - T_DOXY_INTERNAL, - T_DOXY_INVARIANT, - T_DOXY_LATEXONLY, - T_DOXY_LI, - T_DOXY_MANONLY, - T_DOXY_N, - T_DOXY_NOSUBGROUPING, - T_DOXY_NOTE, - T_DOXY_ONLY, - T_DOXY_POST, - T_DOXY_PRE, - T_DOXY_REMARKS, - T_DOXY_RETURN, - T_DOXY_RETURNS, - T_DOXY_SA, - T_DOXY_SEE, - T_DOXY_SHOWINITIALIZER, - T_DOXY_SINCE, - T_DOXY_TEST, - T_DOXY_TODO, - T_DOXY_VERBATIM, - T_DOXY_WARNING, - T_DOXY_XMLONLY, - T_DOXY_A, - T_DOXY_ADDTOGROUP, - T_DOXY_ANCHOR, T_DOXY_B, - T_DOXY_C, - T_DOXY_CLASS, - T_DOXY_COND, - T_DOXY_COPYDOC, - T_DOXY_DEF, - T_DOXY_DONTINCLUDE, - T_DOXY_DOTFILE, - T_DOXY_E, - T_DOXY_ELSEIF, - T_DOXY_EM, - T_DOXY_ENUM, - T_DOXY_EXAMPLE, - T_DOXY_EXCEPTION, - T_DOXY_EXCEPTIONS, - T_DOXY_FILE, - T_DOXY_HTMLINCLUDE, - T_DOXY_IF, - T_DOXY_IFNOT, - T_DOXY_INCLUDE, - T_DOXY_LINK, - T_DOXY_NAMESPACE, - T_DOXY_P, - T_DOXY_PACKAGE, - T_DOXY_REF, - T_DOXY_RELATES, - T_DOXY_RELATESALSO, - T_DOXY_RETVAL, - T_DOXY_THROW, - T_DOXY_THROWS, - T_DOXY_VERBINCLUDE, - T_DOXY_VERSION, - T_DOXY_XREFITEM, - T_DOXY_PARAM, - T_DOXY_IMAGE, - T_DOXY_DEFGROUP, - T_DOXY_PAGE, - T_DOXY_PARAGRAPH, - T_DOXY_SECTION, - T_DOXY_STRUCT, - T_DOXY_SUBSECTION, - T_DOXY_SUBSUBSECTION, - T_DOXY_UNION, - T_DOXY_WEAKGROUP, - T_DOXY_ADDINDEX, - T_DOXY_BRIEF, - T_DOXY_BUG, - T_DOXY_DATE, - T_DOXY_DEPRECATED, - T_DOXY_FN, - T_DOXY_INGROUP, - T_DOXY_LINE, - T_DOXY_MAINPAGE, - T_DOXY_NAME, - T_DOXY_OVERLOAD, - T_DOXY_PAR, - T_DOXY_SHORT, - T_DOXY_SKIP, - T_DOXY_SKIPLINE, - T_DOXY_TYPEDEF, - T_DOXY_UNTIL, - T_DOXY_VAR, - - T_FIRST_QDOC_TAG, - - T_DOXY_ABSTRACT = T_FIRST_QDOC_TAG, T_DOXY_BADCODE, T_DOXY_BASENAME, T_DOXY_BOLD, + T_DOXY_BRIEF, + T_DOXY_BUG, + T_DOXY_C, + T_DOXY_CALLGRAPH, T_DOXY_CAPTION, T_DOXY_CHAPTER, + T_DOXY_CLASS, + T_DOXY_CODE, T_DOXY_CODELINE, + T_DOXY_COMPAT, + T_DOXY_COND, + T_DOXY_CONTENTSPAGE, + T_DOXY_COPYDOC, + T_DOXY_CORELIB, + T_DOXY_DATE, + T_DOXY_DEF, + T_DOXY_DEFGROUP, + T_DOXY_DEPRECATED, + T_DOXY_DONTINCLUDE, + T_DOXY_DOT, + T_DOXY_DOTFILE, T_DOXY_DOTS, + T_DOXY_E, + T_DOXY_ELSE, + T_DOXY_ELSEIF, + T_DOXY_EM, T_DOXY_ENDABSTRACT, T_DOXY_ENDCHAPTER, + T_DOXY_ENDCODE, + T_DOXY_ENDCOND, + T_DOXY_ENDDOT, T_DOXY_ENDFOOTNOTE, + T_DOXY_ENDHTMLONLY, + T_DOXY_ENDIF, + T_DOXY_ENDLATEXONLY, T_DOXY_ENDLEGALESE, + T_DOXY_ENDLINK, T_DOXY_ENDLIST, + T_DOXY_ENDMANONLY, T_DOXY_ENDOMIT, T_DOXY_ENDPART, T_DOXY_ENDQUOTATION, @@ -168,88 +96,158 @@ enum DoxygenReservedWord { T_DOXY_ENDSECTION4, T_DOXY_ENDSIDEBAR, T_DOXY_ENDTABLE, + T_DOXY_ENDVERBATIM, + T_DOXY_ENDXMLONLY, + T_DOXY_ENUM, + T_DOXY_EXAMPLE, + T_DOXY_EXCEPTION, + T_DOXY_EXCEPTIONS, T_DOXY_EXPIRE, + T_DOXY_EXTERNALPAGE, + T_DOXY_FILE, + T_DOXY_FN, T_DOXY_FOOTNOTE, T_DOXY_GENERATELIST, T_DOXY_GRANULARITY, + T_DOXY_GROUP, + T_DOXY_GUI, T_DOXY_HEADER, + T_DOXY_HEADERFILE, + T_DOXY_HIDEINITIALIZER, + T_DOXY_HTMLINCLUDE, + T_DOXY_HTMLONLY, T_DOXY_I, + T_DOXY_IF, + T_DOXY_IFNOT, + T_DOXY_IMAGE, + T_DOXY_INCLUDE, T_DOXY_INDEX, + T_DOXY_INDEXPAGE, + T_DOXY_INGROUP, + T_DOXY_INHEADERFILE, T_DOXY_INLINEIMAGE, + T_DOXY_INMODULE, + T_DOXY_INPUBLICGROUP, + T_DOXY_INTERFACE, + T_DOXY_INTERNAL, + T_DOXY_INVARIANT, T_DOXY_KEYWORD, T_DOXY_L, + T_DOXY_LATEXONLY, T_DOXY_LEGALESE, + T_DOXY_LI, + T_DOXY_LINE, + T_DOXY_LINK, T_DOXY_LIST, + T_DOXY_MACRO, + T_DOXY_MAINCLASS, + T_DOXY_MAINPAGE, + T_DOXY_MANONLY, T_DOXY_META, + T_DOXY_MODULE, + T_DOXY_N, + T_DOXY_NAME, + T_DOXY_NAMESPACE, + T_DOXY_NETWORK, T_DOXY_NEWCODE, + T_DOXY_NEXTPAGE, + T_DOXY_NONREENTRANT, + T_DOXY_NOSUBGROUPING, + T_DOXY_NOTE, T_DOXY_O, + T_DOXY_OBSOLETE, T_DOXY_OLDCODE, T_DOXY_OMIT, T_DOXY_OMITVALUE, + T_DOXY_ONLY, + T_DOXY_OPENGL, + T_DOXY_OVERLOAD, + T_DOXY_P, + T_DOXY_PACKAGE, + T_DOXY_PAGE, + T_DOXY_PAR, + T_DOXY_PARAGRAPH, + T_DOXY_PARAM, T_DOXY_PART, + T_DOXY_POST, + T_DOXY_PRE, + T_DOXY_PRELIMINARY, + T_DOXY_PREVIOUSPAGE, T_DOXY_PRINTLINE, T_DOXY_PRINTTO, T_DOXY_PRINTUNTIL, + T_DOXY_PROPERTY, + T_DOXY_QT3SUPPORT, + T_DOXY_QTESTLIB, T_DOXY_QUOTATION, T_DOXY_QUOTEFILE, T_DOXY_QUOTEFROMFILE, T_DOXY_QUOTEFUNCTION, T_DOXY_RAW, + T_DOXY_REENTRANT, + T_DOXY_REF, + T_DOXY_REIMP, + T_DOXY_RELATES, + T_DOXY_RELATESALSO, + T_DOXY_REMARKS, + T_DOXY_RETURN, + T_DOXY_RETURNS, + T_DOXY_RETVAL, T_DOXY_ROW, + T_DOXY_SA, + T_DOXY_SECTION, T_DOXY_SECTION1, T_DOXY_SECTION2, T_DOXY_SECTION3, T_DOXY_SECTION4, + T_DOXY_SEE, + T_DOXY_SERVICE, + T_DOXY_SHORT, + T_DOXY_SHOWINITIALIZER, T_DOXY_SIDEBAR, + T_DOXY_SINCE, + T_DOXY_SKIP, + T_DOXY_SKIPLINE, T_DOXY_SKIPTO, T_DOXY_SKIPUNTIL, T_DOXY_SNIPPET, + T_DOXY_SQL, + T_DOXY_STARTPAGE, + T_DOXY_STRUCT, T_DOXY_SUB, + T_DOXY_SUBSECTION, + T_DOXY_SUBSUBSECTION, + T_DOXY_SUBTITLE, T_DOXY_SUP, + T_DOXY_SVG, T_DOXY_TABLE, T_DOXY_TABLEOFCONTENTS, T_DOXY_TARGET, + T_DOXY_TEST, + T_DOXY_THREADSAFE, + T_DOXY_THROW, + T_DOXY_THROWS, + T_DOXY_TITLE, + T_DOXY_TODO, T_DOXY_TT, + T_DOXY_TYPEDEF, + T_DOXY_UITOOLS, T_DOXY_UNDERLINE, T_DOXY_UNICODE, + T_DOXY_UNION, + T_DOXY_UNTIL, T_DOXY_VALUE, - T_DOXY_CONTENTSPAGE, - T_DOXY_EXTERNALPAGE, - T_DOXY_GROUP, - T_DOXY_HEADERFILE, - T_DOXY_INDEXPAGE, - T_DOXY_INHEADERFILE, - T_DOXY_MACRO, - T_DOXY_MODULE, - T_DOXY_NEXTPAGE, - T_DOXY_PREVIOUSPAGE, - T_DOXY_PROPERTY, - T_DOXY_REIMP, - T_DOXY_SERVICE, - T_DOXY_STARTPAGE, + T_DOXY_VAR, T_DOXY_VARIABLE, - T_DOXY_COMPAT, - T_DOXY_INMODULE, - T_DOXY_MAINCLASS, - T_DOXY_NONREENTRANT, - T_DOXY_OBSOLETE, - T_DOXY_PRELIMINARY, - T_DOXY_INPUBLICGROUP, - T_DOXY_REENTRANT, - T_DOXY_SUBTITLE, - T_DOXY_THREADSAFE, - T_DOXY_TITLE, - T_DOXY_CORELIB, - T_DOXY_UITOOLS, - T_DOXY_GUI, - T_DOXY_NETWORK, - T_DOXY_OPENGL, - T_DOXY_QT3SUPPORT, - T_DOXY_SVG, - T_DOXY_SQL, - T_DOXY_QTESTLIB, + T_DOXY_VERBATIM, + T_DOXY_VERBINCLUDE, + T_DOXY_VERSION, + T_DOXY_WARNING, + T_DOXY_WEAKGROUP, T_DOXY_WEBKIT, T_DOXY_XML, + T_DOXY_XMLONLY, + T_DOXY_XREFITEM, T_DOXY_LAST_TAG }; diff --git a/src/plugins/cpptools/cppdoxygen.kwgen b/src/plugins/cpptools/cppdoxygen.kwgen index 4159ceedc40..7c22841f926 100644 --- a/src/plugins/cpptools/cppdoxygen.kwgen +++ b/src/plugins/cpptools/cppdoxygen.kwgen @@ -4,127 +4,57 @@ %unicode-function=.unicode() %% +a +abstract +addindex +addtogroup +anchor arg attention author -callgraph -code -dot -else -endcode -endcond -enddot -endhtmlonly -endif -endlatexonly -endlink -endmanonly -endverbatim -endxmlonly -hideinitializer -htmlonly -interface -internal -invariant -latexonly -li -manonly -n -nosubgrouping -note -only -post -pre -remarks -return -returns -sa -see -showinitializer -since -test -todo -verbatim -warning -xmlonly -a -addtogroup -anchor b -c -class -cond -copydoc -def -dontinclude -dotfile -e -elseif -em -enum -example -exception -exceptions -file -htmlinclude -if -ifnot -include -link -namespace -p -package -ref -relates -relatesalso -retval -throw -throws -verbinclude -version -xrefitem -param -image -defgroup -page -paragraph -section -struct -subsection -subsubsection -union -weakgroup -addindex -brief -bug -date -deprecated -fn -ingroup -line -mainpage -name -overload -par -short -skip -skipline -typedef -until -var -abstract badcode basename bold +brief +bug +c +callgraph caption chapter +class +code codeline +compat +cond +contentspage +copydoc +corelib +date +def +defgroup +deprecated +dontinclude +dot +dotfile dots +e +else +elseif +em endabstract endchapter +endcode +endcond +enddot endfootnote +endhtmlonly +endif +endlatexonly endlegalese +endlink endlist +endmanonly endomit endpart endquotation @@ -135,85 +65,155 @@ endsection3 endsection4 endsidebar endtable +endverbatim +endxmlonly +enum +example +exception +exceptions expire +externalpage +file +fn footnote generatelist granularity +group +gui header +headerfile +hideinitializer +htmlinclude +htmlonly i +if +ifnot +image +include index +indexpage +ingroup +inheaderfile inlineimage +inmodule +inpublicgroup +interface +internal +invariant keyword l +latexonly legalese +li +line +link list +macro +mainclass +mainpage +manonly meta +module +n +name +namespace +network newcode +nextpage +nonreentrant +nosubgrouping +note o +obsolete oldcode omit omitvalue +only +opengl +overload +p +package +page +par +paragraph +param part +post +pre +preliminary +previouspage printline printto printuntil +property +qt3support +qtestlib quotation quotefile quotefromfile quotefunction raw +reentrant +ref +reimp +relates +relatesalso +remarks +return +returns +retval row +sa +section section1 section2 section3 section4 +see +service +short +showinitializer sidebar +since +skip +skipline skipto skipuntil snippet +sql +startpage +struct sub +subsection +subsubsection +subtitle sup +svg table tableofcontents target +test +threadsafe +throw +throws +title +todo tt +typedef +uitools underline unicode +union +until value -contentspage -externalpage -group -headerfile -indexpage -inheaderfile -macro -module -nextpage -previouspage -property -reimp -service -startpage +var variable -compat -inmodule -mainclass -nonreentrant -obsolete -preliminary -inpublicgroup -reentrant -subtitle -threadsafe -title -corelib -uitools -gui -network -opengl -qt3support -svg -sql -qtestlib +verbatim +verbinclude +version +warning +weakgroup webkit xml +xmlonly +xrefitem From ed168b2e053dd18d606769ba929b2d3457088eb7 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 31 Mar 2016 11:03:21 +0200 Subject: [PATCH 57/72] CppTools: Update known qdoc commands ...from http://doc-snapshots.qt.io/qt5-5.7/27-qdoc-commands-alphabetical.html /*! * New qdoc that are highlighted and completed: * \annotatedlist * \default * \div * \inherits * \inqmlmodule * \instantiates * \noautolist * \qmlabstract * \qmlattachedproperty * \qmlattachedsignal * \qmlbasictype * \qmlclass * \qmlmethod * \qmlmodule * \qmlproperty * \qmlsignal * \qmltype * \span * \uicontrol */ Change-Id: I55b8e83814a6008b6580a6e50ca780b257d4197b Reviewed-by: David Schulz Reviewed-by: Orgad Shaneh --- src/plugins/cpptools/cppdoxygen.cpp | 394 +++++++++++++++++++++++++- src/plugins/cpptools/cppdoxygen.h | 19 ++ src/plugins/cpptools/cppdoxygen.kwgen | 19 ++ 3 files changed, 426 insertions(+), 6 deletions(-) diff --git a/src/plugins/cpptools/cppdoxygen.cpp b/src/plugins/cpptools/cppdoxygen.cpp index f10e41c52e1..a6fdee07105 100644 --- a/src/plugins/cpptools/cppdoxygen.cpp +++ b/src/plugins/cpptools/cppdoxygen.cpp @@ -67,6 +67,7 @@ static const char *doxy_token_spell[] = { "addindex", "addtogroup", "anchor", + "annotatedlist", "arg", "attention", "author", @@ -90,8 +91,10 @@ static const char *doxy_token_spell[] = { "corelib", "date", "def", + "default", "defgroup", "deprecated", + "div", "dontinclude", "dot", "dotfile", @@ -152,9 +155,12 @@ static const char *doxy_token_spell[] = { "indexpage", "ingroup", "inheaderfile", + "inherits", "inlineimage", "inmodule", "inpublicgroup", + "inqmlmodule", + "instantiates", "interface", "internal", "invariant", @@ -178,6 +184,7 @@ static const char *doxy_token_spell[] = { "network", "newcode", "nextpage", + "noautolist", "nonreentrant", "nosubgrouping", "note", @@ -204,6 +211,16 @@ static const char *doxy_token_spell[] = { "printto", "printuntil", "property", + "qmlabstract", + "qmlattachedproperty", + "qmlattachedsignal", + "qmlbasictype", + "qmlclass", + "qmlmethod", + "qmlmodule", + "qmlproperty", + "qmlsignal", + "qmltype", "qt3support", "qtestlib", "quotation", @@ -238,6 +255,7 @@ static const char *doxy_token_spell[] = { "skipto", "skipuntil", "snippet", + "span", "sql", "startpage", "struct", @@ -258,6 +276,7 @@ static const char *doxy_token_spell[] = { "todo", "tt", "typedef", + "uicontrol", "uitools", "underline", "unicode", @@ -366,6 +385,11 @@ static inline int classify3(const QChar *s) { return T_DOXY_DEF; } } + else if (s[1].unicode() == 'i') { + if (s[2].unicode() == 'v') { + return T_DOXY_DIV; + } + } else if (s[1].unicode() == 'o') { if (s[2].unicode() == 't') { return T_DOXY_DOT; @@ -602,6 +626,13 @@ static inline int classify4(const QChar *s) { } } } + else if (s[1].unicode() == 'p') { + if (s[2].unicode() == 'a') { + if (s[3].unicode() == 'n') { + return T_DOXY_SPAN; + } + } + } } else if (s[0].unicode() == 't') { if (s[1].unicode() == 'e') { @@ -1082,7 +1113,20 @@ static inline int classify7(const QChar *s) { } } else if (s[0].unicode() == 'd') { - if (s[1].unicode() == 'o') { + if (s[1].unicode() == 'e') { + if (s[2].unicode() == 'f') { + if (s[3].unicode() == 'a') { + if (s[4].unicode() == 'u') { + if (s[5].unicode() == 'l') { + if (s[6].unicode() == 't') { + return T_DOXY_DEFAULT; + } + } + } + } + } + } + else if (s[1].unicode() == 'o') { if (s[2].unicode() == 't') { if (s[3].unicode() == 'f') { if (s[4].unicode() == 'i') { @@ -1286,6 +1330,21 @@ static inline int classify7(const QChar *s) { } } } + else if (s[0].unicode() == 'q') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 't') { + if (s[4].unicode() == 'y') { + if (s[5].unicode() == 'p') { + if (s[6].unicode() == 'e') { + return T_DOXY_QMLTYPE; + } + } + } + } + } + } + } else if (s[0].unicode() == 'r') { if (s[1].unicode() == 'e') { if (s[2].unicode() == 'l') { @@ -1603,7 +1662,20 @@ static inline int classify8(const QChar *s) { } else if (s[0].unicode() == 'i') { if (s[1].unicode() == 'n') { - if (s[2].unicode() == 'm') { + if (s[2].unicode() == 'h') { + if (s[3].unicode() == 'e') { + if (s[4].unicode() == 'r') { + if (s[5].unicode() == 'i') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 's') { + return T_DOXY_INHERITS; + } + } + } + } + } + } + else if (s[2].unicode() == 'm') { if (s[3].unicode() == 'o') { if (s[4].unicode() == 'd') { if (s[5].unicode() == 'u') { @@ -1732,7 +1804,22 @@ static inline int classify8(const QChar *s) { } } else if (s[0].unicode() == 'q') { - if (s[1].unicode() == 't') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'c') { + if (s[4].unicode() == 'l') { + if (s[5].unicode() == 'a') { + if (s[6].unicode() == 's') { + if (s[7].unicode() == 's') { + return T_DOXY_QMLCLASS; + } + } + } + } + } + } + } + else if (s[1].unicode() == 't') { if (s[2].unicode() == 'e') { if (s[3].unicode() == 's') { if (s[4].unicode() == 't') { @@ -2076,7 +2163,48 @@ static inline int classify9(const QChar *s) { } } else if (s[0].unicode() == 'q') { - if (s[1].unicode() == 'u') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'm') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'h') { + if (s[7].unicode() == 'o') { + if (s[8].unicode() == 'd') { + return T_DOXY_QMLMETHOD; + } + } + } + } + } + else if (s[4].unicode() == 'o') { + if (s[5].unicode() == 'd') { + if (s[6].unicode() == 'u') { + if (s[7].unicode() == 'l') { + if (s[8].unicode() == 'e') { + return T_DOXY_QMLMODULE; + } + } + } + } + } + } + else if (s[3].unicode() == 's') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'g') { + if (s[6].unicode() == 'n') { + if (s[7].unicode() == 'a') { + if (s[8].unicode() == 'l') { + return T_DOXY_QMLSIGNAL; + } + } + } + } + } + } + } + } + else if (s[1].unicode() == 'u') { if (s[2].unicode() == 'o') { if (s[3].unicode() == 't') { if (s[4].unicode() == 'a') { @@ -2161,7 +2289,24 @@ static inline int classify9(const QChar *s) { } } else if (s[0].unicode() == 'u') { - if (s[1].unicode() == 'n') { + if (s[1].unicode() == 'i') { + if (s[2].unicode() == 'c') { + if (s[3].unicode() == 'o') { + if (s[4].unicode() == 'n') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'r') { + if (s[7].unicode() == 'o') { + if (s[8].unicode() == 'l') { + return T_DOXY_UICONTROL; + } + } + } + } + } + } + } + } + else if (s[1].unicode() == 'n') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'r') { @@ -2350,6 +2495,27 @@ static inline int classify10(const QChar *s) { } } } + else if (s[0].unicode() == 'n') { + if (s[1].unicode() == 'o') { + if (s[2].unicode() == 'a') { + if (s[3].unicode() == 'u') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 'o') { + if (s[6].unicode() == 'l') { + if (s[7].unicode() == 'i') { + if (s[8].unicode() == 's') { + if (s[9].unicode() == 't') { + return T_DOXY_NOAUTOLIST; + } + } + } + } + } + } + } + } + } + } else if (s[0].unicode() == 'p') { if (s[1].unicode() == 'r') { if (s[2].unicode() == 'i') { @@ -2645,6 +2811,25 @@ static inline int classify11(const QChar *s) { } } } + else if (s[2].unicode() == 'q') { + if (s[3].unicode() == 'm') { + if (s[4].unicode() == 'l') { + if (s[5].unicode() == 'm') { + if (s[6].unicode() == 'o') { + if (s[7].unicode() == 'd') { + if (s[8].unicode() == 'u') { + if (s[9].unicode() == 'l') { + if (s[10].unicode() == 'e') { + return T_DOXY_INQMLMODULE; + } + } + } + } + } + } + } + } + } } } else if (s[0].unicode() == 'p') { @@ -2670,6 +2855,46 @@ static inline int classify11(const QChar *s) { } } } + else if (s[0].unicode() == 'q') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'a') { + if (s[4].unicode() == 'b') { + if (s[5].unicode() == 's') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 'r') { + if (s[8].unicode() == 'a') { + if (s[9].unicode() == 'c') { + if (s[10].unicode() == 't') { + return T_DOXY_QMLABSTRACT; + } + } + } + } + } + } + } + } + else if (s[3].unicode() == 'p') { + if (s[4].unicode() == 'r') { + if (s[5].unicode() == 'o') { + if (s[6].unicode() == 'p') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'r') { + if (s[9].unicode() == 't') { + if (s[10].unicode() == 'y') { + return T_DOXY_QMLPROPERTY; + } + } + } + } + } + } + } + } + } + } + } else if (s[0].unicode() == 'r') { if (s[1].unicode() == 'e') { if (s[2].unicode() == 'l') { @@ -2860,6 +3085,27 @@ static inline int classify12(const QChar *s) { } } } + else if (s[2].unicode() == 's') { + if (s[3].unicode() == 't') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 'n') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 'i') { + if (s[8].unicode() == 'a') { + if (s[9].unicode() == 't') { + if (s[10].unicode() == 'e') { + if (s[11].unicode() == 's') { + return T_DOXY_INSTANTIATES; + } + } + } + } + } + } + } + } + } + } } } else if (s[0].unicode() == 'n') { @@ -2912,11 +3158,63 @@ static inline int classify12(const QChar *s) { } } } + else if (s[0].unicode() == 'q') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'b') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 's') { + if (s[6].unicode() == 'i') { + if (s[7].unicode() == 'c') { + if (s[8].unicode() == 't') { + if (s[9].unicode() == 'y') { + if (s[10].unicode() == 'p') { + if (s[11].unicode() == 'e') { + return T_DOXY_QMLBASICTYPE; + } + } + } + } + } + } + } + } + } + } + } + } return T_DOXY_IDENTIFIER; } static inline int classify13(const QChar *s) { - if (s[0].unicode() == 'i') { + if (s[0].unicode() == 'a') { + if (s[1].unicode() == 'n') { + if (s[2].unicode() == 'n') { + if (s[3].unicode() == 'o') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 'a') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'd') { + if (s[9].unicode() == 'l') { + if (s[10].unicode() == 'i') { + if (s[11].unicode() == 's') { + if (s[12].unicode() == 't') { + return T_DOXY_ANNOTATEDLIST; + } + } + } + } + } + } + } + } + } + } + } + } + } + else if (s[0].unicode() == 'i') { if (s[1].unicode() == 'n') { if (s[2].unicode() == 'p') { if (s[3].unicode() == 'u') { @@ -3139,6 +3437,88 @@ static inline int classify15(const QChar *s) { return T_DOXY_IDENTIFIER; } +static inline int classify17(const QChar *s) { + if (s[0].unicode() == 'q') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'a') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'a') { + if (s[7].unicode() == 'c') { + if (s[8].unicode() == 'h') { + if (s[9].unicode() == 'e') { + if (s[10].unicode() == 'd') { + if (s[11].unicode() == 's') { + if (s[12].unicode() == 'i') { + if (s[13].unicode() == 'g') { + if (s[14].unicode() == 'n') { + if (s[15].unicode() == 'a') { + if (s[16].unicode() == 'l') { + return T_DOXY_QMLATTACHEDSIGNAL; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return T_DOXY_IDENTIFIER; +} + +static inline int classify19(const QChar *s) { + if (s[0].unicode() == 'q') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'a') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'a') { + if (s[7].unicode() == 'c') { + if (s[8].unicode() == 'h') { + if (s[9].unicode() == 'e') { + if (s[10].unicode() == 'd') { + if (s[11].unicode() == 'p') { + if (s[12].unicode() == 'r') { + if (s[13].unicode() == 'o') { + if (s[14].unicode() == 'p') { + if (s[15].unicode() == 'e') { + if (s[16].unicode() == 'r') { + if (s[17].unicode() == 't') { + if (s[18].unicode() == 'y') { + return T_DOXY_QMLATTACHEDPROPERTY; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return T_DOXY_IDENTIFIER; +} + int CppTools::classifyDoxygenTag(const QChar *s, int n) { switch (n) { case 1: return classify1(s); @@ -3155,6 +3535,8 @@ int CppTools::classifyDoxygenTag(const QChar *s, int n) { case 12: return classify12(s); case 13: return classify13(s); case 15: return classify15(s); + case 17: return classify17(s); + case 19: return classify19(s); default: return T_DOXY_IDENTIFIER; } // switch } diff --git a/src/plugins/cpptools/cppdoxygen.h b/src/plugins/cpptools/cppdoxygen.h index 0a62b5a1f1d..b7da6c146b6 100644 --- a/src/plugins/cpptools/cppdoxygen.h +++ b/src/plugins/cpptools/cppdoxygen.h @@ -40,6 +40,7 @@ enum DoxygenReservedWord { T_DOXY_ADDINDEX, T_DOXY_ADDTOGROUP, T_DOXY_ANCHOR, + T_DOXY_ANNOTATEDLIST, T_DOXY_ARG, T_DOXY_ATTENTION, T_DOXY_AUTHOR, @@ -63,8 +64,10 @@ enum DoxygenReservedWord { T_DOXY_CORELIB, T_DOXY_DATE, T_DOXY_DEF, + T_DOXY_DEFAULT, T_DOXY_DEFGROUP, T_DOXY_DEPRECATED, + T_DOXY_DIV, T_DOXY_DONTINCLUDE, T_DOXY_DOT, T_DOXY_DOTFILE, @@ -125,9 +128,12 @@ enum DoxygenReservedWord { T_DOXY_INDEXPAGE, T_DOXY_INGROUP, T_DOXY_INHEADERFILE, + T_DOXY_INHERITS, T_DOXY_INLINEIMAGE, T_DOXY_INMODULE, T_DOXY_INPUBLICGROUP, + T_DOXY_INQMLMODULE, + T_DOXY_INSTANTIATES, T_DOXY_INTERFACE, T_DOXY_INTERNAL, T_DOXY_INVARIANT, @@ -151,6 +157,7 @@ enum DoxygenReservedWord { T_DOXY_NETWORK, T_DOXY_NEWCODE, T_DOXY_NEXTPAGE, + T_DOXY_NOAUTOLIST, T_DOXY_NONREENTRANT, T_DOXY_NOSUBGROUPING, T_DOXY_NOTE, @@ -177,6 +184,16 @@ enum DoxygenReservedWord { T_DOXY_PRINTTO, T_DOXY_PRINTUNTIL, T_DOXY_PROPERTY, + T_DOXY_QMLABSTRACT, + T_DOXY_QMLATTACHEDPROPERTY, + T_DOXY_QMLATTACHEDSIGNAL, + T_DOXY_QMLBASICTYPE, + T_DOXY_QMLCLASS, + T_DOXY_QMLMETHOD, + T_DOXY_QMLMODULE, + T_DOXY_QMLPROPERTY, + T_DOXY_QMLSIGNAL, + T_DOXY_QMLTYPE, T_DOXY_QT3SUPPORT, T_DOXY_QTESTLIB, T_DOXY_QUOTATION, @@ -211,6 +228,7 @@ enum DoxygenReservedWord { T_DOXY_SKIPTO, T_DOXY_SKIPUNTIL, T_DOXY_SNIPPET, + T_DOXY_SPAN, T_DOXY_SQL, T_DOXY_STARTPAGE, T_DOXY_STRUCT, @@ -231,6 +249,7 @@ enum DoxygenReservedWord { T_DOXY_TODO, T_DOXY_TT, T_DOXY_TYPEDEF, + T_DOXY_UICONTROL, T_DOXY_UITOOLS, T_DOXY_UNDERLINE, T_DOXY_UNICODE, diff --git a/src/plugins/cpptools/cppdoxygen.kwgen b/src/plugins/cpptools/cppdoxygen.kwgen index 7c22841f926..000306cd41d 100644 --- a/src/plugins/cpptools/cppdoxygen.kwgen +++ b/src/plugins/cpptools/cppdoxygen.kwgen @@ -9,6 +9,7 @@ abstract addindex addtogroup anchor +annotatedlist arg attention author @@ -32,8 +33,10 @@ copydoc corelib date def +default defgroup deprecated +div dontinclude dot dotfile @@ -94,9 +97,12 @@ index indexpage ingroup inheaderfile +inherits inlineimage inmodule inpublicgroup +inqmlmodule +instantiates interface internal invariant @@ -120,6 +126,7 @@ namespace network newcode nextpage +noautolist nonreentrant nosubgrouping note @@ -146,6 +153,16 @@ printline printto printuntil property +qmlabstract +qmlattachedproperty +qmlattachedsignal +qmlbasictype +qmlclass +qmlmethod +qmlmodule +qmlproperty +qmlsignal +qmltype qt3support qtestlib quotation @@ -180,6 +197,7 @@ skipline skipto skipuntil snippet +span sql startpage struct @@ -200,6 +218,7 @@ title todo tt typedef +uicontrol uitools underline unicode From eeb566ef74005181c32882fc611433d0f5694b47 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 31 Mar 2016 11:17:59 +0200 Subject: [PATCH 58/72] CppTools: Update known doxygen commands ...from https://www.stack.nl/~dimitri/doxygen/manual/commands.html /*! * New doxygen that are highlighted and completed: * \authors * \callergraph * \category * \cite * \copybrief * \copydetails * \copyright * \details * \diafile * \dir * \docbookonly * \enddocbookonly * \endinternal * \endmsc * \endparblock * \endrtfonly * \endsecreflist * \enduml * \extends * \hidecallergraph * \hidecallgraph * \idlexcept * \implements * \includelineno * \latexinclude * \memberof * \msc * \mscfile * \parblock * \private * \privatesection * \protected * \protectedsection * \protocol * \public * \publicsection * \pure * \refitem * \related * \relatedalso * \remark * \result * \rtfonly * \secreflist * \startuml * \subpage * \tparam * \vhdlflow */ Task-number: QTCREATORBUG-10145 Change-Id: I7cc3ff0d6d58bbd188ca8056302fda790dcbf0ce Reviewed-by: David Schulz Reviewed-by: Orgad Shaneh --- src/plugins/cpptools/cppdoxygen.cpp | 832 +++++++++++++++++++++++++- src/plugins/cpptools/cppdoxygen.h | 48 ++ src/plugins/cpptools/cppdoxygen.kwgen | 48 ++ 3 files changed, 913 insertions(+), 15 deletions(-) diff --git a/src/plugins/cpptools/cppdoxygen.cpp b/src/plugins/cpptools/cppdoxygen.cpp index a6fdee07105..363e6840107 100644 --- a/src/plugins/cpptools/cppdoxygen.cpp +++ b/src/plugins/cpptools/cppdoxygen.cpp @@ -71,6 +71,7 @@ static const char *doxy_token_spell[] = { "arg", "attention", "author", + "authors", "b", "badcode", "basename", @@ -78,23 +79,33 @@ static const char *doxy_token_spell[] = { "brief", "bug", "c", + "callergraph", "callgraph", "caption", + "category", "chapter", + "cite", "class", "code", "codeline", "compat", "cond", "contentspage", + "copybrief", + "copydetails", "copydoc", + "copyright", "corelib", "date", "def", "default", "defgroup", "deprecated", + "details", + "diafile", + "dir", "div", + "docbookonly", "dontinclude", "dot", "dotfile", @@ -107,25 +118,32 @@ static const char *doxy_token_spell[] = { "endchapter", "endcode", "endcond", + "enddocbookonly", "enddot", "endfootnote", "endhtmlonly", "endif", + "endinternal", "endlatexonly", "endlegalese", "endlink", "endlist", "endmanonly", + "endmsc", "endomit", + "endparblock", "endpart", "endquotation", "endraw", + "endrtfonly", + "endsecreflist", "endsection1", "endsection2", "endsection3", "endsection4", "endsidebar", "endtable", + "enduml", "endverbatim", "endxmlonly", "enum", @@ -133,6 +151,7 @@ static const char *doxy_token_spell[] = { "exception", "exceptions", "expire", + "extends", "externalpage", "file", "fn", @@ -143,14 +162,19 @@ static const char *doxy_token_spell[] = { "gui", "header", "headerfile", + "hidecallergraph", + "hidecallgraph", "hideinitializer", "htmlinclude", "htmlonly", "i", + "idlexcept", "if", "ifnot", "image", + "implements", "include", + "includelineno", "index", "indexpage", "ingroup", @@ -166,6 +190,7 @@ static const char *doxy_token_spell[] = { "invariant", "keyword", "l", + "latexinclude", "latexonly", "legalese", "li", @@ -176,8 +201,11 @@ static const char *doxy_token_spell[] = { "mainclass", "mainpage", "manonly", + "memberof", "meta", "module", + "msc", + "mscfile", "n", "name", "namespace", @@ -202,6 +230,7 @@ static const char *doxy_token_spell[] = { "par", "paragraph", "param", + "parblock", "part", "post", "pre", @@ -210,7 +239,15 @@ static const char *doxy_token_spell[] = { "printline", "printto", "printuntil", + "private", + "privatesection", "property", + "protected", + "protectedsection", + "protocol", + "public", + "publicsection", + "pure", "qmlabstract", "qmlattachedproperty", "qmlattachedsignal", @@ -230,15 +267,22 @@ static const char *doxy_token_spell[] = { "raw", "reentrant", "ref", + "refitem", "reimp", + "related", + "relatedalso", "relates", "relatesalso", + "remark", "remarks", + "result", "return", "returns", "retval", "row", + "rtfonly", "sa", + "secreflist", "section", "section1", "section2", @@ -258,8 +302,10 @@ static const char *doxy_token_spell[] = { "span", "sql", "startpage", + "startuml", "struct", "sub", + "subpage", "subsection", "subsubsection", "subtitle", @@ -274,6 +320,7 @@ static const char *doxy_token_spell[] = { "throws", "title", "todo", + "tparam", "tt", "typedef", "uicontrol", @@ -288,6 +335,7 @@ static const char *doxy_token_spell[] = { "verbatim", "verbinclude", "version", + "vhdlflow", "warning", "weakgroup", "webkit", @@ -386,7 +434,10 @@ static inline int classify3(const QChar *s) { } } else if (s[1].unicode() == 'i') { - if (s[2].unicode() == 'v') { + if (s[2].unicode() == 'r') { + return T_DOXY_DIR; + } + else if (s[2].unicode() == 'v') { return T_DOXY_DIV; } } @@ -403,6 +454,13 @@ static inline int classify3(const QChar *s) { } } } + else if (s[0].unicode() == 'm') { + if (s[1].unicode() == 's') { + if (s[2].unicode() == 'c') { + return T_DOXY_MSC; + } + } + } else if (s[0].unicode() == 'p') { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'r') { @@ -485,7 +543,14 @@ static inline int classify4(const QChar *s) { } } else if (s[0].unicode() == 'c') { - if (s[1].unicode() == 'o') { + if (s[1].unicode() == 'i') { + if (s[2].unicode() == 't') { + if (s[3].unicode() == 'e') { + return T_DOXY_CITE; + } + } + } + else if (s[1].unicode() == 'o') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'e') { return T_DOXY_CODE; @@ -617,6 +682,13 @@ static inline int classify4(const QChar *s) { } } } + else if (s[1].unicode() == 'u') { + if (s[2].unicode() == 'r') { + if (s[3].unicode() == 'e') { + return T_DOXY_PURE; + } + } + } } else if (s[0].unicode() == 's') { if (s[1].unicode() == 'k') { @@ -900,6 +972,13 @@ static inline int classify6(const QChar *s) { } } } + else if (s[3].unicode() == 'm') { + if (s[4].unicode() == 's') { + if (s[5].unicode() == 'c') { + return T_DOXY_ENDMSC; + } + } + } else if (s[3].unicode() == 'r') { if (s[4].unicode() == 'a') { if (s[5].unicode() == 'w') { @@ -907,6 +986,13 @@ static inline int classify6(const QChar *s) { } } } + else if (s[3].unicode() == 'u') { + if (s[4].unicode() == 'm') { + if (s[5].unicode() == 'l') { + return T_DOXY_ENDUML; + } + } + } } } else if (s[1].unicode() == 'x') { @@ -960,9 +1046,40 @@ static inline int classify6(const QChar *s) { } } } + else if (s[0].unicode() == 'p') { + if (s[1].unicode() == 'u') { + if (s[2].unicode() == 'b') { + if (s[3].unicode() == 'l') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'c') { + return T_DOXY_PUBLIC; + } + } + } + } + } + } else if (s[0].unicode() == 'r') { if (s[1].unicode() == 'e') { - if (s[2].unicode() == 't') { + if (s[2].unicode() == 'm') { + if (s[3].unicode() == 'a') { + if (s[4].unicode() == 'r') { + if (s[5].unicode() == 'k') { + return T_DOXY_REMARK; + } + } + } + } + else if (s[2].unicode() == 's') { + if (s[3].unicode() == 'u') { + if (s[4].unicode() == 'l') { + if (s[5].unicode() == 't') { + return T_DOXY_RESULT; + } + } + } + } + else if (s[2].unicode() == 't') { if (s[3].unicode() == 'u') { if (s[4].unicode() == 'r') { if (s[5].unicode() == 'n') { @@ -1027,6 +1144,17 @@ static inline int classify6(const QChar *s) { } } } + else if (s[1].unicode() == 'p') { + if (s[2].unicode() == 'a') { + if (s[3].unicode() == 'r') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 'm') { + return T_DOXY_TPARAM; + } + } + } + } + } } else if (s[0].unicode() == 'w') { if (s[1].unicode() == 'e') { @@ -1045,7 +1173,22 @@ static inline int classify6(const QChar *s) { } static inline int classify7(const QChar *s) { - if (s[0].unicode() == 'b') { + if (s[0].unicode() == 'a') { + if (s[1].unicode() == 'u') { + if (s[2].unicode() == 't') { + if (s[3].unicode() == 'h') { + if (s[4].unicode() == 'o') { + if (s[5].unicode() == 'r') { + if (s[6].unicode() == 's') { + return T_DOXY_AUTHORS; + } + } + } + } + } + } + } + else if (s[0].unicode() == 'b') { if (s[1].unicode() == 'a') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'c') { @@ -1125,6 +1268,30 @@ static inline int classify7(const QChar *s) { } } } + else if (s[2].unicode() == 't') { + if (s[3].unicode() == 'a') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'l') { + if (s[6].unicode() == 's') { + return T_DOXY_DETAILS; + } + } + } + } + } + } + else if (s[1].unicode() == 'i') { + if (s[2].unicode() == 'a') { + if (s[3].unicode() == 'f') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'l') { + if (s[6].unicode() == 'e') { + return T_DOXY_DIAFILE; + } + } + } + } + } } else if (s[1].unicode() == 'o') { if (s[2].unicode() == 't') { @@ -1203,6 +1370,17 @@ static inline int classify7(const QChar *s) { } } } + else if (s[2].unicode() == 't') { + if (s[3].unicode() == 'e') { + if (s[4].unicode() == 'n') { + if (s[5].unicode() == 'd') { + if (s[6].unicode() == 's') { + return T_DOXY_EXTENDS; + } + } + } + } + } } } else if (s[0].unicode() == 'i') { @@ -1260,6 +1438,19 @@ static inline int classify7(const QChar *s) { } } } + else if (s[1].unicode() == 's') { + if (s[2].unicode() == 'c') { + if (s[3].unicode() == 'f') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'l') { + if (s[6].unicode() == 'e') { + return T_DOXY_MSCFILE; + } + } + } + } + } + } } else if (s[0].unicode() == 'n') { if (s[1].unicode() == 'e') { @@ -1327,6 +1518,15 @@ static inline int classify7(const QChar *s) { } } } + else if (s[3].unicode() == 'v') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'e') { + return T_DOXY_PRIVATE; + } + } + } + } } } } @@ -1347,11 +1547,25 @@ static inline int classify7(const QChar *s) { } else if (s[0].unicode() == 'r') { if (s[1].unicode() == 'e') { - if (s[2].unicode() == 'l') { + if (s[2].unicode() == 'f') { + if (s[3].unicode() == 'i') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 'e') { + if (s[6].unicode() == 'm') { + return T_DOXY_REFITEM; + } + } + } + } + } + else if (s[2].unicode() == 'l') { if (s[3].unicode() == 'a') { if (s[4].unicode() == 't') { if (s[5].unicode() == 'e') { - if (s[6].unicode() == 's') { + if (s[6].unicode() == 'd') { + return T_DOXY_RELATED; + } + else if (s[6].unicode() == 's') { return T_DOXY_RELATES; } } @@ -1381,6 +1595,19 @@ static inline int classify7(const QChar *s) { } } } + else if (s[1].unicode() == 't') { + if (s[2].unicode() == 'f') { + if (s[3].unicode() == 'o') { + if (s[4].unicode() == 'n') { + if (s[5].unicode() == 'l') { + if (s[6].unicode() == 'y') { + return T_DOXY_RTFONLY; + } + } + } + } + } + } } else if (s[0].unicode() == 's') { if (s[1].unicode() == 'e') { @@ -1433,6 +1660,19 @@ static inline int classify7(const QChar *s) { } } } + else if (s[1].unicode() == 'u') { + if (s[2].unicode() == 'b') { + if (s[3].unicode() == 'p') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 'g') { + if (s[6].unicode() == 'e') { + return T_DOXY_SUBPAGE; + } + } + } + } + } + } } else if (s[0].unicode() == 't') { if (s[1].unicode() == 'y') { @@ -1576,7 +1816,22 @@ static inline int classify8(const QChar *s) { } } else if (s[0].unicode() == 'c') { - if (s[1].unicode() == 'o') { + if (s[1].unicode() == 'a') { + if (s[2].unicode() == 't') { + if (s[3].unicode() == 'e') { + if (s[4].unicode() == 'g') { + if (s[5].unicode() == 'o') { + if (s[6].unicode() == 'r') { + if (s[7].unicode() == 'y') { + return T_DOXY_CATEGORY; + } + } + } + } + } + } + } + else if (s[1].unicode() == 'o') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'l') { @@ -1736,6 +1991,21 @@ static inline int classify8(const QChar *s) { } } } + else if (s[1].unicode() == 'e') { + if (s[2].unicode() == 'm') { + if (s[3].unicode() == 'b') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'r') { + if (s[6].unicode() == 'o') { + if (s[7].unicode() == 'f') { + return T_DOXY_MEMBEROF; + } + } + } + } + } + } + } } else if (s[0].unicode() == 'n') { if (s[1].unicode() == 'e') { @@ -1787,7 +2057,22 @@ static inline int classify8(const QChar *s) { } } else if (s[0].unicode() == 'p') { - if (s[1].unicode() == 'r') { + if (s[1].unicode() == 'a') { + if (s[2].unicode() == 'r') { + if (s[3].unicode() == 'b') { + if (s[4].unicode() == 'l') { + if (s[5].unicode() == 'o') { + if (s[6].unicode() == 'c') { + if (s[7].unicode() == 'k') { + return T_DOXY_PARBLOCK; + } + } + } + } + } + } + } + else if (s[1].unicode() == 'r') { if (s[2].unicode() == 'o') { if (s[3].unicode() == 'p') { if (s[4].unicode() == 'e') { @@ -1800,6 +2085,17 @@ static inline int classify8(const QChar *s) { } } } + else if (s[3].unicode() == 't') { + if (s[4].unicode() == 'o') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 'o') { + if (s[7].unicode() == 'l') { + return T_DOXY_PROTOCOL; + } + } + } + } + } } } } @@ -1875,6 +2171,21 @@ static inline int classify8(const QChar *s) { } } } + else if (s[1].unicode() == 't') { + if (s[2].unicode() == 'a') { + if (s[3].unicode() == 'r') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 'u') { + if (s[6].unicode() == 'm') { + if (s[7].unicode() == 'l') { + return T_DOXY_STARTUML; + } + } + } + } + } + } + } else if (s[1].unicode() == 'u') { if (s[2].unicode() == 'b') { if (s[3].unicode() == 't') { @@ -1922,6 +2233,21 @@ static inline int classify8(const QChar *s) { } } } + else if (s[1].unicode() == 'h') { + if (s[2].unicode() == 'd') { + if (s[3].unicode() == 'l') { + if (s[4].unicode() == 'f') { + if (s[5].unicode() == 'l') { + if (s[6].unicode() == 'o') { + if (s[7].unicode() == 'w') { + return T_DOXY_VHDLFLOW; + } + } + } + } + } + } + } } else if (s[0].unicode() == 'x') { if (s[1].unicode() == 'r') { @@ -1981,6 +2307,34 @@ static inline int classify9(const QChar *s) { } } } + else if (s[1].unicode() == 'o') { + if (s[2].unicode() == 'p') { + if (s[3].unicode() == 'y') { + if (s[4].unicode() == 'b') { + if (s[5].unicode() == 'r') { + if (s[6].unicode() == 'i') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'f') { + return T_DOXY_COPYBRIEF; + } + } + } + } + } + else if (s[4].unicode() == 'r') { + if (s[5].unicode() == 'i') { + if (s[6].unicode() == 'g') { + if (s[7].unicode() == 'h') { + if (s[8].unicode() == 't') { + return T_DOXY_COPYRIGHT; + } + } + } + } + } + } + } + } } else if (s[0].unicode() == 'e') { if (s[1].unicode() == 'x') { @@ -2002,7 +2356,24 @@ static inline int classify9(const QChar *s) { } } else if (s[0].unicode() == 'i') { - if (s[1].unicode() == 'n') { + if (s[1].unicode() == 'd') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'e') { + if (s[4].unicode() == 'x') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 'p') { + if (s[8].unicode() == 't') { + return T_DOXY_IDLEXCEPT; + } + } + } + } + } + } + } + } + else if (s[1].unicode() == 'n') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'e') { if (s[4].unicode() == 'x') { @@ -2160,6 +2531,21 @@ static inline int classify9(const QChar *s) { } } } + else if (s[2].unicode() == 'o') { + if (s[3].unicode() == 't') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'd') { + return T_DOXY_PROTECTED; + } + } + } + } + } + } + } } } else if (s[0].unicode() == 'q') { @@ -2422,6 +2808,21 @@ static inline int classify10(const QChar *s) { } } } + else if (s[3].unicode() == 'r') { + if (s[4].unicode() == 't') { + if (s[5].unicode() == 'f') { + if (s[6].unicode() == 'o') { + if (s[7].unicode() == 'n') { + if (s[8].unicode() == 'l') { + if (s[9].unicode() == 'y') { + return T_DOXY_ENDRTFONLY; + } + } + } + } + } + } + } else if (s[3].unicode() == 's') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'd') { @@ -2495,6 +2896,27 @@ static inline int classify10(const QChar *s) { } } } + else if (s[0].unicode() == 'i') { + if (s[1].unicode() == 'm') { + if (s[2].unicode() == 'p') { + if (s[3].unicode() == 'l') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'm') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 'n') { + if (s[8].unicode() == 't') { + if (s[9].unicode() == 's') { + return T_DOXY_IMPLEMENTS; + } + } + } + } + } + } + } + } + } + } else if (s[0].unicode() == 'n') { if (s[1].unicode() == 'o') { if (s[2].unicode() == 'a') { @@ -2559,7 +2981,26 @@ static inline int classify10(const QChar *s) { } } else if (s[0].unicode() == 's') { - if (s[1].unicode() == 'u') { + if (s[1].unicode() == 'e') { + if (s[2].unicode() == 'c') { + if (s[3].unicode() == 'r') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'f') { + if (s[6].unicode() == 'l') { + if (s[7].unicode() == 'i') { + if (s[8].unicode() == 's') { + if (s[9].unicode() == 't') { + return T_DOXY_SECREFLIST; + } + } + } + } + } + } + } + } + } + else if (s[1].unicode() == 'u') { if (s[2].unicode() == 'b') { if (s[3].unicode() == 's') { if (s[4].unicode() == 'e') { @@ -2604,9 +3045,72 @@ static inline int classify10(const QChar *s) { } static inline int classify11(const QChar *s) { - if (s[0].unicode() == 'd') { + if (s[0].unicode() == 'c') { + if (s[1].unicode() == 'a') { + if (s[2].unicode() == 'l') { + if (s[3].unicode() == 'l') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'r') { + if (s[6].unicode() == 'g') { + if (s[7].unicode() == 'r') { + if (s[8].unicode() == 'a') { + if (s[9].unicode() == 'p') { + if (s[10].unicode() == 'h') { + return T_DOXY_CALLERGRAPH; + } + } + } + } + } + } + } + } + } + } + else if (s[1].unicode() == 'o') { + if (s[2].unicode() == 'p') { + if (s[3].unicode() == 'y') { + if (s[4].unicode() == 'd') { + if (s[5].unicode() == 'e') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 'a') { + if (s[8].unicode() == 'i') { + if (s[9].unicode() == 'l') { + if (s[10].unicode() == 's') { + return T_DOXY_COPYDETAILS; + } + } + } + } + } + } + } + } + } + } + } + else if (s[0].unicode() == 'd') { if (s[1].unicode() == 'o') { - if (s[2].unicode() == 'n') { + if (s[2].unicode() == 'c') { + if (s[3].unicode() == 'b') { + if (s[4].unicode() == 'o') { + if (s[5].unicode() == 'o') { + if (s[6].unicode() == 'k') { + if (s[7].unicode() == 'o') { + if (s[8].unicode() == 'n') { + if (s[9].unicode() == 'l') { + if (s[10].unicode() == 'y') { + return T_DOXY_DOCBOOKONLY; + } + } + } + } + } + } + } + } + } + else if (s[2].unicode() == 'n') { if (s[3].unicode() == 't') { if (s[4].unicode() == 'i') { if (s[5].unicode() == 'n') { @@ -2681,6 +3185,23 @@ static inline int classify11(const QChar *s) { } } } + else if (s[3].unicode() == 'i') { + if (s[4].unicode() == 'n') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 'r') { + if (s[8].unicode() == 'n') { + if (s[9].unicode() == 'a') { + if (s[10].unicode() == 'l') { + return T_DOXY_ENDINTERNAL; + } + } + } + } + } + } + } + } else if (s[3].unicode() == 'l') { if (s[4].unicode() == 'e') { if (s[5].unicode() == 'g') { @@ -2698,6 +3219,23 @@ static inline int classify11(const QChar *s) { } } } + else if (s[3].unicode() == 'p') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 'r') { + if (s[6].unicode() == 'b') { + if (s[7].unicode() == 'l') { + if (s[8].unicode() == 'o') { + if (s[9].unicode() == 'c') { + if (s[10].unicode() == 'k') { + return T_DOXY_ENDPARBLOCK; + } + } + } + } + } + } + } + } else if (s[3].unicode() == 's') { if (s[4].unicode() == 'e') { if (s[5].unicode() == 'c') { @@ -2901,7 +3439,18 @@ static inline int classify11(const QChar *s) { if (s[3].unicode() == 'a') { if (s[4].unicode() == 't') { if (s[5].unicode() == 'e') { - if (s[6].unicode() == 's') { + if (s[6].unicode() == 'd') { + if (s[7].unicode() == 'a') { + if (s[8].unicode() == 'l') { + if (s[9].unicode() == 's') { + if (s[10].unicode() == 'o') { + return T_DOXY_RELATEDALSO; + } + } + } + } + } + else if (s[6].unicode() == 's') { if (s[7].unicode() == 'a') { if (s[8].unicode() == 'l') { if (s[9].unicode() == 's') { @@ -3108,6 +3657,31 @@ static inline int classify12(const QChar *s) { } } } + else if (s[0].unicode() == 'l') { + if (s[1].unicode() == 'a') { + if (s[2].unicode() == 't') { + if (s[3].unicode() == 'e') { + if (s[4].unicode() == 'x') { + if (s[5].unicode() == 'i') { + if (s[6].unicode() == 'n') { + if (s[7].unicode() == 'c') { + if (s[8].unicode() == 'l') { + if (s[9].unicode() == 'u') { + if (s[10].unicode() == 'd') { + if (s[11].unicode() == 'e') { + return T_DOXY_LATEXINCLUDE; + } + } + } + } + } + } + } + } + } + } + } + } else if (s[0].unicode() == 'n') { if (s[1].unicode() == 'o') { if (s[2].unicode() == 'n') { @@ -3214,9 +3788,86 @@ static inline int classify13(const QChar *s) { } } } + else if (s[0].unicode() == 'e') { + if (s[1].unicode() == 'n') { + if (s[2].unicode() == 'd') { + if (s[3].unicode() == 's') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 'r') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'f') { + if (s[9].unicode() == 'l') { + if (s[10].unicode() == 'i') { + if (s[11].unicode() == 's') { + if (s[12].unicode() == 't') { + return T_DOXY_ENDSECREFLIST; + } + } + } + } + } + } + } + } + } + } + } + } + } + else if (s[0].unicode() == 'h') { + if (s[1].unicode() == 'i') { + if (s[2].unicode() == 'd') { + if (s[3].unicode() == 'e') { + if (s[4].unicode() == 'c') { + if (s[5].unicode() == 'a') { + if (s[6].unicode() == 'l') { + if (s[7].unicode() == 'l') { + if (s[8].unicode() == 'g') { + if (s[9].unicode() == 'r') { + if (s[10].unicode() == 'a') { + if (s[11].unicode() == 'p') { + if (s[12].unicode() == 'h') { + return T_DOXY_HIDECALLGRAPH; + } + } + } + } + } + } + } + } + } + } + } + } + } else if (s[0].unicode() == 'i') { if (s[1].unicode() == 'n') { - if (s[2].unicode() == 'p') { + if (s[2].unicode() == 'c') { + if (s[3].unicode() == 'l') { + if (s[4].unicode() == 'u') { + if (s[5].unicode() == 'd') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 'l') { + if (s[8].unicode() == 'i') { + if (s[9].unicode() == 'n') { + if (s[10].unicode() == 'e') { + if (s[11].unicode() == 'n') { + if (s[12].unicode() == 'o') { + return T_DOXY_INCLUDELINENO; + } + } + } + } + } + } + } + } + } + } + } + else if (s[2].unicode() == 'p') { if (s[3].unicode() == 'u') { if (s[4].unicode() == 'b') { if (s[5].unicode() == 'l') { @@ -3268,6 +3919,33 @@ static inline int classify13(const QChar *s) { } } } + else if (s[0].unicode() == 'p') { + if (s[1].unicode() == 'u') { + if (s[2].unicode() == 'b') { + if (s[3].unicode() == 'l') { + if (s[4].unicode() == 'i') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 's') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'c') { + if (s[9].unicode() == 't') { + if (s[10].unicode() == 'i') { + if (s[11].unicode() == 'o') { + if (s[12].unicode() == 'n') { + return T_DOXY_PUBLICSECTION; + } + } + } + } + } + } + } + } + } + } + } + } + } else if (s[0].unicode() == 'q') { if (s[1].unicode() == 'u') { if (s[2].unicode() == 'o') { @@ -3340,12 +4018,97 @@ static inline int classify13(const QChar *s) { return T_DOXY_IDENTIFIER; } +static inline int classify14(const QChar *s) { + if (s[0].unicode() == 'e') { + if (s[1].unicode() == 'n') { + if (s[2].unicode() == 'd') { + if (s[3].unicode() == 'd') { + if (s[4].unicode() == 'o') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 'b') { + if (s[7].unicode() == 'o') { + if (s[8].unicode() == 'o') { + if (s[9].unicode() == 'k') { + if (s[10].unicode() == 'o') { + if (s[11].unicode() == 'n') { + if (s[12].unicode() == 'l') { + if (s[13].unicode() == 'y') { + return T_DOXY_ENDDOCBOOKONLY; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + else if (s[0].unicode() == 'p') { + if (s[1].unicode() == 'r') { + if (s[2].unicode() == 'i') { + if (s[3].unicode() == 'v') { + if (s[4].unicode() == 'a') { + if (s[5].unicode() == 't') { + if (s[6].unicode() == 'e') { + if (s[7].unicode() == 's') { + if (s[8].unicode() == 'e') { + if (s[9].unicode() == 'c') { + if (s[10].unicode() == 't') { + if (s[11].unicode() == 'i') { + if (s[12].unicode() == 'o') { + if (s[13].unicode() == 'n') { + return T_DOXY_PRIVATESECTION; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return T_DOXY_IDENTIFIER; +} + static inline int classify15(const QChar *s) { if (s[0].unicode() == 'h') { if (s[1].unicode() == 'i') { if (s[2].unicode() == 'd') { if (s[3].unicode() == 'e') { - if (s[4].unicode() == 'i') { + if (s[4].unicode() == 'c') { + if (s[5].unicode() == 'a') { + if (s[6].unicode() == 'l') { + if (s[7].unicode() == 'l') { + if (s[8].unicode() == 'e') { + if (s[9].unicode() == 'r') { + if (s[10].unicode() == 'g') { + if (s[11].unicode() == 'r') { + if (s[12].unicode() == 'a') { + if (s[13].unicode() == 'p') { + if (s[14].unicode() == 'h') { + return T_DOXY_HIDECALLERGRAPH; + } + } + } + } + } + } + } + } + } + } + } + else if (s[4].unicode() == 'i') { if (s[5].unicode() == 'n') { if (s[6].unicode() == 'i') { if (s[7].unicode() == 't') { @@ -3437,6 +4200,43 @@ static inline int classify15(const QChar *s) { return T_DOXY_IDENTIFIER; } +static inline int classify16(const QChar *s) { + if (s[0].unicode() == 'p') { + if (s[1].unicode() == 'r') { + if (s[2].unicode() == 'o') { + if (s[3].unicode() == 't') { + if (s[4].unicode() == 'e') { + if (s[5].unicode() == 'c') { + if (s[6].unicode() == 't') { + if (s[7].unicode() == 'e') { + if (s[8].unicode() == 'd') { + if (s[9].unicode() == 's') { + if (s[10].unicode() == 'e') { + if (s[11].unicode() == 'c') { + if (s[12].unicode() == 't') { + if (s[13].unicode() == 'i') { + if (s[14].unicode() == 'o') { + if (s[15].unicode() == 'n') { + return T_DOXY_PROTECTEDSECTION; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return T_DOXY_IDENTIFIER; +} + static inline int classify17(const QChar *s) { if (s[0].unicode() == 'q') { if (s[1].unicode() == 'm') { @@ -3534,7 +4334,9 @@ int CppTools::classifyDoxygenTag(const QChar *s, int n) { case 11: return classify11(s); case 12: return classify12(s); case 13: return classify13(s); + case 14: return classify14(s); case 15: return classify15(s); + case 16: return classify16(s); case 17: return classify17(s); case 19: return classify19(s); default: return T_DOXY_IDENTIFIER; diff --git a/src/plugins/cpptools/cppdoxygen.h b/src/plugins/cpptools/cppdoxygen.h index b7da6c146b6..8e523cdbcdf 100644 --- a/src/plugins/cpptools/cppdoxygen.h +++ b/src/plugins/cpptools/cppdoxygen.h @@ -44,6 +44,7 @@ enum DoxygenReservedWord { T_DOXY_ARG, T_DOXY_ATTENTION, T_DOXY_AUTHOR, + T_DOXY_AUTHORS, T_DOXY_B, T_DOXY_BADCODE, T_DOXY_BASENAME, @@ -51,23 +52,33 @@ enum DoxygenReservedWord { T_DOXY_BRIEF, T_DOXY_BUG, T_DOXY_C, + T_DOXY_CALLERGRAPH, T_DOXY_CALLGRAPH, T_DOXY_CAPTION, + T_DOXY_CATEGORY, T_DOXY_CHAPTER, + T_DOXY_CITE, T_DOXY_CLASS, T_DOXY_CODE, T_DOXY_CODELINE, T_DOXY_COMPAT, T_DOXY_COND, T_DOXY_CONTENTSPAGE, + T_DOXY_COPYBRIEF, + T_DOXY_COPYDETAILS, T_DOXY_COPYDOC, + T_DOXY_COPYRIGHT, T_DOXY_CORELIB, T_DOXY_DATE, T_DOXY_DEF, T_DOXY_DEFAULT, T_DOXY_DEFGROUP, T_DOXY_DEPRECATED, + T_DOXY_DETAILS, + T_DOXY_DIAFILE, + T_DOXY_DIR, T_DOXY_DIV, + T_DOXY_DOCBOOKONLY, T_DOXY_DONTINCLUDE, T_DOXY_DOT, T_DOXY_DOTFILE, @@ -80,25 +91,32 @@ enum DoxygenReservedWord { T_DOXY_ENDCHAPTER, T_DOXY_ENDCODE, T_DOXY_ENDCOND, + T_DOXY_ENDDOCBOOKONLY, T_DOXY_ENDDOT, T_DOXY_ENDFOOTNOTE, T_DOXY_ENDHTMLONLY, T_DOXY_ENDIF, + T_DOXY_ENDINTERNAL, T_DOXY_ENDLATEXONLY, T_DOXY_ENDLEGALESE, T_DOXY_ENDLINK, T_DOXY_ENDLIST, T_DOXY_ENDMANONLY, + T_DOXY_ENDMSC, T_DOXY_ENDOMIT, + T_DOXY_ENDPARBLOCK, T_DOXY_ENDPART, T_DOXY_ENDQUOTATION, T_DOXY_ENDRAW, + T_DOXY_ENDRTFONLY, + T_DOXY_ENDSECREFLIST, T_DOXY_ENDSECTION1, T_DOXY_ENDSECTION2, T_DOXY_ENDSECTION3, T_DOXY_ENDSECTION4, T_DOXY_ENDSIDEBAR, T_DOXY_ENDTABLE, + T_DOXY_ENDUML, T_DOXY_ENDVERBATIM, T_DOXY_ENDXMLONLY, T_DOXY_ENUM, @@ -106,6 +124,7 @@ enum DoxygenReservedWord { T_DOXY_EXCEPTION, T_DOXY_EXCEPTIONS, T_DOXY_EXPIRE, + T_DOXY_EXTENDS, T_DOXY_EXTERNALPAGE, T_DOXY_FILE, T_DOXY_FN, @@ -116,14 +135,19 @@ enum DoxygenReservedWord { T_DOXY_GUI, T_DOXY_HEADER, T_DOXY_HEADERFILE, + T_DOXY_HIDECALLERGRAPH, + T_DOXY_HIDECALLGRAPH, T_DOXY_HIDEINITIALIZER, T_DOXY_HTMLINCLUDE, T_DOXY_HTMLONLY, T_DOXY_I, + T_DOXY_IDLEXCEPT, T_DOXY_IF, T_DOXY_IFNOT, T_DOXY_IMAGE, + T_DOXY_IMPLEMENTS, T_DOXY_INCLUDE, + T_DOXY_INCLUDELINENO, T_DOXY_INDEX, T_DOXY_INDEXPAGE, T_DOXY_INGROUP, @@ -139,6 +163,7 @@ enum DoxygenReservedWord { T_DOXY_INVARIANT, T_DOXY_KEYWORD, T_DOXY_L, + T_DOXY_LATEXINCLUDE, T_DOXY_LATEXONLY, T_DOXY_LEGALESE, T_DOXY_LI, @@ -149,8 +174,11 @@ enum DoxygenReservedWord { T_DOXY_MAINCLASS, T_DOXY_MAINPAGE, T_DOXY_MANONLY, + T_DOXY_MEMBEROF, T_DOXY_META, T_DOXY_MODULE, + T_DOXY_MSC, + T_DOXY_MSCFILE, T_DOXY_N, T_DOXY_NAME, T_DOXY_NAMESPACE, @@ -175,6 +203,7 @@ enum DoxygenReservedWord { T_DOXY_PAR, T_DOXY_PARAGRAPH, T_DOXY_PARAM, + T_DOXY_PARBLOCK, T_DOXY_PART, T_DOXY_POST, T_DOXY_PRE, @@ -183,7 +212,15 @@ enum DoxygenReservedWord { T_DOXY_PRINTLINE, T_DOXY_PRINTTO, T_DOXY_PRINTUNTIL, + T_DOXY_PRIVATE, + T_DOXY_PRIVATESECTION, T_DOXY_PROPERTY, + T_DOXY_PROTECTED, + T_DOXY_PROTECTEDSECTION, + T_DOXY_PROTOCOL, + T_DOXY_PUBLIC, + T_DOXY_PUBLICSECTION, + T_DOXY_PURE, T_DOXY_QMLABSTRACT, T_DOXY_QMLATTACHEDPROPERTY, T_DOXY_QMLATTACHEDSIGNAL, @@ -203,15 +240,22 @@ enum DoxygenReservedWord { T_DOXY_RAW, T_DOXY_REENTRANT, T_DOXY_REF, + T_DOXY_REFITEM, T_DOXY_REIMP, + T_DOXY_RELATED, + T_DOXY_RELATEDALSO, T_DOXY_RELATES, T_DOXY_RELATESALSO, + T_DOXY_REMARK, T_DOXY_REMARKS, + T_DOXY_RESULT, T_DOXY_RETURN, T_DOXY_RETURNS, T_DOXY_RETVAL, T_DOXY_ROW, + T_DOXY_RTFONLY, T_DOXY_SA, + T_DOXY_SECREFLIST, T_DOXY_SECTION, T_DOXY_SECTION1, T_DOXY_SECTION2, @@ -231,8 +275,10 @@ enum DoxygenReservedWord { T_DOXY_SPAN, T_DOXY_SQL, T_DOXY_STARTPAGE, + T_DOXY_STARTUML, T_DOXY_STRUCT, T_DOXY_SUB, + T_DOXY_SUBPAGE, T_DOXY_SUBSECTION, T_DOXY_SUBSUBSECTION, T_DOXY_SUBTITLE, @@ -247,6 +293,7 @@ enum DoxygenReservedWord { T_DOXY_THROWS, T_DOXY_TITLE, T_DOXY_TODO, + T_DOXY_TPARAM, T_DOXY_TT, T_DOXY_TYPEDEF, T_DOXY_UICONTROL, @@ -261,6 +308,7 @@ enum DoxygenReservedWord { T_DOXY_VERBATIM, T_DOXY_VERBINCLUDE, T_DOXY_VERSION, + T_DOXY_VHDLFLOW, T_DOXY_WARNING, T_DOXY_WEAKGROUP, T_DOXY_WEBKIT, diff --git a/src/plugins/cpptools/cppdoxygen.kwgen b/src/plugins/cpptools/cppdoxygen.kwgen index 000306cd41d..bb8995f110f 100644 --- a/src/plugins/cpptools/cppdoxygen.kwgen +++ b/src/plugins/cpptools/cppdoxygen.kwgen @@ -13,6 +13,7 @@ annotatedlist arg attention author +authors b badcode basename @@ -20,23 +21,33 @@ bold brief bug c +callergraph callgraph caption +category chapter +cite class code codeline compat cond contentspage +copybrief +copydetails copydoc +copyright corelib date def default defgroup deprecated +details +diafile +dir div +docbookonly dontinclude dot dotfile @@ -49,25 +60,32 @@ endabstract endchapter endcode endcond +enddocbookonly enddot endfootnote endhtmlonly endif +endinternal endlatexonly endlegalese endlink endlist endmanonly +endmsc endomit +endparblock endpart endquotation endraw +endrtfonly +endsecreflist endsection1 endsection2 endsection3 endsection4 endsidebar endtable +enduml endverbatim endxmlonly enum @@ -75,6 +93,7 @@ example exception exceptions expire +extends externalpage file fn @@ -85,14 +104,19 @@ group gui header headerfile +hidecallergraph +hidecallgraph hideinitializer htmlinclude htmlonly i +idlexcept if ifnot image +implements include +includelineno index indexpage ingroup @@ -108,6 +132,7 @@ internal invariant keyword l +latexinclude latexonly legalese li @@ -118,8 +143,11 @@ macro mainclass mainpage manonly +memberof meta module +msc +mscfile n name namespace @@ -144,6 +172,7 @@ page par paragraph param +parblock part post pre @@ -152,7 +181,15 @@ previouspage printline printto printuntil +private +privatesection property +protected +protectedsection +protocol +public +publicsection +pure qmlabstract qmlattachedproperty qmlattachedsignal @@ -172,15 +209,22 @@ quotefunction raw reentrant ref +refitem reimp +related +relatedalso relates relatesalso +remark remarks +result return returns retval row +rtfonly sa +secreflist section section1 section2 @@ -200,8 +244,10 @@ snippet span sql startpage +startuml struct sub +subpage subsection subsubsection subtitle @@ -216,6 +262,7 @@ throw throws title todo +tparam tt typedef uicontrol @@ -230,6 +277,7 @@ variable verbatim verbinclude version +vhdlflow warning weakgroup webkit From 52a6e03942bd76b0812e8d9efc471c6ec6abcaf5 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 31 Mar 2016 13:32:08 +0200 Subject: [PATCH 59/72] Valgrind: Fix callgrind's "Cost format" button Broke after 0a89b89065b633cfb4f5dc8c9fd38240b38e53a8 Correct fix seems to me to avoid the whole menu. Change-Id: I59f1eb859c9045fc5ae9ac1b377b7e69b29af7ae Reviewed-by: Orgad Shaneh --- src/plugins/valgrind/callgrindtool.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index 2fbb4958dea..246fe188830 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -412,7 +412,6 @@ CallgrindTool::CallgrindTool(QObject *parent) // Cost formatting { - auto menu = new QMenu; auto group = new QActionGroup(this); // Show costs as absolute numbers @@ -422,7 +421,6 @@ CallgrindTool::CallgrindTool(QObject *parent) m_costAbsolute->setChecked(true); connect(m_costAbsolute, &QAction::toggled, this, &CallgrindTool::updateCostFormat); group->addAction(m_costAbsolute); - menu->addAction(m_costAbsolute); // Show costs in percentages m_costRelative = new QAction(tr("Relative Costs"), this); @@ -430,7 +428,6 @@ CallgrindTool::CallgrindTool(QObject *parent) m_costRelative->setCheckable(true); connect(m_costRelative, &QAction::toggled, this, &CallgrindTool::updateCostFormat); group->addAction(m_costRelative); - menu->addAction(m_costRelative); // Show costs relative to parent m_costRelativeToParent = new QAction(tr("Relative Costs to Parent"), this); @@ -438,11 +435,9 @@ CallgrindTool::CallgrindTool(QObject *parent) m_costRelativeToParent->setCheckable(true); connect(m_costRelativeToParent, &QAction::toggled, this, &CallgrindTool::updateCostFormat); group->addAction(m_costRelativeToParent); - menu->addAction(m_costRelativeToParent); auto button = new QToolButton; - button->setMenu(menu); - menu->setParent(button); + button->addActions(group->actions()); button->setPopupMode(QToolButton::InstantPopup); button->setText(QLatin1String("$")); button->setToolTip(tr("Cost Format")); From 4707fc494557f331fc8e619003d9b6be9abbb790 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 31 Mar 2016 13:56:02 +0200 Subject: [PATCH 60/72] StyleHelper: Silence warning about wrong format string Change-Id: Ic31f3ed15a9039098d0e1467fc51487bd0201113 Reviewed-by: Niels Weber --- src/libs/utils/stylehelper.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index e5575e103c9..2a07ffac6c1 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -286,12 +286,13 @@ void StyleHelper::drawArrow(QStyle::PrimitiveElement element, QPainter *painter, return; const qreal devicePixelRatio = painter->device()->devicePixelRatio(); + const bool enabled = option->state & QStyle::State_Enabled; QRect r = option->rect; int size = qMin(r.height(), r.width()); QPixmap pixmap; QString pixmapName; pixmapName.sprintf("StyleHelper::drawArrow-%d-%d-%d-%f", - element, size, (option->state & QStyle::State_Enabled), devicePixelRatio); + element, size, enabled, devicePixelRatio); if (!QPixmapCache::find(pixmapName, pixmap)) { QImage image(size * devicePixelRatio, size * devicePixelRatio, QImage::Format_ARGB32_Premultiplied); image.fill(Qt::transparent); @@ -311,7 +312,7 @@ void StyleHelper::drawArrow(QStyle::PrimitiveElement element, QPainter *painter, style->QCommonStyle::drawPrimitive(element, &tweakedOption, &painter); }; - if (!(option->state & QStyle::State_Enabled)) { + if (!enabled) { drawCommonStyleArrow(image.rect(), creatorTheme()->color(Theme::IconsDisabledColor)); } else { drawCommonStyleArrow(image.rect().translated(0, devicePixelRatio), toolBarDropShadowColor()); From 2ce3bf8ed49555d0bc6f69d63173338f80528016 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 31 Mar 2016 11:49:00 +0200 Subject: [PATCH 61/72] Help: Disambiguate the HelpPage classes from QtWebKit and WebEngine This way the help viewers can coexist and the building against a version of Qt that has both webkit and webengine available doesn't fail anymore. Change-Id: I2de00b03fc7b127899cbf90b91fc2cfb090a47a5 Reviewed-by: Kai Koehne --- src/plugins/help/qtwebkithelpviewer.cpp | 24 ++++++++++++------------ src/plugins/help/qtwebkithelpviewer.h | 8 ++++---- src/plugins/help/webenginehelpviewer.cpp | 10 +++++----- src/plugins/help/webenginehelpviewer.h | 6 +++--- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/plugins/help/qtwebkithelpviewer.cpp b/src/plugins/help/qtwebkithelpviewer.cpp index a9ce4ed4c6f..fdd6104acd4 100644 --- a/src/plugins/help/qtwebkithelpviewer.cpp +++ b/src/plugins/help/qtwebkithelpviewer.cpp @@ -136,9 +136,9 @@ QNetworkReply *HelpNetworkAccessManager::createRequest(Operation op, return new HelpNetworkReply(request, data.data, data.mimeType); } -// - HelpPage +// - QtWebKitHelpPage -HelpPage::HelpPage(QObject *parent) +QtWebKitHelpPage::QtWebKitHelpPage(QObject *parent) : QWebPage(parent) , closeNewTabIfNeeded(false) , m_pressedButtons(Qt::NoButton) @@ -149,18 +149,18 @@ HelpPage::HelpPage(QObject *parent) SLOT(onHandleUnsupportedContent(QNetworkReply*))); } -QWebPage *HelpPage::createWindow(QWebPage::WebWindowType) +QWebPage *QtWebKitHelpPage::createWindow(QWebPage::WebWindowType) { // TODO: ensure that we'll get a QtWebKitHelpViewer here QtWebKitHelpViewer* viewer = static_cast(OpenPagesManager::instance() .createPage()); - HelpPage *newPage = viewer->page(); + QtWebKitHelpPage *newPage = viewer->page(); newPage->closeNewTabIfNeeded = closeNewTabIfNeeded; closeNewTabIfNeeded = false; return newPage; } -void HelpPage::triggerAction(WebAction action, bool checked) +void QtWebKitHelpPage::triggerAction(WebAction action, bool checked) { switch (action) { case OpenLinkInNewWindow: @@ -171,7 +171,7 @@ void HelpPage::triggerAction(WebAction action, bool checked) } } -bool HelpPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, +bool QtWebKitHelpPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, QWebPage::NavigationType type) { const bool closeNewTab = closeNewTabIfNeeded; @@ -198,7 +198,7 @@ bool HelpPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest & return true; } -void HelpPage::onHandleUnsupportedContent(QNetworkReply *reply) +void QtWebKitHelpPage::onHandleUnsupportedContent(QNetworkReply *reply) { // sub resource of this page if (m_loadingUrl != reply->url()) { @@ -254,7 +254,7 @@ QtWebKitHelpWidget::QtWebKitHelpWidget(QtWebKitHelpViewer *parent) QWebSettings::globalSettings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true); - setPage(new HelpPage(this)); + setPage(new QtWebKitHelpPage(this)); HelpNetworkAccessManager *manager = new HelpNetworkAccessManager(this); page()->setNetworkAccessManager(manager); connect(manager, SIGNAL(finished(QNetworkReply*)), this, @@ -323,7 +323,7 @@ void QtWebKitHelpWidget::mousePressEvent(QMouseEvent *event) if (Utils::HostOsInfo::isLinuxHost() && m_parent->handleForwardBackwardMouseButtons(event)) return; - if (HelpPage *currentPage = static_cast(page())) { + if (QtWebKitHelpPage *currentPage = static_cast(page())) { currentPage->m_pressedButtons = event->buttons(); currentPage->m_keyboardModifiers = event->modifiers(); } @@ -402,7 +402,7 @@ QtWebKitHelpViewer::QtWebKitHelpViewer(QWidget *parent) connect(m_webView->page(), SIGNAL(printRequested(QWebFrame*)), this, SIGNAL(printRequested())); connect(m_webView, SIGNAL(backwardAvailable(bool)), this, SIGNAL(backwardAvailable(bool))); connect(m_webView, SIGNAL(forwardAvailable(bool)), this, SIGNAL(forwardAvailable(bool))); - connect(page(), &HelpPage::linkHovered, this, &QtWebKitHelpViewer::setToolTip); + connect(page(), &QtWebKitHelpPage::linkHovered, this, &QtWebKitHelpViewer::setToolTip); } QFont QtWebKitHelpViewer::viewerFont() const @@ -582,9 +582,9 @@ bool QtWebKitHelpViewer::findText(const QString &text, FindFlags flags, return found; } -HelpPage *QtWebKitHelpViewer::page() const +QtWebKitHelpPage *QtWebKitHelpViewer::page() const { - return static_cast(m_webView->page()); + return static_cast(m_webView->page()); } void QtWebKitHelpViewer::copy() diff --git a/src/plugins/help/qtwebkithelpviewer.h b/src/plugins/help/qtwebkithelpviewer.h index 2e2b94503b3..d556978da47 100644 --- a/src/plugins/help/qtwebkithelpviewer.h +++ b/src/plugins/help/qtwebkithelpviewer.h @@ -36,7 +36,7 @@ namespace Help { namespace Internal { -class HelpPage; +class QtWebKitHelpPage; class QtWebKitHelpWidget; class QtWebKitHelpViewer : public HelpViewer @@ -70,7 +70,7 @@ public: bool findText(const QString &text, Core::FindFlags flags, bool incremental, bool fromSearch, bool *wrapped = 0); - HelpPage *page() const; + QtWebKitHelpPage *page() const; public slots: void scaleUp(); @@ -128,11 +128,11 @@ private: QtWebKitHelpViewer *m_parent; }; -class HelpPage : public QWebPage +class QtWebKitHelpPage : public QWebPage { Q_OBJECT public: - HelpPage(QObject *parent); + QtWebKitHelpPage(QObject *parent); protected: virtual QWebPage *createWindow(QWebPage::WebWindowType); diff --git a/src/plugins/help/webenginehelpviewer.cpp b/src/plugins/help/webenginehelpviewer.cpp index 5d2e2d2f356..55ebc4e57e9 100644 --- a/src/plugins/help/webenginehelpviewer.cpp +++ b/src/plugins/help/webenginehelpviewer.cpp @@ -73,7 +73,7 @@ WebEngineHelpViewer::WebEngineHelpViewer(QWidget *parent) : HelpViewer(parent), m_widget(new WebView(this)) { - m_widget->setPage(new HelpPage(this)); + m_widget->setPage(new WebEngineHelpPage(this)); auto layout = new QVBoxLayout; setLayout(layout); layout->setContentsMargins(0, 0, 0, 0); @@ -226,9 +226,9 @@ bool WebEngineHelpViewer::findText(const QString &text, Core::FindFlags flags, b return true; } -HelpPage *WebEngineHelpViewer::page() const +WebEngineHelpPage *WebEngineHelpViewer::page() const { - return static_cast(m_widget->page()); + return static_cast(m_widget->page()); } void WebEngineHelpViewer::scaleUp() @@ -271,12 +271,12 @@ void WebEngineHelpViewer::print(QPrinter *printer) Q_UNUSED(printer) } -HelpPage::HelpPage(QObject *parent) +WebEngineHelpPage::WebEngineHelpPage(QObject *parent) : QWebEnginePage(parent) { } -QWebEnginePage *HelpPage::createWindow(QWebEnginePage::WebWindowType) +QWebEnginePage *WebEngineHelpPage::createWindow(QWebEnginePage::WebWindowType) { auto viewer = static_cast(OpenPagesManager::instance().createPage()); return viewer->page(); diff --git a/src/plugins/help/webenginehelpviewer.h b/src/plugins/help/webenginehelpviewer.h index 7d777ab4875..ba8d0adfb38 100644 --- a/src/plugins/help/webenginehelpviewer.h +++ b/src/plugins/help/webenginehelpviewer.h @@ -40,10 +40,10 @@ public: void requestStarted(QWebEngineUrlRequestJob *job) override; }; -class HelpPage : public QWebEnginePage +class WebEngineHelpPage : public QWebEnginePage { public: - explicit HelpPage(QObject *parent = 0); + explicit WebEngineHelpPage(QObject *parent = 0); QWebEnginePage *createWindow(QWebEnginePage::WebWindowType) override; }; @@ -83,7 +83,7 @@ public: void setOpenInNewPageActionVisible(bool visible) override; bool findText(const QString &text, Core::FindFlags flags, bool incremental, bool fromSearch, bool *wrapped) override; - HelpPage *page() const; + WebEngineHelpPage *page() const; public slots: void scaleUp() override; From 01504e41b80897869ef5784c83f6852a96ceb829 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 31 Mar 2016 14:31:53 +0200 Subject: [PATCH 62/72] AutoTest: Avoid invalid parse results If the document gets updated while typing we can get different results when fetching the content and using positions inside the content which might have updated milliseconds later. Beside fetching only once ensure valid parse results by adding an additional check for the used visitor. Change-Id: Id1ba4a139a4dc497be0fbb5cf1f81004f3f8676c Reviewed-by: David Schulz --- src/plugins/autotest/testcodeparser.cpp | 18 +++++++++++------- src/plugins/autotest/testvisitor.cpp | 2 ++ src/plugins/autotest/testvisitor.h | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 6bb9fd89047..682824744e9 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -284,9 +284,10 @@ static QString quickTestSrcDir(const CppTools::CppModelManager *cppMM, return QString(); } -static QString testClass(const CppTools::CppModelManager *modelManager, - CPlusPlus::Document::Ptr &document) +static QString testClass(const CppTools::CppModelManager *modelManager, const QString &fileName) { + const QByteArray &fileContent = getFileContent(fileName); + CPlusPlus::Document::Ptr document = modelManager->document(fileName); const QList macros = document->macroUses(); foreach (const CPlusPlus::Document::MacroUse ¯o, macros) { @@ -295,14 +296,13 @@ static QString testClass(const CppTools::CppModelManager *modelManager, const QByteArray name = macro.macro().name(); if (TestUtils::isQTestMacro(name)) { const CPlusPlus::Document::Block arg = macro.arguments().at(0); - return QLatin1String(getFileContent(document->fileName()) - .mid(arg.bytesBegin(), arg.bytesEnd() - arg.bytesBegin())); + return QLatin1String(fileContent.mid(arg.bytesBegin(), + arg.bytesEnd() - arg.bytesBegin())); } } // check if one has used a self-defined macro or QTest::qExec() directly const CPlusPlus::Snapshot snapshot = modelManager->snapshot(); - const QByteArray fileContent = getFileContent(document->fileName()); - document = snapshot.preprocessedDocument(fileContent, document->fileName()); + document = snapshot.preprocessedDocument(fileContent, fileName); document->check(); CPlusPlus::AST *ast = document->translationUnit()->ast(); TestAstVisitor astVisitor(document); @@ -523,7 +523,7 @@ static void checkDocumentForTestCode(QFutureInterface futureInt } else if (testCaseNames.contains(fileName) // if we do a reparse || (includesQtTest(document, modelManager) && qtTestLibDefined(modelManager, fileName))) { - QString testCaseName(testClass(modelManager, document)); + QString testCaseName(testClass(modelManager, fileName)); // we might be in a reparse without the original entry point with the QTest::qExec() if (testCaseName.isEmpty()) testCaseName = testCaseNames.value(fileName); @@ -537,6 +537,10 @@ static void checkDocumentForTestCode(QFutureInterface futureInt TestVisitor visitor(testCaseName); visitor.accept(declaringDoc->globalNamespace()); + + if (!visitor.resultValid()) + return; + const QMap testFunctions = visitor.privateSlots(); QMap dataTags = diff --git a/src/plugins/autotest/testvisitor.cpp b/src/plugins/autotest/testvisitor.cpp index c4c9373ca35..a816aa33eb5 100644 --- a/src/plugins/autotest/testvisitor.cpp +++ b/src/plugins/autotest/testvisitor.cpp @@ -73,6 +73,8 @@ bool TestVisitor::visit(CPlusPlus::Class *symbol) if (className != m_className) continue; + m_valid = true; + if (const auto func = type->asFunctionType()) { if (func->isSlot() && member->isPrivate()) { const QString name = o.prettyName(func->name()); diff --git a/src/plugins/autotest/testvisitor.h b/src/plugins/autotest/testvisitor.h index 5d171216f58..b849a1d8c5f 100644 --- a/src/plugins/autotest/testvisitor.h +++ b/src/plugins/autotest/testvisitor.h @@ -52,6 +52,7 @@ public: virtual ~TestVisitor(); QMap privateSlots() const { return m_privSlots; } + bool resultValid() const { return m_valid; } bool visit(CPlusPlus::Class *symbol); @@ -59,6 +60,7 @@ private: CppTools::SymbolFinder m_symbolFinder; QString m_className; QMap m_privSlots; + bool m_valid = false; }; class TestAstVisitor : public CPlusPlus::ASTVisitor From d0ad71bb18fbec4940d97f247c361d94aa238e84 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 31 Mar 2016 12:29:45 +0200 Subject: [PATCH 63/72] Squish: Sort objects Change-Id: Iff9e700d1c4f392a019803efc407709dd7ccf181 Reviewed-by: Christian Stenger --- tests/system/objects.map | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/objects.map b/tests/system/objects.map index d2bd2f983ff..9e491290e79 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -59,13 +59,14 @@ :DebugModeWidget.Debugger.Docks.LocalsAndWatchersDockWidget_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Debugger.Docks.LocalsAndWatchersDockWidget' type='QDockWidget' visible='1'} :DebugModeWidget.OK_QPushButton {container=':Qt Creator.DebugModeWidget_QSplitter' text='OK' type='QPushButton' unnamed='1' visible='1'} :DebugModeWidget.Toolbar_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='Toolbar' type='QDockWidget' visible='1'} -:DebugModeWidget_QComboBox {container=':Qt Creator.DebugModeWidget_QSplitter' occurrence='2' type='QComboBox' unnamed='1' visible='1'} :DebugModeWidget_Debugger::Internal::ConsoleView {container=':Qt Creator.DebugModeWidget_QSplitter' type='Debugger::Internal::ConsoleView' unnamed='1' visible='1'} +:DebugModeWidget_QComboBox {container=':Qt Creator.DebugModeWidget_QSplitter' occurrence='2' type='QComboBox' unnamed='1' visible='1'} :Debugger Toolbar.Continue_QToolButton {container=':DebugModeWidget.Toolbar_QDockWidget' text='Continue' type='QToolButton' unnamed='1' visible='1'} :Debugger Toolbar.Exit Debugger_QToolButton {container=':DebugModeWidget.Toolbar_QDockWidget' text='Stop Debugger' type='QToolButton' unnamed='1' visible='1'} :Debugger Toolbar.StatusText_Utils::StatusLabel {container=':DebugModeWidget.Toolbar_QDockWidget' type='Utils::StatusLabel' unnamed='1'} :Debugger.Docks.BreakDockWidget.Debugger.Docks.Break_QFrame {container=':DebugModeWidget.Debugger.Docks.BreakDockWidget_QDockWidget' name='Debugger.Docks.Break' type='QFrame' visible='1'} :Debugger.Docks.LocalsAndWatchersDockWidget.Inspector_QFrame {container=':DebugModeWidget.Debugger.Docks.LocalsAndWatchersDockWidget_QDockWidget' name='Inspector' type='QFrame' visible='1'} +:Debugger::Internal::ConsoleEdit {columnIndex='0' container=':DebugModeWidget_Debugger::Internal::ConsoleView' rowIndex='0' type='Debugger::Internal::ConsoleEdit' unnamed='1' visible='1'} :Description.description_Utils::CompletingTextEdit {container=':splitter.Description_QGroupBox' name='description' type='Utils::CompletingTextEdit' visible='1'} :Dialog.OK_QPushButton {text='OK' type='QPushButton' unnamed='1' visible='1' window=':Dialog_QmlJSEditor::Internal::ComponentNameDialog'} :Dialog.componentNameEdit_QLineEdit {name='componentNameEdit' type='Utils::ClassNameValidatingLineEdit' visible='1' window=':Dialog_QmlJSEditor::Internal::ComponentNameDialog'} @@ -119,7 +120,6 @@ :Path.Utils_BaseValidatingLineEdit {container=':qt_tabwidget_stackedwidget_QWidget' name='LineEdit' type='Utils::FancyLineEdit' visible='1'} :QML Debugging.No_QPushButton {text='No' type='QPushButton' unnamed='1' visible='1' window=':QML Debugging_QMessageBox'} :QML Debugging_QMessageBox {text='The option will only take effect if the project is recompiled. Do you want to recompile now?' type='QMessageBox' unnamed='1' visible='1'} -:Debugger::Internal::ConsoleEdit {columnIndex='0' container=':DebugModeWidget_Debugger::Internal::ConsoleView' rowIndex='0' type='Debugger::Internal::ConsoleEdit' unnamed='1' visible='1'} :Qt Creator.Add Bookmark_QToolButton {text='Add Bookmark' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.CloseDoc_QToolButton {toolTip?='Close Document *' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.CloseFind_QToolButton {name='close' type='QToolButton' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} From 483fcb6ab7491ae69008ab3508c7f44ff80fcc76 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 31 Mar 2016 13:45:35 +0200 Subject: [PATCH 64/72] Squish: Update object in tst_session_handling Change-Id: Ia1f327cf2a69e74d242bf4ad7d7ed8cfd7cd3a34 Reviewed-by: Christian Stenger --- tests/system/suite_general/tst_session_handling/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/suite_general/tst_session_handling/test.py b/tests/system/suite_general/tst_session_handling/test.py index 139cdc64f87..0290baafb91 100644 --- a/tests/system/suite_general/tst_session_handling/test.py +++ b/tests/system/suite_general/tst_session_handling/test.py @@ -117,7 +117,7 @@ def checkWelcomePage(sessionName, isCurrent=False): else: sessions = ["default (current session)", sessionName] for sessionName in sessions: - test.verify(object.exists("{container='%s' enabled='true' type='LinkedText' unnamed='1' " + test.verify(object.exists("{container='%s' enabled='true' type='Text' unnamed='1' " "visible='true' text='%s'}" % (welcomePage, sessionName)), "Verifying session '%s' exists." % sessionName) From 72f3f2f45b1083cd2450875f42045b6c2642de35 Mon Sep 17 00:00:00 2001 From: Lorenz Haas Date: Sat, 26 Mar 2016 16:28:08 +0100 Subject: [PATCH 65/72] Beautifier: Fix hidden menu on Linux Task-number: QTCREATORBUG-15936 Change-Id: Id9387495a8c770167292fa526727f969b7408b2c Reviewed-by: David Schulz --- src/plugins/beautifier/beautifierplugin.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/plugins/beautifier/beautifierplugin.cpp b/src/plugins/beautifier/beautifierplugin.cpp index cbd0b96b8b6..dd1fb2c16f6 100644 --- a/src/plugins/beautifier/beautifierplugin.cpp +++ b/src/plugins/beautifier/beautifierplugin.cpp @@ -59,7 +59,6 @@ #include #include #include -#include #include using namespace TextEditor; @@ -179,6 +178,7 @@ bool BeautifierPlugin::initialize(const QStringList &arguments, QString *errorSt Core::ActionContainer *menu = Core::ActionManager::createMenu(Constants::MENU_ID); menu->menu()->setTitle(QCoreApplication::translate("Beautifier", Constants::OPTION_TR_CATEGORY)); + menu->setOnAllDisabledBehavior(Core::ActionContainer::Show); Core::ActionManager::actionContainer(Core::Constants::M_TOOLS)->addMenu(menu); foreach (BeautifierAbstractTool *tool, m_tools) { @@ -188,9 +188,7 @@ bool BeautifierPlugin::initialize(const QStringList &arguments, QString *errorSt addAutoReleasedObject(object); } - // The single shot is needed, otherwise the menu will stay disabled even - // when the submenu's actions get enabled later on. - QTimer::singleShot(0, this, SLOT(updateActions())); + updateActions(); return true; } From 1d0e1633c23d54764e02b8ecf13351ab05e36bdd Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 23 Mar 2016 14:16:24 +0100 Subject: [PATCH 66/72] cdbext version bump Change-Id: Ia7d0731cfcab545a7280dc1d5317d64a2e773893 Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index fd8f84c566b..f3391f7d789 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -275,7 +275,7 @@ extern "C" HRESULT CALLBACK pid(CIDebugClient *client, PCSTR args) int token; commandTokens(args, &token); - dprintf("Qt Creator CDB extension version 3.6 %d bit.\n", + dprintf("Qt Creator CDB extension version 4.0 %d bit.\n", sizeof(void *) * 8); if (const ULONG pid = currentProcessId(client)) ExtensionContext::instance().report('R', token, 0, "pid", "%u", pid); From 380551215668743be9586798b50f9b9bceccd737 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 31 Mar 2016 17:09:56 +0300 Subject: [PATCH 67/72] ProjectExplorer: Rename RunConfiguration:Name -> CurrentRun:Name Similar variables don't contain "Configuration" in their names. For example: CurrentBuild:Name. + make it available globally. Change-Id: Ie094e2f7afc449d678cf0afec1548350f03ead77 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projectexplorer.cpp | 9 +++++++++ src/plugins/projectexplorer/projectexplorerconstants.h | 1 + src/plugins/projectexplorer/runconfiguration.cpp | 6 +++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 6e1bfe6a2c1..0448ad2e151 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1352,6 +1352,15 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er return bc ? bc->displayName() : QString(); }); + expander->registerVariable(Constants::VAR_CURRENTRUN_NAME, + tr("The currently active run configuration's name."), + [this]() -> QString { + if (Target *target = activeTarget()) { + if (RunConfiguration *rc = target->activeRunConfiguration()) + return rc->displayName(); + } + return QString(); + }); expander->registerVariable(Constants::VAR_CURRENTBUILD_TYPE, tr("The currently active build configuration's type."), diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 88e6c4d3a7e..f0e866916ed 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -236,6 +236,7 @@ const char VAR_CURRENTKIT_FILESYSTEMNAME[] = "CurrentKit:FileSystemName"; const char VAR_CURRENTKIT_ID[] = "CurrentKit:Id"; const char VAR_CURRENTBUILD_NAME[] = "CurrentBuild:Name"; const char VAR_CURRENTBUILD_TYPE[] = "CurrentBuild:Type"; +const char VAR_CURRENTRUN_NAME[] = "CurrentRun:Name"; const char VAR_CURRENTDEVICE_HOSTADDRESS[] = "CurrentDevice:HostAddress"; const char VAR_CURRENTDEVICE_SSHPORT[] = "CurrentDevice:SshPort"; const char VAR_CURRENTDEVICE_USERNAME[] = "CurrentDevice:UserName"; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 2fc8554d56c..c83c064de52 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -256,9 +256,9 @@ void RunConfiguration::ctor() BuildConfiguration *bc = target()->activeBuildConfiguration(); return bc ? bc->macroExpander() : target()->macroExpander(); }); - expander->registerVariable("RunConfiguration:Name", - QCoreApplication::translate("ProjectExplorer", "Name of run configuration"), - [this] { return displayName(); }); + expander->registerVariable(Constants::VAR_CURRENTRUN_NAME, + QCoreApplication::translate("ProjectExplorer", "The currently active run configuration's name."), + [this] { return displayName(); }, false); } /*! From 0b37c09270644b2cbcb31e39e40bee36c74d8dac Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 1 Apr 2016 10:20:58 +0200 Subject: [PATCH 68/72] AutoTest: Increase timeout for progress indicator This avoids displaying the progress indicator if reparsing the current document while editing in _most_ cases. Change-Id: I6b6181e5bda1644367b8dc7576c152d5d6962a71 Reviewed-by: David Schulz --- src/plugins/autotest/testnavigationwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/autotest/testnavigationwidget.cpp b/src/plugins/autotest/testnavigationwidget.cpp index 963fec32b6f..ddcc53c43c1 100644 --- a/src/plugins/autotest/testnavigationwidget.cpp +++ b/src/plugins/autotest/testnavigationwidget.cpp @@ -77,7 +77,7 @@ TestNavigationWidget::TestNavigationWidget(QWidget *parent) : m_progressTimer = new QTimer(this); m_progressTimer->setSingleShot(true); - m_progressTimer->setInterval(100); // don't display indicator if progress takes less than 100ms + m_progressTimer->setInterval(1000); // don't display indicator if progress takes less than 1s connect(m_model->parser(), &TestCodeParser::parsingStarted, this, &TestNavigationWidget::onParsingStarted); From c976054fa7db5b0d97eed3ba72c47d206062ead6 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 1 Apr 2016 11:06:41 +0200 Subject: [PATCH 69/72] AutoTest: Enable parsing for tests by default If one enables the plugin it would be most likely to have the parsing (and related short cuts) enabled as well without the need to open the navigation widget or results pane. Change-Id: Ie0624713677bcae67492ac99d25519cc5cfab4a9 Reviewed-by: David Schulz --- src/plugins/autotest/testsettings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/autotest/testsettings.cpp b/src/plugins/autotest/testsettings.cpp index 870b35f124a..7e8d1911b5e 100644 --- a/src/plugins/autotest/testsettings.cpp +++ b/src/plugins/autotest/testsettings.cpp @@ -47,7 +47,7 @@ static const int defaultTimeout = 60000; TestSettings::TestSettings() : timeout(defaultTimeout), metrics(Walltime), omitInternalMssg(true), omitRunConfigWarn(false), - limitResultOutput(true), autoScroll(true), alwaysParse(false) + limitResultOutput(true), autoScroll(true), alwaysParse(true) { } @@ -96,7 +96,7 @@ void TestSettings::fromSettings(const QSettings *s) omitRunConfigWarn = s->value(root + QLatin1String(omitRunConfigWarnKey), false).toBool(); limitResultOutput = s->value(root + QLatin1String(limitResultOutputKey), true).toBool(); autoScroll = s->value(root + QLatin1String(autoScrollKey), true).toBool(); - alwaysParse = s->value(root + QLatin1String(alwaysParseKey), false).toBool(); + alwaysParse = s->value(root + QLatin1String(alwaysParseKey), true).toBool(); gtestRunDisabled = s->value(root + QLatin1String(gtestRunDisabledKey), false).toBool(); gtestRepeat = s->value(root + QLatin1String(gtestRepeatKey), false).toBool(); gtestShuffle = s->value(root + QLatin1String(gtestShuffleKey), false).toBool(); From 6ea1b07ceb4ff9af08612824df59e9ec6ac3be8d Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 31 Mar 2016 15:07:58 +0200 Subject: [PATCH 70/72] CMake: Simplify reparsing code This still fixes the parsing issue when switching build configurations, but the code is simpler. Change-Id: I5748788224c5b49399550c33bcef592f193cfa8a Reviewed-by: Tim Jenssen --- .../cmakebuildconfiguration.cpp | 7 ------- .../cmakeprojectmanager/cmakebuildconfiguration.h | 3 +-- src/plugins/cmakeprojectmanager/cmakeproject.cpp | 15 +++++++++------ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index e427fecf627..93593392e96 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -148,8 +148,6 @@ void CMakeBuildConfiguration::ctor() m_buildDirManager, &BuildDirManager::forceReparse); connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, m_buildDirManager, &BuildDirManager::forceReparse); - connect(target(), &Target::kitChanged, this, &CMakeBuildConfiguration::maybeForceReparse); - connect(project, &Project::activeTargetChanged, this, &CMakeBuildConfiguration::maybeForceReparse); connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::parseCMakeOutput); @@ -174,11 +172,6 @@ bool CMakeBuildConfiguration::isParsing() const return m_buildDirManager && m_buildDirManager->isParsing(); } -void CMakeBuildConfiguration::parse() -{ - m_buildDirManager->parse(); -} - void CMakeBuildConfiguration::resetData() { m_buildDirManager->resetData(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 1a43980fe19..01a69102402 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -73,7 +73,7 @@ public: bool isParsing() const; - void parse(); + void maybeForceReparse(); void resetData(); bool persistCMakeState(); @@ -93,7 +93,6 @@ protected: private: void ctor(); - void maybeForceReparse(); QList completeCMakeConfiguration() const; void setCurrentCMakeConfiguration(const QList &items); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 1bb32c84c02..4ee11e60743 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -92,6 +92,8 @@ CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName) setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX)); rootProjectNode()->setDisplayName(fileName.parentDir().fileName()); + + connect(this, &CMakeProject::activeTargetChanged, this, &CMakeProject::handleActiveTargetChanged); } CMakeProject::~CMakeProject() @@ -439,10 +441,6 @@ Project::RestoreResult CMakeProject::fromMap(const QVariantMap &map, QString *er RestoreResult result = Project::fromMap(map, errorMessage); if (result != RestoreResult::Ok) return result; - - handleActiveTargetChanged(); - handleActiveBuildConfigurationChanged(); - return RestoreResult::Ok; } @@ -461,7 +459,8 @@ void CMakeProject::handleActiveTargetChanged() if (m_connectedTarget) { disconnect(m_connectedTarget, &Target::activeBuildConfigurationChanged, this, &CMakeProject::handleActiveBuildConfigurationChanged); - + disconnect(m_connectedTarget, &Target::kitChanged, + this, &CMakeProject::handleActiveBuildConfigurationChanged); } m_connectedTarget = activeTarget(); @@ -469,7 +468,11 @@ void CMakeProject::handleActiveTargetChanged() if (m_connectedTarget) { connect(m_connectedTarget, &Target::activeBuildConfigurationChanged, this, &CMakeProject::handleActiveBuildConfigurationChanged); + connect(m_connectedTarget, &Target::kitChanged, + this, &CMakeProject::handleActiveBuildConfigurationChanged); } + + handleActiveBuildConfigurationChanged(); } void CMakeProject::handleActiveBuildConfigurationChanged() @@ -483,7 +486,7 @@ void CMakeProject::handleActiveBuildConfigurationChanged() auto i = qobject_cast(bc); QTC_ASSERT(i, continue); if (i == activeBc) - i->parse(); + i->maybeForceReparse(); else i->resetData(); } From 59c260d60a8490e3e8dc1262559ca71dc9f9098d Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 31 Mar 2016 17:11:19 +0200 Subject: [PATCH 71/72] Squish: Update Readme Change-Id: I0588e18ac23a72c596a24e5144c8f531dabbfc8b Reviewed-by: Christian Stenger --- tests/system/README | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/system/README b/tests/system/README index 2ff437e743d..f7900deb136 100644 --- a/tests/system/README +++ b/tests/system/README @@ -2,8 +2,7 @@ Prerequisites - general information ----------------------------------- Squish tests inside this folder have several prerequisites to get them running. -First - and most important - you have to own a valid Squish license. Currently it's recommended to use Squish 5.1.3. -For Squish on Mac it's necessary to change the used Python version to 2.6 inside the /etc/paths.ini +First - and most important - you have to own a valid Squish license. Currently it's recommended to use Squish 6.0. Second - some of the test suites/test cases expect an installed Qt 4 SDK in its default location. On Linux/Mac this is ~/QtSDK, and on Windows this is C:\QtSDK. From ea1f5d2b6c896f9dc5791d981ab5a8630f4561f6 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 25 Mar 2016 23:06:17 +0100 Subject: [PATCH 72/72] Icons: Move debug run/interrupt/continue/exit from core to elsewhere Core contains the small variants of debug run/interrupt/continue/exit while the bigger icon variants are in projectexplorer or debugger. That does not seem to have aany reason, at least in today's state of Qt Creator architecture. But above all, it stands in the way when changing debugger icons as planned due to user feedback. This change moves: Core::Icons::DEBUG_START_SMALL to ProjectExplorer::Icons::DEBUG_START_SMALL Core::Icons::DEBUG_EXIT_SMALL to Debugger::Icons::DEBUG_EXIT_SMALL Core::Icons::DEBUG_INTERRUPT_SMALL to Debugger::Icons::DEBUG_INTERRUPT_SMALL Core::Icons::DEBUG_CONTINUE_SMALL to Debugger::Icons::DEBUG_CONTINUE_SMALL This change just moves icons across modules but does not change anything in the UI. Change-Id: I859b901c312d4d16b6c2f687395a7b48c90aab84 Reviewed-by: Alessandro Portale --- src/plugins/coreplugin/core.qrc | 10 ---------- src/plugins/coreplugin/coreicons.cpp | 12 ------------ src/plugins/coreplugin/coreicons.h | 4 ---- src/plugins/debugger/debugger.qrc | 6 ++++++ src/plugins/debugger/debuggericons.h | 9 +++++++++ src/plugins/debugger/debuggerplugin.cpp | 10 +++++----- src/plugins/debugger/debuggerruncontrol.cpp | 4 ++-- .../images/continue_overlay_small.png | Bin .../images/continue_overlay_small@2x.png | Bin .../images/interrupt_overlay_small.png | Bin .../images/interrupt_overlay_small@2x.png | Bin .../images/stop_overlay_small.png | Bin .../images/stop_overlay_small@2x.png | Bin src/plugins/projectexplorer/appoutputpane.cpp | 2 +- .../images/debugger_overlay_small.png | Bin .../images/debugger_overlay_small@2x.png | Bin .../images/run_overlay_small.png | Bin .../images/run_overlay_small@2x.png | Bin src/plugins/projectexplorer/projectexplorer.qrc | 4 ++++ src/plugins/projectexplorer/projectexplorericons.h | 3 +++ src/tools/icons/qtcreatoricons.svg | 10 +++++----- 21 files changed, 35 insertions(+), 39 deletions(-) rename src/plugins/{coreplugin => debugger}/images/continue_overlay_small.png (100%) rename src/plugins/{coreplugin => debugger}/images/continue_overlay_small@2x.png (100%) rename src/plugins/{coreplugin => debugger}/images/interrupt_overlay_small.png (100%) rename src/plugins/{coreplugin => debugger}/images/interrupt_overlay_small@2x.png (100%) rename src/plugins/{coreplugin => debugger}/images/stop_overlay_small.png (100%) rename src/plugins/{coreplugin => debugger}/images/stop_overlay_small@2x.png (100%) rename src/plugins/{coreplugin => projectexplorer}/images/debugger_overlay_small.png (100%) rename src/plugins/{coreplugin => projectexplorer}/images/debugger_overlay_small@2x.png (100%) rename src/plugins/{coreplugin => projectexplorer}/images/run_overlay_small.png (100%) rename src/plugins/{coreplugin => projectexplorer}/images/run_overlay_small@2x.png (100%) diff --git a/src/plugins/coreplugin/core.qrc b/src/plugins/coreplugin/core.qrc index 46e55fb73bc..291038d870f 100644 --- a/src/plugins/coreplugin/core.qrc +++ b/src/plugins/coreplugin/core.qrc @@ -101,16 +101,6 @@ images/dark_fileicon.png images/dark_foldericon.png images/Desktop.png - images/run_overlay_small.png - images/run_overlay_small@2x.png - images/stop_overlay_small.png - images/stop_overlay_small@2x.png - images/debugger_overlay_small.png - images/debugger_overlay_small@2x.png - images/interrupt_overlay_small.png - images/interrupt_overlay_small@2x.png - images/continue_overlay_small.png - images/continue_overlay_small@2x.png images/zoom.png images/zoom@2x.png diff --git a/src/plugins/coreplugin/coreicons.cpp b/src/plugins/coreplugin/coreicons.cpp index 4432a3c7040..3b1d2793344 100644 --- a/src/plugins/coreplugin/coreicons.cpp +++ b/src/plugins/coreplugin/coreicons.cpp @@ -132,18 +132,6 @@ const Icon INFO_TOOLBAR({ {QLatin1String(":/core/images/info.png"), Theme::IconsInfoToolBarColor}}); const Icon EXPAND({ {QLatin1String(":/find/images/expand.png"), Theme::IconsBaseColor}}); -const Icon DEBUG_START_SMALL({ - {QLatin1String(":/core/images/debugger_overlay_small.png"), Theme::IconsDebugColor}, - {QLatin1String(":/core/images/run_overlay_small.png"), Theme::IconsRunColor}}); -const Icon DEBUG_EXIT_SMALL({ - {QLatin1String(":/core/images/debugger_overlay_small.png"), Theme::IconsDebugColor}, - {QLatin1String(":/core/images/stop_overlay_small.png"), Theme::IconsStopColor}}); -const Icon DEBUG_INTERRUPT_SMALL({ - {QLatin1String(":/core/images/debugger_overlay_small.png"), Theme::IconsDebugColor}, - {QLatin1String(":/core/images/interrupt_overlay_small.png"), Theme::IconsInterruptColor}}); -const Icon DEBUG_CONTINUE_SMALL({ - {QLatin1String(":/core/images/debugger_overlay_small.png"), Theme::IconsDebugColor}, - {QLatin1String(":/core/images/continue_overlay_small.png"), Theme::IconsRunColor}}); const Icon ZOOM({ {QLatin1String(":/core/images/zoom.png"), Theme::IconsBaseColor}}); const Icon TOOLBAR_EXTENSION({ diff --git a/src/plugins/coreplugin/coreicons.h b/src/plugins/coreplugin/coreicons.h index cdf6a7d66a3..c0a3ee6fcf0 100644 --- a/src/plugins/coreplugin/coreicons.h +++ b/src/plugins/coreplugin/coreicons.h @@ -83,10 +83,6 @@ CORE_EXPORT extern const Utils::Icon ERROR_TASKBAR; CORE_EXPORT extern const Utils::Icon INFO; CORE_EXPORT extern const Utils::Icon INFO_TOOLBAR; CORE_EXPORT extern const Utils::Icon EXPAND; -CORE_EXPORT extern const Utils::Icon DEBUG_START_SMALL; -CORE_EXPORT extern const Utils::Icon DEBUG_EXIT_SMALL; -CORE_EXPORT extern const Utils::Icon DEBUG_INTERRUPT_SMALL; -CORE_EXPORT extern const Utils::Icon DEBUG_CONTINUE_SMALL; CORE_EXPORT extern const Utils::Icon ZOOM; CORE_EXPORT extern const Utils::Icon TOOLBAR_EXTENSION; diff --git a/src/plugins/debugger/debugger.qrc b/src/plugins/debugger/debugger.qrc index 00d902ea0d9..cea824430d2 100644 --- a/src/plugins/debugger/debugger.qrc +++ b/src/plugins/debugger/debugger.qrc @@ -6,6 +6,12 @@ images/debugger_continue@2x.png images/debugger_continue_mask.png images/debugger_continue_mask@2x.png + images/stop_overlay_small.png + images/stop_overlay_small@2x.png + images/interrupt_overlay_small.png + images/interrupt_overlay_small@2x.png + images/continue_overlay_small.png + images/continue_overlay_small@2x.png images/debugger_empty_14.png images/debugger_interrupt.png images/debugger_interrupt@2x.png diff --git a/src/plugins/debugger/debuggericons.h b/src/plugins/debugger/debuggericons.h index 30eed3b782d..a1180bedb40 100644 --- a/src/plugins/debugger/debuggericons.h +++ b/src/plugins/debugger/debuggericons.h @@ -48,11 +48,20 @@ const Utils::Icon CONTINUE( const Utils::Icon CONTINUE_FLAT({ {QLatin1String(":/projectexplorer/images/debugger_beetle_mask.png"), Utils::Theme::IconsDebugColor}, {QLatin1String(":/debugger/images/debugger_continue_mask.png"), Utils::Theme::IconsRunColor}}); +const Utils::Icon DEBUG_CONTINUE_SMALL({ + {QLatin1String(":/projectexplorer/images/debugger_overlay_small.png"), Utils::Theme::IconsDebugColor}, + {QLatin1String(":/debugger/images/continue_overlay_small.png"), Utils::Theme::IconsRunColor}}); const Utils::Icon INTERRUPT( QLatin1String(":/debugger/images/debugger_interrupt.png")); const Utils::Icon INTERRUPT_FLAT({ {QLatin1String(":/projectexplorer/images/debugger_beetle_mask.png"), Utils::Theme::IconsDebugColor}, {QLatin1String(":/debugger/images/debugger_interrupt_mask.png"), Utils::Theme::IconsInterruptColor}}); +const Utils::Icon DEBUG_INTERRUPT_SMALL({ + {QLatin1String(":/projectexplorer/images/debugger_overlay_small.png"), Utils::Theme::IconsDebugColor}, + {QLatin1String(":/debugger/images/interrupt_overlay_small.png"), Utils::Theme::IconsInterruptColor}}); +const Utils::Icon DEBUG_EXIT_SMALL({ + {QLatin1String(":/projectexplorer/images/debugger_overlay_small.png"), Utils::Theme::IconsDebugColor}, + {QLatin1String(":/debugger/images/stop_overlay_small.png"), Utils::Theme::IconsStopColor}}); const Utils::Icon LOCATION( QLatin1String(":/debugger/images/location_16.png")); const Utils::Icon SNAPSHOT( diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 5b447cc4398..654f9e2b014 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1345,14 +1345,14 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, this, &DebuggerPluginPrivate::updateWatchersHeader, Qt::QueuedConnection); auto act = m_continueAction = new QAction(tr("Continue"), this); - act->setIcon(Icon::combinedIcon({Core::Icons::DEBUG_CONTINUE_SMALL.icon(), continueSideBarIcon})); + act->setIcon(Icon::combinedIcon({Icons::DEBUG_CONTINUE_SMALL.icon(), continueSideBarIcon})); connect(act, &QAction::triggered, this, &DebuggerPluginPrivate::handleExecContinue); act = m_exitAction = new QAction(tr("Stop Debugger"), this); - act->setIcon(Core::Icons::DEBUG_EXIT_SMALL.icon()); + act->setIcon(Icons::DEBUG_EXIT_SMALL.icon()); connect(act, &QAction::triggered, this, &DebuggerPluginPrivate::handleExecExit); - auto interruptIcon = Icon::combinedIcon({Core::Icons::DEBUG_INTERRUPT_SMALL.icon(), interruptSideBarIcon}); + auto interruptIcon = Icon::combinedIcon({Icons::DEBUG_INTERRUPT_SMALL.icon(), interruptSideBarIcon}); act = m_interruptAction = new QAction(tr("Interrupt"), this); act->setIcon(interruptIcon); connect(act, &QAction::triggered, this, &DebuggerPluginPrivate::handleExecInterrupt); @@ -1439,7 +1439,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, act = m_startAction = new QAction(this); const QIcon sideBarIcon = Icon::sideBarIcon(ProjectExplorer::Icons::DEBUG_START, ProjectExplorer::Icons::DEBUG_START_FLAT); - const QIcon debuggerIcon = Icon::combinedIcon({Core::Icons::DEBUG_START_SMALL.icon(), sideBarIcon}); + const QIcon debuggerIcon = Icon::combinedIcon({ProjectExplorer::Icons::DEBUG_START_SMALL.icon(), sideBarIcon}); act->setIcon(debuggerIcon); act->setText(tr("Start Debugging")); connect(act, &QAction::triggered, [] { ProjectExplorerPlugin::runStartupProject(ProjectExplorer::Constants::DEBUG_RUN_MODE); }); @@ -3524,7 +3524,7 @@ void registerToolbar(const QByteArray &perspectiveId, const ToolbarDescription & QAction *createStartAction() { auto action = new QAction(DebuggerMainWindow::tr("Start"), DebuggerPlugin::instance()); - action->setIcon(Debugger::Icons::ANALYZER_CONTROL_START.icon()); + action->setIcon(Icons::ANALYZER_CONTROL_START.icon()); action->setEnabled(true); return action; } diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 4e8388addab..954539cd195 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -43,6 +43,7 @@ #include // For the environment #include #include +#include #include #include #include @@ -54,7 +55,6 @@ #include #include #include -#include #include #include @@ -111,7 +111,7 @@ DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfig, DebuggerEngi m_engine(engine), m_running(false) { - setIcon(Core::Icons::DEBUG_START_SMALL); + setIcon(ProjectExplorer::Icons::DEBUG_START_SMALL); connect(this, &RunControl::finished, this, &DebuggerRunControl::handleFinished); connect(engine, &DebuggerEngine::requestRemoteSetup, diff --git a/src/plugins/coreplugin/images/continue_overlay_small.png b/src/plugins/debugger/images/continue_overlay_small.png similarity index 100% rename from src/plugins/coreplugin/images/continue_overlay_small.png rename to src/plugins/debugger/images/continue_overlay_small.png diff --git a/src/plugins/coreplugin/images/continue_overlay_small@2x.png b/src/plugins/debugger/images/continue_overlay_small@2x.png similarity index 100% rename from src/plugins/coreplugin/images/continue_overlay_small@2x.png rename to src/plugins/debugger/images/continue_overlay_small@2x.png diff --git a/src/plugins/coreplugin/images/interrupt_overlay_small.png b/src/plugins/debugger/images/interrupt_overlay_small.png similarity index 100% rename from src/plugins/coreplugin/images/interrupt_overlay_small.png rename to src/plugins/debugger/images/interrupt_overlay_small.png diff --git a/src/plugins/coreplugin/images/interrupt_overlay_small@2x.png b/src/plugins/debugger/images/interrupt_overlay_small@2x.png similarity index 100% rename from src/plugins/coreplugin/images/interrupt_overlay_small@2x.png rename to src/plugins/debugger/images/interrupt_overlay_small@2x.png diff --git a/src/plugins/coreplugin/images/stop_overlay_small.png b/src/plugins/debugger/images/stop_overlay_small.png similarity index 100% rename from src/plugins/coreplugin/images/stop_overlay_small.png rename to src/plugins/debugger/images/stop_overlay_small.png diff --git a/src/plugins/coreplugin/images/stop_overlay_small@2x.png b/src/plugins/debugger/images/stop_overlay_small@2x.png similarity index 100% rename from src/plugins/coreplugin/images/stop_overlay_small@2x.png rename to src/plugins/debugger/images/stop_overlay_small@2x.png diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index 0ca23e9e7d6..4084290281b 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -181,7 +181,7 @@ AppOutputPane::AppOutputPane() : // Attach m_attachButton->setToolTip(msgAttachDebuggerTooltip()); m_attachButton->setEnabled(false); - m_attachButton->setIcon(Core::Icons::DEBUG_START_SMALL.icon()); + m_attachButton->setIcon(Icons::DEBUG_START_SMALL.icon()); m_attachButton->setAutoRaise(true); connect(m_attachButton, &QAbstractButton::clicked, diff --git a/src/plugins/coreplugin/images/debugger_overlay_small.png b/src/plugins/projectexplorer/images/debugger_overlay_small.png similarity index 100% rename from src/plugins/coreplugin/images/debugger_overlay_small.png rename to src/plugins/projectexplorer/images/debugger_overlay_small.png diff --git a/src/plugins/coreplugin/images/debugger_overlay_small@2x.png b/src/plugins/projectexplorer/images/debugger_overlay_small@2x.png similarity index 100% rename from src/plugins/coreplugin/images/debugger_overlay_small@2x.png rename to src/plugins/projectexplorer/images/debugger_overlay_small@2x.png diff --git a/src/plugins/coreplugin/images/run_overlay_small.png b/src/plugins/projectexplorer/images/run_overlay_small.png similarity index 100% rename from src/plugins/coreplugin/images/run_overlay_small.png rename to src/plugins/projectexplorer/images/run_overlay_small.png diff --git a/src/plugins/coreplugin/images/run_overlay_small@2x.png b/src/plugins/projectexplorer/images/run_overlay_small@2x.png similarity index 100% rename from src/plugins/coreplugin/images/run_overlay_small@2x.png rename to src/plugins/projectexplorer/images/run_overlay_small@2x.png diff --git a/src/plugins/projectexplorer/projectexplorer.qrc b/src/plugins/projectexplorer/projectexplorer.qrc index f86e9005949..e8d0044e3ff 100644 --- a/src/plugins/projectexplorer/projectexplorer.qrc +++ b/src/plugins/projectexplorer/projectexplorer.qrc @@ -24,6 +24,10 @@ images/run_mask@2x.png images/run_small.png images/run_small@2x.png + images/debugger_overlay_small.png + images/debugger_overlay_small@2x.png + images/run_overlay_small.png + images/run_overlay_small@2x.png images/session.png images/targetrunselected.png images/targetrunselected@2x.png diff --git a/src/plugins/projectexplorer/projectexplorericons.h b/src/plugins/projectexplorer/projectexplorericons.h index 447c94ea5e1..05a2ce3c364 100644 --- a/src/plugins/projectexplorer/projectexplorericons.h +++ b/src/plugins/projectexplorer/projectexplorericons.h @@ -57,6 +57,9 @@ const Utils::Icon DEBUG_START( const Utils::Icon DEBUG_START_FLAT({ {QLatin1String(":/projectexplorer/images/debugger_beetle_mask.png"), Utils::Theme::IconsDebugColor}, {QLatin1String(":/projectexplorer/images/debugger_run_mask.png"), Utils::Theme::IconsRunColor}}); +const Utils::Icon DEBUG_START_SMALL({ + {QLatin1String(":/projectexplorer/images/debugger_overlay_small.png"), Utils::Theme::IconsDebugColor}, + {QLatin1String(":/projectexplorer/images/run_overlay_small.png"), Utils::Theme::IconsRunColor}}); const Utils::Icon BUILDSTEP_MOVEUP({ {QLatin1String(":/projectexplorer/images/buildstepmoveup.png"), Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint); diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 099ccc78192..21bfa82a241 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -2231,7 +2231,7 @@ y="570" />