From 4d517794eaac7dfe6196e9a36d709d66c5720492 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 17 Jun 2025 21:36:10 -0700 Subject: LanguageServer: Enhance auto completion for override. (#7465) * Add additional completion keywords. * LanguageServer: Enhance auto completion for `override`. --- source/compiler-core/slang-json-native.cpp | 34 +++++++++++++++++++++ source/compiler-core/slang-json-value.h | 35 ++++++++++++++++++++++ .../slang-language-server-protocol.cpp | 1 + .../compiler-core/slang-language-server-protocol.h | 7 +++++ 4 files changed, 77 insertions(+) (limited to 'source/compiler-core') diff --git a/source/compiler-core/slang-json-native.cpp b/source/compiler-core/slang-json-native.cpp index 1f9a4dbc6..930aa611f 100644 --- a/source/compiler-core/slang-json-native.cpp +++ b/source/compiler-core/slang-json-native.cpp @@ -205,6 +205,22 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo* *(UnownedStringSlice*)out = m_container->getString(in); return SLANG_OK; } + case RttiInfo::Kind::Optional: + { + if (in.getKind() == JSONValue::Kind::Null) + { + return SLANG_OK; + } + typedef List Type; + const OptionalRttiInfo* optionalRttiInfo = + static_cast(rttiInfo); + auto hasValue = (uint8_t*)out; + *hasValue = 1; + return convert( + in, + optionalRttiInfo->m_elementType, + (uint8_t*)out + optionalRttiInfo->m_valueOffset); + } case RttiInfo::Kind::List: { if (in.getKind() == JSONValue::Kind::Null) @@ -441,6 +457,24 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void* { return SLANG_E_NOT_IMPLEMENTED; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = + static_cast(rttiInfo); + auto hasValue = (const uint8_t*)in; + if (*hasValue) + { + return convert( + optionalRttiInfo->m_elementType, + (const uint8_t*)in + optionalRttiInfo->m_valueOffset, + out); + } + else + { + out = JSONValue::makeNull(); + return SLANG_OK; + } + } case RttiInfo::Kind::List: { const ListRttiInfo* listRttiInfo = static_cast(rttiInfo); diff --git a/source/compiler-core/slang-json-value.h b/source/compiler-core/slang-json-value.h index d9b17f1d5..ae0123d30 100644 --- a/source/compiler-core/slang-json-value.h +++ b/source/compiler-core/slang-json-value.h @@ -8,6 +8,8 @@ #include "slang-json-parser.h" #include "slang-source-loc.h" +#include + namespace Slang { @@ -439,6 +441,39 @@ protected: List m_objectValues; }; +template +class JSONOptional +{ +public: + bool hasValue = false; + T value; + JSONOptional() = default; + JSONOptional(std::nullopt_t) {} + JSONOptional(const T& inValue) + : hasValue(true), value(inValue) + { + } +}; + +template +struct GetRttiInfo> +{ + static const OptionalRttiInfo _make() + { + OptionalRttiInfo info; + info.init>(RttiInfo::Kind::Optional); + info.m_elementType = GetRttiInfo::get(); + info.m_valueOffset = (uint32_t)offsetof(JSONOptional, value); + return info; + } + static const RttiInfo* get() + { + static const OptionalRttiInfo g_info = _make(); + return &g_info; + } +}; + + class JSONBuilder : public JSONListener { public: diff --git a/source/compiler-core/slang-language-server-protocol.cpp b/source/compiler-core/slang-language-server-protocol.cpp index 9a382e756..2530120d3 100644 --- a/source/compiler-core/slang-language-server-protocol.cpp +++ b/source/compiler-core/slang-language-server-protocol.cpp @@ -522,6 +522,7 @@ static const StructRttiInfo _makeCompletionItemRtti() builder.addField("label", &obj.label, StructRttiInfo::Flag::Optional); builder.addField("detail", &obj.detail, StructRttiInfo::Flag::Optional); builder.addField("kind", &obj.kind, StructRttiInfo::Flag::Optional); + builder.addField("sortText", &obj.sortText, StructRttiInfo::Flag::Optional); builder.addField("documentation", &obj.documentation, StructRttiInfo::Flag::Optional); builder.addField("data", &obj.data, StructRttiInfo::Flag::Optional); builder.addField("commitCharacters", &obj.commitCharacters, StructRttiInfo::Flag::Optional); diff --git a/source/compiler-core/slang-language-server-protocol.h b/source/compiler-core/slang-language-server-protocol.h index d96099da6..ff933e867 100644 --- a/source/compiler-core/slang-language-server-protocol.h +++ b/source/compiler-core/slang-language-server-protocol.h @@ -610,6 +610,13 @@ struct CompletionItem */ String detail; + /** + * A string that should be used when comparing this item + * with other items. When omitted the label is used + * as the sort text for this item. + */ + JSONOptional sortText; + /** * A human-readable string that represents a doc-comment. */ -- cgit v1.2.3