Files
whetstone_DSL/editor/tests/step1909_test.cpp

82 lines
2.4 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
// Step 1909: LanguageServerRouter
// Routes LSP requests to the correct per-language server stub based on
// file URI extension or explicit languageId.
//
// t1: .py URI routes to Python server
// t2: .rs URI routes to Rust server
// t3: .go URI routes to Go server
// t4: .ts/.js URI routes to TypeScript server
// t5: unknown extension routes to "unknown", .cpp/.h routes to Cpp
#include "LanguageServerRouter.h"
#include <iostream>
#include <string>
namespace ws = whetstone;
static int p=0,f=0;
#define T(n) { std::cout<<" "<<#n<<"... "; }
#define P() { std::cout<<"PASS\n"; ++p; }
#define F(m) { std::cout<<"FAIL: "<<m<<"\n"; ++f; }
#define C(c,m) if(!(c)){F(m);return;}
void t1(){
T(py_uri_routes_to_python);
ws::LanguageServerRouter router;
C(router.routeByUri("file:///src/sort.py") == "Python",
"expected Python for .py");
C(router.routeByUri("file:///a/b/c.py") == "Python",
"expected Python for any .py");
P();
}
void t2(){
T(rs_uri_routes_to_rust);
ws::LanguageServerRouter router;
C(router.routeByUri("file:///src/lib.rs") == "Rust",
"expected Rust for .rs");
P();
}
void t3(){
T(go_uri_routes_to_go);
ws::LanguageServerRouter router;
C(router.routeByUri("file:///main.go") == "Go",
"expected Go for .go");
P();
}
void t4(){
T(ts_and_js_uri_routes_to_typescript);
ws::LanguageServerRouter router;
C(router.routeByUri("file:///app.ts") == "TypeScript",
"expected TypeScript for .ts");
C(router.routeByUri("file:///app.js") == "TypeScript",
"expected TypeScript for .js");
P();
}
void t5(){
T(cpp_h_routes_to_cpp_unknown_extension_routes_unknown);
ws::LanguageServerRouter router;
C(router.routeByUri("file:///engine.cpp") == "C++",
"expected C++ for .cpp");
C(router.routeByUri("file:///engine.h") == "C++",
"expected C++ for .h");
C(router.routeByUri("file:///data.json") == "unknown",
"expected unknown for .json");
// languageId override
C(router.routeByLanguageId("python") == "Python",
"expected Python for languageId=python");
C(router.routeByLanguageId("rust") == "Rust",
"expected Rust for languageId=rust");
P();
}
int main(){
std::cout << "Step 1909: LanguageServerRouter\n";
t1(); t2(); t3(); t4(); t5();
std::cout << "\n" << p << "/" << (p+f) << " passed\n";
return f > 0 ? 1 : 0;
}