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 SymbolID(llvm::StringRef USR)17SymbolID::SymbolID(llvm::StringRef USR) { 18 auto Hash = llvm::SHA1::hash(llvm::arrayRefFromStringRef(USR)); 19 static_assert(sizeof(Hash) >= RawSize, "RawSize larger than SHA1"); 20 memcpy(HashValue.data(), Hash.data(), RawSize); 21 } 22 raw() const23llvm::StringRef SymbolID::raw() const { 24 return llvm::StringRef(reinterpret_cast<const char *>(HashValue.data()), 25 RawSize); 26 } 27 fromRaw(llvm::StringRef Raw)28SymbolID SymbolID::fromRaw(llvm::StringRef Raw) { 29 SymbolID ID; 30 assert(Raw.size() == RawSize); 31 memcpy(ID.HashValue.data(), Raw.data(), RawSize); 32 return ID; 33 } 34 str() const35std::string SymbolID::str() const { return llvm::toHex(raw()); } 36 fromStr(llvm::StringRef Str)37llvm::Expected<SymbolID> SymbolID::fromStr(llvm::StringRef Str) { 38 if (Str.size() != RawSize * 2) 39 return error("Bad ID length"); 40 for (char C : Str) 41 if (!llvm::isHexDigit(C)) 42 return error("Bad hex ID"); 43 return fromRaw(llvm::fromHex(Str)); 44 } 45 operator <<(llvm::raw_ostream & OS,const SymbolID & ID)46llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolID &ID) { 47 return OS << llvm::toHex(ID.raw()); 48 } 49 50 } // namespace clangd 51 } // namespace clang 52