summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2017-09-08 09:33:35 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2017-09-22 12:58:46 +0000
commitf130de2400b8fa6bc98110b721e12e9e02a5fc09 (patch)
tree2738da3aab6b969f152bc0ff0ea535fc5655c496 /src/plugins
parentc73793414b1bc8901413862972db8ced1ccb9151 (diff)
downloadqt-creator-f130de2400b8fa6bc98110b721e12e9e02a5fc09.tar.gz
Clang: use HighlightingMarks for hover with Ctrl highlighting
Make this highlighting work without builtin code model but based on the HighlightingMarks that we already have from ClangCodeModel. Redundant parameters are removed by this change. Change-Id: I73b5dab46ba59d2f813236831818f0a9bc94c5bc Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/clangcodemodel/clangbackendipcintegration.cpp7
-rw-r--r--src/plugins/clangcodemodel/clangbackendipcintegration.h3
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp12
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.h7
-rw-r--r--src/plugins/clangcodemodel/clangfollowsymbol.cpp97
-rw-r--r--src/plugins/clangcodemodel/clanghighlightingmarksreporter.cpp9
-rw-r--r--src/plugins/cppeditor/cppeditorwidget.cpp9
-rw-r--r--src/plugins/cpptools/baseeditordocumentprocessor.h2
-rw-r--r--src/plugins/cpptools/builtineditordocumentprocessor.h2
-rw-r--r--src/plugins/cpptools/cppsymbolinfo.h1
10 files changed, 105 insertions, 44 deletions
diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp
index 065ea0fe4b..ff1cf8f075 100644
--- a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp
+++ b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp
@@ -275,7 +275,6 @@ CppTools::SymbolInfo toSymbolInfo(const FollowSymbolMessage &message)
result.endLine = static_cast<int>(end.line());
result.endColumn = static_cast<int>(end.column());
result.fileName = start.filePath();
- result.failedToFollow = message.failedToFollow();
return result;
}
@@ -748,14 +747,12 @@ QFuture<CppTools::SymbolInfo> IpcCommunicator::requestFollowSymbol(
const FileContainer &curFileContainer,
const QVector<Utf8String> &dependentFiles,
quint32 line,
- quint32 column,
- bool resolveTarget)
+ quint32 column)
{
const RequestFollowSymbolMessage message(curFileContainer,
dependentFiles,
line,
- column,
- resolveTarget);
+ column);
m_ipcSender->requestFollowSymbol(message);
return m_ipcReceiver.addExpectedRequestFollowSymbolMessage(message.ticketNumber());
diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.h b/src/plugins/clangcodemodel/clangbackendipcintegration.h
index 94be668114..63c9d76801 100644
--- a/src/plugins/clangcodemodel/clangbackendipcintegration.h
+++ b/src/plugins/clangcodemodel/clangbackendipcintegration.h
@@ -169,8 +169,7 @@ public:
QFuture<CppTools::SymbolInfo> requestFollowSymbol(const FileContainer &curFileContainer,
const QVector<Utf8String> &dependentFiles,
quint32 line,
- quint32 column,
- bool resolveTarget);
+ quint32 column);
void completeCode(ClangCompletionAssistProcessor *assistProcessor, const QString &filePath,
quint32 line,
quint32 column,
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
index 593d3cb9c7..24d26adcfd 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
@@ -225,6 +225,12 @@ toTextEditorBlocks(QTextDocument *textDocument,
}
}
+const QVector<ClangBackEnd::HighlightingMarkContainer>
+&ClangEditorDocumentProcessor::highlightingMarks() const
+{
+ return m_highlightingMarks;
+}
+
void ClangEditorDocumentProcessor::updateHighlighting(
const QVector<ClangBackEnd::HighlightingMarkContainer> &highlightingMarks,
const QVector<ClangBackEnd::SourceRangeContainer> &skippedPreprocessorRanges,
@@ -234,6 +240,7 @@ void ClangEditorDocumentProcessor::updateHighlighting(
const auto skippedPreprocessorBlocks = toTextEditorBlocks(textDocument(), skippedPreprocessorRanges);
emit ifdefedOutBlocksUpdated(documentRevision, skippedPreprocessorBlocks);
+ m_highlightingMarks = highlightingMarks;
m_semanticHighlighter.setHighlightingRunner(
[highlightingMarks]() {
auto *reporter = new HighlightingMarksReporter(highlightingMarks);
@@ -376,7 +383,7 @@ static QVector<Utf8String> prioritizeByBaseName(const QString &curPath,
}
QFuture<CppTools::SymbolInfo>
-ClangEditorDocumentProcessor::requestFollowSymbol(int line, int column, bool resolveTarget)
+ClangEditorDocumentProcessor::requestFollowSymbol(int line, int column)
{
QVector<Utf8String> dependentFiles;
CppTools::CppModelManager *modelManager = CppTools::CppModelManager::instance();
@@ -390,8 +397,7 @@ ClangEditorDocumentProcessor::requestFollowSymbol(int line, int column, bool res
return m_ipcCommunicator.requestFollowSymbol(simpleFileContainer(),
dependentFiles,
static_cast<quint32>(line),
- static_cast<quint32>(column),
- resolveTarget);
+ static_cast<quint32>(column));
}
ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArguments() const
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
index 6255608dc2..d7f7f966f5 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
@@ -86,14 +86,14 @@ public:
void setParserConfig(const CppTools::BaseEditorDocumentParser::Configuration config) override;
QFuture<CppTools::CursorInfo> cursorInfo(const CppTools::CursorInfoParams &params) override;
- QFuture<CppTools::SymbolInfo> requestFollowSymbol(int line,
- int column,
- bool resolveTarget) override;
+ QFuture<CppTools::SymbolInfo> requestFollowSymbol(int line, int column) override;
ClangBackEnd::FileContainer fileContainerWithArguments() const;
void clearDiagnosticsWithFixIts();
+ const QVector<ClangBackEnd::HighlightingMarkContainer> &highlightingMarks() const;
+
public:
static ClangEditorDocumentProcessor *get(const QString &filePath);
@@ -122,6 +122,7 @@ private:
QTimer m_updateTranslationUnitTimer;
unsigned m_parserRevision;
+ QVector<ClangBackEnd::HighlightingMarkContainer> m_highlightingMarks;
CppTools::SemanticHighlighter m_semanticHighlighter;
CppTools::BuiltinEditorDocumentProcessor m_builtinProcessor;
};
diff --git a/src/plugins/clangcodemodel/clangfollowsymbol.cpp b/src/plugins/clangcodemodel/clangfollowsymbol.cpp
index ede9cac824..bffa6fbcbf 100644
--- a/src/plugins/clangcodemodel/clangfollowsymbol.cpp
+++ b/src/plugins/clangcodemodel/clangfollowsymbol.cpp
@@ -23,14 +23,78 @@
**
****************************************************************************/
-#include "clangfollowsymbol.h"
#include "clangeditordocumentprocessor.h"
-#include "texteditor/texteditor.h"
-#include "texteditor/convenience.h"
+#include "clangfollowsymbol.h"
+
+#include <texteditor/convenience.h>
+#include <texteditor/texteditor.h>
+
+#include <clangsupport/highlightingmarkcontainer.h>
+
+#include <utils/algorithm.h>
namespace ClangCodeModel {
namespace Internal {
+// Returns invalid Mark if it is not found at (line, column)
+static bool findMark(const QVector<ClangBackEnd::HighlightingMarkContainer> &marks,
+ uint line,
+ uint column,
+ ClangBackEnd::HighlightingMarkContainer &mark)
+{
+ mark = Utils::findOrDefault(marks,
+ [line, column](const ClangBackEnd::HighlightingMarkContainer &curMark) {
+ if (curMark.line() != line)
+ return false;
+ if (curMark.column() == column)
+ return true;
+ if (curMark.column() < column && curMark.column() + curMark.length() >= column)
+ return true;
+ return false;
+ });
+ if (mark.isInvalid())
+ return false;
+ return true;
+}
+
+static int getMarkPos(QTextCursor cursor, const ClangBackEnd::HighlightingMarkContainer &mark)
+{
+ cursor.setPosition(0);
+ cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, mark.line() - 1);
+ cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::MoveAnchor, mark.column() - 1);
+ return cursor.position();
+}
+
+static TextEditor::TextEditorWidget::Link linkAtCursor(QTextCursor cursor,
+ const QString &filePath,
+ uint line,
+ uint column,
+ ClangEditorDocumentProcessor *processor)
+{
+ using Link = TextEditor::TextEditorWidget::Link;
+
+ const QVector<ClangBackEnd::HighlightingMarkContainer> &marks
+ = processor->highlightingMarks();
+ ClangBackEnd::HighlightingMarkContainer mark;
+ if (!findMark(marks, line, column, mark))
+ return Link();
+
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ const QString tokenStr = cursor.selectedText();
+
+ Link token(filePath, mark.line(), mark.column());
+ token.linkTextStart = getMarkPos(cursor, mark);
+ token.linkTextEnd = token.linkTextStart + mark.length();
+ if (mark.isIncludeDirectivePath()) {
+ if (tokenStr != "include" && tokenStr != "#" && tokenStr != "<")
+ return token;
+ return Link();
+ }
+ if (mark.isIdentifier() || tokenStr == "operator")
+ return token;
+ return Link();
+}
+
TextEditor::TextEditorWidget::Link ClangFollowSymbol::findLink(
const CppTools::CursorInEditor &data,
bool resolveTarget,
@@ -39,42 +103,39 @@ TextEditor::TextEditorWidget::Link ClangFollowSymbol::findLink(
CppTools::SymbolFinder *,
bool)
{
- Link link;
-
int lineNumber = 0, positionInBlock = 0;
QTextCursor cursor = TextEditor::Convenience::wordStartCursor(data.cursor());
TextEditor::Convenience::convertPosition(cursor.document(), cursor.position(), &lineNumber,
&positionInBlock);
- const unsigned line = lineNumber;
- const unsigned column = positionInBlock + 1;
- if (!resolveTarget)
- return link;
+ const uint line = lineNumber;
+ const uint column = positionInBlock + 1;
+
ClangEditorDocumentProcessor *processor = ClangEditorDocumentProcessor::get(
data.filePath().toString());
if (!processor)
- return link;
+ return Link();
+
+ if (!resolveTarget)
+ return linkAtCursor(cursor, data.filePath().toString(), line, column, processor);
QFuture<CppTools::SymbolInfo> info
= processor->requestFollowSymbol(static_cast<int>(line),
- static_cast<int>(column),
- resolveTarget);
+ static_cast<int>(column));
+
if (info.isCanceled())
- return link;
+ return Link();
while (!info.isFinished()) {
if (info.isCanceled())
- return link;
+ return Link();
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
CppTools::SymbolInfo result = info.result();
- if (result.failedToFollow)
- return link;
-
// We did not fail but the result is empty
if (result.fileName.isEmpty())
- return link;
+ return Link();
return Link(result.fileName, result.startLine, result.startColumn - 1);
}
diff --git a/src/plugins/clangcodemodel/clanghighlightingmarksreporter.cpp b/src/plugins/clangcodemodel/clanghighlightingmarksreporter.cpp
index 6090b73f41..747070a317 100644
--- a/src/plugins/clangcodemodel/clanghighlightingmarksreporter.cpp
+++ b/src/plugins/clangcodemodel/clanghighlightingmarksreporter.cpp
@@ -158,8 +158,15 @@ void HighlightingMarksReporter::run_internal()
if (isCanceled())
return;
- for (const auto &highlightingMark : m_highlightingMarks)
+ using ClangBackEnd::HighlightingType;
+
+ for (const auto &highlightingMark : m_highlightingMarks) {
+ const HighlightingType mainType = highlightingMark.types().mainHighlightingType;
+ if (mainType == HighlightingType::StringLiteral)
+ continue;
+
reportChunkWise(toHighlightingResult(highlightingMark));
+ }
if (isCanceled())
return;
diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp
index 28f4938024..7593835171 100644
--- a/src/plugins/cppeditor/cppeditorwidget.cpp
+++ b/src/plugins/cppeditor/cppeditorwidget.cpp
@@ -649,15 +649,6 @@ CppEditorWidget::Link CppEditorWidget::findLinkAt(const QTextCursor &cursor,
return Link();
const Utils::FileName &filePath = textDocument()->filePath();
- if (!resolveTarget) {
- // TODO: get that part also from clang
- return d->m_builtinFollowSymbol.findLink(CppTools::CursorInEditor{cursor, filePath, this},
- resolveTarget,
- d->m_modelManager->snapshot(),
- d->m_lastSemanticInfo.doc,
- d->m_modelManager->symbolFinder(),
- inNextSplit);
- }
return followSymbolInterface()->findLink(CppTools::CursorInEditor{cursor, filePath, this},
resolveTarget,
diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.h b/src/plugins/cpptools/baseeditordocumentprocessor.h
index 342979dae3..1ac31a6ebc 100644
--- a/src/plugins/cpptools/baseeditordocumentprocessor.h
+++ b/src/plugins/cpptools/baseeditordocumentprocessor.h
@@ -76,7 +76,7 @@ public:
virtual void setParserConfig(const BaseEditorDocumentParser::Configuration config);
virtual QFuture<CursorInfo> cursorInfo(const CursorInfoParams &params) = 0;
- virtual QFuture<SymbolInfo> requestFollowSymbol(int line, int column, bool resolveTarget) = 0;
+ virtual QFuture<SymbolInfo> requestFollowSymbol(int line, int column) = 0;
public:
using HeaderErrorDiagnosticWidgetCreator = std::function<QWidget*()>;
diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.h b/src/plugins/cpptools/builtineditordocumentprocessor.h
index 7d3d96f992..800bff085a 100644
--- a/src/plugins/cpptools/builtineditordocumentprocessor.h
+++ b/src/plugins/cpptools/builtineditordocumentprocessor.h
@@ -52,7 +52,7 @@ public:
bool isParserRunning() const override;
QFuture<CursorInfo> cursorInfo(const CursorInfoParams &params) override;
- QFuture<SymbolInfo> requestFollowSymbol(int, int, bool) override
+ QFuture<SymbolInfo> requestFollowSymbol(int, int) override
{ return QFuture<SymbolInfo>(); }
private:
diff --git a/src/plugins/cpptools/cppsymbolinfo.h b/src/plugins/cpptools/cppsymbolinfo.h
index 17d2713bc3..dcd00dd3c2 100644
--- a/src/plugins/cpptools/cppsymbolinfo.h
+++ b/src/plugins/cpptools/cppsymbolinfo.h
@@ -39,7 +39,6 @@ public:
int endLine = 0;
int endColumn = 0;
QString fileName;
- bool failedToFollow = false;
};
} // namespace CppTools