summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-11-09 12:44:39 +0100
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-11-13 08:17:19 +0000
commit41d68f469a1e914594bb9ca812005ec5542d3459 (patch)
tree86c7da0f025a3fc9affb2e42b4928a278f190069
parentad37ad1a86e79ee220293c8bdeab4e75aeb479fb (diff)
downloadqt-creator-41d68f469a1e914594bb9ca812005ec5542d3459.tar.gz
Clang: Change dot <-> arrow if all completions require it
Return the behavior that existed before completion fix-its were introduced. Apply it only for the cases when all items require the fix-it. Fixes: QTCREATORBUG-21367 Change-Id: Idc358255135f72353f3fd3204b653fc2fc55e7a0 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r--src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp38
-rw-r--r--src/plugins/clangcodemodel/clangcompletionassistprocessor.h2
-rw-r--r--src/plugins/clangcodemodel/clangfixitoperation.h2
3 files changed, 40 insertions, 2 deletions
diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
index fec7b69dab..d53edaea19 100644
--- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
@@ -29,6 +29,7 @@
#include "clangassistproposalmodel.h"
#include "clangcompletionassistprocessor.h"
#include "clangcompletioncontextanalyzer.h"
+#include "clangfixitoperation.h"
#include "clangfunctionhintmodel.h"
#include "clangcompletionchunkstotextconverter.h"
#include "clangpreprocessorassistproposalitem.h"
@@ -180,6 +181,35 @@ IAssistProposal *ClangCompletionAssistProcessor::perform(const AssistInterface *
return startCompletionHelper(); // == 0 if results are calculated asynchronously
}
+// All completions require fix-it, apply this fix-it now.
+CodeCompletions ClangCompletionAssistProcessor::applyCompletionFixIt(const CodeCompletions &completions)
+{
+ // CLANG-UPGRADE-CHECK: Currently we rely on fact that there are only 2 possible fix-it types:
+ // 'dot to arrow' and 'arrow to dot' and they can't appear for the same item.
+ // However if we get multiple options which trigger for the same code we need to improve this
+ // algorithm. Check comments to FixIts field of CodeCompletionResult and which fix-its are used
+ // to construct results in SemaCodeComplete.cpp.
+ const CodeCompletion &completion = completions.front();
+ const ClangBackEnd::FixItContainer &fixIt = completion.requiredFixIts.front();
+
+ ClangFixItOperation fixItOperation(Utf8String(), completion.requiredFixIts);
+ fixItOperation.perform();
+
+ const int fixItLength = static_cast<int>(fixIt.range.end.column - fixIt.range.start.column);
+ const QString fixItText = fixIt.text.toString();
+ m_positionForProposal += fixItText.length() - fixItLength;
+
+ CodeCompletions completionsWithoutFixIts;
+ completionsWithoutFixIts.reserve(completions.size());
+ for (const CodeCompletion &completion : completions) {
+ CodeCompletion completionCopy = completion;
+ completionCopy.requiredFixIts.clear();
+ completionsWithoutFixIts.push_back(completionCopy);
+ }
+
+ return completionsWithoutFixIts;
+}
+
void ClangCompletionAssistProcessor::handleAvailableCompletions(const CodeCompletions &completions)
{
QTC_CHECK(m_completions.isEmpty());
@@ -196,7 +226,13 @@ void ClangCompletionAssistProcessor::handleAvailableCompletions(const CodeComple
}
//m_sentRequestType == NormalCompletion or function signatures were empty
- m_completions = toAssistProposalItems(completions, m_interface.data());
+
+ // Completions are sorted the way that all items with fix-its come after all items without them
+ // therefore it's enough to check only the first one.
+ if (!completions.isEmpty() && !completions.front().requiredFixIts.isEmpty())
+ m_completions = toAssistProposalItems(applyCompletionFixIt(completions), m_interface.data());
+ else
+ m_completions = toAssistProposalItems(completions, m_interface.data());
if (m_addSnippets && !m_completions.isEmpty())
addSnippets();
diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h
index f5f7b06684..47ce2be1fc 100644
--- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h
+++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h
@@ -85,6 +85,8 @@ private:
const QByteArray &customFileContent,
int functionNameStartPosition = -1);
+ CodeCompletions applyCompletionFixIt(const CodeCompletions &completions);
+
private:
struct Position { int line; int column; };
Position extractLineColumn(int position);
diff --git a/src/plugins/clangcodemodel/clangfixitoperation.h b/src/plugins/clangcodemodel/clangfixitoperation.h
index 1270e98f36..4f37f3d479 100644
--- a/src/plugins/clangcodemodel/clangfixitoperation.h
+++ b/src/plugins/clangcodemodel/clangfixitoperation.h
@@ -57,7 +57,7 @@ public:
private:
void applyFixitsToFile(TextEditor::RefactoringFile &refactoringFile,
const QVector<ClangBackEnd::FixItContainer> fixItContainers);
- Utils::ChangeSet toChangeSet(
+ ::Utils::ChangeSet toChangeSet(
TextEditor::RefactoringFile &refactoringFile,
const QVector<ClangBackEnd::FixItContainer> fixItContainers) const;