2018-08-21 05:27:52 +00:00
|
|
|
// Copyright 2017-2018 ccls Authors
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
2018-05-28 00:50:02 +00:00
|
|
|
#include "clang_tu.h"
|
2017-11-11 19:31:05 +00:00
|
|
|
|
|
|
|
#include "clang_utils.h"
|
2018-07-14 23:02:59 +00:00
|
|
|
|
2018-08-29 05:49:53 +00:00
|
|
|
#include <clang/Lex/Lexer.h>
|
2018-07-14 23:02:59 +00:00
|
|
|
using namespace clang;
|
2017-11-11 19:31:05 +00:00
|
|
|
|
2018-03-31 05:05:21 +00:00
|
|
|
#include <assert.h>
|
|
|
|
#include <mutex>
|
2017-11-11 19:31:05 +00:00
|
|
|
|
2018-07-29 04:32:41 +00:00
|
|
|
Range FromCharSourceRange(const SourceManager &SM, const LangOptions &LangOpts,
|
|
|
|
CharSourceRange R,
|
|
|
|
llvm::sys::fs::UniqueID *UniqueID) {
|
2018-07-14 23:02:59 +00:00
|
|
|
SourceLocation BLoc = R.getBegin(), ELoc = R.getEnd();
|
|
|
|
std::pair<FileID, unsigned> BInfo = SM.getDecomposedLoc(BLoc);
|
|
|
|
std::pair<FileID, unsigned> EInfo = SM.getDecomposedLoc(ELoc);
|
2018-07-29 04:32:41 +00:00
|
|
|
if (R.isTokenRange())
|
2018-07-14 23:02:59 +00:00
|
|
|
EInfo.second += Lexer::MeasureTokenLength(ELoc, SM, LangOpts);
|
|
|
|
unsigned l0 = SM.getLineNumber(BInfo.first, BInfo.second) - 1,
|
|
|
|
c0 = SM.getColumnNumber(BInfo.first, BInfo.second) - 1,
|
|
|
|
l1 = SM.getLineNumber(EInfo.first, EInfo.second) - 1,
|
|
|
|
c1 = SM.getColumnNumber(EInfo.first, EInfo.second) - 1;
|
|
|
|
if (l0 > INT16_MAX)
|
|
|
|
l0 = 0;
|
|
|
|
if (c0 > INT16_MAX)
|
|
|
|
c0 = 0;
|
|
|
|
if (l1 > INT16_MAX)
|
|
|
|
l1 = 0;
|
|
|
|
if (c1 > INT16_MAX)
|
|
|
|
c1 = 0;
|
|
|
|
if (UniqueID) {
|
|
|
|
if (const FileEntry *F = SM.getFileEntryForID(BInfo.first))
|
|
|
|
*UniqueID = F->getUniqueID();
|
|
|
|
else
|
|
|
|
*UniqueID = llvm::sys::fs::UniqueID(0, 0);
|
2018-05-28 00:50:02 +00:00
|
|
|
}
|
2018-07-14 23:02:59 +00:00
|
|
|
return {{int16_t(l0), int16_t(c0)}, {int16_t(l1), int16_t(c1)}};
|
2018-05-28 00:50:02 +00:00
|
|
|
}
|
2018-03-31 05:05:21 +00:00
|
|
|
|
2018-07-14 23:02:59 +00:00
|
|
|
Range FromCharRange(const SourceManager &SM, const LangOptions &LangOpts,
|
2018-07-29 04:32:41 +00:00
|
|
|
SourceRange R, llvm::sys::fs::UniqueID *UniqueID) {
|
|
|
|
return FromCharSourceRange(SM, LangOpts, CharSourceRange::getCharRange(R),
|
|
|
|
UniqueID);
|
2018-03-31 05:05:21 +00:00
|
|
|
}
|
|
|
|
|
2018-07-14 23:02:59 +00:00
|
|
|
Range FromTokenRange(const SourceManager &SM, const LangOptions &LangOpts,
|
2018-07-29 04:32:41 +00:00
|
|
|
SourceRange R, llvm::sys::fs::UniqueID *UniqueID) {
|
|
|
|
return FromCharSourceRange(SM, LangOpts, CharSourceRange::getTokenRange(R),
|
|
|
|
UniqueID);
|
2018-03-31 05:05:21 +00:00
|
|
|
}
|
2018-08-30 07:29:08 +00:00
|
|
|
|
|
|
|
std::unique_ptr<CompilerInvocation>
|
|
|
|
BuildCompilerInvocation(const std::vector<std::string> &args,
|
|
|
|
IntrusiveRefCntPtr<vfs::FileSystem> VFS) {
|
|
|
|
std::vector<const char *> cargs;
|
|
|
|
for (auto &arg : args)
|
|
|
|
cargs.push_back(arg.c_str());
|
|
|
|
IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
|
|
|
|
CompilerInstance::createDiagnostics(new DiagnosticOptions));
|
|
|
|
std::unique_ptr<CompilerInvocation> CI =
|
|
|
|
createInvocationFromCommandLine(cargs, Diags, VFS);
|
|
|
|
if (CI) {
|
2018-09-08 17:37:48 +00:00
|
|
|
CI->getDiagnosticOpts().IgnoreWarnings = true;
|
2018-08-30 07:29:08 +00:00
|
|
|
CI->getFrontendOpts().DisableFree = false;
|
|
|
|
CI->getLangOpts()->SpellChecking = false;
|
|
|
|
}
|
|
|
|
return CI;
|
|
|
|
}
|