This revision was automatically updated to reflect the committed changes. Closed by commit rL322722: [clangd] Deduplicate symbols collected in global-symbol-builder tool. (authored by ioeric, committed by ). Herald added a subscriber: llvm-commits.
Repository: rL LLVM https://reviews.llvm.org/D42113 Files: clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp Index: clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp =================================================================== --- clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp +++ clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp @@ -105,7 +105,22 @@ 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; }
Index: clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp =================================================================== --- clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp +++ clang-tools-extra/trunk/clangd/global-symbol-builder/GlobalSymbolBuilderMain.cpp @@ -105,7 +105,22 @@ 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; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits