summaryrefslogtreecommitdiffstats
path: root/source/compiler-core
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-06-13 12:20:35 -0700
committerGitHub <noreply@github.com>2022-06-13 12:20:35 -0700
commitc90c6ab750ab05dd6d337e4f857958b8f3d00153 (patch)
tree569085637c5d3de33d7aaec8ab8c0e84be49bfd0 /source/compiler-core
parent68d9d87f9385a8c7c29443dcfcbf70434dc889bd (diff)
Language Server improvements. (#2269)
* Language Server improvements. - Improve parser robustness around `attribute_syntax`. - Exclude instance members in a static query. - Coloring accessors - Improved signature help cursor range check. * Add expected test result. * Language server: support configuring predefined macros. * Fix constructor highlighting. * Improving performance by supporting incremental text change notifications. * Fix UTF16 positions and highlighting of constructor calls. * Add completion suggestions for HLSL semantics. * Fix tests. * Fix: don't skip static variables in a static query. * Include literal init expr value in hover text. * Fix scenarios where completion failed to trigger. * Fixing language server protocol field initializations. Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/compiler-core')
-rw-r--r--source/compiler-core/slang-diagnostic-sink.cpp2
-rw-r--r--source/compiler-core/slang-language-server-protocol.cpp104
-rw-r--r--source/compiler-core/slang-language-server-protocol.h114
3 files changed, 217 insertions, 3 deletions
diff --git a/source/compiler-core/slang-diagnostic-sink.cpp b/source/compiler-core/slang-diagnostic-sink.cpp
index 0110b16d7..c934157d2 100644
--- a/source/compiler-core/slang-diagnostic-sink.cpp
+++ b/source/compiler-core/slang-diagnostic-sink.cpp
@@ -570,7 +570,7 @@ void DiagnosticSink::diagnoseImpl(DiagnosticInfo const& info, const UnownedStrin
m_parentSink->diagnoseImpl(info, formattedMessage);
}
- if (info.severity >= Severity::Fatal)
+ if (getEffectiveMessageSeverity(info) >= Severity::Fatal)
{
// TODO: figure out a better policy for aborting compilation
SLANG_ABORT_COMPILATION("");
diff --git a/source/compiler-core/slang-language-server-protocol.cpp b/source/compiler-core/slang-language-server-protocol.cpp
index 3e8907b9a..713d209dd 100644
--- a/source/compiler-core/slang-language-server-protocol.cpp
+++ b/source/compiler-core/slang-language-server-protocol.cpp
@@ -181,12 +181,35 @@ const StructRttiInfo DidCloseTextDocumentParams::g_rttiInfo = _makeDidCloseTextD
const UnownedStringSlice DidCloseTextDocumentParams::methodName =
UnownedStringSlice::fromLiteral("textDocument/didClose");
+static const StructRttiInfo _makeWorkspaceFoldersServerCapabilitiesRtti()
+{
+ WorkspaceFoldersServerCapabilities obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::WorkspaceFoldersServerCapabilities", nullptr);
+ builder.addField("supported", &obj.supported);
+ builder.addField("changeNotifications", &obj.changeNotifications);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo WorkspaceFoldersServerCapabilities::g_rttiInfo =
+ _makeWorkspaceFoldersServerCapabilitiesRtti();
+
+static const StructRttiInfo _makeWorkspaceCapabilitiesRtti()
+{
+ WorkspaceCapabilities obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::WorkspaceCapabilities", nullptr);
+ builder.addField("workspaceFolders", &obj.workspaceFolders);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo WorkspaceCapabilities::g_rttiInfo = _makeWorkspaceCapabilitiesRtti();
+
static const StructRttiInfo _makeServerCapabilitiesRtti()
{
ServerCapabilities obj;
StructRttiBuilder builder(&obj, "LanguageServerProtocol::ServerCapabilities", nullptr);
builder.addField("positionEncoding", &obj.positionEncoding);
builder.addField("textDocumentSync", &obj.textDocumentSync);
+ builder.addField("workspace", &obj.workspace);
builder.addField("hoverProvider", &obj.hoverProvider);
builder.addField("definitionProvider", &obj.definitionProvider);
builder.addField("completionProvider", &obj.completionProvider);
@@ -470,6 +493,87 @@ static const StructRttiInfo _makeSignatureHelpRtti()
}
const StructRttiInfo SignatureHelp::g_rttiInfo = _makeSignatureHelpRtti();
+static const StructRttiInfo _makeDidChangeConfigurationParamsRtti()
+{
+ DidChangeConfigurationParams obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::DidChangeConfigurationParams", nullptr);
+ builder.addField("settings", &obj.settings, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo DidChangeConfigurationParams::g_rttiInfo =
+ _makeDidChangeConfigurationParamsRtti();
+const UnownedStringSlice DidChangeConfigurationParams::methodName =
+ UnownedStringSlice::fromLiteral("workspace/didChangeConfiguration");
+
+static const StructRttiInfo _makeConfigurationItemRtti()
+{
+ ConfigurationItem obj;
+ StructRttiBuilder builder(
+ &obj, "LanguageServerProtocol::ConfigurationItem", nullptr);
+ builder.addField("section", &obj.section, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo ConfigurationItem::g_rttiInfo = _makeConfigurationItemRtti();
+
+static const StructRttiInfo _makeConfigurationParamsRtti()
+{
+ ConfigurationParams obj;
+ StructRttiBuilder builder(
+ &obj, "LanguageServerProtocol::ConfigurationParams", nullptr);
+ builder.addField("items", &obj.items, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo ConfigurationParams::g_rttiInfo = _makeConfigurationParamsRtti();
+const UnownedStringSlice ConfigurationParams::methodName =
+ UnownedStringSlice::fromLiteral("workspace/configuration");
+
+static const StructRttiInfo _makeRegistrationRtti()
+{
+ Registration obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::Registration", nullptr);
+ builder.addField("id", &obj.id, StructRttiInfo::Flag::Optional);
+ builder.addField("method", &obj.method, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo Registration::g_rttiInfo = _makeRegistrationRtti();
+
+static const StructRttiInfo _makeRegistrationParamsRtti()
+{
+ RegistrationParams obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::RegistrationParams", nullptr);
+ builder.addField("registrations", &obj.registrations, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo RegistrationParams::g_rttiInfo = _makeRegistrationParamsRtti();
+
+static const StructRttiInfo _makeCancelParamsRtti()
+{
+ CancelParams obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::CancelParams", nullptr);
+ builder.addField("id", &obj.id, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo CancelParams::g_rttiInfo = _makeCancelParamsRtti();
+
+static const StructRttiInfo _makeLogMessageParamsRtti()
+{
+ LogMessageParams obj;
+ StructRttiBuilder builder(&obj, "LanguageServerProtocol::LogMessageParams", nullptr);
+ builder.addField("type", &obj.type, StructRttiInfo::Flag::Optional);
+ builder.addField("message", &obj.message, StructRttiInfo::Flag::Optional);
+ builder.ignoreUnknownFields();
+ return builder.make();
+}
+const StructRttiInfo LogMessageParams::g_rttiInfo = _makeLogMessageParamsRtti();
+const UnownedStringSlice LogMessageParams::methodName =
+ UnownedStringSlice::fromLiteral("window/logMessage");
+
} // namespace LanguageServerProtocol
}
diff --git a/source/compiler-core/slang-language-server-protocol.h b/source/compiler-core/slang-language-server-protocol.h
index e1ac47beb..11446bd0b 100644
--- a/source/compiler-core/slang-language-server-protocol.h
+++ b/source/compiler-core/slang-language-server-protocol.h
@@ -205,6 +205,33 @@ struct DidCloseTextDocumentParams
static const UnownedStringSlice methodName;
};
+struct WorkspaceFoldersServerCapabilities
+{
+ /**
+ * The server has support for workspace folders
+ */
+ bool supported = false;
+
+ /**
+ * Whether the server wants to receive workspace folder
+ * change notifications.
+ *
+ * If a string is provided, the string is treated as an ID
+ * under which the notification is registered on the client
+ * side. The ID can be used to unregister for these events
+ * using the `client/unregisterCapability` request.
+ */
+ bool changeNotifications = false;
+
+ static const StructRttiInfo g_rttiInfo;
+};
+
+struct WorkspaceCapabilities
+{
+ WorkspaceFoldersServerCapabilities workspaceFolders;
+ static const StructRttiInfo g_rttiInfo;
+};
+
struct ServerCapabilities
{
String positionEncoding;
@@ -214,6 +241,7 @@ struct ServerCapabilities
CompletionOptions completionProvider;
SemanticTokensOptions semanticTokensProvider;
SignatureHelpOptions signatureHelpProvider;
+ WorkspaceCapabilities workspace;
static const StructRttiInfo g_rttiInfo;
};
@@ -245,11 +273,13 @@ struct InitializeResult
static const StructRttiInfo g_rttiInfo;
};
-struct ShutdownParams {
+struct ShutdownParams
+{
static const UnownedStringSlice methodName;
};
-struct ExitParams {
+struct ExitParams
+{
static const UnownedStringSlice methodName;
};
@@ -630,5 +660,85 @@ struct SignatureHelp
};
+struct DidChangeConfigurationParams
+{
+ /**
+ * The actual changed settings
+ */
+ JSONValue settings = JSONValue::makeInvalid();
+
+ static const StructRttiInfo g_rttiInfo;
+
+ static const UnownedStringSlice methodName;
+};
+
+struct ConfigurationItem
+{
+ /**
+ * The configuration section asked for.
+ */
+ String section;
+
+ static const StructRttiInfo g_rttiInfo;
+};
+
+struct ConfigurationParams
+{
+ List<ConfigurationItem> items;
+
+ static const StructRttiInfo g_rttiInfo;
+
+ static const UnownedStringSlice methodName;
+};
+
+struct Registration
+{
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again.
+ */
+ String id;
+
+ /**
+ * The method / capability to register for.
+ */
+ String method;
+
+ static const StructRttiInfo g_rttiInfo;
+};
+
+struct RegistrationParams
+{
+ List<Registration> registrations;
+
+ static const StructRttiInfo g_rttiInfo;
+};
+
+struct CancelParams
+{
+ /**
+ * The request id to cancel.
+ */
+ int64_t id = 0;
+
+ static const StructRttiInfo g_rttiInfo;
+};
+
+struct LogMessageParams
+{
+ /**
+ * The message type. See {@link MessageType}
+ */
+ int type = 0;
+
+ /**
+ * The actual message
+ */
+ String message;
+
+ static const StructRttiInfo g_rttiInfo;
+ static const UnownedStringSlice methodName;
+};
+
} // namespace LanguageServerProtocol
} // namespace Slang