Sprint 277: LSP Advanced Orchestration (steps 1913-1917)
- LSPWorkspaceIndex: track open docs, URI→{languageId,content,version}
- LSPDiagnosticsAggregator: merge diagnostics from multiple LSP sources per URI
- LSPCompletionMerger: merge+deduplicate completion items from multiple sources
- LSPOrchestrator: top-level coordinator composing all three + proxy + cross-lang resolver
- Sprint277IntegrationSummary: poly-api (Go+TypeScript) end-to-end integration
26/26 tests passing (5+5+5+5+6). All new headers ≤600 lines.
LoRA recorded: sprint277-2026-03-01 (1 call, 569 tokens).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
68
editor/src/LSPCompletionMerger.h
Normal file
68
editor/src/LSPCompletionMerger.h
Normal file
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
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<CompletionItem>& 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<CompletionItem> getItems() const {
|
||||
std::vector<CompletionItem> result;
|
||||
std::map<std::string, bool> 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<int>(getItems().size());
|
||||
}
|
||||
|
||||
int sourceCount() const {
|
||||
return static_cast<int>(bySource_.size());
|
||||
}
|
||||
|
||||
private:
|
||||
// source → items
|
||||
std::map<std::string, std::vector<CompletionItem>> bySource_;
|
||||
};
|
||||
|
||||
} // namespace whetstone
|
||||
Reference in New Issue
Block a user