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