Files
whetstone_DSL/editor/src/SymbolIndexUpdater.h

51 lines
1.5 KiB
C
Raw Normal View History

Sprints 273-276: Polyglot FFI Glue, Symbol Index, and LSP Proxy (steps 1893-1912) Sprint 273 — PolyglotFFIGlueGenerator (steps 1893-1897): ABIBoundaryExtractor, CHeaderEmitter, RustPythonBindingEmitter, GoCppBindingEmitter. Extracts exported symbols from toComponent provider and emits C ABI + language-specific bindings. Sprint 274 — More Binding Pairs + DWARF (steps 1898-1902): CppJSBindingEmitter (N-API), RustGoBindingEmitter (#[no_mangle]), DWARFBoundaryAnnotator (DW_TAG_* + crossLangBoundary), FFIGlueDispatcher (routes by fromLang→toLang pair), MCP tool whetstone_generate_ffi_glue (#92). Sprint 275 — Cross-Language Symbol Index (steps 1903-1907): SCIPEmitter (SCIP JSON, one doc/language, caller+provider roles), CrossLanguageSymbolTable (byLangName_ + byScip_ dual index), SymbolIndexUpdater (nodeKey diff, clear-and-rebuild), SymbolIndexOrchestrator (orchestrate + update), MCP tool whetstone_emit_symbol_index (#93). Sprint 276 — LSP Proxy Core (steps 1908-1912): LSPProxyServer (JSON-RPC 2.0 dispatcher), LanguageServerRouter (routeByUri/routeByLanguageId), CrossLanguageBoundaryDetector (detect/detectWithUri/detectInLanguage), CrossLanguageDefinitionResolver (resolve/resolveFromUri → DefinitionLocation). End-to-end: Python call site goto-def resolves to Rust sort-core provider. 100/100 tests passing across all four sprints. Architecture gate clean. LoRA sessions recorded for all sprints (~14k tokens captured). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-01 18:41:32 -07:00
#pragma once
#include "CrossLanguageSymbolTable.h"
#include "ABIBoundaryExtractor.h"
#include <set>
#include <string>
#include <vector>
namespace whetstone {
struct UpdateResult {
int added = 0;
int removed = 0;
int unchanged = 0;
};
class SymbolIndexUpdater {
public:
// Diff oldNodes vs newNodes; update table in place.
// Node identity key: toComponent/name.fromLanguage:toLanguage
static UpdateResult update(CrossLanguageSymbolTable& table,
const std::vector<ABIBoundaryNode>& oldNodes,
const std::vector<ABIBoundaryNode>& newNodes)
{
std::set<std::string> oldKeys, newKeys;
for (auto& n : oldNodes) oldKeys.insert(nodeKey(n));
for (auto& n : newNodes) newKeys.insert(nodeKey(n));
UpdateResult result;
for (auto& n : newNodes) {
if (oldKeys.count(nodeKey(n))) ++result.unchanged;
else ++result.added;
}
for (auto& n : oldNodes) {
if (!newKeys.count(nodeKey(n))) ++result.removed;
}
// Rebuild table from newNodes (clean remove-and-reinsert)
table = CrossLanguageSymbolTable{};
for (auto& n : newNodes) table.insert(n);
return result;
}
private:
static std::string nodeKey(const ABIBoundaryNode& n) {
return n.toComponent + "/" + n.name + "." + n.fromLanguage + ":" + n.toLanguage;
}
};
} // namespace whetstone