Nebiroth created this revision.
Revision https://reviews.llvm.org/D38639 needs this commit in order to properly
make open definition calls on include statements work.
Since this modifies clang and not clangd, I decided to include it in a
different patch.
https://reviews.llvm.org/D39375
Files:
include/clang/Frontend/PrecompiledPreamble.h
lib/Frontend/ASTUnit.cpp
lib/Frontend/PrecompiledPreamble.cpp
Index: lib/Frontend/PrecompiledPreamble.cpp
===================================================================
--- lib/Frontend/PrecompiledPreamble.cpp
+++ lib/Frontend/PrecompiledPreamble.cpp
@@ -203,7 +203,7 @@
const llvm::MemoryBuffer *MainFileBuffer, PreambleBounds Bounds,
DiagnosticsEngine &Diagnostics, IntrusiveRefCntPtr<vfs::FileSystem> VFS,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
- PreambleCallbacks &Callbacks) {
+ PreambleCallbacks &Callbacks, std::unique_ptr<PPCallbacks> PPCallbacks) {
assert(VFS && "VFS is null");
if (!Bounds.Size)
@@ -307,6 +307,7 @@
if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0]))
return BuildPreambleError::BeginSourceFileFailed;
+ Clang->getPreprocessor().addPPCallbacks(std::move(PPCallbacks));
Act->Execute();
// Run the callbacks.
Index: lib/Frontend/ASTUnit.cpp
===================================================================
--- lib/Frontend/ASTUnit.cpp
+++ lib/Frontend/ASTUnit.cpp
@@ -53,54 +53,52 @@
using llvm::TimeRecord;
namespace {
- class SimpleTimer {
- bool WantTiming;
- TimeRecord Start;
- std::string Output;
-
- public:
- explicit SimpleTimer(bool WantTiming) : WantTiming(WantTiming) {
- if (WantTiming)
- Start = TimeRecord::getCurrentTime();
- }
-
- void setOutput(const Twine &Output) {
- if (WantTiming)
- this->Output = Output.str();
- }
-
- ~SimpleTimer() {
- if (WantTiming) {
- TimeRecord Elapsed = TimeRecord::getCurrentTime();
- Elapsed -= Start;
- llvm::errs() << Output << ':';
- Elapsed.print(Elapsed, llvm::errs());
- llvm::errs() << '\n';
- }
- }
- };
+class SimpleTimer {
+ bool WantTiming;
+ TimeRecord Start;
+ std::string Output;
- template <class T>
- std::unique_ptr<T> valueOrNull(llvm::ErrorOr<std::unique_ptr<T>> Val) {
- if (!Val)
- return nullptr;
- return std::move(*Val);
+public:
+ explicit SimpleTimer(bool WantTiming) : WantTiming(WantTiming) {
+ if (WantTiming)
+ Start = TimeRecord::getCurrentTime();
+ }
+
+ void setOutput(const Twine &Output) {
+ if (WantTiming)
+ this->Output = Output.str();
+ }
+
+ ~SimpleTimer() {
+ if (WantTiming) {
+ TimeRecord Elapsed = TimeRecord::getCurrentTime();
+ Elapsed -= Start;
+ llvm::errs() << Output << ':';
+ Elapsed.print(Elapsed, llvm::errs());
+ llvm::errs() << '\n';
+ }
}
+};
- template <class T>
- bool moveOnNoError(llvm::ErrorOr<T> Val, T &Output) {
- if (!Val)
- return false;
- Output = std::move(*Val);
- return true;
- }
+template <class T>
+std::unique_ptr<T> valueOrNull(llvm::ErrorOr<std::unique_ptr<T>> Val) {
+ if (!Val)
+ return nullptr;
+ return std::move(*Val);
+}
+
+template <class T> bool moveOnNoError(llvm::ErrorOr<T> Val, T &Output) {
+ if (!Val)
+ return false;
+ Output = std::move(*Val);
+ return true;
+}
/// \brief Get a source buffer for \p MainFilePath, handling all file-to-file
/// and file-to-buffer remappings inside \p Invocation.
static std::unique_ptr<llvm::MemoryBuffer>
getBufferForFileHandlingRemapping(const CompilerInvocation &Invocation,
- vfs::FileSystem *VFS,
- StringRef FilePath) {
+ vfs::FileSystem *VFS, StringRef FilePath) {
const auto &PreprocessorOpts = Invocation.getPreprocessorOpts();
// Try to determine if the main file has been remapped, either from the
@@ -156,7 +154,7 @@
return nullptr;
return llvm::MemoryBuffer::getMemBufferCopy(Buffer->getBuffer(), FilePath);
}
-}
+} // namespace
struct ASTUnit::ASTWriterData {
SmallString<128> Buffer;
@@ -167,9 +165,7 @@
: Stream(Buffer), Writer(Stream, Buffer, PCMCache, {}) {}
};
-void ASTUnit::clearFileLevelDecls() {
- llvm::DeleteContainerSeconds(FileDecls);
-}
+void ASTUnit::clearFileLevelDecls() { llvm::DeleteContainerSeconds(FileDecls); }
/// \brief After failing to build a precompiled preamble (due to
/// errors in the source that occurs in the preamble), the number of
@@ -183,20 +179,15 @@
static std::atomic<unsigned> ActiveASTUnitObjects;
ASTUnit::ASTUnit(bool _MainFileIsAST)
- : Reader(nullptr), HadModuleLoaderFatalFailure(false),
- OnlyLocalDecls(false), CaptureDiagnostics(false),
- MainFileIsAST(_MainFileIsAST),
- TUKind(TU_Complete), WantTiming(getenv("LIBCLANG_TIMING")),
- OwnsRemappedFileBuffers(true),
- NumStoredDiagnosticsFromDriver(0),
- PreambleRebuildCounter(0),
- NumWarningsInPreamble(0),
- ShouldCacheCodeCompletionResults(false),
- IncludeBriefCommentsInCodeCompletion(false), UserFilesAreVolatile(false),
- CompletionCacheTopLevelHashValue(0),
- PreambleTopLevelHashValue(0),
- CurrentTopLevelHashValue(0),
- UnsafeToFree(false) {
+ : Reader(nullptr), HadModuleLoaderFatalFailure(false),
+ OnlyLocalDecls(false), CaptureDiagnostics(false),
+ MainFileIsAST(_MainFileIsAST), TUKind(TU_Complete),
+ WantTiming(getenv("LIBCLANG_TIMING")), OwnsRemappedFileBuffers(true),
+ NumStoredDiagnosticsFromDriver(0), PreambleRebuildCounter(0),
+ NumWarningsInPreamble(0), ShouldCacheCodeCompletionResults(false),
+ IncludeBriefCommentsInCodeCompletion(false), UserFilesAreVolatile(false),
+ CompletionCacheTopLevelHashValue(0), PreambleTopLevelHashValue(0),
+ CurrentTopLevelHashValue(0), UnsafeToFree(false) {
if (getenv("LIBCLANG_OBJTRACKING"))
fprintf(stderr, "+++ %u translation units\n", ++ActiveASTUnitObjects);
}
@@ -219,109 +210,109 @@
delete RB.second;
}
- ClearCachedCompletionResults();
-
+ ClearCachedCompletionResults();
+
if (getenv("LIBCLANG_OBJTRACKING"))
fprintf(stderr, "--- %u translation units\n", --ActiveASTUnitObjects);
}
void ASTUnit::setPreprocessor(std::shared_ptr<Preprocessor> PP) {
this->PP = std::move(PP);
}
-/// \brief Determine the set of code-completion contexts in which this
+/// \brief Determine the set of code-completion contexts in which this
/// declaration should be shown.
static unsigned getDeclShowContexts(const NamedDecl *ND,
const LangOptions &LangOpts,
bool &IsNestedNameSpecifier) {
IsNestedNameSpecifier = false;
-
+
if (isa<UsingShadowDecl>(ND))
ND = dyn_cast<NamedDecl>(ND->getUnderlyingDecl());
if (!ND)
return 0;
-
+
uint64_t Contexts = 0;
- if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND) ||
+ if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND) ||
isa<ClassTemplateDecl>(ND) || isa<TemplateTemplateParmDecl>(ND) ||
isa<TypeAliasTemplateDecl>(ND)) {
// Types can appear in these contexts.
if (LangOpts.CPlusPlus || !isa<TagDecl>(ND))
- Contexts |= (1LL << CodeCompletionContext::CCC_TopLevel)
- | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
- | (1LL << CodeCompletionContext::CCC_ClassStructUnion)
- | (1LL << CodeCompletionContext::CCC_Statement)
- | (1LL << CodeCompletionContext::CCC_Type)
- | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression);
+ Contexts |= (1LL << CodeCompletionContext::CCC_TopLevel) |
+ (1LL << CodeCompletionContext::CCC_ObjCIvarList) |
+ (1LL << CodeCompletionContext::CCC_ClassStructUnion) |
+ (1LL << CodeCompletionContext::CCC_Statement) |
+ (1LL << CodeCompletionContext::CCC_Type) |
+ (1LL << CodeCompletionContext::CCC_ParenthesizedExpression);
// In C++, types can appear in expressions contexts (for functional casts).
if (LangOpts.CPlusPlus)
Contexts |= (1LL << CodeCompletionContext::CCC_Expression);
-
+
// In Objective-C, message sends can send interfaces. In Objective-C++,
// all types are available due to functional casts.
if (LangOpts.CPlusPlus || isa<ObjCInterfaceDecl>(ND))
Contexts |= (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver);
-
+
// In Objective-C, you can only be a subclass of another Objective-C class
if (isa<ObjCInterfaceDecl>(ND))
Contexts |= (1LL << CodeCompletionContext::CCC_ObjCInterfaceName);
// Deal with tag names.
if (isa<EnumDecl>(ND)) {
Contexts |= (1LL << CodeCompletionContext::CCC_EnumTag);
-
+
// Part of the nested-name-specifier in C++0x.
if (LangOpts.CPlusPlus11)
IsNestedNameSpecifier = true;
} else if (const RecordDecl *Record = dyn_cast<RecordDecl>(ND)) {
if (Record->isUnion())
Contexts |= (1LL << CodeCompletionContext::CCC_UnionTag);
else
Contexts |= (1LL << CodeCompletionContext::CCC_ClassOrStructTag);
-
+
if (LangOpts.CPlusPlus)
IsNestedNameSpecifier = true;
} else if (isa<ClassTemplateDecl>(ND))
IsNestedNameSpecifier = true;
} else if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND)) {
// Values can appear in these contexts.
- Contexts = (1LL << CodeCompletionContext::CCC_Statement)
- | (1LL << CodeCompletionContext::CCC_Expression)
- | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
- | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver);
+ Contexts = (1LL << CodeCompletionContext::CCC_Statement) |
+ (1LL << CodeCompletionContext::CCC_Expression) |
+ (1LL << CodeCompletionContext::CCC_ParenthesizedExpression) |
+ (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver);
} else if (isa<ObjCProtocolDecl>(ND)) {
Contexts = (1LL << CodeCompletionContext::CCC_ObjCProtocolName);
} else if (isa<ObjCCategoryDecl>(ND)) {
Contexts = (1LL << CodeCompletionContext::CCC_ObjCCategoryName);
} else if (isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) {
Contexts = (1LL << CodeCompletionContext::CCC_Namespace);
-
+
// Part of the nested-name-specifier.
IsNestedNameSpecifier = true;
}
-
+
return Contexts;
}
void ASTUnit::CacheCodeCompletionResults() {
if (!TheSema)
return;
-
+
SimpleTimer Timer(WantTiming);
Timer.setOutput("Cache global code completions for " + getMainFileName());
// Clear out the previous results.
ClearCachedCompletionResults();
-
+
// Gather the set of global code completions.
typedef CodeCompletionResult Result;
SmallVector<Result, 8> Results;
CachedCompletionAllocator = std::make_shared<GlobalCodeCompletionAllocator>();
CodeCompletionTUInfo CCTUInfo(CachedCompletionAllocator);
- TheSema->GatherGlobalCodeCompletions(*CachedCompletionAllocator,
- CCTUInfo, Results);
-
+ TheSema->GatherGlobalCodeCompletions(*CachedCompletionAllocator, CCTUInfo,
+ Results);
+
// Translate global code completions into cached completions.
llvm::DenseMap<CanQualType, unsigned> CompletionTypes;
CodeCompletionContext CCContext(CodeCompletionContext::CCC_TopLevel);
@@ -340,58 +331,58 @@
CachedResult.Kind = R.CursorKind;
CachedResult.Availability = R.Availability;
- // Keep track of the type of this completion in an ASTContext-agnostic
+ // Keep track of the type of this completion in an ASTContext-agnostic
// way.
QualType UsageType = getDeclUsageType(*Ctx, R.Declaration);
if (UsageType.isNull()) {
CachedResult.TypeClass = STC_Void;
CachedResult.Type = 0;
} else {
- CanQualType CanUsageType
- = Ctx->getCanonicalType(UsageType.getUnqualifiedType());
+ CanQualType CanUsageType =
+ Ctx->getCanonicalType(UsageType.getUnqualifiedType());
CachedResult.TypeClass = getSimplifiedTypeClass(CanUsageType);
// Determine whether we have already seen this type. If so, we save
- // ourselves the work of formatting the type string by using the
+ // ourselves the work of formatting the type string by using the
// temporary, CanQualType-based hash table to find the associated value.
unsigned &TypeValue = CompletionTypes[CanUsageType];
if (TypeValue == 0) {
TypeValue = CompletionTypes.size();
- CachedCompletionTypes[QualType(CanUsageType).getAsString()]
- = TypeValue;
+ CachedCompletionTypes[QualType(CanUsageType).getAsString()] =
+ TypeValue;
}
-
+
CachedResult.Type = TypeValue;
}
-
+
CachedCompletionResults.push_back(CachedResult);
-
+
/// Handle nested-name-specifiers in C++.
if (TheSema->Context.getLangOpts().CPlusPlus && IsNestedNameSpecifier &&
!R.StartsNestedNameSpecifier) {
// The contexts in which a nested-name-specifier can appear in C++.
- uint64_t NNSContexts
- = (1LL << CodeCompletionContext::CCC_TopLevel)
- | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
- | (1LL << CodeCompletionContext::CCC_ClassStructUnion)
- | (1LL << CodeCompletionContext::CCC_Statement)
- | (1LL << CodeCompletionContext::CCC_Expression)
- | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
- | (1LL << CodeCompletionContext::CCC_EnumTag)
- | (1LL << CodeCompletionContext::CCC_UnionTag)
- | (1LL << CodeCompletionContext::CCC_ClassOrStructTag)
- | (1LL << CodeCompletionContext::CCC_Type)
- | (1LL << CodeCompletionContext::CCC_PotentiallyQualifiedName)
- | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression);
+ uint64_t NNSContexts =
+ (1LL << CodeCompletionContext::CCC_TopLevel) |
+ (1LL << CodeCompletionContext::CCC_ObjCIvarList) |
+ (1LL << CodeCompletionContext::CCC_ClassStructUnion) |
+ (1LL << CodeCompletionContext::CCC_Statement) |
+ (1LL << CodeCompletionContext::CCC_Expression) |
+ (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver) |
+ (1LL << CodeCompletionContext::CCC_EnumTag) |
+ (1LL << CodeCompletionContext::CCC_UnionTag) |
+ (1LL << CodeCompletionContext::CCC_ClassOrStructTag) |
+ (1LL << CodeCompletionContext::CCC_Type) |
+ (1LL << CodeCompletionContext::CCC_PotentiallyQualifiedName) |
+ (1LL << CodeCompletionContext::CCC_ParenthesizedExpression);
if (isa<NamespaceDecl>(R.Declaration) ||
isa<NamespaceAliasDecl>(R.Declaration))
NNSContexts |= (1LL << CodeCompletionContext::CCC_Namespace);
- if (unsigned RemainingContexts
- = NNSContexts & ~CachedResult.ShowInContexts) {
- // If there any contexts where this completion can be a
- // nested-name-specifier but isn't already an option, create a
+ if (unsigned RemainingContexts =
+ NNSContexts & ~CachedResult.ShowInContexts) {
+ // If there any contexts where this completion can be a
+ // nested-name-specifier but isn't already an option, create a
// nested-name-specifier completion.
R.StartsNestedNameSpecifier = true;
CachedResult.Completion = R.CreateCodeCompletionString(
@@ -406,31 +397,31 @@
}
break;
}
-
+
case Result::RK_Keyword:
case Result::RK_Pattern:
// Ignore keywords and patterns; we don't care, since they are so
// easily regenerated.
break;
-
+
case Result::RK_Macro: {
CachedCodeCompletionResult CachedResult;
CachedResult.Completion = R.CreateCodeCompletionString(
*TheSema, CCContext, *CachedCompletionAllocator, CCTUInfo,
IncludeBriefCommentsInCodeCompletion);
- CachedResult.ShowInContexts
- = (1LL << CodeCompletionContext::CCC_TopLevel)
- | (1LL << CodeCompletionContext::CCC_ObjCInterface)
- | (1LL << CodeCompletionContext::CCC_ObjCImplementation)
- | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
- | (1LL << CodeCompletionContext::CCC_ClassStructUnion)
- | (1LL << CodeCompletionContext::CCC_Statement)
- | (1LL << CodeCompletionContext::CCC_Expression)
- | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
- | (1LL << CodeCompletionContext::CCC_MacroNameUse)
- | (1LL << CodeCompletionContext::CCC_PreprocessorExpression)
- | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
- | (1LL << CodeCompletionContext::CCC_OtherWithMacros);
+ CachedResult.ShowInContexts =
+ (1LL << CodeCompletionContext::CCC_TopLevel) |
+ (1LL << CodeCompletionContext::CCC_ObjCInterface) |
+ (1LL << CodeCompletionContext::CCC_ObjCImplementation) |
+ (1LL << CodeCompletionContext::CCC_ObjCIvarList) |
+ (1LL << CodeCompletionContext::CCC_ClassStructUnion) |
+ (1LL << CodeCompletionContext::CCC_Statement) |
+ (1LL << CodeCompletionContext::CCC_Expression) |
+ (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver) |
+ (1LL << CodeCompletionContext::CCC_MacroNameUse) |
+ (1LL << CodeCompletionContext::CCC_PreprocessorExpression) |
+ (1LL << CodeCompletionContext::CCC_ParenthesizedExpression) |
+ (1LL << CodeCompletionContext::CCC_OtherWithMacros);
CachedResult.Priority = R.Priority;
CachedResult.Kind = R.CursorKind;
@@ -442,7 +433,7 @@
}
}
}
-
+
// Save the current top-level hash value.
CompletionCacheTopLevelHashValue = CurrentTopLevelHashValue;
}
@@ -468,6 +459,7 @@
unsigned &Counter;
bool InitializedLanguage;
+
public:
ASTInfoCollector(Preprocessor &PP, ASTContext *Context,
HeaderSearchOptions &HSOpts, PreprocessorOptions &PPOpts,
@@ -482,10 +474,10 @@
bool AllowCompatibleDifferences) override {
if (InitializedLanguage)
return false;
-
+
LangOpt = LangOpts;
InitializedLanguage = true;
-
+
updated();
return false;
}
@@ -553,7 +545,7 @@
}
};
- /// \brief Diagnostic consumer that saves each diagnostic it is given.
+/// \brief Diagnostic consumer that saves each diagnostic it is given.
class StoredDiagnosticConsumer : public DiagnosticConsumer {
SmallVectorImpl<StoredDiagnostic> *StoredDiags;
SmallVectorImpl<ASTUnit::StandaloneDiagnostic> *StandaloneDiags;
@@ -590,11 +582,12 @@
std::unique_ptr<DiagnosticConsumer> OwningPreviousClient;
public:
- CaptureDroppedDiagnostics(bool RequestCapture, DiagnosticsEngine &Diags,
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<ASTUnit::StandaloneDiagnostic> *StandaloneDiags)
- : Diags(Diags), Client(StoredDiags, StandaloneDiags), PreviousClient(nullptr)
- {
+ CaptureDroppedDiagnostics(
+ bool RequestCapture, DiagnosticsEngine &Diags,
+ SmallVectorImpl<StoredDiagnostic> *StoredDiags,
+ SmallVectorImpl<ASTUnit::StandaloneDiagnostic> *StandaloneDiags)
+ : Diags(Diags), Client(StoredDiags, StandaloneDiags),
+ PreviousClient(nullptr) {
if (RequestCapture || Diags.getClient() == nullptr) {
OwningPreviousClient = Diags.takeClient();
PreviousClient = Diags.getClient();
@@ -641,9 +634,7 @@
}
}
-IntrusiveRefCntPtr<ASTReader> ASTUnit::getASTReader() const {
- return Reader;
-}
+IntrusiveRefCntPtr<ASTReader> ASTUnit::getASTReader() const { return Reader; }
ASTMutationListener *ASTUnit::getASTMutationListener() {
if (WriterData)
@@ -673,7 +664,8 @@
ASTUnit &AST, bool CaptureDiagnostics) {
assert(Diags.get() && "no DiagnosticsEngine was provided");
if (CaptureDiagnostics)
- Diags->setClient(new StoredDiagnosticConsumer(&AST.StoredDiagnostics, nullptr));
+ Diags->setClient(
+ new StoredDiagnosticConsumer(&AST.StoredDiagnostics, nullptr));
}
std::unique_ptr<ASTUnit> ASTUnit::LoadFromASTFile(
@@ -686,11 +678,11 @@
std::unique_ptr<ASTUnit> AST(new ASTUnit(true));
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
- ASTUnitCleanup(AST.get());
- llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
- llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
- DiagCleanup(Diags.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit> ASTUnitCleanup(AST.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<
+ DiagnosticsEngine,
+ llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
+ DiagCleanup(Diags.get());
ConfigureDiags(Diags, *AST, CaptureDiagnostics);
@@ -701,14 +693,12 @@
IntrusiveRefCntPtr<vfs::FileSystem> VFS = vfs::getRealFileSystem();
AST->FileMgr = new FileManager(FileSystemOpts, VFS);
AST->UserFilesAreVolatile = UserFilesAreVolatile;
- AST->SourceMgr = new SourceManager(AST->getDiagnostics(),
- AST->getFileManager(),
- UserFilesAreVolatile);
+ AST->SourceMgr = new SourceManager(
+ AST->getDiagnostics(), AST->getFileManager(), UserFilesAreVolatile);
AST->PCMCache = new MemoryBufferCache;
AST->HSOpts = std::make_shared<HeaderSearchOptions>();
AST->HSOpts->ModuleFormat = PCHContainerRdr.getFormat();
- AST->HeaderInfo.reset(new HeaderSearch(AST->HSOpts,
- AST->getSourceManager(),
+ AST->HeaderInfo.reset(new HeaderSearch(AST->HSOpts, AST->getSourceManager(),
AST->getDiagnostics(),
AST->getLangOpts(),
/*Target=*/nullptr));
@@ -737,7 +727,7 @@
bool disableValid = false;
if (::getenv("LIBCLANG_DISABLE_PCH_VALIDATION"))
disableValid = true;
- AST->Reader = new ASTReader(PP, AST->Ctx.get(), PCHContainerRdr, { },
+ AST->Reader = new ASTReader(PP, AST->Ctx.get(), PCHContainerRdr, {},
/*isysroot=*/"",
/*DisableValidation=*/disableValid,
AllowPCHWithCompilerErrors);
@@ -755,7 +745,7 @@
AST->Ctx->setExternalSource(AST->Reader);
switch (AST->Reader->ReadAST(Filename, serialization::MK_MainFile,
- SourceLocation(), ASTReader::ARR_None)) {
+ SourceLocation(), ASTReader::ARR_None)) {
case ASTReader::Success:
break;
@@ -797,13 +787,13 @@
Hash = llvm::HashString(MacroNameTok.getIdentifierInfo()->getName(), Hash);
}
-/// \brief Preprocessor callback class that updates a hash value with the names
+/// \brief Preprocessor callback class that updates a hash value with the names
/// of all macros that have been defined by the translation unit.
class MacroDefinitionTrackerPPCallbacks : public PPCallbacks {
unsigned &Hash;
-
+
public:
- explicit MacroDefinitionTrackerPPCallbacks(unsigned &Hash) : Hash(Hash) { }
+ explicit MacroDefinitionTrackerPPCallbacks(unsigned &Hash) : Hash(Hash) {}
void MacroDefined(const Token &MacroNameTok,
const MacroDirective *MD) override {
@@ -815,11 +805,11 @@
void AddTopLevelDeclarationToHash(Decl *D, unsigned &Hash) {
if (!D)
return;
-
+
DeclContext *DC = D->getDeclContext();
if (!DC)
return;
-
+
if (!(DC->isTranslationUnit() || DC->getLookupParent()->isTranslationUnit()))
return;
@@ -856,10 +846,10 @@
class TopLevelDeclTrackerConsumer : public ASTConsumer {
ASTUnit &Unit;
unsigned &Hash;
-
+
public:
TopLevelDeclTrackerConsumer(ASTUnit &_Unit, unsigned &Hash)
- : Unit(_Unit), Hash(Hash) {
+ : Unit(_Unit), Hash(Hash) {
Hash = 0;
}
@@ -919,7 +909,7 @@
StringRef InFile) override {
CI.getPreprocessor().addPPCallbacks(
llvm::make_unique<MacroDefinitionTrackerPPCallbacks>(
- Unit.getCurrentTopLevelHashValue()));
+ Unit.getCurrentTopLevelHashValue()));
return llvm::make_unique<TopLevelDeclTrackerConsumer>(
Unit, Unit.getCurrentTopLevelHashValue());
}
@@ -929,7 +919,7 @@
bool hasCodeCompletionSupport() const override { return false; }
TranslationUnitKind getTranslationUnitKind() override {
- return Unit.getTranslationUnitKind();
+ return Unit.getTranslationUnitKind();
}
};
@@ -993,9 +983,9 @@
StoredDiags.end());
}
-static void checkAndSanitizeDiags(SmallVectorImpl<StoredDiagnostic> &
- StoredDiagnostics,
- SourceManager &SM) {
+static void
+checkAndSanitizeDiags(SmallVectorImpl<StoredDiagnostic> &StoredDiagnostics,
+ SourceManager &SM) {
// The stored diagnostic has the old source manager in it; update
// the locations to refer into the new source manager. Since we've
// been careful to make sure that the source manager's state
@@ -1009,20 +999,20 @@
}
}
-static IntrusiveRefCntPtr<vfs::FileSystem> createVFSOverlayForPreamblePCH(
- StringRef PCHFilename,
- IntrusiveRefCntPtr<vfs::FileSystem> RealFS,
- IntrusiveRefCntPtr<vfs::FileSystem> VFS) {
+static IntrusiveRefCntPtr<vfs::FileSystem>
+createVFSOverlayForPreamblePCH(StringRef PCHFilename,
+ IntrusiveRefCntPtr<vfs::FileSystem> RealFS,
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS) {
// We want only the PCH file from the real filesystem to be available,
// so we create an in-memory VFS with just that and overlay it on top.
auto Buf = RealFS->getBufferForFile(PCHFilename);
if (!Buf)
return VFS;
- IntrusiveRefCntPtr<vfs::InMemoryFileSystem>
- PCHFS(new vfs::InMemoryFileSystem());
+ IntrusiveRefCntPtr<vfs::InMemoryFileSystem> PCHFS(
+ new vfs::InMemoryFileSystem());
PCHFS->addFile(PCHFilename, 0, std::move(*Buf));
- IntrusiveRefCntPtr<vfs::OverlayFileSystem>
- Overlay(new vfs::OverlayFileSystem(VFS));
+ IntrusiveRefCntPtr<vfs::OverlayFileSystem> Overlay(
+ new vfs::OverlayFileSystem(VFS));
Overlay->pushOverlay(PCHFS);
return Overlay;
}
@@ -1060,23 +1050,22 @@
if (FileMgr) {
FileMgr = new FileManager(FileMgr->getFileSystemOpts(), VFS);
Clang->setFileManager(FileMgr.get());
- }
- else {
+ } else {
Clang->setVirtualFileSystem(VFS);
}
}
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
- CICleanup(Clang.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance> CICleanup(
+ Clang.get());
Clang->setInvocation(std::make_shared<CompilerInvocation>(*Invocation));
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
-
+
// Set up diagnostics, capturing any diagnostics that would
// otherwise be dropped.
Clang->setDiagnostics(&getDiagnostics());
-
+
// Create the target instance.
Clang->setTarget(TargetInfo::CreateTargetInfo(
Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
@@ -1088,7 +1077,7 @@
// FIXME: We shouldn't need to do this, the target should be immutable once
// created. This complexity should be lifted elsewhere.
Clang->getTarget().adjust(Clang->getLangOpts());
-
+
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
"Invocation must have exactly one source file!");
assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
@@ -1108,25 +1097,27 @@
ResetForParse();
- SourceMgr = new SourceManager(getDiagnostics(), *FileMgr,
- UserFilesAreVolatile);
+ SourceMgr =
+ new SourceManager(getDiagnostics(), *FileMgr, UserFilesAreVolatile);
if (!OverrideMainBuffer) {
checkAndRemoveNonDriverDiags(StoredDiagnostics);
TopLevelDeclsInPreamble.clear();
}
// Create a file manager object to provide access to and cache the filesystem.
Clang->setFileManager(&getFileManager());
-
+
// Create the source manager.
Clang->setSourceManager(&getSourceManager());
-
+
// If the main file has been overridden due to the use of a preamble,
// make that override happen and introduce the preamble.
if (OverrideMainBuffer) {
- assert(Preamble && "No preamble was built, but OverrideMainBuffer is not null");
- Preamble->AddImplicitPreamble(Clang->getInvocation(), OverrideMainBuffer.get());
-
+ assert(Preamble &&
+ "No preamble was built, but OverrideMainBuffer is not null");
+ Preamble->AddImplicitPreamble(Clang->getInvocation(),
+ OverrideMainBuffer.get());
+
// The stored diagnostic has the old source manager in it; update
// the locations to refer into the new source manager. Since we've
// been careful to make sure that the source manager's state
@@ -1143,7 +1134,7 @@
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
- ActCleanup(Act.get());
+ ActCleanup(Act.get());
if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0]))
goto error;
@@ -1158,7 +1149,7 @@
goto error;
transferASTDataFromCompilerInstance(*Clang);
-
+
Act->EndSourceFile();
FailedParseDiagnostics.clear();
@@ -1192,8 +1183,8 @@
const FixItHint &InFix) {
ASTUnit::StandaloneFixIt OutFix;
OutFix.RemoveRange = makeStandaloneRange(InFix.RemoveRange, SM, LangOpts);
- OutFix.InsertFromRange = makeStandaloneRange(InFix.InsertFromRange, SM,
- LangOpts);
+ OutFix.InsertFromRange =
+ makeStandaloneRange(InFix.InsertFromRange, SM, LangOpts);
OutFix.CodeToInsert = InFix.CodeToInsert;
OutFix.BeforePreviousInsertions = InFix.BeforePreviousInsertions;
return OutFix;
@@ -1227,10 +1218,10 @@
/// the source file.
///
/// This routine will compute the preamble of the main source file. If a
-/// non-trivial preamble is found, it will precompile that preamble into a
+/// non-trivial preamble is found, it will precompile that preamble into a
/// precompiled header so that the precompiled preamble can be used to reduce
/// reparsing time. If a precompiled preamble has already been constructed,
-/// this routine will determine if it is still valid and, if so, avoid
+/// this routine will determine if it is still valid and, if so, avoid
/// rebuilding the precompiled preamble.
///
/// \param AllowRebuild When true (the default), this routine is
@@ -1258,9 +1249,8 @@
if (!MainFileBuffer)
return nullptr;
- PreambleBounds Bounds =
- ComputePreambleBounds(*PreambleInvocationIn.getLangOpts(),
- MainFileBuffer.get(), MaxLines);
+ PreambleBounds Bounds = ComputePreambleBounds(
+ *PreambleInvocationIn.getLangOpts(), MainFileBuffer.get(), MaxLines);
if (!Bounds.Size)
return nullptr;
@@ -1315,7 +1305,7 @@
llvm::ErrorOr<PrecompiledPreamble> NewPreamble = PrecompiledPreamble::Build(
PreambleInvocationIn, MainFileBuffer.get(), Bounds, *Diagnostics, VFS,
- PCHContainerOps, Callbacks);
+ PCHContainerOps, Callbacks, nullptr);
if (NewPreamble) {
Preamble = std::move(*NewPreamble);
PreambleRebuildCounter = 1;
@@ -1406,8 +1396,8 @@
}
if (SourceMgr) {
- if (const FileEntry *
- FE = SourceMgr->getFileEntryForID(SourceMgr->getMainFileID()))
+ if (const FileEntry *FE =
+ SourceMgr->getFileEntryForID(SourceMgr->getMainFileID()))
return FE->getName();
}
@@ -1418,8 +1408,8 @@
if (!isMainFileAST())
return StringRef();
- serialization::ModuleFile &
- Mod = Reader->getModuleManager().getPrimaryModule();
+ serialization::ModuleFile &Mod =
+ Reader->getModuleManager().getPrimaryModule();
return Mod.FileName;
}
@@ -1465,7 +1455,7 @@
if (!AST)
return nullptr;
}
-
+
if (!ResourceFilesPath.empty()) {
// Override the resources path.
CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath;
@@ -1476,15 +1466,16 @@
AST->PreambleRebuildCounter = PrecompilePreambleAfterNParses;
AST->TUKind = Action ? Action->getTranslationUnitKind() : TU_Complete;
AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
- AST->IncludeBriefCommentsInCodeCompletion
- = IncludeBriefCommentsInCodeCompletion;
+ AST->IncludeBriefCommentsInCodeCompletion =
+ IncludeBriefCommentsInCodeCompletion;
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
- ASTUnitCleanup(OwnAST.get());
- llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
- llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
- DiagCleanup(Diags.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit> ASTUnitCleanup(
+ OwnAST.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<
+ DiagnosticsEngine,
+ llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
+ DiagCleanup(Diags.get());
// We'll manage file buffers ourselves.
CI->getPreprocessorOpts().RetainRemappedFileBuffers = true;
@@ -1496,16 +1487,16 @@
new CompilerInstance(std::move(PCHContainerOps)));
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
- CICleanup(Clang.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance> CICleanup(
+ Clang.get());
Clang->setInvocation(std::move(CI));
AST->OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
-
+
// Set up diagnostics, capturing any diagnostics that would
// otherwise be dropped.
Clang->setDiagnostics(&AST->getDiagnostics());
-
+
// Create the target instance.
Clang->setTarget(TargetInfo::CreateTargetInfo(
Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
@@ -1517,7 +1508,7 @@
// FIXME: We shouldn't need to do this, the target should be immutable once
// created. This complexity should be lifted elsewhere.
Clang->getTarget().adjust(Clang->getLangOpts());
-
+
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
"Invocation must have exactly one source file!");
assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
@@ -1535,7 +1526,7 @@
// Create a file manager object to provide access to and cache the filesystem.
Clang->setFileManager(&AST->getFileManager());
-
+
// Create the source manager.
Clang->setSourceManager(&AST->getSourceManager());
@@ -1549,7 +1540,7 @@
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
- ActCleanup(TrackerAct.get());
+ ActCleanup(TrackerAct.get());
if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) {
AST->transferASTDataFromCompilerInstance(*Clang);
@@ -1562,7 +1553,7 @@
if (Persistent && !TrackerAct) {
Clang->getPreprocessor().addPPCallbacks(
llvm::make_unique<MacroDefinitionTrackerPPCallbacks>(
- AST->getCurrentTopLevelHashValue()));
+ AST->getCurrentTopLevelHashValue()));
std::vector<std::unique_ptr<ASTConsumer>> Consumers;
if (Clang->hasASTConsumer())
Consumers.push_back(Clang->takeASTConsumer());
@@ -1581,7 +1572,7 @@
// Steal the created target, context, and preprocessor.
AST->transferASTDataFromCompilerInstance(*Clang);
-
+
Act->EndSourceFile();
if (OwnAST)
@@ -1619,7 +1610,7 @@
// Recover resources if we crash before exiting this method.
llvm::CrashRecoveryContextCleanupRegistrar<llvm::MemoryBuffer>
- MemBufferCleanup(OverrideMainBuffer.get());
+ MemBufferCleanup(OverrideMainBuffer.get());
return Parse(std::move(PCHContainerOps), std::move(OverrideMainBuffer), VFS);
}
@@ -1640,19 +1631,19 @@
AST->CaptureDiagnostics = CaptureDiagnostics;
AST->TUKind = TUKind;
AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
- AST->IncludeBriefCommentsInCodeCompletion
- = IncludeBriefCommentsInCodeCompletion;
+ AST->IncludeBriefCommentsInCodeCompletion =
+ IncludeBriefCommentsInCodeCompletion;
AST->Invocation = std::move(CI);
AST->FileSystemOpts = FileMgr->getFileSystemOpts();
AST->FileMgr = FileMgr;
AST->UserFilesAreVolatile = UserFilesAreVolatile;
-
+
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
- ASTUnitCleanup(AST.get());
- llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
- llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
- DiagCleanup(Diags.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit> ASTUnitCleanup(AST.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<
+ DiagnosticsEngine,
+ llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
+ DiagCleanup(Diags.get());
if (AST->LoadFromCompilerInvocation(std::move(PCHContainerOps),
PrecompilePreambleAfterNParses,
@@ -1699,7 +1690,7 @@
PPOpts.RemappedFilesKeepOriginalName = RemappedFilesKeepOriginalName;
PPOpts.AllowPCHWithCompilerErrors = AllowPCHWithCompilerErrors;
PPOpts.SingleFileParseMode = SingleFileParse;
-
+
// Override the resources path.
CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath;
@@ -1725,8 +1716,8 @@
AST->CaptureDiagnostics = CaptureDiagnostics;
AST->TUKind = TUKind;
AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
- AST->IncludeBriefCommentsInCodeCompletion
- = IncludeBriefCommentsInCodeCompletion;
+ AST->IncludeBriefCommentsInCodeCompletion =
+ IncludeBriefCommentsInCodeCompletion;
AST->UserFilesAreVolatile = UserFilesAreVolatile;
AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size();
AST->StoredDiagnostics.swap(StoredDiagnostics);
@@ -1738,12 +1729,10 @@
Diags = nullptr;
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
- ASTUnitCleanup(AST.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit> ASTUnitCleanup(AST.get());
if (AST->LoadFromCompilerInvocation(std::move(PCHContainerOps),
- PrecompilePreambleAfterNParses,
- VFS)) {
+ PrecompilePreambleAfterNParses, VFS)) {
// Some error occurred, if caller wants to examine diagnostics, pass it the
// ASTUnit.
if (ErrAST) {
@@ -1768,7 +1757,7 @@
}
clearFileLevelDecls();
-
+
SimpleTimer ParsingTimer(WantTiming);
ParsingTimer.setOutput("Reparsing " + getMainFileName());
@@ -1790,7 +1779,6 @@
OverrideMainBuffer =
getMainBufferWithPrecompiledPreamble(PCHContainerOps, *Invocation, VFS);
-
// Clear out the diagnostics state.
FileMgr.reset();
getDiagnostics().Reset();
@@ -1802,16 +1790,16 @@
bool Result =
Parse(std::move(PCHContainerOps), std::move(OverrideMainBuffer), VFS);
- // If we're caching global code-completion results, and the top-level
+ // If we're caching global code-completion results, and the top-level
// declarations have changed, clear out the code-completion cache.
if (!Result && ShouldCacheCodeCompletionResults &&
CurrentTopLevelHashValue != CompletionCacheTopLevelHashValue)
CacheCodeCompletionResults();
// We now need to clear out the completion info related to this translation
// unit; it'll be recreated if necessary.
CCTUInfo.reset();
-
+
return Result;
}
@@ -1833,70 +1821,69 @@
//----------------------------------------------------------------------------//
namespace {
- /// \brief Code completion consumer that combines the cached code-completion
- /// results from an ASTUnit with the code-completion results provided to it,
- /// then passes the result on to
- class AugmentedCodeCompleteConsumer : public CodeCompleteConsumer {
- uint64_t NormalContexts;
- ASTUnit &AST;
- CodeCompleteConsumer &Next;
-
- public:
- AugmentedCodeCompleteConsumer(ASTUnit &AST, CodeCompleteConsumer &Next,
- const CodeCompleteOptions &CodeCompleteOpts)
- : CodeCompleteConsumer(CodeCompleteOpts, Next.isOutputBinary()),
- AST(AST), Next(Next)
- {
- // Compute the set of contexts in which we will look when we don't have
- // any information about the specific context.
- NormalContexts
- = (1LL << CodeCompletionContext::CCC_TopLevel)
- | (1LL << CodeCompletionContext::CCC_ObjCInterface)
- | (1LL << CodeCompletionContext::CCC_ObjCImplementation)
- | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
- | (1LL << CodeCompletionContext::CCC_Statement)
- | (1LL << CodeCompletionContext::CCC_Expression)
- | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
- | (1LL << CodeCompletionContext::CCC_DotMemberAccess)
- | (1LL << CodeCompletionContext::CCC_ArrowMemberAccess)
- | (1LL << CodeCompletionContext::CCC_ObjCPropertyAccess)
- | (1LL << CodeCompletionContext::CCC_ObjCProtocolName)
- | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
- | (1LL << CodeCompletionContext::CCC_Recovery);
-
- if (AST.getASTContext().getLangOpts().CPlusPlus)
- NormalContexts |= (1LL << CodeCompletionContext::CCC_EnumTag)
- | (1LL << CodeCompletionContext::CCC_UnionTag)
- | (1LL << CodeCompletionContext::CCC_ClassOrStructTag);
- }
-
- void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context,
- CodeCompletionResult *Results,
- unsigned NumResults) override;
-
- void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
- OverloadCandidate *Candidates,
- unsigned NumCandidates) override {
- Next.ProcessOverloadCandidates(S, CurrentArg, Candidates, NumCandidates);
- }
+/// \brief Code completion consumer that combines the cached code-completion
+/// results from an ASTUnit with the code-completion results provided to it,
+/// then passes the result on to
+class AugmentedCodeCompleteConsumer : public CodeCompleteConsumer {
+ uint64_t NormalContexts;
+ ASTUnit &AST;
+ CodeCompleteConsumer &Next;
- CodeCompletionAllocator &getAllocator() override {
- return Next.getAllocator();
- }
+public:
+ AugmentedCodeCompleteConsumer(ASTUnit &AST, CodeCompleteConsumer &Next,
+ const CodeCompleteOptions &CodeCompleteOpts)
+ : CodeCompleteConsumer(CodeCompleteOpts, Next.isOutputBinary()), AST(AST),
+ Next(Next) {
+ // Compute the set of contexts in which we will look when we don't have
+ // any information about the specific context.
+ NormalContexts =
+ (1LL << CodeCompletionContext::CCC_TopLevel) |
+ (1LL << CodeCompletionContext::CCC_ObjCInterface) |
+ (1LL << CodeCompletionContext::CCC_ObjCImplementation) |
+ (1LL << CodeCompletionContext::CCC_ObjCIvarList) |
+ (1LL << CodeCompletionContext::CCC_Statement) |
+ (1LL << CodeCompletionContext::CCC_Expression) |
+ (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver) |
+ (1LL << CodeCompletionContext::CCC_DotMemberAccess) |
+ (1LL << CodeCompletionContext::CCC_ArrowMemberAccess) |
+ (1LL << CodeCompletionContext::CCC_ObjCPropertyAccess) |
+ (1LL << CodeCompletionContext::CCC_ObjCProtocolName) |
+ (1LL << CodeCompletionContext::CCC_ParenthesizedExpression) |
+ (1LL << CodeCompletionContext::CCC_Recovery);
+
+ if (AST.getASTContext().getLangOpts().CPlusPlus)
+ NormalContexts |= (1LL << CodeCompletionContext::CCC_EnumTag) |
+ (1LL << CodeCompletionContext::CCC_UnionTag) |
+ (1LL << CodeCompletionContext::CCC_ClassOrStructTag);
+ }
+
+ void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context,
+ CodeCompletionResult *Results,
+ unsigned NumResults) override;
+
+ void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
+ OverloadCandidate *Candidates,
+ unsigned NumCandidates) override {
+ Next.ProcessOverloadCandidates(S, CurrentArg, Candidates, NumCandidates);
+ }
- CodeCompletionTUInfo &getCodeCompletionTUInfo() override {
- return Next.getCodeCompletionTUInfo();
- }
- };
+ CodeCompletionAllocator &getAllocator() override {
+ return Next.getAllocator();
+ }
+
+ CodeCompletionTUInfo &getCodeCompletionTUInfo() override {
+ return Next.getCodeCompletionTUInfo();
+ }
+};
} // anonymous namespace
/// \brief Helper function that computes which global names are hidden by the
/// local code-completion results.
-static void CalculateHiddenNames(const CodeCompletionContext &Context,
- CodeCompletionResult *Results,
- unsigned NumResults,
- ASTContext &Ctx,
- llvm::StringSet<llvm::BumpPtrAllocator> &HiddenNames){
+static void
+CalculateHiddenNames(const CodeCompletionContext &Context,
+ CodeCompletionResult *Results, unsigned NumResults,
+ ASTContext &Ctx,
+ llvm::StringSet<llvm::BumpPtrAllocator> &HiddenNames) {
bool OnlyTagNames = false;
switch (Context.getKind()) {
case CodeCompletionContext::CCC_Recovery:
@@ -1918,13 +1905,13 @@
case CodeCompletionContext::CCC_ParenthesizedExpression:
case CodeCompletionContext::CCC_ObjCInterfaceName:
break;
-
+
case CodeCompletionContext::CCC_EnumTag:
case CodeCompletionContext::CCC_UnionTag:
case CodeCompletionContext::CCC_ClassOrStructTag:
OnlyTagNames = true;
break;
-
+
case CodeCompletionContext::CCC_ObjCProtocolName:
case CodeCompletionContext::CCC_MacroName:
case CodeCompletionContext::CCC_MacroNameUse:
@@ -1942,101 +1929,98 @@
// be hidden.
return;
}
-
+
typedef CodeCompletionResult Result;
for (unsigned I = 0; I != NumResults; ++I) {
if (Results[I].Kind != Result::RK_Declaration)
continue;
-
- unsigned IDNS
- = Results[I].Declaration->getUnderlyingDecl()->getIdentifierNamespace();
+
+ unsigned IDNS =
+ Results[I].Declaration->getUnderlyingDecl()->getIdentifierNamespace();
bool Hiding = false;
if (OnlyTagNames)
Hiding = (IDNS & Decl::IDNS_Tag);
else {
- unsigned HiddenIDNS = (Decl::IDNS_Type | Decl::IDNS_Member |
- Decl::IDNS_Namespace | Decl::IDNS_Ordinary |
- Decl::IDNS_NonMemberOperator);
+ unsigned HiddenIDNS =
+ (Decl::IDNS_Type | Decl::IDNS_Member | Decl::IDNS_Namespace |
+ Decl::IDNS_Ordinary | Decl::IDNS_NonMemberOperator);
if (Ctx.getLangOpts().CPlusPlus)
HiddenIDNS |= Decl::IDNS_Tag;
Hiding = (IDNS & HiddenIDNS);
}
-
+
if (!Hiding)
continue;
-
+
DeclarationName Name = Results[I].Declaration->getDeclName();
if (IdentifierInfo *Identifier = Name.getAsIdentifierInfo())
HiddenNames.insert(Identifier->getName());
else
HiddenNames.insert(Name.getAsString());
}
}
-void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &S,
- CodeCompletionContext Context,
- CodeCompletionResult *Results,
- unsigned NumResults) {
+void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(
+ Sema &S, CodeCompletionContext Context, CodeCompletionResult *Results,
+ unsigned NumResults) {
// Merge the results we were given with the results we cached.
bool AddedResult = false;
- uint64_t InContexts =
- Context.getKind() == CodeCompletionContext::CCC_Recovery
- ? NormalContexts : (1LL << Context.getKind());
+ uint64_t InContexts = Context.getKind() == CodeCompletionContext::CCC_Recovery
+ ? NormalContexts
+ : (1LL << Context.getKind());
// Contains the set of names that are hidden by "local" completion results.
llvm::StringSet<llvm::BumpPtrAllocator> HiddenNames;
typedef CodeCompletionResult Result;
SmallVector<Result, 8> AllResults;
- for (ASTUnit::cached_completion_iterator
- C = AST.cached_completion_begin(),
- CEnd = AST.cached_completion_end();
+ for (ASTUnit::cached_completion_iterator C = AST.cached_completion_begin(),
+ CEnd = AST.cached_completion_end();
C != CEnd; ++C) {
- // If the context we are in matches any of the contexts we are
+ // If the context we are in matches any of the contexts we are
// interested in, we'll add this result.
if ((C->ShowInContexts & InContexts) == 0)
continue;
-
+
// If we haven't added any results previously, do so now.
if (!AddedResult) {
- CalculateHiddenNames(Context, Results, NumResults, S.Context,
+ CalculateHiddenNames(Context, Results, NumResults, S.Context,
HiddenNames);
AllResults.insert(AllResults.end(), Results, Results + NumResults);
AddedResult = true;
}
-
+
// Determine whether this global completion result is hidden by a local
// completion result. If so, skip it.
if (C->Kind != CXCursor_MacroDefinition &&
HiddenNames.count(C->Completion->getTypedText()))
continue;
-
+
// Adjust priority based on similar type classes.
unsigned Priority = C->Priority;
CodeCompletionString *Completion = C->Completion;
if (!Context.getPreferredType().isNull()) {
if (C->Kind == CXCursor_MacroDefinition) {
- Priority = getMacroUsagePriority(C->Completion->getTypedText(),
- S.getLangOpts(),
- Context.getPreferredType()->isAnyPointerType());
+ Priority = getMacroUsagePriority(
+ C->Completion->getTypedText(), S.getLangOpts(),
+ Context.getPreferredType()->isAnyPointerType());
} else if (C->Type) {
- CanQualType Expected
- = S.Context.getCanonicalType(
- Context.getPreferredType().getUnqualifiedType());
+ CanQualType Expected = S.Context.getCanonicalType(
+ Context.getPreferredType().getUnqualifiedType());
SimplifiedTypeClass ExpectedSTC = getSimplifiedTypeClass(Expected);
if (ExpectedSTC == C->TypeClass) {
// We know this type is similar; check for an exact match.
- llvm::StringMap<unsigned> &CachedCompletionTypes
- = AST.getCachedCompletionTypes();
- llvm::StringMap<unsigned>::iterator Pos
- = CachedCompletionTypes.find(QualType(Expected).getAsString());
+ llvm::StringMap<unsigned> &CachedCompletionTypes =
+ AST.getCachedCompletionTypes();
+ llvm::StringMap<unsigned>::iterator Pos =
+ CachedCompletionTypes.find(QualType(Expected).getAsString());
if (Pos != CachedCompletionTypes.end() && Pos->second == C->Type)
Priority /= CCF_ExactTypeMatch;
else
Priority /= CCF_SimilarTypeMatch;
}
}
}
-
+
// Adjust the completion string, if required.
if (C->Kind == CXCursor_MacroDefinition &&
Context.getKind() == CodeCompletionContext::CCC_MacroNameUse) {
@@ -2048,18 +2032,18 @@
Priority = CCP_CodePattern;
Completion = Builder.TakeString();
}
-
- AllResults.push_back(Result(Completion, Priority, C->Kind,
- C->Availability));
+
+ AllResults.push_back(
+ Result(Completion, Priority, C->Kind, C->Availability));
}
-
+
// If we did not add any cached completion results, just forward the
// results we were given to the next consumer.
if (!AddedResult) {
Next.ProcessCodeCompleteResults(S, Context, Results, NumResults);
return;
}
-
+
Next.ProcessCodeCompleteResults(S, Context, AllResults.data(),
AllResults.size());
}
@@ -2077,17 +2061,17 @@
return;
SimpleTimer CompletionTimer(WantTiming);
- CompletionTimer.setOutput("Code completion @ " + File + ":" +
- Twine(Line) + ":" + Twine(Column));
+ CompletionTimer.setOutput("Code completion @ " + File + ":" + Twine(Line) +
+ ":" + Twine(Column));
auto CCInvocation = std::make_shared<CompilerInvocation>(*Invocation);
FrontendOptions &FrontendOpts = CCInvocation->getFrontendOpts();
CodeCompleteOptions &CodeCompleteOpts = FrontendOpts.CodeCompleteOpts;
PreprocessorOptions &PreprocessorOpts = CCInvocation->getPreprocessorOpts();
- CodeCompleteOpts.IncludeMacros = IncludeMacros &&
- CachedCompletionResults.empty();
+ CodeCompleteOpts.IncludeMacros =
+ IncludeMacros && CachedCompletionResults.empty();
CodeCompleteOpts.IncludeCodePatterns = IncludeCodePatterns;
CodeCompleteOpts.IncludeGlobals = CachedCompletionResults.empty();
CodeCompleteOpts.IncludeBriefComments = IncludeBriefComments;
@@ -2109,17 +2093,16 @@
new CompilerInstance(PCHContainerOps));
// Recover resources if we crash before exiting this method.
- llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
- CICleanup(Clang.get());
+ llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance> CICleanup(
+ Clang.get());
auto &Inv = *CCInvocation;
Clang->setInvocation(std::move(CCInvocation));
OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
-
+
// Set up diagnostics, capturing any diagnostics produced.
Clang->setDiagnostics(&Diag);
- CaptureDroppedDiagnostics Capture(true,
- Clang->getDiagnostics(),
+ CaptureDroppedDiagnostics Capture(true, Clang->getDiagnostics(),
&StoredDiagnostics, nullptr);
ProcessWarningOptions(Diag, Inv.getDiagnosticOpts());
@@ -2130,22 +2113,22 @@
Clang->setInvocation(nullptr);
return;
}
-
+
// Inform the target of the language options.
//
// FIXME: We shouldn't need to do this, the target should be immutable once
// created. This complexity should be lifted elsewhere.
Clang->getTarget().adjust(Clang->getLangOpts());
-
+
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
"Invocation must have exactly one source file!");
assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
InputKind::Source &&
"FIXME: AST inputs not yet supported here!");
assert(Clang->getFrontendOpts().Inputs[0].getKind().getLanguage() !=
InputKind::LLVM_IR &&
"IR inputs not support here!");
-
+
// Use the source and file managers that we were given.
Clang->setFileManager(&FileMgr);
Clang->setSourceManager(&SourceMgr);
@@ -2160,8 +2143,8 @@
// Use the code completion consumer we were given, but adding any cached
// code-completion results.
- AugmentedCodeCompleteConsumer *AugmentedConsumer
- = new AugmentedCodeCompleteConsumer(*this, Consumer, CodeCompleteOpts);
+ AugmentedCodeCompleteConsumer *AugmentedConsumer =
+ new AugmentedCodeCompleteConsumer(*this, Consumer, CodeCompleteOpts);
Clang->setCodeCompletionConsumer(AugmentedConsumer);
// If we have a precompiled preamble, try to use it. We only allow
@@ -2175,7 +2158,8 @@
auto VFS = FileMgr.getVirtualFileSystem();
auto CompleteFileStatus = VFS->status(CompleteFilePath);
if (CompleteFileStatus) {
- llvm::sys::fs::UniqueID CompleteFileID = CompleteFileStatus->getUniqueID();
+ llvm::sys::fs::UniqueID CompleteFileID =
+ CompleteFileStatus->getUniqueID();
std::string MainPath(OriginalSourceFile);
auto MainStatus = VFS->status(MainPath);
@@ -2191,8 +2175,10 @@
// If the main file has been overridden due to the use of a preamble,
// make that override happen and introduce the preamble.
if (OverrideMainBuffer) {
- assert(Preamble && "No preamble was built, but OverrideMainBuffer is not null");
- Preamble->AddImplicitPreamble(Clang->getInvocation(), OverrideMainBuffer.get());
+ assert(Preamble &&
+ "No preamble was built, but OverrideMainBuffer is not null");
+ Preamble->AddImplicitPreamble(Clang->getInvocation(),
+ OverrideMainBuffer.get());
OwnedBuffers.push_back(OverrideMainBuffer.release());
} else {
PreprocessorOpts.PrecompiledPreambleBytes.first = 0;
@@ -2224,7 +2210,7 @@
if (llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath))
return true;
- // FIXME: Can we somehow regenerate the stat cache here, or do we need to
+ // FIXME: Can we somehow regenerate the stat cache here, or do we need to
// unconditionally create a stat cache when we parse the file?
llvm::raw_fd_ostream Out(fd, /*shouldClose=*/true);
@@ -2243,11 +2229,8 @@
return false;
}
-static bool serializeUnit(ASTWriter &Writer,
- SmallVectorImpl<char> &Buffer,
- Sema &S,
- bool hasErrors,
- raw_ostream &OS) {
+static bool serializeUnit(ASTWriter &Writer, SmallVectorImpl<char> &Buffer,
+ Sema &S, bool hasErrors, raw_ostream &OS) {
Writer.WriteAST(S, std::string(), nullptr, "", hasErrors);
// Write the generated bitstream to "Out".
@@ -2258,12 +2241,13 @@
}
bool ASTUnit::serialize(raw_ostream &OS) {
- // For serialization we are lenient if the errors were only warn-as-error kind.
+ // For serialization we are lenient if the errors were only warn-as-error
+ // kind.
bool hasErrors = getDiagnostics().hasUncompilableErrorOccurred();
if (WriterData)
- return serializeUnit(WriterData->Writer, WriterData->Buffer,
- getSema(), hasErrors, OS);
+ return serializeUnit(WriterData->Writer, WriterData->Buffer, getSema(),
+ hasErrors, OS);
SmallString<128> Buffer;
llvm::BitstreamWriter Stream(Buffer);
@@ -2275,10 +2259,9 @@
typedef ContinuousRangeMap<unsigned, int, 2> SLocRemap;
void ASTUnit::TranslateStoredDiagnostics(
- FileManager &FileMgr,
- SourceManager &SrcMgr,
- const SmallVectorImpl<StandaloneDiagnostic> &Diags,
- SmallVectorImpl<StoredDiagnostic> &Out) {
+ FileManager &FileMgr, SourceManager &SrcMgr,
+ const SmallVectorImpl<StandaloneDiagnostic> &Diags,
+ SmallVectorImpl<StoredDiagnostic> &Out) {
// Map the standalone diagnostic into the new source manager. We also need to
// remap all the locations to the new view. This includes the diag location,
// any associated source ranges, and the source ranges of associated fix-its.
@@ -2327,15 +2310,15 @@
FH.RemoveRange = CharSourceRange::getCharRange(BL, EL);
}
- Result.push_back(StoredDiagnostic(SD.Level, SD.ID,
- SD.Message, Loc, Ranges, FixIts));
+ Result.push_back(
+ StoredDiagnostic(SD.Level, SD.ID, SD.Message, Loc, Ranges, FixIts));
}
Result.swap(Out);
}
void ASTUnit::addFileLevelDecl(Decl *D) {
assert(D);
-
+
// We only care about local declarations.
if (D->isFromASTFile())
return;
@@ -2393,10 +2376,9 @@
if (LocDecls.empty())
return;
- LocDeclsTy::iterator BeginIt =
- std::lower_bound(LocDecls.begin(), LocDecls.end(),
- std::make_pair(Offset, (Decl *)nullptr),
- llvm::less_first());
+ LocDeclsTy::iterator BeginIt = std::lower_bound(
+ LocDecls.begin(), LocDecls.end(), std::make_pair(Offset, (Decl *)nullptr),
+ llvm::less_first());
if (BeginIt != LocDecls.begin())
--BeginIt;
@@ -2412,13 +2394,13 @@
std::make_pair(Offset + Length, (Decl *)nullptr), llvm::less_first());
if (EndIt != LocDecls.end())
++EndIt;
-
+
for (LocDeclsTy::iterator DIt = BeginIt; DIt != EndIt; ++DIt)
Decls.push_back(DIt->second);
}
-SourceLocation ASTUnit::getLocation(const FileEntry *File,
- unsigned Line, unsigned Col) const {
+SourceLocation ASTUnit::getLocation(const FileEntry *File, unsigned Line,
+ unsigned Col) const {
const SourceManager &SM = getSourceManager();
SourceLocation Loc = SM.translateFileLineCol(File, Line, Col);
return SM.getMacroArgExpandedLocation(Loc);
@@ -2443,9 +2425,10 @@
return Loc;
unsigned Offs;
- if (SourceMgr->isInFileID(Loc, PreambleID, &Offs) && Offs < Preamble->getBounds().Size) {
- SourceLocation FileLoc
- = SourceMgr->getLocForStartOfFile(SourceMgr->getMainFileID());
+ if (SourceMgr->isInFileID(Loc, PreambleID, &Offs) &&
+ Offs < Preamble->getBounds().Size) {
+ SourceLocation FileLoc =
+ SourceMgr->getLocForStartOfFile(SourceMgr->getMainFileID());
return FileLoc.getLocWithOffset(Offs);
}
@@ -2477,29 +2460,29 @@
FileID FID;
if (SourceMgr)
FID = SourceMgr->getPreambleFileID();
-
+
if (Loc.isInvalid() || FID.isInvalid())
return false;
-
+
return SourceMgr->isInFileID(Loc, FID);
}
bool ASTUnit::isInMainFileID(SourceLocation Loc) const {
FileID FID;
if (SourceMgr)
FID = SourceMgr->getMainFileID();
-
+
if (Loc.isInvalid() || FID.isInvalid())
return false;
-
+
return SourceMgr->isInFileID(Loc, FID);
}
SourceLocation ASTUnit::getEndOfPreambleFileID() const {
FileID FID;
if (SourceMgr)
FID = SourceMgr->getPreambleFileID();
-
+
if (FID.isInvalid())
return SourceLocation();
@@ -2510,18 +2493,18 @@
FileID FID;
if (SourceMgr)
FID = SourceMgr->getMainFileID();
-
+
if (FID.isInvalid())
return SourceLocation();
-
+
return SourceMgr->getLocForStartOfFile(FID);
}
llvm::iterator_range<PreprocessingRecord::iterator>
ASTUnit::getLocalPreprocessingEntities() const {
if (isMainFileAST()) {
- serialization::ModuleFile &
- Mod = Reader->getModuleManager().getPrimaryModule();
+ serialization::ModuleFile &Mod =
+ Reader->getModuleManager().getPrimaryModule();
return Reader->getModulePreprocessedEntities(Mod);
}
@@ -2534,8 +2517,8 @@
bool ASTUnit::visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn) {
if (isMainFileAST()) {
- serialization::ModuleFile &
- Mod = Reader->getModuleManager().getPrimaryModule();
+ serialization::ModuleFile &Mod =
+ Reader->getModuleManager().getPrimaryModule();
for (const Decl *D : Reader->getModuleFileLevelDecls(Mod)) {
if (!Fn(context, D))
return false;
@@ -2545,8 +2528,8 @@
}
for (ASTUnit::top_level_iterator TL = top_level_begin(),
- TLEnd = top_level_end();
- TL != TLEnd; ++TL) {
+ TLEnd = top_level_end();
+ TL != TLEnd; ++TL) {
if (!Fn(context, *TL))
return false;
}
Index: include/clang/Frontend/PrecompiledPreamble.h
===================================================================
--- include/clang/Frontend/PrecompiledPreamble.h
+++ include/clang/Frontend/PrecompiledPreamble.h
@@ -77,7 +77,7 @@
const llvm::MemoryBuffer *MainFileBuffer, PreambleBounds Bounds,
DiagnosticsEngine &Diagnostics, IntrusiveRefCntPtr<vfs::FileSystem> VFS,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
- PreambleCallbacks &Callbacks);
+ PreambleCallbacks &Callbacks, std::unique_ptr<PPCallbacks> PPCallbacks);
PrecompiledPreamble(PrecompiledPreamble &&) = default;
PrecompiledPreamble &operator=(PrecompiledPreamble &&) = default;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits