diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/compiler-core/slang-json-native.cpp | 2 | ||||
| -rw-r--r-- | source/compiler-core/slang-language-server-protocol.cpp (renamed from source/slang/slang-language-server-protocol.cpp) | 38 | ||||
| -rw-r--r-- | source/compiler-core/slang-language-server-protocol.h (renamed from source/slang/slang-language-server-protocol.h) | 22 | ||||
| -rw-r--r-- | source/core/slang-io.cpp | 86 | ||||
| -rw-r--r-- | source/core/slang-io.h | 17 | ||||
| -rw-r--r-- | source/core/slang-string-util.cpp | 24 | ||||
| -rw-r--r-- | source/core/slang-string-util.h | 5 | ||||
| -rw-r--r-- | source/slang/slang-check-modifier.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-language-server.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-workspace-version.cpp | 96 | ||||
| -rw-r--r-- | source/slang/slang-workspace-version.h | 22 |
11 files changed, 168 insertions, 148 deletions
diff --git a/source/compiler-core/slang-json-native.cpp b/source/compiler-core/slang-json-native.cpp index d268fffc2..c7a90df4c 100644 --- a/source/compiler-core/slang-json-native.cpp +++ b/source/compiler-core/slang-json-native.cpp @@ -308,7 +308,7 @@ SlangResult NativeToJSONConverter::_structToJSON(const StructRttiInfo* structRtt // Do the super class first if (structRttiInfo->m_super) { - SLANG_RETURN_ON_FAIL(_structToJSON(structRttiInfo, src, outPairs)); + SLANG_RETURN_ON_FAIL(_structToJSON(structRttiInfo->m_super, src, outPairs)); } const Byte* base = (const Byte*)src; diff --git a/source/slang/slang-language-server-protocol.cpp b/source/compiler-core/slang-language-server-protocol.cpp index c557be7ec..3e8907b9a 100644 --- a/source/slang/slang-language-server-protocol.cpp +++ b/source/compiler-core/slang-language-server-protocol.cpp @@ -15,14 +15,23 @@ static const StructRttiInfo _makeTextDocumentSyncOptionsRtti() } const StructRttiInfo TextDocumentSyncOptions::g_rttiInfo = _makeTextDocumentSyncOptionsRtti(); +static const StructRttiInfo _makeWorkDoneProgressParamsRtti() +{ + WorkDoneProgressParams obj; + StructRttiBuilder builder(&obj, "LanguageServerProtocol::WorkDoneProgressParams", nullptr); + builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional); + builder.ignoreUnknownFields(); + return builder.make(); +} +const StructRttiInfo WorkDoneProgressParams::g_rttiInfo = _makeWorkDoneProgressParamsRtti(); + static const StructRttiInfo _makeCompletionOptionsRtti() { CompletionOptions obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionOptions", nullptr); + StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionOptions", &WorkDoneProgressParams::g_rttiInfo); builder.addField("triggerCharacters", &obj.triggerCharacters); builder.addField("resolveProvider", &obj.resolveProvider); builder.addField("allCommitCharacters", &obj.allCommitCharacters); - builder.addField("workDoneToken", &obj.workDoneToken); builder.ignoreUnknownFields(); return builder.make(); } @@ -314,23 +323,12 @@ static const StructRttiInfo _makeTextDocumentPositionParamsRtti() } const StructRttiInfo TextDocumentPositionParams::g_rttiInfo = _makeTextDocumentPositionParamsRtti(); -static const StructRttiInfo _makeWorkDoneProgressParamsRtti() -{ - WorkDoneProgressParams obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::WorkDoneProgressParams", nullptr); - builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional); - builder.ignoreUnknownFields(); - return builder.make(); -} -const StructRttiInfo WorkDoneProgressParams::g_rttiInfo = _makeWorkDoneProgressParamsRtti(); - static const StructRttiInfo _makeHoverParamsRtti() { HoverParams obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::HoverParams", nullptr); + StructRttiBuilder builder(&obj, "LanguageServerProtocol::HoverParams", &WorkDoneProgressParams::g_rttiInfo); builder.addField("textDocument", &obj.textDocument); builder.addField("position", &obj.position); - builder.addField("workDoneToken", &obj, StructRttiInfo::Flag::Optional); builder.ignoreUnknownFields(); return builder.make(); } @@ -363,10 +361,9 @@ const StructRttiInfo Hover::g_rttiInfo = _makeHoverRtti(); static const StructRttiInfo _makeDefinitionParamsRtti() { DefinitionParams obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::DefinitionParams", nullptr); + StructRttiBuilder builder(&obj, "LanguageServerProtocol::DefinitionParams", &WorkDoneProgressParams::g_rttiInfo); builder.addField("textDocument", &obj.textDocument); builder.addField("position", &obj.position); - builder.addField("workDoneToken", &obj, StructRttiInfo::Flag::Optional); builder.ignoreUnknownFields(); return builder.make(); } @@ -377,10 +374,9 @@ const UnownedStringSlice DefinitionParams::methodName = static const StructRttiInfo _makeCompletionParamsRtti() { CompletionParams obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionParams", nullptr); + StructRttiBuilder builder(&obj, "LanguageServerProtocol::CompletionParams", &WorkDoneProgressParams::g_rttiInfo); builder.addField("textDocument", &obj.textDocument); builder.addField("position", &obj.position); - builder.addField("workDoneToken", &obj, StructRttiInfo::Flag::Optional); builder.ignoreUnknownFields(); return builder.make(); } @@ -406,9 +402,8 @@ const StructRttiInfo CompletionItem::g_rttiInfo = _makeCompletionItemRtti(); static const StructRttiInfo _makeSemanticTokensParamsRtti() { SemanticTokensParams obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::SemanticTokensParams", nullptr); + StructRttiBuilder builder(&obj, "LanguageServerProtocol::SemanticTokensParams", &WorkDoneProgressParams::g_rttiInfo); builder.addField("textDocument", &obj.textDocument); - builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional); builder.ignoreUnknownFields(); return builder.make(); } @@ -430,10 +425,9 @@ const StructRttiInfo SemanticTokens::g_rttiInfo = _makeSemanticTokensRtti(); static const StructRttiInfo _makeSignatureHelpParamsRtti() { SignatureHelpParams obj; - StructRttiBuilder builder(&obj, "LanguageServerProtocol::SignatureHelpParams", nullptr); + StructRttiBuilder builder(&obj, "LanguageServerProtocol::SignatureHelpParams", &WorkDoneProgressParams::g_rttiInfo); builder.addField("textDocument", &obj.textDocument); builder.addField("position", &obj.position); - builder.addField("workDoneToken", &obj.workDoneToken, StructRttiInfo::Flag::Optional); builder.ignoreUnknownFields(); return builder.make(); } diff --git a/source/slang/slang-language-server-protocol.h b/source/compiler-core/slang-language-server-protocol.h index 29fbaa701..a23ba0130 100644 --- a/source/slang/slang-language-server-protocol.h +++ b/source/compiler-core/slang-language-server-protocol.h @@ -245,13 +245,11 @@ struct InitializeResult static const StructRttiInfo g_rttiInfo; }; -struct ShutdownParams -{ +struct ShutdownParams { static const UnownedStringSlice methodName; }; -struct ExitParams -{ +struct ExitParams { static const UnownedStringSlice methodName; }; @@ -377,16 +375,16 @@ struct TextDocumentPositionParams }; struct HoverParams - : TextDocumentPositionParams - , WorkDoneProgressParams + : WorkDoneProgressParams + ,TextDocumentPositionParams { static const StructRttiInfo g_rttiInfo; static const UnownedStringSlice methodName; }; struct DefinitionParams - : TextDocumentPositionParams - , WorkDoneProgressParams + : WorkDoneProgressParams + , TextDocumentPositionParams { static const StructRttiInfo g_rttiInfo; static const UnownedStringSlice methodName; @@ -424,8 +422,8 @@ struct Hover }; struct CompletionParams - : TextDocumentPositionParams - , WorkDoneProgressParams + : WorkDoneProgressParams + , TextDocumentPositionParams { static const StructRttiInfo g_rttiInfo; static const UnownedStringSlice methodName; @@ -532,8 +530,8 @@ struct SemanticTokens }; struct SignatureHelpParams - : TextDocumentPositionParams - , WorkDoneProgressParams + : WorkDoneProgressParams + , TextDocumentPositionParams { static const UnownedStringSlice methodName; diff --git a/source/core/slang-io.cpp b/source/core/slang-io.cpp index 162e49980..c11ba85e0 100644 --- a/source/core/slang-io.cpp +++ b/source/core/slang-io.cpp @@ -4,6 +4,7 @@ #include "../../slang-com-helper.h" #include "slang-string-util.h" +#include "slang-char-util.h" #ifndef __STDC__ # define __STDC__ 1 @@ -918,7 +919,90 @@ namespace Slang return SLANG_OK; } + + String URI::getPath() const + { + Index startIndex = uri.indexOf("://"); + if (startIndex == -1) + return String(); + startIndex += 3; + Index endIndex = uri.indexOf('?'); + if (endIndex == -1) + endIndex = uri.getLength(); + StringBuilder sb; +#if SLANG_WINDOWS_FAMILY + if (uri[startIndex] == '/') + startIndex++; +#endif + for (Index i = startIndex; i < endIndex;) + { + auto ch = uri[i]; + if (ch == '%') + { + Int charVal = CharUtil::getHexDigitValue(uri[i + 1]) * 16 + + CharUtil::getHexDigitValue(uri[i + 2]); + sb.appendChar((char)charVal); + i += 3; + } + else + { + sb.appendChar(uri[i]); + i++; + } + } + return sb.ProduceString(); + } + StringSlice URI::getProtocol() const + { + Index separatorIndex = uri.indexOf("://"); + if (separatorIndex != -1) + return uri.subString(0, separatorIndex); + return StringSlice(); + } -} + bool URI::isSafeURIChar(char ch) + { + return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || + ch == '-' || ch == '_' || ch == '/' || ch == '.'; + } + URI URI::fromLocalFilePath(UnownedStringSlice path) + { + URI uri; + StringBuilder sb; + sb << "file://"; + +#if SLANG_WINDOWS_FAMILY + sb << "/"; +#endif + + for (auto ch : path) + { + if (isSafeURIChar(ch)) + { + sb.appendChar(ch); + } + else if (ch == '\\') + { + sb.appendChar('/'); + } + else + { + char buffer[32]; + int length = IntToAscii(buffer, (int)ch, 16); + ReverseInternalAscii(buffer, length); + sb << "%" << buffer; + } + } + return URI::fromString(sb.getUnownedSlice()); + } + + URI URI::fromString(UnownedStringSlice uriString) + { + URI uri; + uri.uri = uriString; + return uri; + } + +} diff --git a/source/core/slang-io.h b/source/core/slang-io.h index de761cf4b..51b1d45e5 100644 --- a/source/core/slang-io.h +++ b/source/core/slang-io.h @@ -157,6 +157,23 @@ namespace Slang static SlangResult remove(const String& path); }; + struct URI + { + String uri; + bool operator==(const URI& other) const { return uri == other.uri; } + bool operator!=(const URI& other) const { return uri != other.uri; } + + HashCode getHashCode() const { return uri.getHashCode(); } + + bool isLocalFile() { return uri.startsWith("file://"); }; + String getPath() const; + StringSlice getProtocol() const; + + static URI fromLocalFilePath(UnownedStringSlice path); + static URI fromString(UnownedStringSlice uriString); + static bool isSafeURIChar(char ch); + }; + // Helper class to clean up temporary files on dtor class TemporaryFileSet: public RefObject { diff --git a/source/core/slang-string-util.cpp b/source/core/slang-string-util.cpp index 5282f01a6..c4b654072 100644 --- a/source/core/slang-string-util.cpp +++ b/source/core/slang-string-util.cpp @@ -645,4 +645,28 @@ ComPtr<ISlangBlob> StringUtil::createStringBlob(const String& string) return (cur == end) ? SLANG_OK : SLANG_FAIL; } +int StringUtil::parseIntAndAdvancePos(UnownedStringSlice text, Index& pos) +{ + int result = 0; + while (text[pos] == ' ' && pos < text.getLength()) + { + pos++; + continue; + } + while (pos < text.getLength()) + { + if (text[pos] >= '0' && text[pos] <= '9') + { + result *= 10; + result += text[pos] - '0'; + pos++; + } + else + { + break; + } + } + return result; +} + } // namespace Slang diff --git a/source/core/slang-string-util.h b/source/core/slang-string-util.h index 03f503ed2..b7576da1d 100644 --- a/source/core/slang-string-util.h +++ b/source/core/slang-string-util.h @@ -109,6 +109,11 @@ struct StringUtil /// Convert into int64_t. Returns SLANG_OK on success. static SlangResult parseInt64(const UnownedStringSlice& text, int64_t& out); + + /// Parse an integer from text starting at pos until the end or the first non-digit char. + /// Modifies pos to the position where parsing ends. + /// Returns parsed integer. + static int parseIntAndAdvancePos(UnownedStringSlice text, Index& pos); }; /* A helper class that allows parsing of lines from text with iteration. Uses StringUtil::extractLine for the actual underlying implementation. */ diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 1d9e30c95..176609106 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -80,6 +80,8 @@ namespace Slang AttributeDecl* SemanticsVisitor::lookUpAttributeDecl(Name* attributeName, Scope* scope) { + if (!attributeName) + return nullptr; // We start by looking for an existing attribute matching // the name `attributeName`. // diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp index dc3b4fe89..180e17ed9 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -13,7 +13,7 @@ #include "../core/slang-range.h" #include "../../slang-com-helper.h" #include "../compiler-core/slang-json-rpc-connection.h" -#include "slang-language-server-protocol.h" +#include "../compiler-core/slang-language-server-protocol.h" #include "slang-language-server.h" #include "slang-workspace-version.h" #include "slang-language-server-ast-lookup.h" diff --git a/source/slang/slang-workspace-version.cpp b/source/slang/slang-workspace-version.cpp index 29404c2d0..1e92c31ca 100644 --- a/source/slang/slang-workspace-version.cpp +++ b/source/slang/slang-workspace-version.cpp @@ -1,7 +1,6 @@ #include "slang-workspace-version.h" #include "../core/slang-io.h" #include "../core/slang-file-system.h" -#include "../core/slang-char-util.h" #include "../compiler-core/slang-lexer.h" namespace Slang @@ -93,18 +92,18 @@ void parseDiagnostics(Dictionary<String, DocumentDiagnostics>& diagnostics, Stri LanguageServerProtocol::Diagnostic diagnostic; Index pos = lparentIndex + 1; - int lineLoc = StringUtil::parseInt(line, pos); + int lineLoc = StringUtil::parseIntAndAdvancePos(line, pos); if (lineLoc == 0) lineLoc = 1; diagnostic.range.end.line = diagnostic.range.start.line = lineLoc - 1; pos++; - int colLoc = StringUtil::parseInt(line, pos); + int colLoc = StringUtil::parseIntAndAdvancePos(line, pos); if (colLoc == 0) colLoc = 1; diagnostic.range.end.character = diagnostic.range.start.character = colLoc - 1; if (pos >= line.getLength()) continue; - line = line.subString(colonIndex + 3, line.getLength()); + line = line.tail(colonIndex + 3); colonIndex = line.indexOf(':'); if (colonIndex == -1) continue; @@ -125,13 +124,13 @@ void parseDiagnostics(Dictionary<String, DocumentDiagnostics>& diagnostics, Stri continue; } pos = line.indexOf(' '); - diagnostic.code = StringUtil::parseInt(line, pos); - diagnostic.message = line.subString(colonIndex + 2, line.getLength()); + diagnostic.code = StringUtil::parseIntAndAdvancePos(line, pos); + diagnostic.message = line.tail(colonIndex + 2); if (lineIndex + 1 < lines.getCount() && lines[lineIndex].startsWith("^+")) { lineIndex++; pos = 2; - auto tokenLength = StringUtil::parseInt(lines[lineIndex], pos); + auto tokenLength = StringUtil::parseIntAndAdvancePos(line, pos); diagnostic.range.end.character += tokenLength; } diagnosticList.messages.Add(diagnostic); @@ -192,89 +191,6 @@ void* Workspace::getInterface(const Guid& uuid) return nullptr; } -String URI::getPath() const -{ - Index startIndex = uri.indexOf("://"); - if (startIndex == -1) return String(); - startIndex += 3; - Index endIndex = uri.indexOf('?'); - if (endIndex == -1) - endIndex = uri.getLength(); - StringBuilder sb; -#if SLANG_WINDOWS_FAMILY - if (uri[startIndex] == '/') - startIndex++; -#endif - for (Index i = startIndex; i < endIndex;) - { - auto ch = uri[i]; - if (ch == '%') - { - Int charVal = CharUtil::getHexDigitValue(uri[i + 1]) * 16 + - CharUtil::getHexDigitValue(uri[i + 2]); - sb.appendChar((char)charVal); - i += 3; - } - else - { - sb.appendChar(uri[i]); - i++; - } - } - return sb.ProduceString(); -} - -StringSlice URI::getProtocol() const -{ - Index separatorIndex = uri.indexOf("://"); - if (separatorIndex != -1) - return uri.subString(0, separatorIndex); - return StringSlice(); -} - -bool URI::isSafeURIChar(char ch) -{ - return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || - ch == '-' || ch == '_' || ch == '/' || ch == '.'; -} - -URI URI::fromLocalFilePath(UnownedStringSlice path) -{ - URI uri; - StringBuilder sb; - sb << "file://"; - -#if SLANG_WINDOWS_FAMILY - sb << "/"; -#endif - - for (auto ch : path) - { - if (isSafeURIChar(ch)) - { - sb.appendChar(ch); - } - else if (ch == '\\') - { - sb.appendChar('/'); - } - else - { - char buffer[32]; - int length = IntToAscii(buffer, (int)ch, 16); - ReverseInternalAscii(buffer, length); - sb << "%" << buffer; - } - } - return URI::fromString(sb.getUnownedSlice()); -} - -URI URI::fromString(UnownedStringSlice uriString) -{ - URI uri; - uri.uri = uriString; - return uri; -} void DocumentVersion::setText(const String& newText) { text = newText; diff --git a/source/slang/slang-workspace-version.h b/source/slang/slang-workspace-version.h index 58811ed7d..2aa2619f1 100644 --- a/source/slang/slang-workspace-version.h +++ b/source/slang/slang-workspace-version.h @@ -5,32 +5,12 @@ #include "../../slang.h" #include "../core/slang-basic.h" #include "../core/slang-com-object.h" -#include "slang-language-server-protocol.h" +#include "../compiler-core/slang-language-server-protocol.h" #include "slang-compiler.h" #include "slang-doc-ast.h" namespace Slang { - struct URI - { - String uri; - bool operator==(const URI& other) const - { - return uri == other.uri; - } - bool operator!=(const URI& other) const { return uri != other.uri; } - - HashCode getHashCode() const { return uri.getHashCode(); } - - bool isLocalFile() { return uri.startsWith("file://"); }; - String getPath() const; - StringSlice getProtocol() const; - - static URI fromLocalFilePath(UnownedStringSlice path); - static URI fromString(UnownedStringSlice uriString); - static bool isSafeURIChar(char ch); - }; - class Workspace; class DocumentVersion : public RefObject |
