Clang: Fix built-in's ExtractFunction action

Since

  Clang: Provide highlighting for identifier under cursor
  commit ca72c29462

the LocalUseMap, used for some refactoring actions, was not updated
anymore. Fall back to the built-in implementation for the LocalUseMap
because it contains pointers to built-in AST that clang obviously can't
provide.

Task-number: QTCREATORBUG-18607
Change-Id: I08762fe457835d4d83aca719febcb3497ee9696b
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-08-18 14:51:32 +02:00
parent a9ddbb61a4
commit 0db7ad77a0
6 changed files with 53 additions and 31 deletions

View File

@@ -129,8 +129,10 @@ void IpcReceiver::deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *t
} }
} }
QFuture<CppTools::CursorInfo> IpcReceiver::addExpectedReferencesMessage(quint64 ticket, QFuture<CppTools::CursorInfo> IpcReceiver::addExpectedReferencesMessage(
QTextDocument *textDocument) quint64 ticket,
QTextDocument *textDocument,
const CppTools::SemanticInfo::LocalUseMap &localUses)
{ {
QTC_CHECK(textDocument); QTC_CHECK(textDocument);
QTC_CHECK(!m_referencesTable.contains(ticket)); QTC_CHECK(!m_referencesTable.contains(ticket));
@@ -138,7 +140,7 @@ QFuture<CppTools::CursorInfo> IpcReceiver::addExpectedReferencesMessage(quint64
QFutureInterface<CppTools::CursorInfo> futureInterface; QFutureInterface<CppTools::CursorInfo> futureInterface;
futureInterface.reportStarted(); futureInterface.reportStarted();
const ReferencesEntry entry{futureInterface, textDocument}; const ReferencesEntry entry{futureInterface, textDocument, localUses};
m_referencesTable.insert(ticket, entry); m_referencesTable.insert(ticket, entry);
return futureInterface.future(); return futureInterface.future();
@@ -229,6 +231,7 @@ CppTools::CursorInfo::Range toCursorInfoRange(const QTextDocument &textDocument,
static static
CppTools::CursorInfo toCursorInfo(const QTextDocument &textDocument, CppTools::CursorInfo toCursorInfo(const QTextDocument &textDocument,
const CppTools::SemanticInfo::LocalUseMap &localUses,
const ReferencesMessage &message) const ReferencesMessage &message)
{ {
CppTools::CursorInfo result; CppTools::CursorInfo result;
@@ -239,6 +242,7 @@ CppTools::CursorInfo toCursorInfo(const QTextDocument &textDocument,
result.useRanges.append(toCursorInfoRange(textDocument, reference)); result.useRanges.append(toCursorInfoRange(textDocument, reference));
result.useRanges.reserve(references.size()); result.useRanges.reserve(references.size());
result.localUses = localUses;
return result; return result;
} }
@@ -257,7 +261,7 @@ void IpcReceiver::references(const ReferencesMessage &message)
return; // Editor document closed or a new request was issued making this result outdated. return; // Editor document closed or a new request was issued making this result outdated.
QTC_ASSERT(entry.textDocument, return); QTC_ASSERT(entry.textDocument, return);
futureInterface.reportResult(toCursorInfo(*entry.textDocument, message)); futureInterface.reportResult(toCursorInfo(*entry.textDocument, entry.localUses, message));
futureInterface.reportFinished(); futureInterface.reportFinished();
} }
@@ -672,12 +676,14 @@ QFuture<CppTools::CursorInfo> IpcCommunicator::requestReferences(
const FileContainer &fileContainer, const FileContainer &fileContainer,
quint32 line, quint32 line,
quint32 column, quint32 column,
QTextDocument *textDocument) QTextDocument *textDocument,
const CppTools::SemanticInfo::LocalUseMap &localUses)
{ {
const RequestReferencesMessage message(fileContainer, line, column); const RequestReferencesMessage message(fileContainer, line, column);
m_ipcSender->requestReferences(message); m_ipcSender->requestReferences(message);
return m_ipcReceiver.addExpectedReferencesMessage(message.ticketNumber(), textDocument); return m_ipcReceiver.addExpectedReferencesMessage(message.ticketNumber(), textDocument,
localUses);
} }
void IpcCommunicator::updateTranslationUnitWithRevisionCheck(Core::IDocument *document) void IpcCommunicator::updateTranslationUnitWithRevisionCheck(Core::IDocument *document)

View File

@@ -75,8 +75,10 @@ public:
void addExpectedCodeCompletedMessage(quint64 ticket, ClangCompletionAssistProcessor *processor); void addExpectedCodeCompletedMessage(quint64 ticket, ClangCompletionAssistProcessor *processor);
void deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget); void deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget);
QFuture<CppTools::CursorInfo> addExpectedReferencesMessage(quint64 ticket, QFuture<CppTools::CursorInfo>
QTextDocument *textDocument); addExpectedReferencesMessage(quint64 ticket,
QTextDocument *textDocument,
const CppTools::SemanticInfo::LocalUseMap &localUses);
bool isExpectingCodeCompletedMessage() const; bool isExpectingCodeCompletedMessage() const;
void reset(); void reset();
@@ -99,11 +101,14 @@ private:
struct ReferencesEntry { struct ReferencesEntry {
ReferencesEntry() = default; ReferencesEntry() = default;
ReferencesEntry(QFutureInterface<CppTools::CursorInfo> futureInterface, ReferencesEntry(QFutureInterface<CppTools::CursorInfo> futureInterface,
QTextDocument *textDocument) QTextDocument *textDocument,
const CppTools::SemanticInfo::LocalUseMap &localUses)
: futureInterface(futureInterface) : futureInterface(futureInterface)
, textDocument(textDocument) {} , textDocument(textDocument)
, localUses(localUses) {}
QFutureInterface<CppTools::CursorInfo> futureInterface; QFutureInterface<CppTools::CursorInfo> futureInterface;
QPointer<QTextDocument> textDocument; QPointer<QTextDocument> textDocument;
CppTools::SemanticInfo::LocalUseMap localUses;
}; };
QHash<quint64, ReferencesEntry> m_referencesTable; QHash<quint64, ReferencesEntry> m_referencesTable;
}; };
@@ -149,9 +154,12 @@ public:
void registerUnsavedFilesForEditor(const FileContainers &fileContainers); void registerUnsavedFilesForEditor(const FileContainers &fileContainers);
void unregisterUnsavedFilesForEditor(const FileContainers &fileContainers); void unregisterUnsavedFilesForEditor(const FileContainers &fileContainers);
void requestDocumentAnnotations(const ClangBackEnd::FileContainer &fileContainer); void requestDocumentAnnotations(const ClangBackEnd::FileContainer &fileContainer);
QFuture<CppTools::CursorInfo> requestReferences(const FileContainer &fileContainer, QFuture<CppTools::CursorInfo> requestReferences(
const FileContainer &fileContainer,
quint32 line, quint32 line,
quint32 column, QTextDocument *textDocument); quint32 column,
QTextDocument *textDocument,
const CppTools::SemanticInfo::LocalUseMap &localUses);
void completeCode(ClangCompletionAssistProcessor *assistProcessor, const QString &filePath, void completeCode(ClangCompletionAssistProcessor *assistProcessor, const QString &filePath,
quint32 line, quint32 line,
quint32 column, quint32 column,

View File

@@ -36,6 +36,7 @@
#include <diagnosticcontainer.h> #include <diagnosticcontainer.h>
#include <sourcelocationcontainer.h> #include <sourcelocationcontainer.h>
#include <cpptools/builtincursorinfo.h>
#include <cpptools/clangdiagnosticconfigsmodel.h> #include <cpptools/clangdiagnosticconfigsmodel.h>
#include <cpptools/clangdiagnosticconfigsmodel.h> #include <cpptools/clangdiagnosticconfigsmodel.h>
#include <cpptools/compileroptionsbuilder.h> #include <cpptools/compileroptionsbuilder.h>
@@ -334,11 +335,14 @@ ClangEditorDocumentProcessor::cursorInfo(const CppTools::CursorInfoParams &param
const QTextBlock block = params.textCursor.document()->findBlockByNumber(line - 1); const QTextBlock block = params.textCursor.document()->findBlockByNumber(line - 1);
column += ClangCodeModel::Utils::extraUtf8CharsShift(block.text(), column); column += ClangCodeModel::Utils::extraUtf8CharsShift(block.text(), column);
const CppTools::SemanticInfo::LocalUseMap localUses
= CppTools::BuiltinCursorInfo::findLocalUses(params.semanticInfo.doc, line, column);
return m_ipcCommunicator.requestReferences(simpleFileContainer(), return m_ipcCommunicator.requestReferences(simpleFileContainer(),
static_cast<quint32>(line), static_cast<quint32>(line),
static_cast<quint32>(column), static_cast<quint32>(column),
textDocument()); textDocument(),
localUses);
} }
ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArguments() const ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArguments() const

View File

@@ -47,7 +47,6 @@ using namespace CPlusPlus;
using SemanticUses = QList<CppTools::SemanticInfo::Use>; using SemanticUses = QList<CppTools::SemanticInfo::Use>;
namespace CppTools { namespace CppTools {
namespace Internal {
namespace { namespace {
CursorInfo::Range toRange(const SemanticInfo::Use &use) CursorInfo::Range toRange(const SemanticInfo::Use &use)
@@ -186,7 +185,8 @@ private:
{ {
CursorInfo result; CursorInfo result;
const CppTools::SemanticInfo::LocalUseMap localUses = findLocalUses(); const CppTools::SemanticInfo::LocalUseMap localUses
= BuiltinCursorInfo::findLocalUses(m_document, m_line, m_column);
result.localUses = localUses; result.localUses = localUses;
splitLocalUses(localUses, &result.useRanges, &result.unusedVariablesRanges); splitLocalUses(localUses, &result.useRanges, &result.unusedVariablesRanges);
@@ -200,16 +200,6 @@ private:
return result; // OK, result.unusedVariablesRanges will be passed on return result; // OK, result.unusedVariablesRanges will be passed on
} }
CppTools::SemanticInfo::LocalUseMap findLocalUses() const
{
AST *ast = m_document->translationUnit()->ast();
FunctionDefinitionUnderCursor functionDefinitionUnderCursor(m_document->translationUnit());
DeclarationAST *declaration = functionDefinitionUnderCursor(ast,
static_cast<unsigned>(m_line),
static_cast<unsigned>(m_column));
return CppTools::LocalSymbols(m_document, declaration).uses;
}
void splitLocalUses(const CppTools::SemanticInfo::LocalUseMap &uses, void splitLocalUses(const CppTools::SemanticInfo::LocalUseMap &uses,
CursorInfo::Ranges *rangesForLocalVariableUnderCursor, CursorInfo::Ranges *rangesForLocalVariableUnderCursor,
CursorInfo::Ranges *rangesForLocalUnusedVariables) const CursorInfo::Ranges *rangesForLocalUnusedVariables) const
@@ -365,5 +355,15 @@ QFuture<CursorInfo> BuiltinCursorInfo::run(const CursorInfoParams &cursorInfoPar
return Utils::runAsync(&FindUses::find, document, snapshot, line, column, scope, expression); return Utils::runAsync(&FindUses::find, document, snapshot, line, column, scope, expression);
} }
} // namespace Internal CppTools::SemanticInfo::LocalUseMap
BuiltinCursorInfo::findLocalUses(const Document::Ptr &document, int line, int column)
{
AST *ast = document->translationUnit()->ast();
FunctionDefinitionUnderCursor functionDefinitionUnderCursor(document->translationUnit());
DeclarationAST *declaration = functionDefinitionUnderCursor(ast,
static_cast<unsigned>(line),
static_cast<unsigned>(column));
return CppTools::LocalSymbols(document, declaration).uses;
}
} // namespace CppTools } // namespace CppTools

View File

@@ -26,17 +26,21 @@
#pragma once #pragma once
#include "cppcursorinfo.h" #include "cppcursorinfo.h"
#include "cpptools_global.h"
#include <cplusplus/CppDocument.h>
#include <QFuture> #include <QFuture>
namespace CppTools { namespace CppTools {
namespace Internal {
class BuiltinCursorInfo class CPPTOOLS_EXPORT BuiltinCursorInfo
{ {
public: public:
static QFuture<CursorInfo> run(const CursorInfoParams &params); static QFuture<CursorInfo> run(const CursorInfoParams &params);
static CppTools::SemanticInfo::LocalUseMap
findLocalUses(const CPlusPlus::Document::Ptr &document, int line, int column);
}; };
} // namespace Internal
} // namespace CppTools } // namespace CppTools

View File

@@ -257,7 +257,7 @@ bool BuiltinEditorDocumentProcessor::isParserRunning() const
QFuture<CursorInfo> QFuture<CursorInfo>
BuiltinEditorDocumentProcessor::cursorInfo(const CursorInfoParams &params) BuiltinEditorDocumentProcessor::cursorInfo(const CursorInfoParams &params)
{ {
return Internal::BuiltinCursorInfo::run(params); return BuiltinCursorInfo::run(params);
} }
void BuiltinEditorDocumentProcessor::onParserFinished(CPlusPlus::Document::Ptr document, void BuiltinEditorDocumentProcessor::onParserFinished(CPlusPlus::Document::Ptr document,