Clang: implement followSymbol in TranslationUnit

Follow symbol in current TU or dependent files
Current algorithm tries to do the same as built-in
follow symbol but better.
Currently clang-based follow symbol has some limitations:
- following function usage may return the declaration
instead of definition because we don't have header
dependencies in backend
- overrides are not searched because of the same reason
and the amount of dependent files (parsing 250 files
takes a while)
- some includes are not handled correctly, in that case
we return failure and ask built-in code model to follow
(example: <QtGui> or other qt includes)

Change-Id: If35028ee0b5e818fdba29363c9520c5cca996348
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Ivan Donchevskii
2017-07-27 13:20:22 +02:00
parent c6ff65fd65
commit 32d38789f9
10 changed files with 418 additions and 21 deletions

View File

@@ -37,11 +37,11 @@ static FollowSymbolJob::AsyncResult runAsyncHelperFollow(const TranslationUnit &
quint32 line,
quint32 column,
const QVector<Utf8String> &dependentFiles,
bool resolveTarget)
const CommandLineArguments &currentArgs)
{
TIME_SCOPE_DURATION("FollowSymbolJobRunner");
return FollowSymbolResult();
return translationUnit.followSymbol(line, column, dependentFiles, currentArgs);
}
IAsyncJob::AsyncPrepareResult FollowSymbolJob::prepareAsyncRun()
@@ -49,6 +49,8 @@ IAsyncJob::AsyncPrepareResult FollowSymbolJob::prepareAsyncRun()
const JobRequest jobRequest = context().jobRequest;
QTC_ASSERT(jobRequest.type == JobRequest::Type::FollowSymbol,
return AsyncPrepareResult());
// Is too slow because of IPC timings, no implementation for now
QTC_ASSERT(jobRequest.resolveTarget, return AsyncPrepareResult());
try {
m_pinnedDocument = context().documentForJobRequest();
@@ -56,12 +58,18 @@ IAsyncJob::AsyncPrepareResult FollowSymbolJob::prepareAsyncRun()
const TranslationUnit translationUnit
= m_pinnedDocument.translationUnit(jobRequest.preferredTranslationUnit);
const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput();
const CommandLineArguments currentArgs(updateInput.filePath.constData(),
updateInput.projectArguments,
updateInput.fileArguments,
false);
const quint32 line = jobRequest.line;
const quint32 column = jobRequest.column;
const QVector<Utf8String> &dependentFiles = jobRequest.dependentFiles;
const bool resolveTarget = jobRequest.resolveTarget;
setRunner([translationUnit, line, column, dependentFiles, resolveTarget]() {
return runAsyncHelperFollow(translationUnit, line, column, dependentFiles, resolveTarget);
setRunner([translationUnit, line, column, dependentFiles, currentArgs]() {
return runAsyncHelperFollow(translationUnit, line, column, dependentFiles, currentArgs);
});
return AsyncPrepareResult{translationUnit.id()};
@@ -77,8 +85,8 @@ void FollowSymbolJob::finalizeAsyncRun()
const AsyncResult result = asyncResult();
const FollowSymbolMessage message(m_pinnedFileContainer,
result.m_range,
result.m_failedToFollow,
result.range,
result.failedToFollow,
context().jobRequest.ticketNumber);
context().client->followSymbol(message);
}