67#include "llvm/ADT/ArrayRef.h"
68#include "llvm/ADT/DenseMap.h"
69#include "llvm/ADT/IntrusiveRefCntPtr.h"
70#include "llvm/ADT/STLExtras.h"
71#include "llvm/ADT/ScopeExit.h"
72#include "llvm/ADT/SmallVector.h"
73#include "llvm/ADT/StringMap.h"
74#include "llvm/ADT/StringRef.h"
75#include "llvm/ADT/StringSet.h"
76#include "llvm/ADT/Twine.h"
77#include "llvm/ADT/iterator_range.h"
78#include "llvm/Bitstream/BitstreamWriter.h"
79#include "llvm/Support/Allocator.h"
80#include "llvm/Support/CrashRecoveryContext.h"
81#include "llvm/Support/DJB.h"
82#include "llvm/Support/ErrorHandling.h"
83#include "llvm/Support/ErrorOr.h"
84#include "llvm/Support/MemoryBuffer.h"
85#include "llvm/Support/SaveAndRestore.h"
86#include "llvm/Support/Timer.h"
87#include "llvm/Support/VirtualFileSystem.h"
88#include "llvm/Support/raw_ostream.h"
103using namespace clang;
105using llvm::TimeRecord;
115 explicit SimpleTimer(
bool WantTiming) : WantTiming(WantTiming) {
117 Start = TimeRecord::getCurrentTime();
122 TimeRecord Elapsed = TimeRecord::getCurrentTime();
124 llvm::errs() << Output <<
':';
125 Elapsed.print(Elapsed, llvm::errs());
126 llvm::errs() <<
'\n';
130 void setOutput(
const Twine &Output) {
132 this->Output = Output.str();
139static std::unique_ptr<T>
valueOrNull(llvm::ErrorOr<std::unique_ptr<T>> Val) {
142 return std::move(*Val);
147static std::unique_ptr<llvm::MemoryBuffer>
149 llvm::vfs::FileSystem *VFS,
150 StringRef FilePath,
bool isVolatile) {
156 llvm::MemoryBuffer *Buffer =
nullptr;
157 std::unique_ptr<llvm::MemoryBuffer> BufferOwner;
158 auto FileStatus = VFS->status(FilePath);
160 llvm::sys::fs::UniqueID MainFileID = FileStatus->getUniqueID();
163 for (
const auto &RF : PreprocessorOpts.RemappedFiles) {
164 std::string MPath(RF.first);
165 auto MPathStatus = VFS->status(MPath);
167 llvm::sys::fs::UniqueID MID = MPathStatus->getUniqueID();
168 if (MainFileID == MID) {
170 BufferOwner =
valueOrNull(VFS->getBufferForFile(RF.second, -1,
true, isVolatile));
179 for (
const auto &RB : PreprocessorOpts.RemappedFileBuffers) {
180 std::string MPath(RB.first);
181 auto MPathStatus = VFS->status(MPath);
183 llvm::sys::fs::UniqueID MID = MPathStatus->getUniqueID();
184 if (MainFileID == MID) {
187 Buffer =
const_cast<llvm::MemoryBuffer *
>(RB.second);
194 if (!Buffer && !BufferOwner) {
195 BufferOwner =
valueOrNull(VFS->getBufferForFile(FilePath, -1,
true, isVolatile));
204 return llvm::MemoryBuffer::getMemBufferCopy(Buffer->getBuffer(), FilePath);
207void ASTUnit::clearFileLevelDecls() {
222ASTUnit::ASTUnit(
bool _MainFileIsAST)
224 MainFileIsAST(_MainFileIsAST), WantTiming(getenv(
"LIBCLANG_TIMING")),
225 ShouldCacheCodeCompletionResults(
false),
226 IncludeBriefCommentsInCodeCompletion(
false), UserFilesAreVolatile(
false),
227 UnsafeToFree(
false) {
228 if (getenv(
"LIBCLANG_OBJTRACKING"))
238 clearFileLevelDecls();
244 if (Invocation && OwnsRemappedFileBuffers) {
246 for (
const auto &RB : PPOpts.RemappedFileBuffers)
250 ClearCachedCompletionResults();
252 if (getenv(
"LIBCLANG_OBJTRACKING"))
257 this->PP = std::move(PP);
262 "Bad context for source file");
270 bool &IsNestedNameSpecifier) {
271 IsNestedNameSpecifier =
false;
278 uint64_t Contexts = 0;
292 if (LangOpts.CPlusPlus)
301 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
303 if (ID->getDefinition())
314 if (LangOpts.CPlusPlus11)
315 IsNestedNameSpecifier =
true;
316 }
else if (
const auto *
Record = dyn_cast<RecordDecl>(ND)) {
322 if (LangOpts.CPlusPlus)
323 IsNestedNameSpecifier =
true;
325 IsNestedNameSpecifier =
true;
340 IsNestedNameSpecifier =
true;
346void ASTUnit::CacheCodeCompletionResults() {
350 SimpleTimer Timer(WantTiming);
351 Timer.setOutput(
"Cache global code completions for " +
getMainFileName());
354 ClearCachedCompletionResults();
357 using Result = CodeCompletionResult;
358 SmallVector<Result, 8> Results;
359 CachedCompletionAllocator = std::make_shared<GlobalCodeCompletionAllocator>();
360 CodeCompletionTUInfo CCTUInfo(CachedCompletionAllocator);
361 TheSema->CodeCompletion().GatherGlobalCodeCompletions(
362 *CachedCompletionAllocator, CCTUInfo, Results);
365 llvm::DenseMap<CanQualType, unsigned> CompletionTypes;
368 for (
auto &R : Results) {
370 case Result::RK_Declaration: {
371 bool IsNestedNameSpecifier =
false;
373 CachedResult.
Completion =
R.CreateCodeCompletionString(
374 *TheSema, CCContext, *CachedCompletionAllocator, CCTUInfo,
375 IncludeBriefCommentsInCodeCompletion);
377 R.Declaration, Ctx->getLangOpts(), IsNestedNameSpecifier);
378 CachedResult.Priority =
R.Priority;
379 CachedResult.Kind =
R.CursorKind;
380 CachedResult.Availability =
R.Availability;
387 CachedResult.Type = 0;
396 unsigned &TypeValue = CompletionTypes[CanUsageType];
397 if (TypeValue == 0) {
398 TypeValue = CompletionTypes.size();
399 CachedCompletionTypes[QualType(CanUsageType).getAsString()]
403 CachedResult.Type = TypeValue;
406 CachedCompletionResults.push_back(CachedResult);
409 if (TheSema->Context.getLangOpts().CPlusPlus && IsNestedNameSpecifier &&
410 !
R.StartsNestedNameSpecifier) {
430 if (uint64_t RemainingContexts
431 = NNSContexts & ~CachedResult.ShowInContexts) {
435 R.StartsNestedNameSpecifier =
true;
436 CachedResult.Completion =
R.CreateCodeCompletionString(
437 *TheSema, CCContext, *CachedCompletionAllocator, CCTUInfo,
438 IncludeBriefCommentsInCodeCompletion);
439 CachedResult.ShowInContexts = RemainingContexts;
442 CachedResult.Type = 0;
443 CachedCompletionResults.push_back(CachedResult);
449 case Result::RK_Keyword:
450 case Result::RK_Pattern:
455 case Result::RK_Macro: {
457 CachedResult.
Completion =
R.CreateCodeCompletionString(
458 *TheSema, CCContext, *CachedCompletionAllocator, CCTUInfo,
459 IncludeBriefCommentsInCodeCompletion);
460 CachedResult.ShowInContexts
474 CachedResult.Priority =
R.Priority;
475 CachedResult.Kind =
R.CursorKind;
476 CachedResult.Availability =
R.Availability;
478 CachedResult.Type = 0;
479 CachedCompletionResults.push_back(CachedResult);
486 CompletionCacheTopLevelHashValue = CurrentTopLevelHashValue;
489void ASTUnit::ClearCachedCompletionResults() {
490 CachedCompletionResults.clear();
491 CachedCompletionTypes.clear();
492 CachedCompletionAllocator =
nullptr;
500 HeaderSearchOptions &HSOpts;
501 std::string &ContextHash;
502 PreprocessorOptions &PPOpts;
503 LangOptions &LangOpts;
504 CodeGenOptions &CodeGenOpts;
505 TargetOptions &TargetOpts;
509 ASTInfoCollector(HeaderSearchOptions &HSOpts, std::string &ContextHash,
510 PreprocessorOptions &PPOpts, LangOptions &LangOpts,
511 CodeGenOptions &CodeGenOpts, TargetOptions &TargetOpts,
513 : HSOpts(HSOpts), ContextHash(ContextHash), PPOpts(PPOpts),
514 LangOpts(LangOpts), CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts),
517 bool ReadLanguageOptions(
const LangOptions &NewLangOpts,
518 StringRef ModuleFilename,
bool Complain,
519 bool AllowCompatibleDifferences)
override {
520 LangOpts = NewLangOpts;
524 bool ReadCodeGenOptions(
const CodeGenOptions &NewCodeGenOpts,
525 StringRef ModuleFilename,
bool Complain,
526 bool AllowCompatibleDifferences)
override {
527 CodeGenOpts = NewCodeGenOpts;
531 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &NewHSOpts,
532 StringRef ModuleFilename,
533 StringRef NewContextHash,
534 bool Complain)
override {
536 ContextHash = NewContextHash;
540 bool ReadHeaderSearchPaths(
const HeaderSearchOptions &NewHSOpts,
541 bool Complain)
override {
548 bool ReadPreprocessorOptions(
const PreprocessorOptions &NewPPOpts,
549 StringRef ModuleFilename,
bool ReadMacros,
551 std::string &SuggestedPredefines)
override {
556 bool ReadTargetOptions(
const TargetOptions &NewTargetOpts,
557 StringRef ModuleFilename,
bool Complain,
558 bool AllowCompatibleDifferences)
override {
559 TargetOpts = NewTargetOpts;
563 void ReadCounter(
const serialization::ModuleFile &M,
565 Counter = NewCounter;
573 bool CaptureNonErrorsFromIncludes)
574 : StoredDiags(StoredDiags), StandaloneDiags(StandaloneDiags),
575 CaptureNonErrorsFromIncludes(CaptureNonErrorsFromIncludes) {
576 assert((StoredDiags || StandaloneDiags) &&
577 "No output collections were passed to StoredDiagnosticConsumer.");
582 this->LangOpts = &LangOpts;
611 StoredDiags->emplace_back(Level, Info);
612 ResultDiag = &StoredDiags->back();
615 if (StandaloneDiags) {
616 std::optional<StoredDiagnostic> StoredDiag;
618 StoredDiag.emplace(Level, Info);
619 ResultDiag = &*StoredDiag;
621 StandaloneDiags->emplace_back(*LangOpts, *ResultDiag);
631 Client(StoredDiags, StandaloneDiags,
632 CaptureDiagnostics !=
635 Diags.getClient() ==
nullptr) {
636 OwningPreviousClient = Diags.takeClient();
637 PreviousClient = Diags.getClient();
638 Diags.setClient(&Client, false);
643 if (Diags.getClient() == &Client)
644 Diags.setClient(PreviousClient, !!OwningPreviousClient.release());
653 return &WriterData->Writer;
659 return &WriterData->Writer;
663std::unique_ptr<llvm::MemoryBuffer>
666 auto Buffer = FileMgr->getBufferForFile(Filename, UserFilesAreVolatile);
668 return std::move(*Buffer);
670 *ErrorStr = Buffer.getError().message();
678 assert(Diags.get() &&
"no DiagnosticsEngine was provided");
681 &AST.StoredDiagnostics,
nullptr,
688 std::shared_ptr<DiagnosticOptions> DiagOpts,
691 const LangOptions *ProvidedLangOpts,
bool OnlyLocalDecls,
693 bool UserFilesAreVolatile) {
694 std::unique_ptr<ASTUnit> AST(
new ASTUnit(
true));
697 llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
698 ASTUnitCleanup(AST.get());
700 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
701 DiagCleanup(Diags.get());
703 ConfigureDiags(Diags, *AST, CaptureDiagnostics);
705 std::unique_ptr<LangOptions> LocalLangOpts;
707 if (ProvidedLangOpts)
708 return *ProvidedLangOpts;
709 LocalLangOpts = std::make_unique<LangOptions>();
710 return *LocalLangOpts;
713 AST->LangOpts = std::make_unique<LangOptions>(LangOpts);
714 AST->OnlyLocalDecls = OnlyLocalDecls;
715 AST->CaptureDiagnostics = CaptureDiagnostics;
716 AST->DiagOpts = DiagOpts;
717 AST->Diagnostics = Diags;
718 AST->UserFilesAreVolatile = UserFilesAreVolatile;
719 AST->HSOpts = std::make_unique<HeaderSearchOptions>(HSOpts);
720 AST->HSOpts->ModuleFormat = std::string(PCHContainerRdr.
getFormats().front());
721 AST->PPOpts = std::make_shared<PreprocessorOptions>();
722 AST->CodeGenOpts = std::make_unique<CodeGenOptions>();
723 AST->TargetOpts = std::make_shared<TargetOptions>();
728 std::string ContextHash;
729 unsigned Counter = 0;
733 ASTInfoCollector Collector(*AST->HSOpts, ContextHash, *AST->PPOpts,
734 *AST->LangOpts, *AST->CodeGenOpts,
735 *AST->TargetOpts, Counter);
737 Filename, TmpFileMgr, *AST->ModCache, PCHContainerRdr,
740 AST->getDiagnostics().Report(diag::err_fe_unable_to_load_ast_file);
745 *AST->Diagnostics, std::move(VFS));
747 AST->FileMgr = llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOpts, VFS);
749 AST->SourceMgr = llvm::makeIntrusiveRefCnt<SourceManager>(
750 AST->getDiagnostics(), AST->getFileManager(), UserFilesAreVolatile);
752 AST->HSOpts->PrebuiltModuleFiles = HSOpts.PrebuiltModuleFiles;
753 AST->HSOpts->PrebuiltModulePaths = HSOpts.PrebuiltModulePaths;
754 AST->HeaderInfo = std::make_unique<HeaderSearch>(
755 AST->getHeaderSearchOpts(), AST->getSourceManager(),
756 AST->getDiagnostics(), AST->getLangOpts(),
758 AST->HeaderInfo->initializeModuleCachePath(std::move(ContextHash));
760 AST->PP = std::make_shared<Preprocessor>(
761 *AST->PPOpts, AST->getDiagnostics(), *AST->LangOpts,
762 AST->getSourceManager(), *AST->HeaderInfo, AST->ModuleLoader,
767 AST->Ctx = llvm::makeIntrusiveRefCnt<ASTContext>(
768 *AST->LangOpts, AST->getSourceManager(), AST->PP->getIdentifierTable(),
769 AST->PP->getSelectorTable(), AST->PP->getBuiltinInfo(),
770 AST->getTranslationUnitKind());
774 if (::getenv(
"LIBCLANG_DISABLE_PCH_VALIDATION"))
776 AST->Reader = llvm::makeIntrusiveRefCnt<ASTReader>(
777 *AST->PP, *AST->ModCache, AST->Ctx.get(), PCHContainerRdr,
778 *AST->CodeGenOpts,
ArrayRef<std::shared_ptr<ModuleFileExtension>>(),
780 disableValid, AllowASTWithCompilerErrors,
783 true, HSOpts.ValidateASTInputFilesContent);
790 AST->Ctx->setExternalSource(AST->Reader);
798 AST->Target->adjust(AST->PP->getDiagnostics(), *AST->LangOpts,
802 AST->PP->Initialize(*AST->Target);
804 AST->PP->setCounterValue(Counter);
808 AST->Ctx->InitBuiltinTypes(*AST->Target);
815 AST->Ctx->getCommentCommandTraits().registerCommentOptions(
816 AST->LangOpts->CommentOpts);
825 if (
auto FE = llvm::expectedToOptional(TmpFileMgr.
getSTDIN()))
827 auto Buf = llvm::MemoryBuffer::getMemBufferCopy(
828 (*BufRef)->getBuffer(), (*BufRef)->getBufferIdentifier());
829 off_t BufSize = Buf->getBufferSize();
830 AST->ModCache->getInMemoryModuleCache().addBuiltPCM(
831 "-", std::move(Buf), BufSize, 0);
836 AST->HSOpts->ForceCheckCXX20ModulesInputFiles =
837 HSOpts.ForceCheckCXX20ModulesInputFiles;
850 AST->getDiagnostics().Report(diag::err_fe_unable_to_load_ast_file);
857 AST->HSOpts->UserEntries = HSOpts.UserEntries;
858 AST->HSOpts->SystemHeaderPrefixes = HSOpts.SystemHeaderPrefixes;
859 AST->HSOpts->VFSOverlayFiles = HSOpts.VFSOverlayFiles;
860 AST->LangOpts->PICLevel = LangOpts.PICLevel;
861 AST->LangOpts->PIE = LangOpts.PIE;
863 AST->OriginalSourceFile = std::string(AST->Reader->getOriginalSourceFile());
865 Module *M = AST->HeaderInfo->lookupModule(AST->getLangOpts().CurrentModule);
866 if (M && AST->getLangOpts().isCompilingModule() && M->
isNamedModule())
867 AST->Ctx->setCurrentNamedModule(M);
875 AST->TheSema = std::make_unique<Sema>(*AST->PP, *AST->Ctx, *AST->Consumer);
876 AST->TheSema->Initialize();
877 AST->Reader->InitializeSema(*AST->TheSema);
881 AST->getDiagnostics().getClient()->BeginSourceFile(AST->PP->getLangOpts(),
896class MacroDefinitionTrackerPPCallbacks :
public PPCallbacks {
900 explicit MacroDefinitionTrackerPPCallbacks(
unsigned &Hash) : Hash(Hash) {}
902 void MacroDefined(
const Token &MacroNameTok,
903 const MacroDirective *MD)
override {
922 if (
const auto *ND = dyn_cast<NamedDecl>(D)) {
923 if (
const auto *EnumD = dyn_cast<EnumDecl>(D)) {
926 if (!EnumD->isScoped()) {
927 for (
const auto *EI : EnumD->enumerators()) {
928 if (EI->getIdentifier())
929 Hash = llvm::djbHash(EI->getIdentifier()->getName(), Hash);
934 if (ND->getIdentifier())
935 Hash = llvm::djbHash(ND->getIdentifier()->getName(), Hash);
937 std::string NameStr = Name.getAsString();
938 Hash = llvm::djbHash(NameStr, Hash);
943 if (
const auto *ImportD = dyn_cast<ImportDecl>(D)) {
944 if (
const Module *Mod = ImportD->getImportedModule()) {
945 std::string ModName = Mod->getFullModuleName();
946 Hash = llvm::djbHash(ModName, Hash);
954class TopLevelDeclTrackerConsumer :
public ASTConsumer {
959 TopLevelDeclTrackerConsumer(ASTUnit &_Unit,
unsigned &Hash)
960 : Unit(_Unit), Hash(Hash) {
964 void handleTopLevelDecl(Decl *D) {
978 handleFileLevelDecl(D);
981 void handleFileLevelDecl(Decl *D) {
983 if (
auto *NSD = dyn_cast<NamespaceDecl>(D)) {
984 for (
auto *I : NSD->decls())
985 handleFileLevelDecl(I);
989 bool HandleTopLevelDecl(DeclGroupRef D)
override {
990 for (
auto *TopLevelDecl : D)
991 handleTopLevelDecl(TopLevelDecl);
996 void HandleInterestingDecl(DeclGroupRef)
override {}
998 void HandleTopLevelDeclInObjCContainer(DeclGroupRef D)
override {
999 for (
auto *TopLevelDecl : D)
1000 handleTopLevelDecl(TopLevelDecl);
1003 ASTMutationListener *GetASTMutationListener()
override {
1007 ASTDeserializationListener *GetASTDeserializationListener()
override {
1016 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
1017 StringRef InFile)
override {
1019 std::make_unique<MacroDefinitionTrackerPPCallbacks>(
1021 return std::make_unique<TopLevelDeclTrackerConsumer>(
1026 TopLevelDeclTrackerAction(ASTUnit &_Unit) : Unit(_Unit) {}
1028 bool hasCodeCompletionSupport()
const override {
return false; }
1037 unsigned getHash()
const {
return Hash; }
1039 std::vector<Decl *> takeTopLevelDecls() {
return std::move(TopLevelDecls); }
1041 std::vector<LocalDeclID> takeTopLevelDeclIDs() {
1042 return std::move(TopLevelDeclIDs);
1045 void AfterPCHEmitted(ASTWriter &Writer)
override {
1046 TopLevelDeclIDs.reserve(TopLevelDecls.size());
1047 for (
const auto *D : TopLevelDecls) {
1049 if (D->isInvalidDecl())
1051 TopLevelDeclIDs.push_back(Writer.
getDeclID(D));
1055 void HandleTopLevelDecl(DeclGroupRef DG)
override {
1056 for (
auto *D : DG) {
1064 TopLevelDecls.push_back(D);
1068 std::unique_ptr<PPCallbacks> createPPCallbacks()
override {
1069 return std::make_unique<MacroDefinitionTrackerPPCallbacks>(Hash);
1074 std::vector<Decl *> TopLevelDecls;
1075 std::vector<LocalDeclID> TopLevelDeclIDs;
1076 llvm::SmallVector<StandaloneDiagnostic, 4> PreambleDiags;
1100 for (
auto &SD : StoredDiagnostics) {
1101 if (SD.getLocation().isValid()) {
1103 SD.setLocation(Loc);
1113bool ASTUnit::Parse(std::shared_ptr<PCHContainerOperations> PCHContainerOps,
1114 std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer,
1120 assert(VFS == &FileMgr->getVirtualFileSystem() &&
1121 "VFS passed to Parse and VFS in FileMgr are different");
1123 CCInvocation = std::make_shared<CompilerInvocation>(*Invocation);
1124 if (OverrideMainBuffer) {
1126 "No preamble was built, but OverrideMainBuffer is not null");
1127 Preamble->AddImplicitPreamble(*CCInvocation, VFS, OverrideMainBuffer.get());
1132 auto Clang = std::make_unique<CompilerInstance>(CCInvocation,
1133 std::move(PCHContainerOps));
1136 llvm::scope_exit CleanOnError([&]() {
1138 SavedMainFileBuffer =
nullptr;
1142 transferASTDataFromCompilerInstance(*Clang);
1143 FailedParseDiagnostics.swap(StoredDiagnostics);
1144 StoredDiagnostics.clear();
1145 NumStoredDiagnosticsFromDriver = 0;
1151 if (VFS && FileMgr && &FileMgr->getVirtualFileSystem() == VFS) {
1152 Clang->setVirtualFileSystem(std::move(VFS));
1153 Clang->setFileManager(FileMgr);
1155 Clang->setVirtualFileSystem(std::move(VFS));
1156 Clang->createFileManager();
1157 FileMgr = Clang->getFileManagerPtr();
1161 llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
1162 CICleanup(Clang.get());
1164 OriginalSourceFile =
1165 std::string(Clang->getFrontendOpts().Inputs[0].getFile());
1172 if (!Clang->createTarget())
1175 assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
1176 "Invocation must have exactly one source file!");
1177 assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
1179 "FIXME: AST inputs not yet supported here!");
1180 assert(Clang->getFrontendOpts().Inputs[0].getKind().getLanguage() !=
1182 "IR inputs not support here!");
1186 std::make_unique<LangOptions>(Clang->getInvocation().getLangOpts());
1187 FileSystemOpts = Clang->getFileSystemOpts();
1191 SourceMgr = llvm::makeIntrusiveRefCnt<SourceManager>(
1193 if (!OverrideMainBuffer) {
1195 TopLevelDeclsInPreamble.clear();
1203 if (OverrideMainBuffer) {
1212 SavedMainFileBuffer = std::move(OverrideMainBuffer);
1215 std::unique_ptr<TopLevelDeclTrackerAction> Act(
1216 new TopLevelDeclTrackerAction(*
this));
1219 llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
1220 ActCleanup(Act.get());
1222 if (!Act->BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0]))
1225 if (SavedMainFileBuffer) {
1226 StoredDiagnostics.clear();
1227 StoredDiagnostics.reserve(PreambleDiagnostics.size());
1228 llvm::transform(std::move(PreambleDiagnostics),
1229 std::back_inserter(StoredDiagnostics),
1230 [&](
auto &&StandaloneDiag) {
1233 std::move(StandaloneDiag), PreambleSrcLocCache);
1236 PreambleSrcLocCache.clear();
1238 if (llvm::Error Err = Act->Execute()) {
1239 consumeError(std::move(Err));
1243 transferASTDataFromCompilerInstance(*Clang);
1245 Act->EndSourceFile();
1247 FailedParseDiagnostics.clear();
1249 CleanOnError.release();
1274std::unique_ptr<llvm::MemoryBuffer>
1275ASTUnit::getMainBufferWithPrecompiledPreamble(
1276 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
1279 unsigned MaxLines) {
1282 std::unique_ptr<llvm::MemoryBuffer> MainFileBuffer =
1284 MainFilePath, UserFilesAreVolatile);
1285 if (!MainFileBuffer)
1289 PreambleInvocationIn.
getLangOpts(), *MainFileBuffer, MaxLines);
1294 if (Preamble->CanReuse(PreambleInvocationIn, *MainFileBuffer, Bounds,
1305 PreambleRebuildCountdown = 1;
1306 return MainFileBuffer;
1309 PreambleDiagnostics.clear();
1310 TopLevelDeclsInPreamble.clear();
1311 PreambleSrcLocCache.clear();
1312 PreambleRebuildCountdown = 1;
1319 if (PreambleRebuildCountdown > 1) {
1320 --PreambleRebuildCountdown;
1324 assert(!Preamble &&
"No Preamble should be stored at that point");
1332 SmallVector<StandaloneDiagnostic, 4> NewPreambleDiagsStandalone;
1333 SmallVector<StoredDiagnostic, 4> NewPreambleDiags;
1334 ASTUnitPreambleCallbacks Callbacks;
1336 std::optional<CaptureDroppedDiagnostics>
Capture;
1338 Capture.emplace(CaptureDiagnostics, *Diagnostics, &NewPreambleDiags,
1339 &NewPreambleDiagsStandalone);
1342 SimpleTimer PreambleTimer(WantTiming);
1343 PreambleTimer.setOutput(
"Precompiling preamble");
1345 const bool PreviousSkipFunctionBodies =
1351 PreambleInvocationIn, MainFileBuffer.get(), Bounds, Diagnostics, VFS,
1352 PCHContainerOps, StorePreamblesInMemory, PreambleStoragePath,
1356 PreviousSkipFunctionBodies;
1359 Preamble = std::move(*NewPreamble);
1360 PreambleRebuildCountdown = 1;
1365 PreambleRebuildCountdown = 1;
1375 llvm_unreachable(
"unexpected BuildPreambleError");
1379 assert(Preamble &&
"Preamble wasn't built");
1381 TopLevelDecls.clear();
1382 TopLevelDeclsInPreamble = Callbacks.takeTopLevelDeclIDs();
1383 PreambleTopLevelHashValue = Callbacks.getHash();
1388 StoredDiagnostics = std::move(NewPreambleDiags);
1389 PreambleDiagnostics = std::move(NewPreambleDiagsStandalone);
1394 if (CurrentTopLevelHashValue != PreambleTopLevelHashValue) {
1395 CompletionCacheTopLevelHashValue = 0;
1396 PreambleTopLevelHashValue = CurrentTopLevelHashValue;
1399 return MainFileBuffer;
1402void ASTUnit::RealizeTopLevelDeclsFromPreamble() {
1403 assert(Preamble &&
"Should only be called when preamble was built");
1405 std::vector<Decl *> Resolved;
1406 Resolved.reserve(TopLevelDeclsInPreamble.size());
1408 serialization::ModuleFile &MF = Reader->getModuleManager().getPrimaryModule();
1409 for (
const auto TopLevelDecl : TopLevelDeclsInPreamble) {
1412 if (Decl *D = Reader->GetLocalDecl(MF, TopLevelDecl))
1413 Resolved.push_back(D);
1415 TopLevelDeclsInPreamble.clear();
1416 TopLevelDecls.insert(TopLevelDecls.begin(), Resolved.begin(), Resolved.end());
1443 if (Invocation && !Invocation->getFrontendOpts().Inputs.empty()) {
1448 return Input.
getBuffer().getBufferIdentifier();
1453 SourceMgr->getFileEntryRefForID(SourceMgr->getMainFileID()))
1454 return FE->getName();
1465 Mod = Reader->getModuleManager().getPrimaryModule();
1469std::unique_ptr<ASTUnit>
1471 std::shared_ptr<DiagnosticOptions> DiagOpts,
1474 bool UserFilesAreVolatile) {
1475 std::unique_ptr<ASTUnit> AST(
new ASTUnit(
false));
1476 ConfigureDiags(Diags, *AST, CaptureDiagnostics);
1479 AST->DiagOpts = std::move(DiagOpts);
1480 AST->Diagnostics = std::move(Diags);
1481 AST->FileSystemOpts = CI->getFileSystemOpts();
1482 AST->Invocation = std::move(CI);
1484 llvm::makeIntrusiveRefCnt<FileManager>(AST->FileSystemOpts, VFS);
1485 AST->UserFilesAreVolatile = UserFilesAreVolatile;
1486 AST->SourceMgr = llvm::makeIntrusiveRefCnt<SourceManager>(
1487 AST->getDiagnostics(), *AST->FileMgr, UserFilesAreVolatile);
1494 std::shared_ptr<CompilerInvocation> CI,
1495 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
1496 std::shared_ptr<DiagnosticOptions> DiagOpts,
1498 ASTUnit *Unit,
bool Persistent, StringRef ResourceFilesPath,
1500 unsigned PrecompilePreambleAfterNParses,
bool CacheCodeCompletionResults,
1501 bool UserFilesAreVolatile, std::unique_ptr<ASTUnit> *ErrAST) {
1502 assert(CI &&
"A CompilerInvocation is required");
1504 std::unique_ptr<ASTUnit> OwnAST;
1505 ASTUnit *AST = Unit;
1509 create(CI, DiagOpts, Diags, CaptureDiagnostics, UserFilesAreVolatile);
1515 if (!ResourceFilesPath.empty()) {
1517 CI->getHeaderSearchOpts().ResourceDir = std::string(ResourceFilesPath);
1519 AST->OnlyLocalDecls = OnlyLocalDecls;
1520 AST->CaptureDiagnostics = CaptureDiagnostics;
1521 if (PrecompilePreambleAfterNParses > 0)
1522 AST->PreambleRebuildCountdown = PrecompilePreambleAfterNParses;
1524 AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1525 AST->IncludeBriefCommentsInCodeCompletion =
false;
1528 llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
1529 ASTUnitCleanup(OwnAST.get());
1531 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
1532 DiagCleanup(Diags.get());
1535 CI->getPreprocessorOpts().RetainRemappedFileBuffers =
true;
1536 CI->getFrontendOpts().DisableFree =
false;
1541 auto Clang = std::make_unique<CompilerInstance>(std::move(CI),
1542 std::move(PCHContainerOps));
1545 llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
1546 CICleanup(Clang.get());
1548 AST->OriginalSourceFile =
1549 std::string(Clang->getFrontendOpts().Inputs[0].getFile());
1556 if (!Clang->createTarget())
1559 assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
1560 "Invocation must have exactly one source file!");
1561 assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
1563 "FIXME: AST inputs not yet supported here!");
1564 assert(Clang->getFrontendOpts().Inputs[0].getKind().getLanguage() !=
1566 "IR inputs not support here!");
1569 AST->TheSema.reset();
1572 AST->Reader =
nullptr;
1583 std::unique_ptr<TopLevelDeclTrackerAction> TrackerAct;
1585 TrackerAct.reset(
new TopLevelDeclTrackerAction(*AST));
1586 Act = TrackerAct.get();
1590 llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
1591 ActCleanup(TrackerAct.get());
1593 if (!Act->
BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0])) {
1594 AST->transferASTDataFromCompilerInstance(*Clang);
1595 if (OwnAST && ErrAST)
1596 ErrAST->swap(OwnAST);
1601 if (Persistent && !TrackerAct) {
1602 Clang->getPreprocessor().addPPCallbacks(
1603 std::make_unique<MacroDefinitionTrackerPPCallbacks>(
1605 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
1606 if (Clang->hasASTConsumer())
1607 Consumers.push_back(Clang->takeASTConsumer());
1608 Consumers.push_back(std::make_unique<TopLevelDeclTrackerConsumer>(
1610 Clang->setASTConsumer(
1611 std::make_unique<MultiplexConsumer>(std::move(Consumers)));
1613 if (llvm::Error Err = Act->
Execute()) {
1614 consumeError(std::move(Err));
1615 AST->transferASTDataFromCompilerInstance(*Clang);
1616 if (OwnAST && ErrAST)
1617 ErrAST->swap(OwnAST);
1623 AST->transferASTDataFromCompilerInstance(*Clang);
1628 return OwnAST.release();
1633bool ASTUnit::LoadFromCompilerInvocation(
1634 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
1635 unsigned PrecompilePreambleAfterNParses,
1640 assert(VFS &&
"VFS is null");
1643 Invocation->getPreprocessorOpts().RetainRemappedFileBuffers =
true;
1644 Invocation->getFrontendOpts().DisableFree =
false;
1649 std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer;
1650 if (PrecompilePreambleAfterNParses > 0) {
1651 PreambleRebuildCountdown = PrecompilePreambleAfterNParses;
1652 OverrideMainBuffer =
1653 getMainBufferWithPrecompiledPreamble(PCHContainerOps, *Invocation, VFS);
1659 SimpleTimer ParsingTimer(WantTiming);
1663 llvm::CrashRecoveryContextCleanupRegistrar<llvm::MemoryBuffer>
1664 MemBufferCleanup(OverrideMainBuffer.get());
1666 return Parse(std::move(PCHContainerOps), std::move(OverrideMainBuffer), VFS);
1669std::unique_ptr<ASTUnit> ASTUnit::LoadFromCompilerInvocation(
1670 std::shared_ptr<CompilerInvocation> CI,
1671 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
1672 std::shared_ptr<DiagnosticOptions> DiagOpts,
1677 bool CacheCodeCompletionResults,
bool IncludeBriefCommentsInCodeCompletion,
1678 bool UserFilesAreVolatile) {
1680 std::unique_ptr<ASTUnit> AST(
new ASTUnit(
false));
1681 ConfigureDiags(Diags, *AST, CaptureDiagnostics);
1682 *AST->CodeGenOpts = CI->getCodeGenOpts();
1683 AST->DiagOpts = DiagOpts;
1684 AST->Diagnostics = Diags;
1685 AST->OnlyLocalDecls = OnlyLocalDecls;
1686 AST->CaptureDiagnostics = CaptureDiagnostics;
1687 AST->TUKind = TUKind;
1688 AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1689 AST->IncludeBriefCommentsInCodeCompletion
1690 = IncludeBriefCommentsInCodeCompletion;
1691 AST->Invocation = std::move(CI);
1692 AST->FileSystemOpts = FileMgr->getFileSystemOpts();
1693 AST->FileMgr = FileMgr;
1694 AST->UserFilesAreVolatile = UserFilesAreVolatile;
1697 llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
1698 ASTUnitCleanup(AST.get());
1700 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
1701 DiagCleanup(Diags.get());
1703 if (AST->LoadFromCompilerInvocation(std::move(PCHContainerOps),
1704 PrecompilePreambleAfterNParses,
1705 AST->FileMgr->getVirtualFileSystemPtr()))
1717 assert(FileMgr &&
"FileMgr is null on Reparse call");
1718 VFS = FileMgr->getVirtualFileSystemPtr();
1721 clearFileLevelDecls();
1723 SimpleTimer ParsingTimer(WantTiming);
1728 for (
const auto &RB : PPOpts.RemappedFileBuffers)
1733 Invocation->getPreprocessorOpts().addRemappedFile(
RemappedFile.first,
1739 std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer;
1740 if (Preamble || PreambleRebuildCountdown > 0)
1741 OverrideMainBuffer =
1742 getMainBufferWithPrecompiledPreamble(PCHContainerOps, *Invocation, VFS);
1749 if (OverrideMainBuffer)
1754 Parse(std::move(PCHContainerOps), std::move(OverrideMainBuffer), VFS);
1758 if (!
Result && ShouldCacheCodeCompletionResults &&
1759 CurrentTopLevelHashValue != CompletionCacheTopLevelHashValue)
1760 CacheCodeCompletionResults();
1770 SavedMainFileBuffer.reset();
1778 TopLevelDecls.clear();
1779 clearFileLevelDecls();
1792 uint64_t NormalContexts;
1825 unsigned NumResults)
override;
1827 void ProcessOverloadCandidates(
Sema &S,
unsigned CurrentArg,
1829 unsigned NumCandidates,
1831 bool Braced)
override {
1832 Next.ProcessOverloadCandidates(S, CurrentArg, Candidates, NumCandidates,
1833 OpenParLoc, Braced);
1836 CodeCompletionAllocator &getAllocator()
override {
1837 return Next.getAllocator();
1840 CodeCompletionTUInfo &getCodeCompletionTUInfo()
override {
1841 return Next.getCodeCompletionTUInfo();
1851 unsigned NumResults,
1853 llvm::StringSet<llvm::BumpPtrAllocator> &HiddenNames){
1854 bool OnlyTagNames =
false;
1855 switch (Context.getKind()) {
1880 OnlyTagNames =
true;
1906 for (
unsigned I = 0; I != NumResults; ++I) {
1907 if (Results[I].Kind != Result::RK_Declaration)
1913 bool Hiding =
false;
1922 Hiding = (IDNS & HiddenIDNS);
1930 HiddenNames.insert(Identifier->getName());
1936void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(
Sema &S,
1939 unsigned NumResults) {
1941 bool AddedResult =
false;
1944 ? NormalContexts : (1LL << Context.getKind());
1946 llvm::StringSet<llvm::BumpPtrAllocator> HiddenNames;
1955 if ((
C->ShowInContexts & InContexts) == 0)
1962 AllResults.insert(AllResults.end(), Results, Results + NumResults);
1969 HiddenNames.count(
C->Completion->getTypedText()))
1973 unsigned Priority =
C->Priority;
1975 if (!Context.getPreferredType().isNull()) {
1979 Context.getPreferredType()->isAnyPointerType());
1980 }
else if (
C->Type) {
1983 Context.getPreferredType().getUnqualifiedType());
1985 if (ExpectedSTC ==
C->TypeClass) {
1987 llvm::StringMap<unsigned> &CachedCompletionTypes
1989 llvm::StringMap<unsigned>::iterator Pos
1991 if (Pos != CachedCompletionTypes.end() && Pos->second ==
C->Type)
2006 Builder.AddTypedTextChunk(
C->Completion->getTypedText());
2008 Completion = Builder.TakeString();
2011 AllResults.push_back(
Result(Completion, Priority,
C->Kind,
2018 Next.ProcessCodeCompleteResults(S, Context, Results, NumResults);
2022 Next.ProcessCodeCompleteResults(S, Context, AllResults.data(),
2029 bool IncludeCodePatterns,
bool IncludeBriefComments,
2031 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
2037 std::unique_ptr<SyntaxOnlyAction> Act) {
2041 SimpleTimer CompletionTimer(WantTiming);
2042 CompletionTimer.setOutput(
"Code completion @ " +
File +
":" +
2045 auto CCInvocation = std::make_shared<CompilerInvocation>(*Invocation);
2052 CachedCompletionResults.empty();
2054 CodeCompleteOpts.
IncludeGlobals = CachedCompletionResults.empty();
2056 CodeCompleteOpts.
LoadExternal = Consumer.loadExternal();
2059 assert(IncludeBriefComments == this->IncludeBriefCommentsInCodeCompletion);
2066 LangOpts = CCInvocation->getLangOpts();
2069 LangOpts.SpellChecking =
false;
2070 CCInvocation->getDiagnosticOpts().IgnoreWarnings =
true;
2072 auto Clang = std::make_unique<CompilerInstance>(std::move(CCInvocation),
2076 llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
2077 CICleanup(Clang.get());
2079 auto &Inv = Clang->getInvocation();
2080 OriginalSourceFile =
2081 std::string(Clang->getFrontendOpts().Inputs[0].getFile());
2084 Clang->setDiagnostics(
Diag);
2086 Clang->getDiagnostics(),
2087 &StoredDiagnostics,
nullptr);
2089 FileMgr->getVirtualFileSystem());
2092 if (!Clang->createTarget()) {
2096 assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
2097 "Invocation must have exactly one source file!");
2098 assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
2100 "FIXME: AST inputs not yet supported here!");
2101 assert(Clang->getFrontendOpts().Inputs[0].getKind().getLanguage() !=
2103 "IR inputs not support here!");
2106 Clang->setVirtualFileSystem(FileMgr->getVirtualFileSystemPtr());
2107 Clang->setFileManager(FileMgr);
2108 Clang->setSourceManager(SourceMgr);
2120 AugmentedCodeCompleteConsumer *AugmentedConsumer
2121 =
new AugmentedCodeCompleteConsumer(*
this, Consumer, CodeCompleteOpts);
2122 Clang->setCodeCompletionConsumer(AugmentedConsumer);
2125 [&FileMgr](StringRef Filename) -> std::optional<llvm::sys::fs::UniqueID> {
2126 if (
auto Status = FileMgr->getVirtualFileSystem().status(Filename))
2127 return Status->getUniqueID();
2128 return std::nullopt;
2131 auto hasSameUniqueID = [getUniqueID](StringRef LHS, StringRef RHS) {
2134 if (
auto LHSID = getUniqueID(LHS))
2135 if (
auto RHSID = getUniqueID(RHS))
2136 return *LHSID == *RHSID;
2144 std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer;
2145 if (Preamble &&
Line > 1 && hasSameUniqueID(
File, OriginalSourceFile)) {
2146 OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(
2147 PCHContainerOps, Inv, FileMgr->getVirtualFileSystemPtr(),
false,
2153 if (OverrideMainBuffer) {
2155 "No preamble was built, but OverrideMainBuffer is not null");
2158 FileMgr->getVirtualFileSystemPtr();
2159 Preamble->AddImplicitPreamble(Clang->getInvocation(), VFS,
2160 OverrideMainBuffer.get());
2165 OwnedBuffers.push_back(OverrideMainBuffer.release());
2172 if (!Clang->getLangOpts().Modules)
2178 if (Act->BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0])) {
2179 if (llvm::Error Err = Act->Execute()) {
2180 consumeError(std::move(Err));
2182 Act->EndSourceFile();
2187 if (HadModuleLoaderFatalFailure)
2193 if (llvm::Error Err = llvm::writeToOutput(
2194 File, [
this](llvm::raw_ostream &Out) {
2195 return serialize(Out) ? llvm::make_error<llvm::StringError>(
2196 "ASTUnit serialization failed",
2197 llvm::inconvertibleErrorCode())
2198 : llvm::Error::success();
2200 consumeError(std::move(Err));
2207 Sema &S, raw_ostream &OS) {
2208 Writer.
WriteAST(&S, std::string(),
nullptr,
"");
2211 if (!Buffer.empty())
2212 OS.write(Buffer.data(), Buffer.size());
2222 llvm::BitstreamWriter Stream(Buffer);
2224 ASTWriter Writer(Stream, Buffer, *ModCache, *CodeGenOpts, {});
2237 if (Loc.
isInvalid() || !
SM.isLocalSourceLocation(Loc))
2245 assert(
SM.isLocalSourceLocation(FileLoc));
2246 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
2247 if (FID.isInvalid())
2250 std::unique_ptr<LocDeclsTy> &Decls = FileDecls[FID];
2252 Decls = std::make_unique<LocDeclsTy>();
2254 std::pair<unsigned, Decl *> LocDecl(Offset, D);
2256 if (Decls->empty() || Decls->back().first <= Offset) {
2257 Decls->push_back(LocDecl);
2261 LocDeclsTy::iterator I =
2262 llvm::upper_bound(*Decls, LocDecl, llvm::less_first());
2264 Decls->insert(I, LocDecl);
2269 if (
File.isInvalid())
2272 if (SourceMgr->isLoadedFileID(
File)) {
2273 assert(Ctx->getExternalSource() &&
"No external source!");
2274 return Ctx->getExternalSource()->FindFileRegionDecls(
File, Offset, Length,
2278 FileDeclsTy::iterator I = FileDecls.find(
File);
2279 if (I == FileDecls.end())
2282 LocDeclsTy &LocDecls = *I->second;
2283 if (LocDecls.empty())
2286 LocDeclsTy::iterator BeginIt =
2287 llvm::partition_point(LocDecls, [=](std::pair<unsigned, Decl *> LD) {
2288 return LD.first < Offset;
2290 if (BeginIt != LocDecls.begin())
2296 while (BeginIt != LocDecls.begin() &&
2297 BeginIt->second->isTopLevelDeclInObjCContainer())
2300 LocDeclsTy::iterator EndIt = llvm::upper_bound(
2301 LocDecls, std::make_pair(Offset + Length, (
Decl *)
nullptr),
2302 llvm::less_first());
2303 if (EndIt != LocDecls.end())
2306 for (LocDeclsTy::iterator DIt = BeginIt; DIt != EndIt; ++DIt)
2307 Decls.push_back(DIt->second);
2311 unsigned Line,
unsigned Col)
const {
2314 return SM.getMacroArgExpandedLocation(Loc);
2318 unsigned Offset)
const {
2330 PreambleID = SourceMgr->getPreambleFileID();
2336 if (SourceMgr->isInFileID(Loc, PreambleID, &Offs) && Offs < Preamble->getBounds().Size) {
2338 = SourceMgr->getLocForStartOfFile(SourceMgr->getMainFileID());
2351 PreambleID = SourceMgr->getPreambleFileID();
2357 if (SourceMgr->isInFileID(Loc, SourceMgr->getMainFileID(), &Offs) &&
2358 Offs < Preamble->getBounds().Size) {
2359 SourceLocation FileLoc = SourceMgr->getLocForStartOfFile(PreambleID);
2369 FID = SourceMgr->getPreambleFileID();
2374 return SourceMgr->isInFileID(Loc, FID);
2380 FID = SourceMgr->getMainFileID();
2385 return SourceMgr->isInFileID(Loc, FID);
2391 FID = SourceMgr->getPreambleFileID();
2396 return SourceMgr->getLocForEndOfFile(FID);
2402 FID = SourceMgr->getMainFileID();
2407 return SourceMgr->getLocForStartOfFile(FID);
2410llvm::iterator_range<PreprocessingRecord::iterator>
2414 Mod = Reader->getModuleManager().getPrimaryModule();
2415 return Reader->getModulePreprocessedEntities(Mod);
2419 return llvm::make_range(PPRec->local_begin(), PPRec->local_end());
2428 Mod = Reader->getModuleManager().getPrimaryModule();
2429 for (
const auto *D : Reader->getModuleFileLevelDecls(Mod)) {
2430 if (!Fn(context, D))
2439 TL != TLEnd; ++TL) {
2440 if (!Fn(context, *TL))
2449 return std::nullopt;
2472 return std::nullopt;
2483 if (LangOpts.OpenCL)
2485 else if (LangOpts.CUDA)
2487 else if (LangOpts.CPlusPlus)
2503ASTUnit::ConcurrencyState::ConcurrencyState() {
2504 Mutex =
new std::recursive_mutex;
2507ASTUnit::ConcurrencyState::~ConcurrencyState() {
2508 delete static_cast<std::recursive_mutex *
>(Mutex);
2511void ASTUnit::ConcurrencyState::start() {
2512 bool acquired =
static_cast<std::recursive_mutex *
>(Mutex)->try_lock();
2513 assert(acquired &&
"Concurrent access to ASTUnit!");
2516void ASTUnit::ConcurrencyState::finish() {
2517 static_cast<std::recursive_mutex *
>(Mutex)->unlock();
2522ASTUnit::ConcurrencyState::ConcurrencyState() { Mutex =
nullptr; }
2523ASTUnit::ConcurrencyState::~ConcurrencyState() {}
2524void ASTUnit::ConcurrencyState::start() {}
2525void ASTUnit::ConcurrencyState::finish() {}
Defines the clang::ASTContext interface.
static void checkAndSanitizeDiags(SmallVectorImpl< StoredDiagnostic > &StoredDiagnostics, SourceManager &SM)
static void CalculateHiddenNames(const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults, ASTContext &Ctx, llvm::StringSet< llvm::BumpPtrAllocator > &HiddenNames)
Helper function that computes which global names are hidden by the local code-completion results.
static uint64_t getDeclShowContexts(const NamedDecl *ND, const LangOptions &LangOpts, bool &IsNestedNameSpecifier)
Determine the set of code-completion contexts in which this declaration should be shown.
static void AddTopLevelDeclarationToHash(Decl *D, unsigned &Hash)
Add the given declaration to the hash of all top-level entities.
static std::unique_ptr< T > valueOrNull(llvm::ErrorOr< std::unique_ptr< T > > Val)
static bool serializeUnit(ASTWriter &Writer, SmallVectorImpl< char > &Buffer, Sema &S, raw_ostream &OS)
static std::unique_ptr< llvm::MemoryBuffer > getBufferForFileHandlingRemapping(const CompilerInvocation &Invocation, llvm::vfs::FileSystem *VFS, StringRef FilePath, bool isVolatile)
Get a source buffer for MainFilePath, handling all file-to-file and file-to-buffer remappings inside ...
const unsigned DefaultPreambleRebuildInterval
After failing to build a precompiled preamble (due to errors in the source that occurs in the preambl...
static void checkAndRemoveNonDriverDiags(SmallVectorImpl< StoredDiagnostic > &StoredDiags)
static bool isInMainFile(const clang::Diagnostic &D)
static bool isNonDriverDiag(const StoredDiagnostic &StoredDiag)
static std::atomic< unsigned > ActiveASTUnitObjects
Tracks the number of ASTUnit objects that are currently active.
static void AddDefinedMacroToHash(const Token &MacroNameTok, unsigned &Hash)
Add the given macro to the hash of all top-level entities.
Defines the Diagnostic-related interfaces.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::FileManager interface and associated types.
Defines the clang::FrontendAction interface and various convenience abstract classes (clang::ASTFront...
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
Defines the PPCallbacks interface.
Defines the clang::Preprocessor interface.
This file declares facilities that support code completion.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines the clang::TargetOptions class.
Allows QualTypes to be sorted and hence used in maps and sets.
C Language Family Type Representation.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const LangOptions & getLangOpts() const
Abstract base class to use for AST consumer-based frontend actions.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Abstract interface for callback invocations by the ASTReader.
@ ARR_None
The client can't handle any AST loading failures.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
Utility class for loading a ASTContext from an AST file.
unsigned & getCurrentTopLevelHashValue()
Retrieve a reference to the current top-level name hash value.
void enableSourceFileDiagnostics()
Enable source-range based diagnostic messages.
void addFileLevelDecl(Decl *D)
Add a new local file-level declaration.
const FileManager & getFileManager() const
void CodeComplete(StringRef File, unsigned Line, unsigned Column, ArrayRef< RemappedFile > RemappedFiles, bool IncludeMacros, bool IncludeCodePatterns, bool IncludeBriefComments, CodeCompleteConsumer &Consumer, std::shared_ptr< PCHContainerOperations > PCHContainerOps, llvm::IntrusiveRefCntPtr< DiagnosticsEngine > Diag, LangOptions &LangOpts, llvm::IntrusiveRefCntPtr< SourceManager > SourceMgr, llvm::IntrusiveRefCntPtr< FileManager > FileMgr, SmallVectorImpl< StoredDiagnostic > &StoredDiagnostics, SmallVectorImpl< const llvm::MemoryBuffer * > &OwnedBuffers, std::unique_ptr< SyntaxOnlyAction > Act)
Perform code completion at the given file, line, and column within this translation unit.
cached_completion_iterator cached_completion_end()
static std::unique_ptr< ASTUnit > LoadFromASTFile(StringRef Filename, const PCHContainerReader &PCHContainerRdr, WhatToLoad ToLoad, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, std::shared_ptr< DiagnosticOptions > DiagOpts, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, const FileSystemOptions &FileSystemOpts, const HeaderSearchOptions &HSOpts, const LangOptions *LangOpts=nullptr, bool OnlyLocalDecls=false, CaptureDiagsKind CaptureDiagnostics=CaptureDiagsKind::None, bool AllowASTWithCompilerErrors=false, bool UserFilesAreVolatile=false)
Create a ASTUnit from an AST file.
bool serialize(raw_ostream &OS)
Serialize this translation unit with the given output stream.
ASTDeserializationListener * getDeserializationListener()
bool Reparse(std::shared_ptr< PCHContainerOperations > PCHContainerOps, ArrayRef< RemappedFile > RemappedFiles={}, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS=nullptr)
Reparse the source files using the same command-line options that were originally used to produce thi...
std::unique_ptr< llvm::MemoryBuffer > getBufferForFile(StringRef Filename, std::string *ErrorStr=nullptr)
llvm::StringMap< unsigned > & getCachedCompletionTypes()
Retrieve the mapping from formatted type names to unique type identifiers.
const DiagnosticsEngine & getDiagnostics() const
SourceLocation getLocation(const FileEntry *File, unsigned Line, unsigned Col) const
Get the source location for the given file:line:col triplet.
void ResetForParse()
Free data that will be re-generated on the next parse.
llvm::IntrusiveRefCntPtr< SourceManager > getSourceManagerPtr()
InputKind getInputKind() const
Determine the input kind this AST unit represents.
std::optional< StringRef > getPCHFile()
Get the PCH file if one was included.
StringRef getMainFileName() const
SourceLocation mapLocationToPreamble(SourceLocation Loc) const
If Loc is a local location of the main file but inside the preamble chunk, returns the corresponding ...
cached_completion_iterator cached_completion_begin()
const LangOptions & getLangOpts() const
bool isMainFileAST() const
std::vector< Decl * >::iterator top_level_iterator
const SourceManager & getSourceManager() const
SourceLocation getEndOfPreambleFileID() const
std::vector< CachedCodeCompletionResult >::iterator cached_completion_iterator
llvm::IntrusiveRefCntPtr< DiagnosticsEngine > getDiagnosticsPtr()
static ASTUnit * LoadFromCompilerInvocationAction(std::shared_ptr< CompilerInvocation > CI, std::shared_ptr< PCHContainerOperations > PCHContainerOps, std::shared_ptr< DiagnosticOptions > DiagOpts, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, FrontendAction *Action=nullptr, ASTUnit *Unit=nullptr, bool Persistent=true, StringRef ResourceFilesPath=StringRef(), bool OnlyLocalDecls=false, CaptureDiagsKind CaptureDiagnostics=CaptureDiagsKind::None, unsigned PrecompilePreambleAfterNParses=0, bool CacheCodeCompletionResults=false, bool UserFilesAreVolatile=false, std::unique_ptr< ASTUnit > *ErrAST=nullptr)
Create an ASTUnit from a source file, via a CompilerInvocation object, by invoking the optionally pro...
@ LoadASTOnly
Load the AST, but do not restore Sema state.
@ LoadEverything
Load everything, including Sema.
top_level_iterator top_level_end()
SourceLocation getStartOfMainFileID() const
IntrusiveRefCntPtr< ASTReader > getASTReader() const
IntrusiveRefCntPtr< FileManager > getFileManagerPtr()
bool(*)(void *context, const Decl *D) DeclVisitorFn
Type for a function iterating over a number of declarations.
bool visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn)
Iterate over local declarations (locally parsed if this is a parsed source file or the loaded declara...
IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVirtualFileSystemPtr()
llvm::iterator_range< PreprocessingRecord::iterator > getLocalPreprocessingEntities() const
Returns an iterator range for the local preprocessing entities of the local Preprocessor,...
top_level_iterator top_level_begin()
ASTMutationListener * getASTMutationListener()
TranslationUnitKind getTranslationUnitKind() const
Determine what kind of translation unit this AST represents.
void setPreprocessor(std::shared_ptr< Preprocessor > pp)
StringRef getASTFileName() const
If this ASTUnit came from an AST file, returns the filename for it.
bool Save(StringRef File)
Save this translation unit to a file with the given name.
static std::unique_ptr< ASTUnit > create(std::shared_ptr< CompilerInvocation > CI, std::shared_ptr< DiagnosticOptions > DiagOpts, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, CaptureDiagsKind CaptureDiagnostics, bool UserFilesAreVolatile)
Create a ASTUnit. Gets ownership of the passed CompilerInvocation.
void addTopLevelDecl(Decl *D)
Add a new top-level declaration.
bool isInMainFileID(SourceLocation Loc) const
bool isModuleFile() const
Returns true if the ASTUnit was constructed from a serialized module file.
void findFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls)
Get the decls that are contained in a file in the Offset/Length range.
const ASTContext & getASTContext() const
bool isInPreambleFileID(SourceLocation Loc) const
SourceLocation mapLocationFromPreamble(SourceLocation Loc) const
If Loc is a loaded location from the preamble, returns the corresponding local location of the main f...
std::pair< std::string, llvm::MemoryBuffer * > RemappedFile
A mapping from a file name to the memory buffer that stores the remapped contents of that file.
Writes an AST file containing the contents of a translation unit.
LocalDeclID getDeclID(const Decl *D)
Determine the local declaration ID of an already-emitted declaration.
ASTFileSignature WriteAST(llvm::PointerUnion< Sema *, Preprocessor * > Subject, StringRef OutputFile, Module *WritingModule, StringRef isysroot)
Write a precompiled header or a module with the AST produced by the Sema object, or a dependency scan...
RAII object that optionally captures and filters diagnostics, if there is no diagnostic client to cap...
~CaptureDroppedDiagnostics()
CaptureDroppedDiagnostics(CaptureDiagsKind CaptureDiagnostics, DiagnosticsEngine &Diags, SmallVectorImpl< StoredDiagnostic > *StoredDiags, SmallVectorImpl< StandaloneDiagnostic > *StandaloneDiags)
Abstract interface for a consumer of code-completion information.
Options controlling the behavior of code completion.
unsigned IncludeCodePatterns
Show code patterns in code completion results.
unsigned IncludeFixIts
Include results after corrections (small fix-its), e.g.
unsigned LoadExternal
Hint whether to load data from the external AST to provide full results.
unsigned IncludeMacros
Show macros in code completion results.
unsigned IncludeBriefComments
Show brief documentation comments in code completion results.
unsigned IncludeGlobals
Show top-level decls in code completion results.
A builder class used to construct new code-completion strings.
The context in which code completion occurred, so that the code-completion consumer can process the r...
@ CCC_TypeQualifiers
Code completion within a type-qualifier list.
@ CCC_ObjCMessageReceiver
Code completion occurred where an Objective-C message receiver is expected.
@ CCC_PreprocessorExpression
Code completion occurred within a preprocessor expression.
@ CCC_ObjCCategoryName
Code completion where an Objective-C category name is expected.
@ CCC_ObjCIvarList
Code completion occurred within the instance variable list of an Objective-C interface,...
@ CCC_Statement
Code completion occurred where a statement (or declaration) is expected in a function,...
@ CCC_Type
Code completion occurred where a type name is expected.
@ CCC_ArrowMemberAccess
Code completion occurred on the right-hand side of a member access expression using the arrow operato...
@ CCC_ClassStructUnion
Code completion occurred within a class, struct, or union.
@ CCC_ObjCInterface
Code completion occurred within an Objective-C interface, protocol, or category interface.
@ CCC_ObjCPropertyAccess
Code completion occurred on the right-hand side of an Objective-C property access expression.
@ CCC_Expression
Code completion occurred where an expression is expected.
@ CCC_SelectorName
Code completion for a selector, as in an @selector expression.
@ CCC_TopLevelOrExpression
Code completion at a top level, i.e.
@ CCC_EnumTag
Code completion occurred after the "enum" keyword, to indicate an enumeration name.
@ CCC_UnionTag
Code completion occurred after the "union" keyword, to indicate a union name.
@ CCC_ParenthesizedExpression
Code completion in a parenthesized expression, which means that we may also have types here in C and ...
@ CCC_TopLevel
Code completion occurred within a "top-level" completion context, e.g., at namespace or global scope.
@ CCC_ClassOrStructTag
Code completion occurred after the "struct" or "class" keyword, to indicate a struct or class name.
@ CCC_ObjCClassMessage
Code completion where an Objective-C class message is expected.
@ CCC_ObjCImplementation
Code completion occurred within an Objective-C implementation or category implementation.
@ CCC_IncludedFile
Code completion inside the filename part of a include directive.
@ CCC_ObjCInstanceMessage
Code completion where an Objective-C instance message is expected.
@ CCC_SymbolOrNewName
Code completion occurred where both a new name and an existing symbol is permissible.
@ CCC_Recovery
An unknown context, in which we are recovering from a parsing error and don't know which completions ...
@ CCC_ObjCProtocolName
Code completion occurred where a protocol name is expected.
@ CCC_OtherWithMacros
An unspecified code-completion context where we should also add macro completions.
@ CCC_NewName
Code completion occurred where a new name is expected.
@ CCC_MacroNameUse
Code completion occurred where a macro name is expected (without any arguments, in the case of a func...
@ CCC_Symbol
Code completion occurred where an existing name(such as type, functionor variable) is expected.
@ CCC_Attribute
Code completion of an attribute name.
@ CCC_Other
An unspecified code-completion context.
@ CCC_DotMemberAccess
Code completion occurred on the right-hand side of a member access expression using the dot operator.
@ CCC_MacroName
Code completion occurred where an macro is being defined.
@ CCC_Namespace
Code completion occurred where a namespace or namespace alias is expected.
@ CCC_PreprocessorDirective
Code completion occurred where a preprocessor directive is expected.
@ CCC_NaturalLanguage
Code completion occurred in a context where natural language is expected, e.g., a comment or string l...
@ CCC_ObjCInterfaceName
Code completion where the name of an Objective-C class is expected.
@ CCC_ObjCClassForwardDecl
Captures a result of code completion.
const NamedDecl * Declaration
When Kind == RK_Declaration or RK_Pattern, the declaration we are referring to.
A "string" used to describe how code completion can be performed for an entity.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
std::shared_ptr< Preprocessor > getPreprocessorPtr()
std::unique_ptr< Sema > takeSema()
IntrusiveRefCntPtr< ASTContext > getASTContextPtr() const
IntrusiveRefCntPtr< ASTReader > getASTReader() const
std::shared_ptr< ModuleCache > getModuleCachePtr() const
bool hasASTContext() const
Preprocessor & getPreprocessor() const
Return the current preprocessor.
IntrusiveRefCntPtr< TargetInfo > getTargetPtr() const
std::shared_ptr< CompilerInvocation > getInvocationPtr()
bool hadModuleLoaderFatalFailure() const
void setSourceManager(llvm::IntrusiveRefCntPtr< SourceManager > Value)
setSourceManager - Replace the current source manager.
CompilerInvocation & getInvocation()
std::unique_ptr< ASTConsumer > takeASTConsumer()
takeASTConsumer - Remove the current AST consumer and give ownership to the caller.
void setFileManager(IntrusiveRefCntPtr< FileManager > Value)
Replace the current file manager.
bool hasPreprocessor() const
Helper class for holding the data necessary to invoke the compiler.
PreprocessorOptions & getPreprocessorOpts()
LangOptions & getLangOpts()
Mutable getters.
FrontendOptions & getFrontendOpts()
DiagnosticOptions & getDiagnosticOpts()
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
bool isTranslationUnit() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
Decl - This represents one declaration (or definition), e.g.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
unsigned getIdentifierNamespace() const
SourceLocation getLocation() const
@ IDNS_NonMemberOperator
This declaration is a C++ operator declared in a non-class context.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Member
Members, declared with object declarations within tag definitions.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::string getAsString() const
Retrieve the human-readable string for this name.
virtual void EndSourceFile()
Callback to inform the diagnostic client that processing of a source file has ended.
virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info)
Handle this diagnostic, reporting it to the user or capturing it to a log as needed.
virtual void BeginSourceFile(const LangOptions &LangOpts, const Preprocessor *PP=nullptr)
Callback to inform the diagnostic client that processing of a source file is beginning.
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
const SourceLocation & getLocation() const
SourceManager & getSourceManager() const
bool hasSourceManager() const
Concrete class used by the front-end to report problems and issues.
void setNumWarnings(unsigned NumWarnings)
Level
The level of the diagnostic, after it has been through mapping.
DiagnosticConsumer * getClient()
unsigned getNumWarnings() const
void Reset(bool soft=false)
Reset the state of the diagnostic object to its initial configuration.
Cached information about one file (either on disk or in the virtual file system).
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
llvm::Expected< FileEntryRef > getSTDIN()
Get the FileEntryRef for stdin, returning an error if stdin cannot be read.
Keeps track of options that affect how file operations are performed.
Diagnostic consumer that saves each diagnostic it is given.
void BeginSourceFile(const LangOptions &LangOpts, const Preprocessor *PP=nullptr) override
Callback to inform the diagnostic client that processing of a source file is beginning.
FilterAndStoreDiagnosticConsumer(SmallVectorImpl< StoredDiagnostic > *StoredDiags, SmallVectorImpl< StandaloneDiagnostic > *StandaloneDiags, bool CaptureNonErrorsFromIncludes)
void HandleDiagnostic(DiagnosticsEngine::Level Level, const Diagnostic &Info) override
Handle this diagnostic, reporting it to the user or capturing it to a log as needed.
Abstract base class for actions which can be performed by the frontend.
virtual void EndSourceFile()
Perform any per-file post processing, deallocate per-file objects, and run statistics and output file...
llvm::Error Execute()
Set the source manager's main input file, and run the action.
virtual TranslationUnitKind getTranslationUnitKind()
For AST-based actions, the kind of translation unit we're handling.
bool BeginSourceFile(CompilerInstance &CI, const FrontendInputFile &Input)
Prepare the action for processing the input file Input.
FrontendOptions - Options for controlling the behavior of the frontend.
unsigned SkipFunctionBodies
Skip over function bodies to speed up parsing in cases you do not need them (e.g.
CodeCompleteOptions CodeCompleteOpts
ParsedSourceLocation CodeCompletionAt
If given, enable code completion at the provided location.
SmallVector< FrontendInputFile, 0 > Inputs
The input files and their types.
A SourceLocation and its associated SourceManager.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
@ CMK_ModuleMap
Compiling a module from a module map.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isCompilingModule() const
Are we compiling a module?
Identifies a module file to be loaded.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
static ModuleFileName makeInMemory(StringRef Name)
Creates a file name for an in-memory module.
Describes a module or submodule.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
virtual llvm::ArrayRef< llvm::StringRef > getFormats() const =0
Equivalent to the format passed to -fmodule-format=.
This interface provides a way to observe the actions of the preprocessor as it does its thing.
A set of callbacks to gather useful information while building a preamble.
static llvm::ErrorOr< PrecompiledPreamble > Build(const CompilerInvocation &Invocation, const llvm::MemoryBuffer *MainFileBuffer, PreambleBounds Bounds, IntrusiveRefCntPtr< DiagnosticsEngine > Diagnostics, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, std::shared_ptr< PCHContainerOperations > PCHContainerOps, bool StoreInMemory, StringRef StoragePath, PreambleCallbacks &Callbacks)
Try to build PrecompiledPreamble for Invocation.
Iteration over the preprocessed entities.
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
bool RetainRemappedFileBuffers
Whether the compiler instance should retain (i.e., not free) the buffers associated with remapped fil...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
void clearRemappedFiles()
void addRemappedFile(StringRef From, StringRef To)
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
SourceManager & getSourceManager() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Sema - This implements semantic analysis and AST building for C.
const LangOptions & getLangOpts() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
bool isWrittenInMainFile(SourceLocation Loc) const
Returns true if the spelling location for the given location is in the main file buffer.
Represents a diagnostic in a form that can be retained until its corresponding source manager is dest...
const FullSourceLoc & getLocation() const
static TargetInfo * CreateTargetInfo(DiagnosticsEngine &Diags, TargetOptions &Opts)
Construct a target for the given options.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
Information about a module that has been loaded by the ASTReader.
ModuleFileName FileName
The file name of the module file.
ModuleKind Kind
The type of this module.
@ CXCursor_MacroDefinition
Defines the clang::TargetInfo interface.
@ VFS
Remove unused -ivfsoverlay arguments.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromOverlayFiles(ArrayRef< std::string > VFSOverlayFiles, DiagnosticsEngine &Diags, IntrusiveRefCntPtr< llvm::vfs::FileSystem > BaseFS)
@ CCP_NestedNameSpecifier
Priority for a nested-name-specifier.
@ CCP_CodePattern
Priority for a code pattern.
std::shared_ptr< ModuleCache > createCrossProcessModuleCache()
Creates new ModuleCache backed by a file system directory that may be operated on by multiple process...
@ Parse
Parse the block; this code is always used.
Language
The language for the input, used to select and validate the language standard and possible actions.
@ C
Languages that the frontend can parse and compile.
@ Result
The result type of a method or function.
SimplifiedTypeClass
A simplified classification of types used when determining "similar" types for code completion.
CaptureDiagsKind
Enumerates the available kinds for capturing diagnostics.
@ AllWithoutNonErrorsFromIncludes
IntrusiveRefCntPtr< llvm::vfs::FileSystem > createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags)
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Complete
The translation unit is a complete translation unit.
@ CCF_ExactTypeMatch
Divide by this factor when a code-completion result's type exactly matches the type we expect.
@ CCF_SimilarTypeMatch
Divide by this factor when a code-completion result's type is similar to the type we expect (e....
SimplifiedTypeClass getSimplifiedTypeClass(CanQualType T)
Determine the simplified type class of the given canonical type.
unsigned getMacroUsagePriority(StringRef MacroName, const LangOptions &LangOpts, bool PreferredTypeIsPointer=false)
Determine the priority to be given to a macro code completion result with the given name.
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ All
Disable validation for all kinds.
PreambleBounds ComputePreambleBounds(const LangOptions &LangOpts, const llvm::MemoryBufferRef &Buffer, unsigned MaxLines)
Runs lexer to compute suggested preamble bounds.
@ CouldntCreateTargetInfo
llvm::StringRef getAsString(SyncScope S)
QualType getDeclUsageType(ASTContext &C, NestedNameSpecifier Qualifier, const NamedDecl *ND)
Determine the type that this declaration will have if it is used as a type or in an expression.
StoredDiagnostic translateStandaloneDiag(FileManager &FileMgr, SourceManager &SrcMgr, const StandaloneDiagnostic &StandaloneDiag, llvm::StringMap< SourceLocation > &SrcLocCache)
Translates StandaloneDiag into a StoredDiagnostic, associating it with the provided FileManager and S...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
__LIBC_ATTRS FILE * stderr
A cached code-completion result, which may be introduced in one of many different contexts.
CodeCompletionString * Completion
The code-completion string corresponding to this completion result.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
unsigned Size
Size of the preamble in bytes.
Describes how types, statements, expressions, and declarations should be printed.