summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-09-18 19:00:59 +0000
committerSam McCall <sam.mccall@gmail.com>2018-09-18 19:00:59 +0000
commit46b55558445119d6f2209ec6aa570991c89d8424 (patch)
treeaf100b8fb9798326dad0dd03c28b044327f4cfc7
parent22db696549906574b8713af178aea32ba0aba089 (diff)
downloadbcm5719-llvm-46b55558445119d6f2209ec6aa570991c89d8424.tar.gz
bcm5719-llvm-46b55558445119d6f2209ec6aa570991c89d8424.zip
[clangd] Fix error handling for SymbolID parsing (notably YAML and dexp)
llvm-svn: 342505
-rw-r--r--clang-tools-extra/clangd/index/Index.cpp9
-rw-r--r--clang-tools-extra/clangd/index/Index.h12
-rw-r--r--clang-tools-extra/clangd/index/SymbolYAML.cpp11
-rw-r--r--clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp8
-rw-r--r--clang-tools-extra/clangd/indexer/IndexerMain.cpp3
5 files changed, 22 insertions, 21 deletions
diff --git a/clang-tools-extra/clangd/index/Index.cpp b/clang-tools-extra/clangd/index/Index.cpp
index cfc49406c1e..dec95fcf910 100644
--- a/clang-tools-extra/clangd/index/Index.cpp
+++ b/clang-tools-extra/clangd/index/Index.cpp
@@ -41,8 +41,13 @@ SymbolID SymbolID::fromRaw(llvm::StringRef Raw) {
std::string SymbolID::str() const { return toHex(raw()); }
-void operator>>(StringRef Str, SymbolID &ID) {
- ID = SymbolID::fromRaw(fromHex(Str));
+llvm::Expected<SymbolID> SymbolID::fromStr(llvm::StringRef Str) {
+ if (Str.size() != RawSize * 2)
+ return createStringError(llvm::inconvertibleErrorCode(), "Bad ID length");
+ for (char C : Str)
+ if (!isHexDigit(C))
+ return createStringError(llvm::inconvertibleErrorCode(), "Bad hex ID");
+ return fromRaw(fromHex(Str));
}
raw_ostream &operator<<(raw_ostream &OS, SymbolOrigin O) {
diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h
index 8a18c619781..746638229af 100644
--- a/clang-tools-extra/clangd/index/Index.h
+++ b/clang-tools-extra/clangd/index/Index.h
@@ -91,12 +91,12 @@ public:
return StringRef(reinterpret_cast<const char *>(HashValue.data()), RawSize);
}
static SymbolID fromRaw(llvm::StringRef);
+
// Returns a 40-bytes hex encoded string.
std::string str() const;
+ static llvm::Expected<SymbolID> fromStr(llvm::StringRef);
private:
- friend void operator>>(llvm::StringRef Str, SymbolID &ID);
-
std::array<uint8_t, RawSize> HashValue;
};
@@ -108,15 +108,9 @@ inline llvm::hash_code hash_value(const SymbolID &ID) {
return llvm::hash_code(Result);
}
-// Write SymbolID into the given stream. SymbolID is encoded as a 40-bytes
-// hex string.
+// Write SymbolID into the given stream. SymbolID is encoded as ID.str().
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolID &ID);
-// Construct SymbolID from a hex string.
-// The HexStr is required to be a 40-bytes hex string, which is encoded from the
-// "<<" operator.
-void operator>>(llvm::StringRef HexStr, SymbolID &ID);
-
} // namespace clangd
} // namespace clang
namespace llvm {
diff --git a/clang-tools-extra/clangd/index/SymbolYAML.cpp b/clang-tools-extra/clangd/index/SymbolYAML.cpp
index 01c7987ac7f..4dec54782a2 100644
--- a/clang-tools-extra/clangd/index/SymbolYAML.cpp
+++ b/clang-tools-extra/clangd/index/SymbolYAML.cpp
@@ -40,10 +40,13 @@ struct NormalizedSymbolID {
OS << ID;
}
- SymbolID denormalize(IO &) {
- SymbolID ID;
- HexString >> ID;
- return ID;
+ SymbolID denormalize(IO &I) {
+ auto ID = SymbolID::fromStr(HexString);
+ if (!ID) {
+ I.setError(llvm::toString(ID.takeError()));
+ return SymbolID();
+ }
+ return *ID;
}
std::string HexString;
diff --git a/clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp b/clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp
index 09c310ff575..afaace3ac41 100644
--- a/clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp
+++ b/clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp
@@ -144,14 +144,14 @@ class Lookup : public Command {
};
void run() override {
- auto Raw = fromHex(ID);
- if (Raw.size() != clang::clangd::SymbolID::RawSize) {
- llvm::outs() << "invalid SymbolID\n";
+ auto SID = clang::clangd::SymbolID::fromStr(ID);
+ if (!SID) {
+ llvm::outs() << llvm::toString(SID.takeError()) << "\n";
return;
}
clang::clangd::LookupRequest Request;
- Request.IDs = {clang::clangd::SymbolID::fromRaw(Raw)};
+ Request.IDs = {*SID};
bool FoundSymbol = false;
Index->lookup(Request, [&](const Symbol &Sym) {
FoundSymbol = true;
diff --git a/clang-tools-extra/clangd/indexer/IndexerMain.cpp b/clang-tools-extra/clangd/indexer/IndexerMain.cpp
index fc85c54e227..24551bf61a8 100644
--- a/clang-tools-extra/clangd/indexer/IndexerMain.cpp
+++ b/clang-tools-extra/clangd/indexer/IndexerMain.cpp
@@ -172,8 +172,7 @@ public:
[&](llvm::StringRef Key, llvm::StringRef Value) {
llvm::yaml::Input Yin(Value);
auto Sym = clang::clangd::SymbolFromYAML(Yin);
- clang::clangd::SymbolID ID;
- Key >> ID;
+ auto ID = cantFail(clang::clangd::SymbolID::fromStr(Key));
if (const auto *Existing = UniqueSymbols.find(ID))
UniqueSymbols.insert(mergeSymbol(*Existing, Sym));
else
OpenPOWER on IntegriCloud