Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions source/compiler-core/slang-json-native.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
35 changes: 35 additions & 0 deletions source/compiler-core/slang-json-value.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "slang-json-parser.h"
#include "slang-source-loc.h"

#include <optional>

namespace Slang
{

Expand Down Expand Up @@ -439,6 +441,39 @@ class JSONContainer : public RefObject
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:
Expand Down
1 change: 1 addition & 0 deletions source/compiler-core/slang-language-server-protocol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions source/compiler-core/slang-language-server-protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> sortText;

/**
* A human-readable string that represents a doc-comment.
*/
Expand Down
8 changes: 7 additions & 1 deletion source/core/slang-rtti-info.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ struct RttiInfo
Enum,
List,
Dictionary,

Optional,
CountOf,
};

Expand Down Expand Up @@ -296,6 +296,12 @@ SLANG_FORCE_INLINE StructRttiInfo::Flags combine(
return StructRttiInfo::Flags(defaultValue) | flags;
}

struct OptionalRttiInfo : public RttiInfo
{
const RttiInfo* m_elementType;
uint32_t m_valueOffset;
};

struct ListRttiInfo : public RttiInfo
{
const RttiInfo* m_elementType;
Expand Down
60 changes: 60 additions & 0 deletions source/core/slang-rtti-util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ RttiTypeFuncs RttiUtil::getDefaultTypeFuncs(const RttiInfo* rttiInfo)
case RttiInfo::Kind::List:
return ListFuncs::getFuncs();
case RttiInfo::Kind::Struct:
case RttiInfo::Kind::Optional:
return StructArrayFuncs::getFuncs();
default:
break;
Expand Down Expand Up @@ -556,6 +557,10 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)
const OtherRttiInfo* otherRttiInfo = static_cast<const OtherRttiInfo*>(rttiInfo);
return otherRttiInfo->m_isDefaultFunc && otherRttiInfo->m_isDefaultFunc(rttiInfo, src);
}
case RttiInfo::Kind::Optional:
{
return *(const bool*)src == (_getIntDefaultValue(defaultValue) != 0);
}
default:
{
return false;
Expand Down Expand Up @@ -660,6 +665,11 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)

return true;
}
case RttiInfo::Kind::Optional:
{
const OptionalRttiInfo* optionalRttiInfo = static_cast<const OptionalRttiInfo*>(type);
return canMemCpy(optionalRttiInfo->m_elementType);
}
default:
{
return type->isBuiltIn();
Expand Down Expand Up @@ -723,6 +733,11 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)

return true;
}
case RttiInfo::Kind::Optional:
{
const OptionalRttiInfo* optionalRttiInfo = static_cast<const OptionalRttiInfo*>(type);
return canZeroInit(optionalRttiInfo->m_elementType);
}
default:
{
return type->isBuiltIn();
Expand Down Expand Up @@ -783,6 +798,11 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)
} while (structRttiInfo);
return false;
}
case RttiInfo::Kind::Optional:
{
const OptionalRttiInfo* optionalRttiInfo = static_cast<const OptionalRttiInfo*>(type);
return hasDtor(optionalRttiInfo->m_elementType);
}
default:
{
return !type->isBuiltIn();
Expand Down Expand Up @@ -894,6 +914,19 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)

return;
}
case RttiInfo::Kind::Optional:
{
const OptionalRttiInfo* optionalRttiInfo =
static_cast<const OptionalRttiInfo*>(rttiInfo);
ctorArray(typeMap, GetRttiInfo<bool>::get(), dst, stride, count);
ctorArray(
typeMap,
optionalRttiInfo->m_elementType,
dst + optionalRttiInfo->m_valueOffset,
stride,
count);
return;
}
}

SLANG_ASSERT(!"Unexpected");
Expand Down Expand Up @@ -1005,6 +1038,20 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)

return;
}
case RttiInfo::Kind::Optional:
{
const OptionalRttiInfo* optionalRttiInfo =
static_cast<const OptionalRttiInfo*>(rttiInfo);
copyArray(typeMap, GetRttiInfo<bool>::get(), dst, src, stride, count);
copyArray(
typeMap,
optionalRttiInfo->m_elementType,
dst + optionalRttiInfo->m_valueOffset,
src + optionalRttiInfo->m_valueOffset,
stride,
count);
return;
}
}

SLANG_ASSERT(!"Unexpected");
Expand Down Expand Up @@ -1091,6 +1138,19 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src)

return;
}
case RttiInfo::Kind::Optional:
{
const OptionalRttiInfo* optionalRttiInfo =
static_cast<const OptionalRttiInfo*>(rttiInfo);
dtorArray(typeMap, GetRttiInfo<bool>::get(), dst, stride, count);
dtorArray(
typeMap,
optionalRttiInfo->m_elementType,
dst + optionalRttiInfo->m_valueOffset,
stride,
count);
return;
}
}

SLANG_ASSERT(!"Unexpected");
Expand Down
3 changes: 2 additions & 1 deletion source/slang/slang-ast-decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ bool isInterfaceRequirement(Decl* decl)
{
if (as<InterfaceDecl>(ancestor))
return true;

if (as<InterfaceDefaultImplDecl>(ancestor))
return false;
if (as<ExtensionDecl>(ancestor))
return false;
}
Expand Down
12 changes: 5 additions & 7 deletions source/slang/slang-ast-print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1313,17 +1313,15 @@ void ASTPrinter::addGenericParams(const DeclRef<GenericDecl>& genericDeclRef)
sb << ", ";
first = false;

{
ScopePart scopePart(this, Part::Type::GenericParamValue);
sb << getText(genericValParam.getName());
}

sb << ":";

{
ScopePart scopePart(this, Part::Type::GenericParamValueType);
addType(getType(m_astBuilder, genericValParam));
}
sb << " ";
{
ScopePart scopePart(this, Part::Type::GenericParamValue);
sb << getText(genericValParam.getName());
}
}
else if (auto genericTypePackParam = paramDeclRef.as<GenericTypePackParamDecl>())
{
Expand Down
Loading
Loading