Clang: use local renaming based on ClangCodeModel

Provide refactoring engine for ClangCodeModel and
implement missing methods.

Change-Id: If5c913e0c5a7941cd2ced54d0fcfa4d625eadc93
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Ivan Donchevskii
2017-09-26 16:00:30 +02:00
parent 94e818dc82
commit 32bae7ef6c
30 changed files with 275 additions and 21 deletions

View File

@@ -261,6 +261,7 @@ void ClangCodeModelServer::requestReferences(const RequestReferencesMessage &mes
JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::RequestReferences);
fillJobRequest(jobRequest, message);
jobRequest.localReferences = message.local();
processor.addJob(jobRequest);
processor.process();
} catch (const std::exception &exception) {

View File

@@ -118,6 +118,7 @@ public:
qint32 funcNameStartColumn = -1;
quint64 ticketNumber = 0;
Utf8StringVector dependentFiles;
bool localReferences = false;
};
using JobRequests = QVector<JobRequest>;

View File

@@ -121,7 +121,7 @@ public:
ReferencesCollector(CXTranslationUnit cxTranslationUnit);
~ReferencesCollector();
ReferencesResult collect(uint line, uint column) const;
ReferencesResult collect(uint line, uint column, bool localReferences = false) const;
private:
bool isWithinTokenRange(CXToken token, uint line, uint column) const;
@@ -207,7 +207,7 @@ bool ReferencesCollector::checkToken(unsigned index, const Utf8String &identifie
return candidate.usr() == usr;
}
ReferencesResult ReferencesCollector::collect(uint line, uint column) const
ReferencesResult ReferencesCollector::collect(uint line, uint column, bool localReferences) const
{
ReferencesResult result;
@@ -216,11 +216,15 @@ ReferencesResult ReferencesCollector::collect(uint line, uint column) const
return result;
const Cursor cursorFromUser = m_cxCursors[static_cast<int>(index)];
const ReferencedCursor refCursor = ReferencedCursor::find(cursorFromUser);
const Utf8String usr = refCursor.usr();
if (usr.isEmpty())
return result;
if (localReferences && !refCursor.isLocalVariable())
return result;
const CXToken token = m_cxTokens[index];
const Utf8String identifier = ClangString(clang_getTokenSpelling(m_cxTranslationUnit, token));
for (uint i = 0; i < m_cxTokenCount; ++i) {
@@ -239,10 +243,11 @@ ReferencesResult ReferencesCollector::collect(uint line, uint column) const
ReferencesResult collectReferences(CXTranslationUnit cxTranslationUnit,
uint line,
uint column)
uint column,
bool localReferences)
{
ReferencesCollector collector(cxTranslationUnit);
return collector.collect(line, column);
return collector.collect(line, column, localReferences);
}
} // namespace ClangBackEnd

View File

@@ -54,7 +54,8 @@ public:
ReferencesResult collectReferences(CXTranslationUnit cxTranslationUnit,
uint line,
uint column);
uint column,
bool localReferences = false);
} // namespace ClangBackEnd

View File

@@ -43,9 +43,10 @@ IAsyncJob::AsyncPrepareResult RequestReferencesJob::prepareAsyncRun()
const TranslationUnit translationUnit = *m_translationUnit;
const quint32 line = jobRequest.line;
const quint32 column = jobRequest.column;
setRunner([translationUnit, line, column]() {
const bool localReferences = jobRequest.localReferences;
setRunner([translationUnit, line, column, localReferences]() {
TIME_SCOPE_DURATION("RequestReferencesJobRunner");
return translationUnit.references(line, column);
return translationUnit.references(line, column, localReferences);
});
return AsyncPrepareResult{translationUnit.id()};

View File

@@ -139,9 +139,9 @@ void TranslationUnit::extractDocumentAnnotations(
skippedSourceRanges = this->skippedSourceRanges().toSourceRangeContainers();
}
ReferencesResult TranslationUnit::references(uint line, uint column) const
ReferencesResult TranslationUnit::references(uint line, uint column, bool localReferences) const
{
return collectReferences(m_cxTranslationUnit, line, column);
return collectReferences(m_cxTranslationUnit, line, column, localReferences);
}
DiagnosticSet TranslationUnit::diagnostics() const

View File

@@ -85,7 +85,7 @@ public:
QVector<SourceRangeContainer> &skippedSourceRanges) const;
ReferencesResult references(uint line, uint column) const;
ReferencesResult references(uint line, uint column, bool localReferences = false) const;
DiagnosticSet diagnostics() const;
SourceLocation sourceLocationAt(uint line, uint column) const;