From 9c77515b211b04a5fe81abb4487c20d8095e253e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 14 Jan 2016 13:40:00 +0100 Subject: [PATCH 1/9] Debugger: Improve UnstartedAppWatcherDialog. Make it possible to ESC out of it by using a QDialogButtonBox and overriding the ESC shortcut. Also remove context help button. Change-Id: If632c5f3cadc012dd2f67dcb709570f7a9c25bf5 Reviewed-by: David Schulz --- .../debugger/unstartedappwatcherdialog.cpp | 32 +++++++++++-------- .../debugger/unstartedappwatcherdialog.h | 3 +- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/plugins/debugger/unstartedappwatcherdialog.cpp b/src/plugins/debugger/unstartedappwatcherdialog.cpp index 6a6b5cffc53..7e4e268a8cb 100644 --- a/src/plugins/debugger/unstartedappwatcherdialog.cpp +++ b/src/plugins/debugger/unstartedappwatcherdialog.cpp @@ -49,6 +49,8 @@ #include #include #include +#include +#include #include #include #include @@ -84,6 +86,7 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Attach to Process Not Yet Started")); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); m_kitChooser = new DebuggerKitChooser(DebuggerKitChooser::LocalDebugging, this); m_kitChooser->populate(); @@ -124,19 +127,11 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) m_waitingLabel = new QLabel(QString(), this); m_waitingLabel->setAlignment(Qt::AlignCenter); - m_watchingPushButton = new QPushButton(this); + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this); + m_watchingPushButton = buttonBox->addButton(tr("Start Watching"), QDialogButtonBox::ActionRole); m_watchingPushButton->setCheckable(true); m_watchingPushButton->setChecked(false); m_watchingPushButton->setEnabled(false); - m_watchingPushButton->setText(tr("Start Watching")); - - m_closePushButton = new QPushButton(this); - m_closePushButton->setText(tr("Close")); - - QHBoxLayout *buttonsLine = new QHBoxLayout(); - buttonsLine->addSpacerItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); - buttonsLine->addWidget(m_watchingPushButton); - buttonsLine->addWidget(m_closePushButton); QFormLayout *mainLayout = new QFormLayout(this); mainLayout->addRow(new QLabel(tr("Kit: "), this), m_kitChooser); @@ -145,7 +140,7 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) mainLayout->addRow(m_continueOnAttachCheckBox); mainLayout->addRow(m_waitingLabel); mainLayout->addItem(new QSpacerItem(20, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)); - mainLayout->addRow(buttonsLine); + mainLayout->addRow(buttonBox); setLayout(mainLayout); connect(m_pathChooser, &Utils::PathChooser::beforeBrowsing, @@ -154,8 +149,7 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) this, &UnstartedAppWatcherDialog::startStopWatching); connect(m_pathChooser, &Utils::PathChooser::pathChanged, this, &UnstartedAppWatcherDialog::stopAndCheckExecutable); - connect(m_closePushButton, &QAbstractButton::clicked, - this, &QDialog::reject); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(&m_timer, &QTimer::timeout, this, &UnstartedAppWatcherDialog::findProcess); connect(m_kitChooser, &KitChooser::currentIndexChanged, @@ -165,6 +159,18 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) setWaitingState(checkExecutableString() ? NotWatchingState : InvalidWacherState); } +bool UnstartedAppWatcherDialog::event(QEvent *e) +{ + if (e->type() == QEvent::ShortcutOverride) { + QKeyEvent *ke = static_cast(e); + if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { + ke->accept(); + return true; + } + } + return QDialog::event(e); +} + void UnstartedAppWatcherDialog::selectExecutable() { QString path; diff --git a/src/plugins/debugger/unstartedappwatcherdialog.h b/src/plugins/debugger/unstartedappwatcherdialog.h index 5edb21781fa..583db95ce5e 100644 --- a/src/plugins/debugger/unstartedappwatcherdialog.h +++ b/src/plugins/debugger/unstartedappwatcherdialog.h @@ -64,6 +64,8 @@ public: bool continueOnAttach() const; void startWatching(); + bool event(QEvent *) override; + signals: void processFound(); @@ -93,7 +95,6 @@ private: QCheckBox *m_hideOnAttachCheckBox; QCheckBox *m_continueOnAttachCheckBox; QPushButton *m_watchingPushButton; - QPushButton *m_closePushButton; ProjectExplorer::DeviceProcessItem m_process; QTimer m_timer; }; From 17e5cd708541d10d17a77216e80b8a6c99f1a85a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 19 Jan 2016 12:04:06 +0100 Subject: [PATCH 2/9] QmlDesigner: Fix crash in qml2puppet We should not call updateDirtyNode() for items without a window. This will assert later in consistency checks. Change-Id: Iff3574123a1497206de88d59fcf630ead57ef593 Reviewed-by: Tim Jenssen --- .../qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index c215b2c16b0..7890f695c85 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -581,7 +581,8 @@ void QuickItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParen } refresh(); - DesignerSupport::updateDirtyNode(quickItem()); + if (quickItem()->window()) + DesignerSupport::updateDirtyNode(quickItem()); if (instanceIsValidLayoutable(oldParentInstance, oldParentProperty)) oldParentInstance->refreshLayoutable(); From 6dd80accfff0a8c36ae4242e69b5d22bccd10cec Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 15 Jan 2016 12:13:26 +0100 Subject: [PATCH 3/9] QmlDesigner: Remove unused file Change-Id: Ife567cfb368092f818c7cf418ede4ab1bca227aa Reviewed-by: Tim Jenssen --- .../QmlDesignerExtension.json.in | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/plugins/qmldesigner/qmldesignerextension/QmlDesignerExtension.json.in diff --git a/src/plugins/qmldesigner/qmldesignerextension/QmlDesignerExtension.json.in b/src/plugins/qmldesigner/qmldesignerextension/QmlDesignerExtension.json.in deleted file mode 100644 index 92ccdf9a96f..00000000000 --- a/src/plugins/qmldesigner/qmldesignerextension/QmlDesignerExtension.json.in +++ /dev/null @@ -1,15 +0,0 @@ -{ - \"Name\" : \"QmlDesignerExtension\", - \"Version\" : \"$$QTCREATOR_VERSION\", - \"CompatVersion\" : \"$$QTCREATOR_COMPAT_VERSION\", - \"Vendor\" : \"The Qt Company Ltd\", - \"Copyright\" : \"(C) 2015 The Qt Company Ltd\", - \"License\" : [ \"Commercial Usage\", - \"\", - \"Licensees holding valid Qt Commercial licenses may use this plugin in accordance with the Qt Commercial License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and The Qt Company.\" - ], - \"Category\" : \"Qt Quick\", - \"Description\" : \"Extensions for the Qt Quick Designer.\", - \"Url\" : \"http://www.qt.io\", - $$dependencyList -} From 1a6b62a2b03b29bae7f900c77df785eefc8707b3 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 18 Jan 2016 09:22:49 +0100 Subject: [PATCH 4/9] Clang: Fix text format for completion details The tooltip text right to the completion list item is prepared for rich text (html) interpretation, but the QLabel the text will finally be displayed with has no explicit text format set and thus defaults to auto detection. The auto detection works fine for e.g. "int optionalArg" but fails for "const Foo&". Task-number: QTCREATORBUG-15630 Change-Id: Ia58d65ee542730e4823c69150d452cdde98112f8 Reviewed-by: Marco Bubke --- .../clangcodemodel/clangassistproposalmodel.cpp | 5 +++++ src/plugins/clangcodemodel/clangassistproposalmodel.h | 2 ++ .../texteditor/codeassist/genericproposalmodel.cpp | 11 +++++++++++ .../texteditor/codeassist/genericproposalmodel.h | 4 ++++ .../texteditor/codeassist/genericproposalwidget.cpp | 6 ++++++ 5 files changed, 28 insertions(+) diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp index d4085b39298..4b7ac93b16f 100644 --- a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp @@ -39,6 +39,11 @@ namespace ClangCodeModel { namespace Internal { +ClangAssistProposalModel::ClangAssistProposalModel() +{ + setDetailTextFormat(Qt::RichText); +} + bool ClangAssistProposalModel::isSortable(const QString &/*prefix*/) const { return true; diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.h b/src/plugins/clangcodemodel/clangassistproposalmodel.h index 5f7b1f502a0..90ef4a2f202 100644 --- a/src/plugins/clangcodemodel/clangassistproposalmodel.h +++ b/src/plugins/clangcodemodel/clangassistproposalmodel.h @@ -41,6 +41,8 @@ namespace Internal { class ClangAssistProposalModel : public TextEditor::GenericProposalModel { public: + ClangAssistProposalModel(); + bool isSortable(const QString &prefix) const override; void sort(const QString &prefix) override; }; diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp index 3881775bc8a..e7839d97eb7 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp @@ -135,6 +135,7 @@ private: } // Anonymous GenericProposalModel::GenericProposalModel() + : m_detailTextFormat(Qt::AutoText) {} GenericProposalModel::~GenericProposalModel() @@ -150,6 +151,16 @@ void GenericProposalModel::loadContent(const QList &items) m_idByText.insert(m_originalItems.at(i)->text(), i); } +Qt::TextFormat GenericProposalModel::detailTextFormat() const +{ + return m_detailTextFormat; +} + +void GenericProposalModel::setDetailTextFormat(Qt::TextFormat detailTextFormat) +{ + m_detailTextFormat = detailTextFormat; +} + void GenericProposalModel::reset() { m_currentItems = m_originalItems; diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.h b/src/plugins/texteditor/codeassist/genericproposalmodel.h index a68bf21134e..b97a23869ea 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.h +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.h @@ -72,12 +72,16 @@ public: void setSortingAllowed(bool isAllowed); bool isSortingAllowed() const; + Qt::TextFormat detailTextFormat() const; + void setDetailTextFormat(Qt::TextFormat detailTextFormat); + protected: QList m_currentItems; private: QHash m_idByText; QList m_originalItems; + Qt::TextFormat m_detailTextFormat; }; } // TextEditor diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index 063bedb9565..777e1a8b3f4 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -168,6 +168,11 @@ public: m_label->setText(text); } + void setTextFormat(Qt::TextFormat textFormat) + { + m_label->setTextFormat(textFormat); + } + // Workaround QTCREATORBUG-11653 void calculateMaximumWidth() { @@ -312,6 +317,7 @@ void GenericProposalWidgetPrivate::maybeShowInfoTip() m_infoFrame->move(m_completionListView->infoFramePos()); m_infoFrame->setText(infoTip); + m_infoFrame->setTextFormat(m_model->detailTextFormat()); m_infoFrame->calculateMaximumWidth(); m_infoFrame->adjustSize(); m_infoFrame->show(); From a071e52b945cfff1aa199d009df1cb58279cf9e2 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 18 Jan 2016 09:51:00 +0100 Subject: [PATCH 5/9] Clang: Extract duplicate code Change-Id: I476916f825ab475f77f918127217dfc33eb4f388 Reviewed-by: Marco Bubke --- .../clangcodemodel/clangassistproposalitem.cpp | 4 +--- .../clangcompletionchunkstotextconverter.cpp | 7 +++++++ .../clangcompletionchunkstotextconverter.h | 2 ++ .../completionchunkstotextconvertertest.cpp | 16 +++++----------- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index f96128b9171..0cc5e25faf6 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -104,9 +104,7 @@ void ClangAssistProposalItem::applyContextualContent(TextEditor::TextEditorWidge } } else if (ccr.completionKind() == CodeCompletion::KeywordCompletionKind) { CompletionChunksToTextConverter converter; - converter.setAddPlaceHolderPositions(true); - converter.setAddSpaces(true); - converter.setAddExtraVerticalSpaceBetweenBraces(true); + converter.setupForKeywords(); converter.parseChunks(ccr.chunks()); diff --git a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp index 93a004a1ea4..ec733c87d71 100644 --- a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp +++ b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp @@ -96,6 +96,13 @@ void CompletionChunksToTextConverter::setPlaceHolderToEmphasize(int placeHolderN m_placeHolderPositionToEmphasize = placeHolderNumber; } +void CompletionChunksToTextConverter::setupForKeywords() +{ + setAddPlaceHolderPositions(true); + setAddSpaces(true); + setAddExtraVerticalSpaceBetweenBraces(true); +} + const QString &CompletionChunksToTextConverter::text() const { return m_text; diff --git a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h index e84e0dd84fc..fec927eb446 100644 --- a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h +++ b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h @@ -56,6 +56,8 @@ public: void setAddOptional(bool addOptional); void setPlaceHolderToEmphasize(int placeHolderNumber); + void setupForKeywords(); + const QString &text() const; const std::vector &placeholderPositions() const; bool hasPlaceholderPositions() const; diff --git a/tests/unit/unittest/completionchunkstotextconvertertest.cpp b/tests/unit/unittest/completionchunkstotextconvertertest.cpp index 42ec87768a0..175da498e4e 100644 --- a/tests/unit/unittest/completionchunkstotextconvertertest.cpp +++ b/tests/unit/unittest/completionchunkstotextconvertertest.cpp @@ -269,7 +269,7 @@ TEST_F(CompletionChunksToTextConverter, Switch) leftBrace, verticalSpace, rightBrace}); - setupConverterForKeywords(); + converter.setupForKeywords(); converter.parseChunks(completionChunks); @@ -292,7 +292,7 @@ TEST_F(CompletionChunksToTextConverter, For) statements, verticalSpace, rightBrace}); - setupConverterForKeywords(); + converter.setupForKeywords(); converter.parseChunks(completionChunks); @@ -306,7 +306,7 @@ TEST_F(CompletionChunksToTextConverter, const_cast) rightAngle, leftParen, rightParen}); - setupConverterForKeywords(); + converter.setupForKeywords(); converter.parseChunks(completionChunks); @@ -333,7 +333,7 @@ TEST_F(CompletionChunksToTextConverter, ElseIf) statements, verticalSpace, rightBrace}); - setupConverterForKeywords(); + converter.setupForKeywords(); converter.parseChunks(completionChunks); @@ -348,17 +348,11 @@ TEST_F(CompletionChunksToTextConverter, EnableIfT) optionalComma, optionalEnableIfTType, rightAngle}); - setupConverterForKeywords(); + converter.setupForKeywords(); converter.parseChunks(completionChunks); ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>")); } -void CompletionChunksToTextConverter::setupConverterForKeywords() -{ - converter.setAddPlaceHolderPositions(true); - converter.setAddSpaces(true); - converter.setAddExtraVerticalSpaceBetweenBraces(true); -} } From 2324db9d4100e7df2a97fe5da968d76deebef23f Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 18 Jan 2016 11:22:39 +0100 Subject: [PATCH 6/9] Clang: Fix html code in completion list item E.g. "dynamic_cast<>()" showed up as item. Let CompletionChunksToTextConverter default to plain text format and explicitly request HTML where needed. Change-Id: Iebce85cb888a5bd697ffdce364118b6dc65a435d Reviewed-by: Marco Bubke --- .../clangcompletionassistprocessor.cpp | 3 +- .../clangcompletionchunkstotextconverter.cpp | 29 ++++++++++++++----- .../clangcompletionchunkstotextconverter.h | 20 +++++++++---- .../clangcodemodel/clangfunctionhintmodel.cpp | 3 +- .../completionchunkstotextconvertertest.cpp | 20 ++++++------- 5 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 0cd362d4da2..a918b101401 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -103,7 +103,8 @@ QList toAssistProposalItems(const CodeCompletions &complet items.insert(name, item); item->setText(name); item->setOrder(ccr.priority()); - QString detail = CompletionChunksToTextConverter::convertToToolTip(ccr.chunks()); + QString detail + = CompletionChunksToTextConverter::convertToToolTipWithHtml(ccr.chunks()); if (!ccr.briefComment().isEmpty()) detail += QStringLiteral("\n\n") + ccr.briefComment().toString(); diff --git a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp index ec733c87d71..4954979e38c 100644 --- a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp +++ b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp @@ -118,7 +118,7 @@ bool CompletionChunksToTextConverter::hasPlaceholderPositions() const return m_placeholderPositions.size() > 0; } -QString CompletionChunksToTextConverter::convertToFunctionSignature( +QString CompletionChunksToTextConverter::convertToFunctionSignatureWithHtml( const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks, int parameterToEmphasize) { @@ -126,6 +126,7 @@ QString CompletionChunksToTextConverter::convertToFunctionSignature( converter.setAddPlaceHolderText(true); converter.setAddResultType(true); + converter.setTextFormat(TextFormat::Html); converter.setAddOptional(true); converter.setEmphasizeOptional(true); @@ -147,7 +148,7 @@ QString CompletionChunksToTextConverter::convertToName( return converter.text(); } -QString CompletionChunksToTextConverter::convertToToolTip( +QString CompletionChunksToTextConverter::convertToToolTipWithHtml( const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks) { CompletionChunksToTextConverter converter; @@ -155,6 +156,7 @@ QString CompletionChunksToTextConverter::convertToToolTip( converter.setAddSpaces(true); converter.setAddExtraVerticalSpaceBetweenBraces(true); converter.setAddOptional(true); + converter.setTextFormat(TextFormat::Html); converter.setEmphasizeOptional(true); converter.setAddResultType(true); @@ -189,7 +191,7 @@ void CompletionChunksToTextConverter::parseDependendOnTheOptionalState( void CompletionChunksToTextConverter::parseResultType(const Utf8String &resultTypeText) { if (m_addResultType) - m_text += resultTypeText.toString().toHtmlEscaped() + QChar(QChar::Space); + m_text += inDesiredTextFormat(resultTypeText) + QChar(QChar::Space); } void CompletionChunksToTextConverter::parseText(const Utf8String &text) @@ -199,14 +201,14 @@ void CompletionChunksToTextConverter::parseText(const Utf8String &text) m_text += QChar(QChar::Space); } - m_text += text.toString().toHtmlEscaped(); + m_text += inDesiredTextFormat(text); } void CompletionChunksToTextConverter::wrapInCursiveTagIfOptional( const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk) { if (m_addOptional) { - if (m_emphasizeOptional) { + if (m_emphasizeOptional && m_textFormat == TextFormat::Html) { if (!m_previousCodeCompletionChunk.isOptional() && codeCompletionChunk.isOptional()) m_text += QStringLiteral(""); else if (m_previousCodeCompletionChunk.isOptional() && !codeCompletionChunk.isOptional()) @@ -219,7 +221,7 @@ void CompletionChunksToTextConverter::parsePlaceHolder( const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk) { if (m_addPlaceHolderText) { - appendText(codeCompletionChunk.text().toString().toHtmlEscaped(), + appendText(inDesiredTextFormat(codeCompletionChunk.text()), emphasizeCurrentPlaceHolder()); } @@ -294,6 +296,14 @@ void CompletionChunksToTextConverter::addExtraVerticalSpaceBetweenBraces( } } +QString CompletionChunksToTextConverter::inDesiredTextFormat(const Utf8String &text) +{ + if (m_textFormat == TextFormat::Html) + return text.toString().toHtmlEscaped(); + else + return text.toString(); +} + bool CompletionChunksToTextConverter::emphasizeCurrentPlaceHolder() const { if (m_addPlaceHolderPositions) { @@ -304,9 +314,14 @@ bool CompletionChunksToTextConverter::emphasizeCurrentPlaceHolder() const return false; } +void CompletionChunksToTextConverter::setTextFormat(TextFormat textFormat) +{ + m_textFormat = textFormat; +} + void CompletionChunksToTextConverter::appendText(const QString &text, bool boldFormat) { - if (boldFormat) + if (boldFormat && m_textFormat == TextFormat::Html) m_text += QStringLiteral("") + text + QStringLiteral(""); else m_text += text; diff --git a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h index fec927eb446..6d88778c640 100644 --- a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h +++ b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.h @@ -47,12 +47,17 @@ class CompletionChunksToTextConverter public: void parseChunks(const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks); + enum class TextFormat { + Plain, + Html + }; + void setTextFormat(TextFormat textFormat); void setAddPlaceHolderText(bool addPlaceHolderText); void setAddPlaceHolderPositions(bool addPlaceHolderPositions); void setAddResultType(bool addResultType); void setAddSpaces(bool addSpaces); void setAddExtraVerticalSpaceBetweenBraces(bool addExtraVerticalSpaceBetweenBraces); - void setEmphasizeOptional(bool emphasizeOptional); + void setEmphasizeOptional(bool emphasizeOptional); // Only for Html format void setAddOptional(bool addOptional); void setPlaceHolderToEmphasize(int placeHolderNumber); @@ -62,10 +67,13 @@ public: const std::vector &placeholderPositions() const; bool hasPlaceholderPositions() const; - static QString convertToFunctionSignature(const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks, - int parameterToEmphasize = -1); static QString convertToName(const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks); - static QString convertToToolTip(const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks); + static QString convertToKeywords(const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks); + static QString convertToToolTipWithHtml(const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks); + static QString convertToFunctionSignatureWithHtml( + const ClangBackEnd::CodeCompletionChunks &codeCompletionChunks, + int parameterToEmphasize = -1); + private: void parse(const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk); void parseDependendOnTheOptionalState(const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk); @@ -78,7 +86,8 @@ private: void addExtraVerticalSpaceBetweenBraces(); void addExtraVerticalSpaceBetweenBraces(const ClangBackEnd::CodeCompletionChunks::iterator &); - void appendText(const QString &text, bool boldFormat = false); + QString inDesiredTextFormat(const Utf8String &text) const; + void appendText(const QString &text, bool boldFormat = false); // Boldness only in Html format bool canAddSpace() const; bool isNotOptionalOrAddOptionals(const ClangBackEnd::CodeCompletionChunk &codeCompletionChunk) const; @@ -90,6 +99,7 @@ private: ClangBackEnd::CodeCompletionChunk m_previousCodeCompletionChunk; QString m_text; int m_placeHolderPositionToEmphasize = -1; + TextFormat m_textFormat = TextFormat::Plain; bool m_addPlaceHolderText = false; bool m_addPlaceHolderPositions = false; bool m_addResultType = false; diff --git a/src/plugins/clangcodemodel/clangfunctionhintmodel.cpp b/src/plugins/clangcodemodel/clangfunctionhintmodel.cpp index 03dfa6d6c99..730cecbbc1f 100644 --- a/src/plugins/clangcodemodel/clangfunctionhintmodel.cpp +++ b/src/plugins/clangcodemodel/clangfunctionhintmodel.cpp @@ -58,7 +58,8 @@ QString ClangFunctionHintModel::text(int index) const { const ClangBackEnd::CodeCompletionChunks chunks = m_functionSymbols.at(index).chunks(); const QString signatureWithEmphasizedCurrentParameter - = CompletionChunksToTextConverter::convertToFunctionSignature(chunks, m_currentArgument + 1); + = CompletionChunksToTextConverter::convertToFunctionSignatureWithHtml(chunks, + m_currentArgument + 1); return signatureWithEmphasizedCurrentParameter; } diff --git a/tests/unit/unittest/completionchunkstotextconvertertest.cpp b/tests/unit/unittest/completionchunkstotextconvertertest.cpp index 175da498e4e..38607c0979c 100644 --- a/tests/unit/unittest/completionchunkstotextconvertertest.cpp +++ b/tests/unit/unittest/completionchunkstotextconvertertest.cpp @@ -131,7 +131,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithOneArgumen using ClangCodeModel::Internal::CompletionChunksToTextConverter; - ASSERT_THAT(converter.convertToFunctionSignature(completionChunks), + ASSERT_THAT(converter.convertToFunctionSignatureWithHtml(completionChunks), QStringLiteral("int Function(char x)")); } @@ -143,7 +143,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithOneParamet functionArgumentX, rightParen}); - ASSERT_THAT(converter.convertToFunctionSignature(completionChunks, 1), + ASSERT_THAT(converter.convertToFunctionSignatureWithHtml(completionChunks, 1), QStringLiteral("int Function(char x)")); } @@ -155,7 +155,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithOneParamet functionArgumentX, rightParen}); - ASSERT_THAT(converter.convertToFunctionSignature(completionChunks, -1), + ASSERT_THAT(converter.convertToFunctionSignatureWithHtml(completionChunks, -1), QStringLiteral("int Function(char x)")); } @@ -169,7 +169,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTwoParamet functionArgumentY, rightParen}); - ASSERT_THAT(converter.convertToFunctionSignature(completionChunks, 2), + ASSERT_THAT(converter.convertToFunctionSignatureWithHtml(completionChunks, 2), QStringLiteral("int Function(char x, int y)")); } @@ -183,7 +183,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTwoParamet optionalFunctionArgumentY, rightParen}); - ASSERT_THAT(converter.convertToFunctionSignature(completionChunks, 2), + ASSERT_THAT(converter.convertToFunctionSignatureWithHtml(completionChunks, 2), QStringLiteral("int Function(char x, int y)")); } @@ -197,7 +197,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTemplateRe using ClangCodeModel::Internal::CompletionChunksToTextConverter; - ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignature(completionChunks), + ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignatureWithHtml(completionChunks), QStringLiteral("Foo<int> Function(char x)")); } @@ -211,7 +211,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertToFunctionSignatureWithTemplateAr using ClangCodeModel::Internal::CompletionChunksToTextConverter; - ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignature(completionChunks), + ASSERT_THAT(CompletionChunksToTextConverter::convertToFunctionSignatureWithHtml(completionChunks), QStringLiteral("int Function(const Foo<int> &foo)")); } @@ -227,7 +227,7 @@ TEST_F(CompletionChunksToTextConverter, ConvertFunctionWithOptionalParameter) optionalFunctionArgumentZ, rightParen}); - ASSERT_THAT(Converter::convertToToolTip(completionChunks), + ASSERT_THAT(Converter::convertToToolTipWithHtml(completionChunks), QStringLiteral("int Function (char x, int y, int z)")); } @@ -310,7 +310,7 @@ TEST_F(CompletionChunksToTextConverter, const_cast) converter.parseChunks(completionChunks); - ASSERT_THAT(converter.text(), QStringLiteral("const_cast<>()")); + ASSERT_THAT(converter.text(), QStringLiteral("const_cast<>()")); } TEST_F(CompletionChunksToTextConverter, Throw) @@ -352,7 +352,7 @@ TEST_F(CompletionChunksToTextConverter, EnableIfT) converter.parseChunks(completionChunks); - ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>")); + ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>")); } } From 5691156b358fb7233258eb941dd0f82a1e881ab0 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 18 Jan 2016 12:14:10 +0100 Subject: [PATCH 7/9] Clang: Fix inserting "::" after namespace The extra "::" is showed in the tooltip right to the completion list item, but it was not inserted. Change-Id: I0ad2b816c56b8e3b5ccf0643f2c1a4f2a20b8818 Reviewed-by: Marco Bubke --- .../clangcodemodel/clangassistproposalitem.cpp | 6 ++++++ .../unittest/completionchunkstotextconvertertest.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index 0cc5e25faf6..684d3d38113 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -111,6 +111,12 @@ void ClangAssistProposalItem::applyContextualContent(TextEditor::TextEditorWidge textToBeInserted = converter.text(); if (converter.hasPlaceholderPositions()) cursorOffset = converter.placeholderPositions().at(0) - converter.text().size(); + } else if (ccr.completionKind() == CodeCompletion::NamespaceCompletionKind) { + CompletionChunksToTextConverter converter; + + converter.parseChunks(ccr.chunks()); // Appends "::" after name space name + + textToBeInserted = converter.text(); } else if (!ccr.text().isEmpty()) { const TextEditor::CompletionSettings &completionSettings = TextEditor::TextEditorSettings::instance()->completionSettings(); diff --git a/tests/unit/unittest/completionchunkstotextconvertertest.cpp b/tests/unit/unittest/completionchunkstotextconvertertest.cpp index 38607c0979c..5f503ed167d 100644 --- a/tests/unit/unittest/completionchunkstotextconvertertest.cpp +++ b/tests/unit/unittest/completionchunkstotextconvertertest.cpp @@ -53,6 +53,7 @@ protected: CodeCompletionChunk templateResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Foo")}; CodeCompletionChunk enumerationResultType{CodeCompletionChunk::ResultType, Utf8StringLiteral("Enumeration")}; CodeCompletionChunk functionName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Function")}; + CodeCompletionChunk namespaceName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Namespace")}; CodeCompletionChunk variableName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Variable")}; CodeCompletionChunk enumeratorName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Enumerator")}; CodeCompletionChunk enumerationName{CodeCompletionChunk::TypedText, Utf8StringLiteral("Enumeration")}; @@ -61,6 +62,7 @@ protected: CodeCompletionChunk rightParen{CodeCompletionChunk::RightParen, Utf8StringLiteral(")")}; CodeCompletionChunk comma{CodeCompletionChunk::Comma, Utf8StringLiteral(", ")}; CodeCompletionChunk semicolon{CodeCompletionChunk::SemiColon, Utf8StringLiteral(";")}; + CodeCompletionChunk colonColonText{CodeCompletionChunk::Text, Utf8StringLiteral("::")}; CodeCompletionChunk functionArgumentX{CodeCompletionChunk::Placeholder, Utf8StringLiteral("char x")}; CodeCompletionChunk functionArgumentY{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int y")}; CodeCompletionChunk functionArgumentZ{CodeCompletionChunk::Placeholder, Utf8StringLiteral("int z")}; @@ -355,4 +357,13 @@ TEST_F(CompletionChunksToTextConverter, EnableIfT) ASSERT_THAT(converter.text(), QStringLiteral("enable_if_t<>")); } +TEST_F(CompletionChunksToTextConverter, Namespace) +{ + CodeCompletionChunks completionChunks({namespaceName, colonColonText}); + + converter.parseChunks(completionChunks); + + ASSERT_THAT(converter.text(), QStringLiteral("Namespace::")); +} + } From 01f144d51458ec3e7c379f267affb0fd5e568eee Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 19 Jan 2016 15:21:11 +0100 Subject: [PATCH 8/9] Fix display of MSVC2015 in compilerString(). Display values of _MSC_VER >= 1900 (currently displayed as MSVC 2014) as MSVC2015 and larger values as unknown. Change-Id: Id23b0f9342e6ad6d776bb44743e5e4ce91462c8f Reviewed-by: Eike Ziller --- src/plugins/coreplugin/icore.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index c2d18261401..d4377ec753c 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -464,6 +464,10 @@ static QString compilerString() #elif defined(Q_CC_GNU) return QLatin1String("GCC " ) + QLatin1String(__VERSION__); #elif defined(Q_CC_MSVC) + if (_MSC_VER > 1999) + return QLatin1String("MSVC "); + if (_MSC_VER >= 1900) // 1900: MSVC 2015 + return QLatin1String("MSVC 2015"); if (_MSC_VER >= 1800) // 1800: MSVC 2013 (yearly release cycle) return QLatin1String("MSVC ") + QString::number(2008 + ((_MSC_VER / 100) - 13)); if (_MSC_VER >= 1500) // 1500: MSVC 2008, 1600: MSVC 2010, ... (2-year release cycle) From f8d4e4954b9b1b0419443b1d90fe1a597b649dd2 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 19 Jan 2016 15:34:31 +0100 Subject: [PATCH 9/9] Fix const-ness of ClangCodeModel::Internal::CompletionChunksToTextConverter::inDesiredTextFormat((). Change-Id: I622b65d7d8fd90d67863282fe85b867acf16b899 Reviewed-by: Nikolai Kosjar --- .../clangcodemodel/clangcompletionchunkstotextconverter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp index 4954979e38c..796fe87c1c8 100644 --- a/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp +++ b/src/plugins/clangcodemodel/clangcompletionchunkstotextconverter.cpp @@ -296,7 +296,7 @@ void CompletionChunksToTextConverter::addExtraVerticalSpaceBetweenBraces( } } -QString CompletionChunksToTextConverter::inDesiredTextFormat(const Utf8String &text) +QString CompletionChunksToTextConverter::inDesiredTextFormat(const Utf8String &text) const { if (m_textFormat == TextFormat::Html) return text.toString().toHtmlEscaped();