Skip to content

Commit 1dd6ec2

Browse files
authored
Export language server to wasm. (#5419)
1 parent faa7d6b commit 1dd6ec2

9 files changed

+1003
-234
lines changed

source/compiler-core/slang-language-server-protocol.h

+30
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "../../source/core/slang-rtti-info.h"
88
#include "../../source/compiler-core/slang-json-value.h"
9+
#include <optional>
910

1011
namespace Slang
1112
{
@@ -1124,3 +1125,32 @@ struct DocumentFormattingParams
11241125

11251126
} // namespace LanguageServerProtocol
11261127
} // namespace Slang
1128+
1129+
namespace Slang
1130+
{
1131+
template<typename T>
1132+
struct LanguageServerResult
1133+
{
1134+
SlangResult returnCode;
1135+
bool isNull = true;
1136+
T result;
1137+
LanguageServerResult()
1138+
{
1139+
returnCode = SLANG_OK;
1140+
}
1141+
LanguageServerResult(std::nullopt_t)
1142+
{
1143+
returnCode = SLANG_OK;
1144+
}
1145+
LanguageServerResult(const T& value)
1146+
{
1147+
result = value;
1148+
isNull = false;
1149+
returnCode = SLANG_OK;
1150+
}
1151+
LanguageServerResult(SlangResult code)
1152+
{
1153+
returnCode = code;
1154+
}
1155+
};
1156+
}

source/slang-wasm/CMakeLists.txt

+10-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,16 @@ if (EMSCRIPTEN)
99
EXECUTABLE
1010
EXCLUDE_FROM_ALL
1111
USE_FEWER_WARNINGS
12-
LINK_WITH_PRIVATE miniz lz4_static slang core compiler-core
12+
LINK_WITH_PRIVATE
13+
miniz
14+
lz4_static
15+
slang
16+
core
17+
compiler-core
18+
slang-capability-defs
19+
slang-capability-lookup
20+
slang-reflect-headers
21+
slang-lookup-tables
1322
INCLUDE_DIRECTORIES_PUBLIC ${slang_SOURCE_DIR}/include .
1423
)
1524
# To generate binding code

source/slang-wasm/slang-wasm-bindings.cpp

+146
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,150 @@ EMSCRIPTEN_BINDINGS(slang)
7474
return_value_policy::take_ownership());
7575

7676
register_vector<slang::wgsl::ComponentType*>("ComponentTypeList");
77+
78+
register_vector<std::string>("StringList");
79+
register_optional<std::vector<std::string>>();
80+
81+
value_object<slang::wgsl::lsp::Position>("Position")
82+
.field("line", &slang::wgsl::lsp::Position::line)
83+
.field("character", &slang::wgsl::lsp::Position::character);
84+
85+
value_object<slang::wgsl::lsp::Range>("Range")
86+
.field("start", &slang::wgsl::lsp::Range::start)
87+
.field("end", &slang::wgsl::lsp::Range::end);
88+
89+
value_object<slang::wgsl::lsp::Location>("Location")
90+
.field("uri", &slang::wgsl::lsp::Location::uri)
91+
.field("range", &slang::wgsl::lsp::Location::range);
92+
register_vector<slang::wgsl::lsp::Location>("LocationList");
93+
register_optional<std::vector<slang::wgsl::lsp::Location>>();
94+
95+
value_object<slang::wgsl::lsp::TextEdit>("TextEdit")
96+
.field("range", &slang::wgsl::lsp::TextEdit::range)
97+
.field("text", &slang::wgsl::lsp::TextEdit::text);
98+
register_optional<slang::wgsl::lsp::TextEdit>();
99+
register_vector<slang::wgsl::lsp::TextEdit>("TextEditList");
100+
register_optional<std::vector<slang::wgsl::lsp::TextEdit>>();
101+
102+
value_object<slang::wgsl::lsp::MarkupContent>("MarkupContent")
103+
.field("kind", &slang::wgsl::lsp::MarkupContent::kind)
104+
.field("value", &slang::wgsl::lsp::MarkupContent::value);
105+
register_optional<slang::wgsl::lsp::MarkupContent>();
106+
107+
value_object<slang::wgsl::lsp::Hover>("Hover")
108+
.field("contents", &slang::wgsl::lsp::Hover::contents)
109+
.field("range", &slang::wgsl::lsp::Hover::range);
110+
register_optional<slang::wgsl::lsp::Hover>();
111+
112+
value_object<slang::wgsl::lsp::CompletionItem>("CompletionItem")
113+
.field("label", &slang::wgsl::lsp::CompletionItem::label)
114+
.field("kind", &slang::wgsl::lsp::CompletionItem::kind)
115+
.field("detail", &slang::wgsl::lsp::CompletionItem::detail)
116+
.field("documentation", &slang::wgsl::lsp::CompletionItem::documentation)
117+
.field("textEdit", &slang::wgsl::lsp::CompletionItem::textEdit)
118+
.field("data", &slang::wgsl::lsp::CompletionItem::data)
119+
.field("commitCharacters", &slang::wgsl::lsp::CompletionItem::commitCharacters);
120+
register_optional<slang::wgsl::lsp::CompletionItem>();
121+
register_vector<slang::wgsl::lsp::CompletionItem>("CompletionItemList");
122+
register_optional<std::vector<slang::wgsl::lsp::CompletionItem>>();
123+
124+
value_object<slang::wgsl::lsp::CompletionContext>("CompletionContext")
125+
.field("triggerKind", &slang::wgsl::lsp::CompletionContext::triggerKind)
126+
.field("triggerCharacter", &slang::wgsl::lsp::CompletionContext::triggerCharacter);
127+
128+
value_array<std::array<uint32_t, 2>>("array_uint_2")
129+
.element(emscripten::index<0>())
130+
.element(emscripten::index<1>());
131+
132+
value_object<slang::wgsl::lsp::ParameterInformation>("ParameterInformation")
133+
.field("label", &slang::wgsl::lsp::ParameterInformation::label)
134+
.field("documentation", &slang::wgsl::lsp::ParameterInformation::documentation);
135+
136+
register_vector<slang::wgsl::lsp::ParameterInformation>("ParameterInformationList");
137+
138+
value_object<slang::wgsl::lsp::SignatureInformation>("SignatureInformation")
139+
.field("label", &slang::wgsl::lsp::SignatureInformation::label)
140+
.field("documentation", &slang::wgsl::lsp::SignatureInformation::documentation)
141+
.field("parameters", &slang::wgsl::lsp::SignatureInformation::parameters);
142+
143+
register_vector<slang::wgsl::lsp::SignatureInformation>("SignatureInformationList");
144+
145+
value_object<slang::wgsl::lsp::SignatureHelp>("SignatureHelp")
146+
.field("signatures", &slang::wgsl::lsp::SignatureHelp::signatures)
147+
.field("activeSignature", &slang::wgsl::lsp::SignatureHelp::activeSignature)
148+
.field("activeParameter", &slang::wgsl::lsp::SignatureHelp::activeParameter);
149+
register_optional<slang::wgsl::lsp::SignatureHelp>();
150+
151+
value_object<slang::wgsl::lsp::DocumentSymbol>("DocumentSymbol")
152+
.field("name", &slang::wgsl::lsp::DocumentSymbol::name)
153+
.field("detail", &slang::wgsl::lsp::DocumentSymbol::detail)
154+
.field("kind", &slang::wgsl::lsp::DocumentSymbol::kind)
155+
.field("range", &slang::wgsl::lsp::DocumentSymbol::range)
156+
.field("selectionRange", &slang::wgsl::lsp::DocumentSymbol::selectionRange)
157+
.field("children", &slang::wgsl::lsp::DocumentSymbol::children);
158+
159+
register_vector<slang::wgsl::lsp::DocumentSymbol>("DocumentSymbolList");
160+
register_optional<std::vector<slang::wgsl::lsp::DocumentSymbol>>();
161+
162+
value_object<slang::wgsl::lsp::Diagnostics>("Diagnostics")
163+
.field("code", &slang::wgsl::lsp::Diagnostics::code)
164+
.field("range", &slang::wgsl::lsp::Diagnostics::range)
165+
.field("severity", &slang::wgsl::lsp::Diagnostics::severity)
166+
.field("message", &slang::wgsl::lsp::Diagnostics::message);
167+
register_vector<slang::wgsl::lsp::Diagnostics>("DiagnosticsList");
168+
register_optional<std::vector<slang::wgsl::lsp::Diagnostics>>();
169+
170+
register_vector<uint32_t>("Uint32List");
171+
register_optional<std::vector<uint32_t>>();
172+
173+
class_<slang::wgsl::lsp::LanguageServer>("LanguageServer")
174+
.function(
175+
"didOpenTextDocument",
176+
&slang::wgsl::lsp::LanguageServer::didOpenTextDocument,
177+
allow_raw_pointers())
178+
.function(
179+
"didCloseTextDocument",
180+
&slang::wgsl::lsp::LanguageServer::didCloseTextDocument,
181+
allow_raw_pointers())
182+
.function(
183+
"didChangeTextDocument",
184+
&slang::wgsl::lsp::LanguageServer::didChangeTextDocument,
185+
allow_raw_pointers())
186+
.function(
187+
"hover",
188+
&slang::wgsl::lsp::LanguageServer::hover,
189+
allow_raw_pointers())
190+
.function(
191+
"gotoDefinition",
192+
&slang::wgsl::lsp::LanguageServer::gotoDefinition,
193+
allow_raw_pointers())
194+
.function(
195+
"completion",
196+
&slang::wgsl::lsp::LanguageServer::completion,
197+
allow_raw_pointers())
198+
.function(
199+
"completionResolve",
200+
&slang::wgsl::lsp::LanguageServer::completionResolve,
201+
allow_raw_pointers())
202+
.function(
203+
"semanticTokens",
204+
&slang::wgsl::lsp::LanguageServer::semanticTokens,
205+
allow_raw_pointers())
206+
.function(
207+
"signatureHelp",
208+
&slang::wgsl::lsp::LanguageServer::signatureHelp,
209+
allow_raw_pointers())
210+
.function(
211+
"documentSymbol",
212+
&slang::wgsl::lsp::LanguageServer::documentSymbol,
213+
allow_raw_pointers())
214+
.function(
215+
"getDiagnostics",
216+
&slang::wgsl::lsp::LanguageServer::getDiagnostics,
217+
allow_raw_pointers());
218+
219+
function(
220+
"createLanguageServer",
221+
&slang::wgsl::lsp::createLanguageServer,
222+
return_value_policy::take_ownership());
77223
}

0 commit comments

Comments
 (0)