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:
Nikolai Kosjar
2016-05-30 10:25:52 +02:00
parent 53415cece1
commit 606d41187c
23 changed files with 323 additions and 291 deletions

View File

@@ -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;
}