[clangd] Deduplicate symbols collected in global-symbol-builder tool.

Summary: After D42111, the executor framework no longer deduplicate tool results.

Reviewers: bkramer, sammccall

Subscribers: klimek, ilya-biryukov, cfe-commits

Differential Revision: https://reviews.llvm.org/D42113

llvm-svn: 322722
This commit is contained in:
Eric Liu
2018-01-17 18:27:41 +00:00
parent 8e951fd2f6
commit 31300c7d8b

View File

@@ -105,7 +105,22 @@ int main(int argc, const char **argv) {
llvm::errs() << llvm::toString(std::move(Err)) << "\n";
}
// Deduplicate the result by key and keep the longest value.
// FIXME(ioeric): Merge occurrences, rather than just dropping all but one.
// Definitions and forward declarations have the same key and may both have
// information. Usage count will need to be aggregated across occurrences,
// too.
llvm::StringMap<llvm::StringRef> UniqueSymbols;
Executor->get()->getToolResults()->forEachResult(
[](llvm::StringRef, llvm::StringRef Value) { llvm::outs() << Value; });
[&UniqueSymbols](llvm::StringRef Key, llvm::StringRef Value) {
auto Ret = UniqueSymbols.try_emplace(Key, Value);
if (!Ret.second) {
// If key already exists, keep the longest value.
llvm::StringRef &V = Ret.first->second;
V = V.size() < Value.size() ? Value : V;
}
});
for (const auto &Sym : UniqueSymbols)
llvm::outs() << Sym.second;
return 0;
}