diff options
Diffstat (limited to 'clangd/Compiler.cpp')
-rw-r--r-- | clangd/Compiler.cpp | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/clangd/Compiler.cpp b/clangd/Compiler.cpp index 011841c4..1eecce98 100644 --- a/clangd/Compiler.cpp +++ b/clangd/Compiler.cpp @@ -1,9 +1,8 @@ //===--- Compiler.cpp --------------------------------------------*- C++-*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -14,21 +13,20 @@ #include "llvm/Support/Format.h" #include "llvm/Support/FormatVariadic.h" -using namespace llvm; namespace clang { namespace clangd { void IgnoreDiagnostics::log(DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) { // FIXME: format lazily, in case vlog is off. - SmallString<64> Message; + llvm::SmallString<64> Message; Info.FormatDiagnostic(Message); - SmallString<64> Location; + llvm::SmallString<64> Location; if (Info.hasSourceManager() && Info.getLocation().isValid()) { auto &SourceMgr = Info.getSourceManager(); auto Loc = SourceMgr.getFileLoc(Info.getLocation()); - raw_svector_ostream OS(Location); + llvm::raw_svector_ostream OS(Location); Loc.print(OS, SourceMgr); OS << ":"; } @@ -41,11 +39,41 @@ void IgnoreDiagnostics::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, IgnoreDiagnostics::log(DiagLevel, Info); } -std::unique_ptr<CompilerInstance> prepareCompilerInstance( - std::unique_ptr<clang::CompilerInvocation> CI, - const PrecompiledPreamble *Preamble, std::unique_ptr<MemoryBuffer> Buffer, - std::shared_ptr<PCHContainerOperations> PCHs, - IntrusiveRefCntPtr<vfs::FileSystem> VFS, DiagnosticConsumer &DiagsClient) { +std::unique_ptr<CompilerInvocation> +buildCompilerInvocation(const ParseInputs &Inputs) { + std::vector<const char *> ArgStrs; + for (const auto &S : Inputs.CompileCommand.CommandLine) + ArgStrs.push_back(S.c_str()); + + if (Inputs.FS->setCurrentWorkingDirectory(Inputs.CompileCommand.Directory)) { + log("Couldn't set working directory when creating compiler invocation."); + // We proceed anyway, our lit-tests rely on results for non-existing working + // dirs. + } + + // FIXME(ibiryukov): store diagnostics from CommandLine when we start + // reporting them. + IgnoreDiagnostics IgnoreDiagnostics; + llvm::IntrusiveRefCntPtr<DiagnosticsEngine> CommandLineDiagsEngine = + CompilerInstance::createDiagnostics(new DiagnosticOptions, + &IgnoreDiagnostics, false); + std::unique_ptr<CompilerInvocation> CI = createInvocationFromCommandLine( + ArgStrs, CommandLineDiagsEngine, Inputs.FS); + if (!CI) + return nullptr; + // createInvocationFromCommandLine sets DisableFree. + CI->getFrontendOpts().DisableFree = false; + CI->getLangOpts()->CommentOpts.ParseAllComments = true; + return CI; +} + +std::unique_ptr<CompilerInstance> +prepareCompilerInstance(std::unique_ptr<clang::CompilerInvocation> CI, + const PrecompiledPreamble *Preamble, + std::unique_ptr<llvm::MemoryBuffer> Buffer, + std::shared_ptr<PCHContainerOperations> PCHs, + llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS, + DiagnosticConsumer &DiagsClient) { assert(VFS && "VFS is null"); assert(!CI->getPreprocessorOpts().RetainRemappedFileBuffers && "Setting RetainRemappedFileBuffers to true will cause a memory leak " |