forked from qt-creator/qt-creator
Clang: Prepare for multi-threading
* Make the necessary data implicitly shared since it might get accessed/modified from two different threads with follow-up changes. This applies for UnsavedFiles/UnsavedFile and ProjectPart::arguments(). * Avoid returning references. Change-Id: I98842c1cb90ae0d344a15c63b72cbc89568722d3 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -33,8 +33,10 @@
|
||||
#include "codecompletionsextractor.h"
|
||||
#include "sourcelocation.h"
|
||||
#include "unsavedfile.h"
|
||||
#include "unsavedfiles.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "sourcerange.h"
|
||||
#include "clangunsavedfilesshallowarguments.h"
|
||||
|
||||
#include <clang-c/Index.h>
|
||||
|
||||
@@ -55,8 +57,10 @@ CodeCompletions toCodeCompletions(const ClangCodeCompleteResults &results)
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
CodeCompleter::CodeCompleter(TranslationUnit translationUnit)
|
||||
CodeCompleter::CodeCompleter(TranslationUnit translationUnit,
|
||||
const UnsavedFiles &unsavedFiles)
|
||||
: translationUnit(std::move(translationUnit))
|
||||
, unsavedFiles(unsavedFiles)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -64,10 +68,7 @@ CodeCompletions CodeCompleter::complete(uint line, uint column)
|
||||
{
|
||||
neededCorrection_ = CompletionCorrection::NoCorrection;
|
||||
|
||||
ClangCodeCompleteResults results = complete(line,
|
||||
column,
|
||||
translationUnit.cxUnsavedFiles(),
|
||||
translationUnit.unsavedFilesCount());
|
||||
ClangCodeCompleteResults results = completeHelper(line, column);
|
||||
|
||||
tryDotArrowCorrectionIfNoResults(results, line, column);
|
||||
|
||||
@@ -79,19 +80,17 @@ CompletionCorrection CodeCompleter::neededCorrection() const
|
||||
return neededCorrection_;
|
||||
}
|
||||
|
||||
ClangCodeCompleteResults CodeCompleter::complete(uint line,
|
||||
uint column,
|
||||
CXUnsavedFile *unsavedFiles,
|
||||
unsigned unsavedFileCount)
|
||||
ClangCodeCompleteResults CodeCompleter::completeHelper(uint line, uint column)
|
||||
{
|
||||
const Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath());
|
||||
UnsavedFilesShallowArguments unsaved = unsavedFiles.shallowArguments();
|
||||
|
||||
return clang_codeCompleteAt(translationUnit.cxTranslationUnitWithoutReparsing(),
|
||||
nativeFilePath.constData(),
|
||||
line,
|
||||
column,
|
||||
unsavedFiles,
|
||||
unsavedFileCount,
|
||||
unsaved.data(),
|
||||
unsaved.count(),
|
||||
defaultOptions());
|
||||
}
|
||||
|
||||
@@ -106,6 +105,11 @@ uint CodeCompleter::defaultOptions() const
|
||||
return options;
|
||||
}
|
||||
|
||||
UnsavedFile &CodeCompleter::unsavedFile()
|
||||
{
|
||||
return unsavedFiles.unsavedFile(translationUnit.filePath());
|
||||
}
|
||||
|
||||
void CodeCompleter::tryDotArrowCorrectionIfNoResults(ClangCodeCompleteResults &results,
|
||||
uint line,
|
||||
uint column)
|
||||
@@ -124,16 +128,12 @@ ClangCodeCompleteResults CodeCompleter::completeWithArrowInsteadOfDot(uint line,
|
||||
uint dotPosition)
|
||||
{
|
||||
ClangCodeCompleteResults results;
|
||||
const bool replaced = translationUnit.unsavedFile().replaceAt(dotPosition,
|
||||
1,
|
||||
Utf8StringLiteral("->"));
|
||||
const bool replaced = unsavedFile().replaceAt(dotPosition,
|
||||
1,
|
||||
Utf8StringLiteral("->"));
|
||||
|
||||
if (replaced) {
|
||||
results = complete(line,
|
||||
column + 1,
|
||||
translationUnit.cxUnsavedFiles(),
|
||||
translationUnit.unsavedFilesCount());
|
||||
|
||||
results = completeHelper(line, column + 1);
|
||||
if (results.hasResults())
|
||||
neededCorrection_ = CompletionCorrection::DotToArrowCorrection;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user