#pragma once #include #include #include #include namespace whetstone { struct CompletionItem { std::string label; int kind = 1; // 1=Text 2=Method 3=Function 6=Variable etc. std::string detail; std::string source; // language server that produced this item }; class LSPCompletionMerger { public: // Add items from a named source. Replaces any previous items from that source. void addItems(const std::string& source, const std::vector& items) { bySource_[source] = items; } // Return all items merged from all sources, deduplicated by label. // When two sources offer the same label, the first encountered wins (sorted source order). std::vector getItems() const { std::vector result; std::map seen; for (const auto& [src, items] : bySource_) { for (const auto& item : items) { if (!seen.count(item.label)) { seen[item.label] = true; result.push_back(item); } } } std::sort(result.begin(), result.end(), [](const CompletionItem& a, const CompletionItem& b){ return a.label < b.label; }); return result; } // Remove all items from one source. void clearSource(const std::string& source) { bySource_.erase(source); } // Remove all items. void clearAll() { bySource_.clear(); } // Count unique labels across all sources. int uniqueCount() const { return static_cast(getItems().size()); } int sourceCount() const { return static_cast(bySource_.size()); } private: // source → items std::map> bySource_; }; } // namespace whetstone