diff options
Diffstat (limited to 'clangd/Compiler.cpp')
-rw-r--r-- | clangd/Compiler.cpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/clangd/Compiler.cpp b/clangd/Compiler.cpp index c94ef755..7758e039 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 // //===----------------------------------------------------------------------===// @@ -11,6 +10,7 @@ #include "Logger.h" #include "clang/Basic/TargetInfo.h" #include "clang/Lex/PreprocessorOptions.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "llvm/Support/Format.h" #include "llvm/Support/FormatVariadic.h" @@ -40,11 +40,38 @@ void IgnoreDiagnostics::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, IgnoreDiagnostics::log(DiagLevel, Info); } +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"); @@ -61,14 +88,15 @@ prepareCompilerInstance(std::unique_ptr<clang::CompilerInvocation> CI, CI->getFrontendOpts().Inputs[0].getFile(), Buffer.get()); } - auto Clang = llvm::make_unique<CompilerInstance>(PCHs); + auto Clang = llvm::make_unique<CompilerInstance>( + std::make_shared<PCHContainerOperations>()); Clang->setInvocation(std::move(CI)); Clang->createDiagnostics(&DiagsClient, false); if (auto VFSWithRemapping = createVFSFromCompilerInvocation( Clang->getInvocation(), Clang->getDiagnostics(), VFS)) VFS = VFSWithRemapping; - Clang->setVirtualFileSystem(VFS); + Clang->createFileManager(VFS); Clang->setTarget(TargetInfo::CreateTargetInfo( Clang->getDiagnostics(), Clang->getInvocation().TargetOpts)); |