summaryrefslogtreecommitdiffstats
path: root/source/compiler-core
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-06-17 21:36:10 -0700
committerGitHub <noreply@github.com>2025-06-17 21:36:10 -0700
commit4d517794eaac7dfe6196e9a36d709d66c5720492 (patch)
treea7e65d8307b4e25f2a7bafcc9a2de1666c8b689e /source/compiler-core
parentb9799e6137fb1d173cefd823521bb70b09ac435a (diff)
LanguageServer: Enhance auto completion for override. (#7465)
* Add additional completion keywords. * LanguageServer: Enhance auto completion for `override`.
Diffstat (limited to 'source/compiler-core')
-rw-r--r--source/compiler-core/slang-json-native.cpp34
-rw-r--r--source/compiler-core/slang-json-value.h35
-rw-r--r--source/compiler-core/slang-language-server-protocol.cpp1
-rw-r--r--source/compiler-core/slang-language-server-protocol.h7
4 files changed, 77 insertions, 0 deletions
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<Byte> Type;
+ const OptionalRttiInfo* optionalRttiInfo =
+ static_cast<const OptionalRttiInfo*>(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<const OptionalRttiInfo*>(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<const ListRttiInfo*>(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 <optional>
+
namespace Slang
{
@@ -439,6 +441,39 @@ protected:
List<JSONKeyValue> m_objectValues;
};
+template<typename T>
+class JSONOptional
+{
+public:
+ bool hasValue = false;
+ T value;
+ JSONOptional() = default;
+ JSONOptional(std::nullopt_t) {}
+ JSONOptional(const T& inValue)
+ : hasValue(true), value(inValue)
+ {
+ }
+};
+
+template<typename T>
+struct GetRttiInfo<JSONOptional<T>>
+{
+ static const OptionalRttiInfo _make()
+ {
+ OptionalRttiInfo info;
+ info.init<JSONOptional<T>>(RttiInfo::Kind::Optional);
+ info.m_elementType = GetRttiInfo<T>::get();
+ info.m_valueOffset = (uint32_t)offsetof(JSONOptional<T>, 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
@@ -611,6 +611,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<String> sortText;
+
+ /**
* A human-readable string that represents a doc-comment.
*/
MarkupContent documentation;