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
|
|
|
}
|