Skip to content

Commit 1146920

Browse files
authored
Add smoke test for language server. (shader-slang#2266)
1 parent ff2ae7e commit 1146920

30 files changed

+625
-156
lines changed

build/visual-studio/compiler-core/compiler-core.vcxproj

+2
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@
294294
<ClInclude Include="..\..\..\source\compiler-core\slang-json-rpc-connection.h" />
295295
<ClInclude Include="..\..\..\source\compiler-core\slang-json-rpc.h" />
296296
<ClInclude Include="..\..\..\source\compiler-core\slang-json-value.h" />
297+
<ClInclude Include="..\..\..\source\compiler-core\slang-language-server-protocol.h" />
297298
<ClInclude Include="..\..\..\source\compiler-core\slang-lexer-diagnostic-defs.h" />
298299
<ClInclude Include="..\..\..\source\compiler-core\slang-lexer.h" />
299300
<ClInclude Include="..\..\..\source\compiler-core\slang-llvm-compiler.h" />
@@ -328,6 +329,7 @@
328329
<ClCompile Include="..\..\..\source\compiler-core\slang-json-rpc-connection.cpp" />
329330
<ClCompile Include="..\..\..\source\compiler-core\slang-json-rpc.cpp" />
330331
<ClCompile Include="..\..\..\source\compiler-core\slang-json-value.cpp" />
332+
<ClCompile Include="..\..\..\source\compiler-core\slang-language-server-protocol.cpp" />
331333
<ClCompile Include="..\..\..\source\compiler-core\slang-lexer.cpp" />
332334
<ClCompile Include="..\..\..\source\compiler-core\slang-llvm-compiler.cpp" />
333335
<ClCompile Include="..\..\..\source\compiler-core\slang-name-convention-util.cpp" />

build/visual-studio/compiler-core/compiler-core.vcxproj.filters

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@
6969
<ClInclude Include="..\..\..\source\compiler-core\slang-json-value.h">
7070
<Filter>Header Files</Filter>
7171
</ClInclude>
72+
<ClInclude Include="..\..\..\source\compiler-core\slang-language-server-protocol.h">
73+
<Filter>Header Files</Filter>
74+
</ClInclude>
7275
<ClInclude Include="..\..\..\source\compiler-core\slang-lexer-diagnostic-defs.h">
7376
<Filter>Header Files</Filter>
7477
</ClInclude>
@@ -167,6 +170,9 @@
167170
<ClCompile Include="..\..\..\source\compiler-core\slang-json-value.cpp">
168171
<Filter>Source Files</Filter>
169172
</ClCompile>
173+
<ClCompile Include="..\..\..\source\compiler-core\slang-language-server-protocol.cpp">
174+
<Filter>Source Files</Filter>
175+
</ClCompile>
170176
<ClCompile Include="..\..\..\source\compiler-core\slang-lexer.cpp">
171177
<Filter>Source Files</Filter>
172178
</ClCompile>

build/visual-studio/slang/slang.vcxproj

-2
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,6 @@ IF EXIST ..\..\..\external\slang-binaries\bin\windows-aarch64\slang-glslang.dll\
408408
<ClInclude Include="..\..\..\source\slang\slang-ir.h" />
409409
<ClInclude Include="..\..\..\source\slang\slang-language-server-ast-lookup.h" />
410410
<ClInclude Include="..\..\..\source\slang\slang-language-server-collect-member.h" />
411-
<ClInclude Include="..\..\..\source\slang\slang-language-server-protocol.h" />
412411
<ClInclude Include="..\..\..\source\slang\slang-language-server-semantic-tokens.h" />
413412
<ClInclude Include="..\..\..\source\slang\slang-language-server.h" />
414413
<ClInclude Include="..\..\..\source\slang\slang-legalize-types.h" />
@@ -558,7 +557,6 @@ IF EXIST ..\..\..\external\slang-binaries\bin\windows-aarch64\slang-glslang.dll\
558557
<ClCompile Include="..\..\..\source\slang\slang-ir.cpp" />
559558
<ClCompile Include="..\..\..\source\slang\slang-language-server-ast-lookup.cpp" />
560559
<ClCompile Include="..\..\..\source\slang\slang-language-server-collect-member.cpp" />
561-
<ClCompile Include="..\..\..\source\slang\slang-language-server-protocol.cpp" />
562560
<ClCompile Include="..\..\..\source\slang\slang-language-server-semantic-tokens.cpp" />
563561
<ClCompile Include="..\..\..\source\slang\slang-language-server.cpp" />
564562
<ClCompile Include="..\..\..\source\slang\slang-legalize-types.cpp" />

build/visual-studio/slang/slang.vcxproj.filters

-6
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,6 @@
321321
<ClInclude Include="..\..\..\source\slang\slang-language-server-collect-member.h">
322322
<Filter>Header Files</Filter>
323323
</ClInclude>
324-
<ClInclude Include="..\..\..\source\slang\slang-language-server-protocol.h">
325-
<Filter>Header Files</Filter>
326-
</ClInclude>
327324
<ClInclude Include="..\..\..\source\slang\slang-language-server-semantic-tokens.h">
328325
<Filter>Header Files</Filter>
329326
</ClInclude>
@@ -767,9 +764,6 @@
767764
<ClCompile Include="..\..\..\source\slang\slang-language-server-collect-member.cpp">
768765
<Filter>Source Files</Filter>
769766
</ClCompile>
770-
<ClCompile Include="..\..\..\source\slang\slang-language-server-protocol.cpp">
771-
<Filter>Source Files</Filter>
772-
</ClCompile>
773767
<ClCompile Include="..\..\..\source\slang\slang-language-server-semantic-tokens.cpp">
774768
<Filter>Source Files</Filter>
775769
</ClCompile>

source/compiler-core/slang-json-native.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ SlangResult NativeToJSONConverter::_structToJSON(const StructRttiInfo* structRtt
308308
// Do the super class first
309309
if (structRttiInfo->m_super)
310310
{
311-
SLANG_RETURN_ON_FAIL(_structToJSON(structRttiInfo, src, outPairs));
311+
SLANG_RETURN_ON_FAIL(_structToJSON(structRttiInfo->m_super, src, outPairs));
312312
}
313313

314314
const Byte* base = (const Byte*)src;

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

+16-22
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,23 @@ static const StructRttiInfo _makeTextDocumentSyncOptionsRtti()
1515
}
1616
const StructRttiInfo TextDocumentSyncOptions::g_rttiInfo = _makeTextDocumentSyncOptionsRtti();
1717

18+
static const StructRttiInfo _makeWorkDoneProgressParamsRtti()
19+
{
20+
WorkDoneProgressParams obj;
21+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::WorkDoneProgressParams", nullptr);
22+
builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional);
23+
builder.ignoreUnknownFields();
24+
return builder.make();
25+
}
26+
const StructRttiInfo WorkDoneProgressParams::g_rttiInfo = _makeWorkDoneProgressParamsRtti();
27+
1828
static const StructRttiInfo _makeCompletionOptionsRtti()
1929
{
2030
CompletionOptions obj;
21-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionOptions", nullptr);
31+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionOptions", &WorkDoneProgressParams::g_rttiInfo);
2232
builder.addField("triggerCharacters", &obj.triggerCharacters);
2333
builder.addField("resolveProvider", &obj.resolveProvider);
2434
builder.addField("allCommitCharacters", &obj.allCommitCharacters);
25-
builder.addField("workDoneToken", &obj.workDoneToken);
2635
builder.ignoreUnknownFields();
2736
return builder.make();
2837
}
@@ -314,23 +323,12 @@ static const StructRttiInfo _makeTextDocumentPositionParamsRtti()
314323
}
315324
const StructRttiInfo TextDocumentPositionParams::g_rttiInfo = _makeTextDocumentPositionParamsRtti();
316325

317-
static const StructRttiInfo _makeWorkDoneProgressParamsRtti()
318-
{
319-
WorkDoneProgressParams obj;
320-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::WorkDoneProgressParams", nullptr);
321-
builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional);
322-
builder.ignoreUnknownFields();
323-
return builder.make();
324-
}
325-
const StructRttiInfo WorkDoneProgressParams::g_rttiInfo = _makeWorkDoneProgressParamsRtti();
326-
327326
static const StructRttiInfo _makeHoverParamsRtti()
328327
{
329328
HoverParams obj;
330-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::HoverParams", nullptr);
329+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::HoverParams", &WorkDoneProgressParams::g_rttiInfo);
331330
builder.addField("textDocument", &obj.textDocument);
332331
builder.addField("position", &obj.position);
333-
builder.addField("workDoneToken", &obj, StructRttiInfo::Flag::Optional);
334332
builder.ignoreUnknownFields();
335333
return builder.make();
336334
}
@@ -363,10 +361,9 @@ const StructRttiInfo Hover::g_rttiInfo = _makeHoverRtti();
363361
static const StructRttiInfo _makeDefinitionParamsRtti()
364362
{
365363
DefinitionParams obj;
366-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::DefinitionParams", nullptr);
364+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::DefinitionParams", &WorkDoneProgressParams::g_rttiInfo);
367365
builder.addField("textDocument", &obj.textDocument);
368366
builder.addField("position", &obj.position);
369-
builder.addField("workDoneToken", &obj, StructRttiInfo::Flag::Optional);
370367
builder.ignoreUnknownFields();
371368
return builder.make();
372369
}
@@ -377,10 +374,9 @@ const UnownedStringSlice DefinitionParams::methodName =
377374
static const StructRttiInfo _makeCompletionParamsRtti()
378375
{
379376
CompletionParams obj;
380-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionParams", nullptr);
377+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionParams", &WorkDoneProgressParams::g_rttiInfo);
381378
builder.addField("textDocument", &obj.textDocument);
382379
builder.addField("position", &obj.position);
383-
builder.addField("workDoneToken", &obj, StructRttiInfo::Flag::Optional);
384380
builder.ignoreUnknownFields();
385381
return builder.make();
386382
}
@@ -406,9 +402,8 @@ const StructRttiInfo CompletionItem::g_rttiInfo = _makeCompletionItemRtti();
406402
static const StructRttiInfo _makeSemanticTokensParamsRtti()
407403
{
408404
SemanticTokensParams obj;
409-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::SemanticTokensParams", nullptr);
405+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::SemanticTokensParams", &WorkDoneProgressParams::g_rttiInfo);
410406
builder.addField("textDocument", &obj.textDocument);
411-
builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional);
412407
builder.ignoreUnknownFields();
413408
return builder.make();
414409
}
@@ -430,10 +425,9 @@ const StructRttiInfo SemanticTokens::g_rttiInfo = _makeSemanticTokensRtti();
430425
static const StructRttiInfo _makeSignatureHelpParamsRtti()
431426
{
432427
SignatureHelpParams obj;
433-
StructRttiBuilder builder(&obj, "LanguageServerProtocol::SignatureHelpParams", nullptr);
428+
StructRttiBuilder builder(&obj, "LanguageServerProtocol::SignatureHelpParams", &WorkDoneProgressParams::g_rttiInfo);
434429
builder.addField("textDocument", &obj.textDocument);
435430
builder.addField("position", &obj.position);
436-
builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional);
437431
builder.ignoreUnknownFields();
438432
return builder.make();
439433
}

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

+10-12
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,11 @@ struct InitializeResult
245245
static const StructRttiInfo g_rttiInfo;
246246
};
247247

248-
struct ShutdownParams
249-
{
248+
struct ShutdownParams {
250249
static const UnownedStringSlice methodName;
251250
};
252251

253-
struct ExitParams
254-
{
252+
struct ExitParams {
255253
static const UnownedStringSlice methodName;
256254
};
257255

@@ -377,16 +375,16 @@ struct TextDocumentPositionParams
377375
};
378376

379377
struct HoverParams
380-
: TextDocumentPositionParams
381-
, WorkDoneProgressParams
378+
: WorkDoneProgressParams
379+
,TextDocumentPositionParams
382380
{
383381
static const StructRttiInfo g_rttiInfo;
384382
static const UnownedStringSlice methodName;
385383
};
386384

387385
struct DefinitionParams
388-
: TextDocumentPositionParams
389-
, WorkDoneProgressParams
386+
: WorkDoneProgressParams
387+
, TextDocumentPositionParams
390388
{
391389
static const StructRttiInfo g_rttiInfo;
392390
static const UnownedStringSlice methodName;
@@ -424,8 +422,8 @@ struct Hover
424422
};
425423

426424
struct CompletionParams
427-
: TextDocumentPositionParams
428-
, WorkDoneProgressParams
425+
: WorkDoneProgressParams
426+
, TextDocumentPositionParams
429427
{
430428
static const StructRttiInfo g_rttiInfo;
431429
static const UnownedStringSlice methodName;
@@ -532,8 +530,8 @@ struct SemanticTokens
532530
};
533531

534532
struct SignatureHelpParams
535-
: TextDocumentPositionParams
536-
, WorkDoneProgressParams
533+
: WorkDoneProgressParams
534+
, TextDocumentPositionParams
537535
{
538536
static const UnownedStringSlice methodName;
539537

source/core/slang-io.cpp

+85-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "../../slang-com-helper.h"
55

66
#include "slang-string-util.h"
7+
#include "slang-char-util.h"
78

89
#ifndef __STDC__
910
# define __STDC__ 1
@@ -918,7 +919,90 @@ namespace Slang
918919

919920
return SLANG_OK;
920921
}
922+
923+
String URI::getPath() const
924+
{
925+
Index startIndex = uri.indexOf("://");
926+
if (startIndex == -1)
927+
return String();
928+
startIndex += 3;
929+
Index endIndex = uri.indexOf('?');
930+
if (endIndex == -1)
931+
endIndex = uri.getLength();
932+
StringBuilder sb;
933+
#if SLANG_WINDOWS_FAMILY
934+
if (uri[startIndex] == '/')
935+
startIndex++;
936+
#endif
937+
for (Index i = startIndex; i < endIndex;)
938+
{
939+
auto ch = uri[i];
940+
if (ch == '%')
941+
{
942+
Int charVal = CharUtil::getHexDigitValue(uri[i + 1]) * 16 +
943+
CharUtil::getHexDigitValue(uri[i + 2]);
944+
sb.appendChar((char)charVal);
945+
i += 3;
946+
}
947+
else
948+
{
949+
sb.appendChar(uri[i]);
950+
i++;
951+
}
952+
}
953+
return sb.ProduceString();
954+
}
921955

956+
StringSlice URI::getProtocol() const
957+
{
958+
Index separatorIndex = uri.indexOf("://");
959+
if (separatorIndex != -1)
960+
return uri.subString(0, separatorIndex);
961+
return StringSlice();
962+
}
922963

923-
}
964+
bool URI::isSafeURIChar(char ch)
965+
{
966+
return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') ||
967+
ch == '-' || ch == '_' || ch == '/' || ch == '.';
968+
}
924969

970+
URI URI::fromLocalFilePath(UnownedStringSlice path)
971+
{
972+
URI uri;
973+
StringBuilder sb;
974+
sb << "file://";
975+
976+
#if SLANG_WINDOWS_FAMILY
977+
sb << "/";
978+
#endif
979+
980+
for (auto ch : path)
981+
{
982+
if (isSafeURIChar(ch))
983+
{
984+
sb.appendChar(ch);
985+
}
986+
else if (ch == '\\')
987+
{
988+
sb.appendChar('/');
989+
}
990+
else
991+
{
992+
char buffer[32];
993+
int length = IntToAscii(buffer, (int)ch, 16);
994+
ReverseInternalAscii(buffer, length);
995+
sb << "%" << buffer;
996+
}
997+
}
998+
return URI::fromString(sb.getUnownedSlice());
999+
}
1000+
1001+
URI URI::fromString(UnownedStringSlice uriString)
1002+
{
1003+
URI uri;
1004+
uri.uri = uriString;
1005+
return uri;
1006+
}
1007+
1008+
}

source/core/slang-io.h

+17
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,23 @@ namespace Slang
157157
static SlangResult remove(const String& path);
158158
};
159159

160+
struct URI
161+
{
162+
String uri;
163+
bool operator==(const URI& other) const { return uri == other.uri; }
164+
bool operator!=(const URI& other) const { return uri != other.uri; }
165+
166+
HashCode getHashCode() const { return uri.getHashCode(); }
167+
168+
bool isLocalFile() { return uri.startsWith("file://"); };
169+
String getPath() const;
170+
StringSlice getProtocol() const;
171+
172+
static URI fromLocalFilePath(UnownedStringSlice path);
173+
static URI fromString(UnownedStringSlice uriString);
174+
static bool isSafeURIChar(char ch);
175+
};
176+
160177
// Helper class to clean up temporary files on dtor
161178
class TemporaryFileSet: public RefObject
162179
{

source/core/slang-string-util.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -645,4 +645,28 @@ ComPtr<ISlangBlob> StringUtil::createStringBlob(const String& string)
645645
return (cur == end) ? SLANG_OK : SLANG_FAIL;
646646
}
647647

648+
int StringUtil::parseIntAndAdvancePos(UnownedStringSlice text, Index& pos)
649+
{
650+
int result = 0;
651+
while (text[pos] == ' ' && pos < text.getLength())
652+
{
653+
pos++;
654+
continue;
655+
}
656+
while (pos < text.getLength())
657+
{
658+
if (text[pos] >= '0' && text[pos] <= '9')
659+
{
660+
result *= 10;
661+
result += text[pos] - '0';
662+
pos++;
663+
}
664+
else
665+
{
666+
break;
667+
}
668+
}
669+
return result;
670+
}
671+
648672
} // namespace Slang

0 commit comments

Comments
 (0)