diff options
| author | Yong He <yonghe@outlook.com> | 2022-06-13 12:20:35 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-13 12:20:35 -0700 |
| commit | c90c6ab750ab05dd6d337e4f857958b8f3d00153 (patch) | |
| tree | 569085637c5d3de33d7aaec8ab8c0e84be49bfd0 /source/compiler-core | |
| parent | 68d9d87f9385a8c7c29443dcfcbf70434dc889bd (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.cpp | 2 | ||||
| -rw-r--r-- | source/compiler-core/slang-language-server-protocol.cpp | 104 | ||||
| -rw-r--r-- | source/compiler-core/slang-language-server-protocol.h | 114 |
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 |
