1 | //===--- SymbolID.cpp --------------------------------------------*- C++-*-===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "SymbolID.h" |
10 | #include "support/Logger.h" |
11 | #include "llvm/ADT/StringExtras.h" |
12 | #include "llvm/Support/SHA1.h" |
13 | |
14 | namespace clang { |
15 | namespace clangd { |
16 | |
17 | SymbolID::SymbolID(llvm::StringRef USR) { |
18 | auto Hash = llvm::SHA1::hash(Data: llvm::arrayRefFromStringRef(Input: USR)); |
19 | static_assert(sizeof(Hash) >= RawSize, "RawSize larger than SHA1"); |
20 | memcpy(dest: HashValue.data(), src: Hash.data(), n: RawSize); |
21 | } |
22 | |
23 | llvm::StringRef SymbolID::raw() const { |
24 | return llvm::StringRef(reinterpret_cast<const char *>(HashValue.data()), |
25 | RawSize); |
26 | } |
27 | |
28 | SymbolID SymbolID::fromRaw(llvm::StringRef Raw) { |
29 | SymbolID ID; |
30 | assert(Raw.size() == RawSize); |
31 | memcpy(dest: ID.HashValue.data(), src: Raw.data(), n: RawSize); |
32 | return ID; |
33 | } |
34 | |
35 | std::string SymbolID::str() const { return llvm::toHex(Input: raw()); } |
36 | |
37 | llvm::Expected<SymbolID> SymbolID::fromStr(llvm::StringRef Str) { |
38 | if (Str.size() != RawSize * 2) |
39 | return error(Fmt: "Bad ID length"); |
40 | for (char C : Str) |
41 | if (!llvm::isHexDigit(C)) |
42 | return error(Fmt: "Bad hex ID"); |
43 | return fromRaw(Raw: llvm::fromHex(Input: Str)); |
44 | } |
45 | |
46 | llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolID &ID) { |
47 | return OS << llvm::toHex(Input: ID.raw()); |
48 | } |
49 | |
50 | } // namespace clangd |
51 | } // namespace clang |
52 |