summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/compiler-core/slang-json-native.cpp2
-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.cpp86
-rw-r--r--source/core/slang-io.h17
-rw-r--r--source/core/slang-string-util.cpp24
-rw-r--r--source/core/slang-string-util.h5
-rw-r--r--source/slang/slang-check-modifier.cpp2
-rw-r--r--source/slang/slang-language-server.cpp2
-rw-r--r--source/slang/slang-workspace-version.cpp96
-rw-r--r--source/slang/slang-workspace-version.h22
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