summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-json-native.cpp
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2024-10-29 14:49:26 +0800
committerGitHub <noreply@github.com>2024-10-29 14:49:26 +0800
commitf65d756bff8d4c5cbc15bd0322a2ae8e6b896a21 (patch)
treeea1d61342cd29368e19135000ec2948813096205 /source/compiler-core/slang-json-native.cpp
parenta729c15e9dce9f5116a38afc66329ab2ca4cea54 (diff)
format
* format * Minor test fixes * enable checking cpp format in ci
Diffstat (limited to 'source/compiler-core/slang-json-native.cpp')
-rw-r--r--source/compiler-core/slang-json-native.cpp171
1 files changed, 110 insertions, 61 deletions
diff --git a/source/compiler-core/slang-json-native.cpp b/source/compiler-core/slang-json-native.cpp
index eb0f7d9ee..e4b425801 100644
--- a/source/compiler-core/slang-json-native.cpp
+++ b/source/compiler-core/slang-json-native.cpp
@@ -1,14 +1,13 @@
#include "slang-json-native.h"
-#include "slang-com-helper.h"
-
#include "../core/slang-rtti-util.h"
-
+#include "slang-com-helper.h"
#include "slang-json-diagnostics.h"
-namespace Slang {
+namespace Slang
+{
-/* static */RttiTypeFuncsMap JSONNativeUtil::getTypeFuncsMap()
+/* static */ RttiTypeFuncsMap JSONNativeUtil::getTypeFuncsMap()
{
RttiTypeFuncsMap typeMap;
typeMap.add(GetRttiInfo<JSONValue>::get(), GetRttiTypeFuncsForZeroPod<JSONValue>::getFuncs());
@@ -17,7 +16,7 @@ namespace Slang {
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!! JSONToNativeConverter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
-/* static */Index JSONToNativeConverter::_getFieldCount(const StructRttiInfo* structRttiInfo)
+/* static */ Index JSONToNativeConverter::_getFieldCount(const StructRttiInfo* structRttiInfo)
{
if (structRttiInfo->m_super)
{
@@ -29,7 +28,9 @@ namespace Slang {
}
}
-/* static */Index JSONToNativeConverter::_findFieldIndex(const StructRttiInfo* structRttiInfo, const UnownedStringSlice& fieldName)
+/* static */ Index JSONToNativeConverter::_findFieldIndex(
+ const StructRttiInfo* structRttiInfo,
+ const UnownedStringSlice& fieldName)
{
if (structRttiInfo->m_super)
{
@@ -40,9 +41,13 @@ namespace Slang {
}
}
- ConstArrayView<StructRttiInfo::Field> fields(structRttiInfo->m_fields, structRttiInfo->m_fieldCount);
+ ConstArrayView<StructRttiInfo::Field> fields(
+ structRttiInfo->m_fields,
+ structRttiInfo->m_fieldCount);
- Index index = fields.findFirstIndex([fieldName](const StructRttiInfo::Field& field) ->bool { return fieldName == field.m_name; });
+ Index index = fields.findFirstIndex(
+ [fieldName](const StructRttiInfo::Field& field) -> bool
+ { return fieldName == field.m_name; });
if (index >= 0 && structRttiInfo->m_super)
{
index += _getFieldCount(structRttiInfo->m_super);
@@ -51,7 +56,11 @@ namespace Slang {
return index;
}
-SlangResult JSONToNativeConverter::_structToNative(const ConstArrayView<JSONKeyValue>& pairs, const StructRttiInfo* structRttiInfo, void* out, Index& outFieldCount)
+SlangResult JSONToNativeConverter::_structToNative(
+ const ConstArrayView<JSONKeyValue>& pairs,
+ const StructRttiInfo* structRttiInfo,
+ void* out,
+ Index& outFieldCount)
{
Index fieldCount = 0;
@@ -77,14 +86,19 @@ SlangResult JSONToNativeConverter::_structToNative(const ConstArrayView<JSONKeyV
continue;
}
- m_sink->diagnose(SourceLoc(), JSONDiagnostics::fieldRequiredOnType, field.m_name, structRttiInfo->m_name);
+ m_sink->diagnose(
+ SourceLoc(),
+ JSONDiagnostics::fieldRequiredOnType,
+ field.m_name,
+ structRttiInfo->m_name);
// Unable to find this key
return SLANG_FAIL;
}
// If there are any of the pairs, that are not in the type.. it's an error
- const Index index = pairs.findFirstIndex([key](const JSONKeyValue& pair) -> bool { return pair.key == key; });
+ const Index index = pairs.findFirstIndex(
+ [key](const JSONKeyValue& pair) -> bool { return pair.key == key; });
if (index < 0)
{
if (field.m_flags & StructRttiInfo::Flag::Optional)
@@ -92,7 +106,11 @@ SlangResult JSONToNativeConverter::_structToNative(const ConstArrayView<JSONKeyV
continue;
}
- m_sink->diagnose(SourceLoc(), JSONDiagnostics::fieldRequiredOnType, field.m_name, structRttiInfo->m_name);
+ m_sink->diagnose(
+ SourceLoc(),
+ JSONDiagnostics::fieldRequiredOnType,
+ field.m_name,
+ structRttiInfo->m_name);
// Unable to find this key
return SLANG_FAIL;
@@ -107,7 +125,7 @@ SlangResult JSONToNativeConverter::_structToNative(const ConstArrayView<JSONKeyV
++fieldCount;
}
- // Write off the amount of fields converted/handled.
+ // Write off the amount of fields converted/handled.
outFieldCount = fieldCount;
return SLANG_OK;
}
@@ -125,12 +143,12 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
switch (rttiInfo->m_kind)
{
- case RttiInfo::Kind::Bool:
+ case RttiInfo::Kind::Bool:
{
*(bool*)out = m_container->asBool(in);
return SLANG_OK;
}
- case RttiInfo::Kind::Struct:
+ case RttiInfo::Kind::Struct:
{
if (in.getKind() != JSONValue::Kind::Object)
{
@@ -150,38 +168,44 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
for (auto& pair : pairs)
{
UnownedStringSlice fieldName = m_container->getStringFromKey(pair.key);
- const Index index = _findFieldIndex(structRttiInfo, UnownedStringSlice(fieldName));
+ const Index index =
+ _findFieldIndex(structRttiInfo, UnownedStringSlice(fieldName));
if (index < 0)
{
- m_sink->diagnose(pair.keyLoc, JSONDiagnostics::fieldNotDefinedOnType, fieldName, structRttiInfo->m_name);
+ m_sink->diagnose(
+ pair.keyLoc,
+ JSONDiagnostics::fieldNotDefinedOnType,
+ fieldName,
+ structRttiInfo->m_name);
}
}
- // If these are different then there are fields defined in the object that are *not* defined in class definition
+ // If these are different then there are fields defined in the object that are *not*
+ // defined in class definition
return SLANG_FAIL;
}
return SLANG_OK;
}
- case RttiInfo::Kind::Enum:
+ case RttiInfo::Kind::Enum:
{
return SLANG_E_NOT_IMPLEMENTED;
}
- case RttiInfo::Kind::String:
+ case RttiInfo::Kind::String:
{
*(String*)out = m_container->getTransientString(in);
return SLANG_OK;
}
- case RttiInfo::Kind::UnownedStringSlice:
+ case RttiInfo::Kind::UnownedStringSlice:
{
- // Problem -> if the slice is a lexeme, then when we decode with getString, it will lose scope.
- // So we do something a bit odd and place the decoding string
+ // Problem -> if the slice is a lexeme, then when we decode with getString, it will lose
+ // scope. So we do something a bit odd and place the decoding string
*(UnownedStringSlice*)out = m_container->getString(in);
return SLANG_OK;
}
- case RttiInfo::Kind::List:
+ case RttiInfo::Kind::List:
{
if (in.getKind() == JSONValue::Kind::Null)
return SLANG_OK;
@@ -200,7 +224,8 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
const ListRttiInfo* listRttiInfo = static_cast<const ListRttiInfo*>(rttiInfo);
auto elementType = listRttiInfo->m_elementType;
- SLANG_RETURN_ON_FAIL(RttiUtil::setListCount(m_typeMap, elementType, out, arr.getCount()));
+ SLANG_RETURN_ON_FAIL(
+ RttiUtil::setListCount(m_typeMap, elementType, out, arr.getCount()));
// Okay, we need to copy over one by one
Byte* dstEles = list.getBuffer();
@@ -211,13 +236,14 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
return SLANG_OK;
}
- case RttiInfo::Kind::FixedArray:
+ case RttiInfo::Kind::FixedArray:
{
if (in.getKind() != JSONValue::Kind::Array)
{
return SLANG_FAIL;
}
- const FixedArrayRttiInfo* fixedArrayRttiInfo = static_cast<const FixedArrayRttiInfo*>(rttiInfo);
+ const FixedArrayRttiInfo* fixedArrayRttiInfo =
+ static_cast<const FixedArrayRttiInfo*>(rttiInfo);
const auto elementType = fixedArrayRttiInfo->m_elementType;
const Index elementCount = Index(fixedArrayRttiInfo->m_elementCount);
const auto elementSize = elementType->m_size;
@@ -226,7 +252,11 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
if (srcArray.getCount() > elementCount)
{
- m_sink->diagnose(in.loc, JSONDiagnostics::tooManyElementsForArray, srcArray.getCount(), elementCount);
+ m_sink->diagnose(
+ in.loc,
+ JSONDiagnostics::tooManyElementsForArray,
+ srcArray.getCount(),
+ elementCount);
return SLANG_FAIL;
}
@@ -238,13 +268,13 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
return SLANG_OK;
}
- case RttiInfo::Kind::Dictionary:
+ case RttiInfo::Kind::Dictionary:
{
- // We can *only* serialize this into a straight JSON object iff the key is a string-like type
- // We could turn into (say) an array of keys and values
+ // We can *only* serialize this into a straight JSON object iff the key is a string-like
+ // type We could turn into (say) an array of keys and values
break;
}
- case RttiInfo::Kind::Other:
+ case RttiInfo::Kind::Other:
{
if (rttiInfo == GetRttiInfo<JSONValue>::get())
{
@@ -255,16 +285,18 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo*
}
return SLANG_FAIL;
}
- default: break;
+ default: break;
}
return SLANG_FAIL;
}
-SlangResult JSONToNativeConverter::convertArrayToStruct(const JSONValue& value, const RttiInfo* rttiInfo, void* out)
+SlangResult JSONToNativeConverter::convertArrayToStruct(
+ const JSONValue& value,
+ const RttiInfo* rttiInfo,
+ void* out)
{
// Check converting JSON array into a struct, as that's what this method supports
- if (!(rttiInfo->m_kind == RttiInfo::Kind::Struct &&
- value.getKind() == JSONValue::Kind::Array))
+ if (!(rttiInfo->m_kind == RttiInfo::Kind::Struct && value.getKind() == JSONValue::Kind::Array))
{
// If they are the wrong types then just fail
return SLANG_FAIL;
@@ -274,7 +306,8 @@ SlangResult JSONToNativeConverter::convertArrayToStruct(const JSONValue& value,
Index totalFieldCount = 0;
ShortList<const StructRttiInfo*, 8> infos;
- for (const StructRttiInfo* cur = static_cast<const StructRttiInfo*>(rttiInfo); cur; cur = cur->m_super)
+ for (const StructRttiInfo* cur = static_cast<const StructRttiInfo*>(rttiInfo); cur;
+ cur = cur->m_super)
{
totalFieldCount += cur->m_fieldCount;
infos.add(cur);
@@ -300,7 +333,8 @@ SlangResult JSONToNativeConverter::convertArrayToStruct(const JSONValue& value,
{
// Convert the field
const auto& field = info->m_fields[j];
- SLANG_RETURN_ON_FAIL(convert(array[argIndex++], field.m_type, dstBase + field.m_offset));
+ SLANG_RETURN_ON_FAIL(
+ convert(array[argIndex++], field.m_type, dstBase + field.m_offset));
}
}
@@ -309,7 +343,10 @@ SlangResult JSONToNativeConverter::convertArrayToStruct(const JSONValue& value,
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!! NativeToJSONConverter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
-SlangResult NativeToJSONConverter::_structToJSON(const StructRttiInfo* structRttiInfo, const void* src, List<JSONKeyValue>& outPairs)
+SlangResult NativeToJSONConverter::_structToJSON(
+ const StructRttiInfo* structRttiInfo,
+ const void* src,
+ List<JSONKeyValue>& outPairs)
{
// Do the super class first
if (structRttiInfo->m_super)
@@ -326,7 +363,8 @@ SlangResult NativeToJSONConverter::_structToJSON(const StructRttiInfo* structRtt
if (field.m_flags & StructRttiInfo::Flag::Optional)
{
- const RttiDefaultValue defaultValue = RttiDefaultValue(field.m_flags & uint8_t(RttiDefaultValue::Mask));
+ const RttiDefaultValue defaultValue =
+ RttiDefaultValue(field.m_flags & uint8_t(RttiDefaultValue::Mask));
if (RttiUtil::isDefault(defaultValue, field.m_type, base + field.m_offset))
{
// If it's a default, we don't bother writing it
@@ -340,7 +378,11 @@ SlangResult NativeToJSONConverter::_structToJSON(const StructRttiInfo* structRtt
if (SLANG_FAILED(res))
{
- m_sink->diagnose(SourceLoc(), JSONDiagnostics::unableToConvertField, field.m_name, structRttiInfo->m_name);
+ m_sink->diagnose(
+ SourceLoc(),
+ JSONDiagnostics::unableToConvertField,
+ field.m_name,
+ structRttiInfo->m_name);
return res;
}
@@ -366,25 +408,25 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void*
switch (rttiInfo->m_kind)
{
- case RttiInfo::Kind::Invalid: return SLANG_FAIL;
- case RttiInfo::Kind::Bool:
+ case RttiInfo::Kind::Invalid: return SLANG_FAIL;
+ case RttiInfo::Kind::Bool:
{
out = JSONValue::makeBool(RttiUtil::asBool(rttiInfo, in));
return SLANG_OK;
}
- case RttiInfo::Kind::String:
+ case RttiInfo::Kind::String:
{
const String& str = *(const String*)in;
out = m_container->createString(str.getUnownedSlice());
return SLANG_OK;
}
- case RttiInfo::Kind::UnownedStringSlice:
+ case RttiInfo::Kind::UnownedStringSlice:
{
const UnownedStringSlice& slice = *(const UnownedStringSlice*)in;
out = m_container->createString(slice);
return SLANG_OK;
}
- case RttiInfo::Kind::Struct:
+ case RttiInfo::Kind::Struct:
{
const StructRttiInfo* structRttiInfo = static_cast<const StructRttiInfo*>(rttiInfo);
@@ -393,11 +435,11 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void*
out = m_container->createObject(pairs.getBuffer(), pairs.getCount());
return SLANG_OK;
}
- case RttiInfo::Kind::Enum:
- {
+ case RttiInfo::Kind::Enum:
+ {
return SLANG_E_NOT_IMPLEMENTED;
}
- case RttiInfo::Kind::List:
+ case RttiInfo::Kind::List:
{
const ListRttiInfo* listRttiInfo = static_cast<const ListRttiInfo*>(rttiInfo);
const auto elementRttiInfo = listRttiInfo->m_elementType;
@@ -422,9 +464,10 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void*
out = m_container->createArray(dstValues.getBuffer(), count);
return SLANG_OK;
}
- case RttiInfo::Kind::FixedArray:
+ case RttiInfo::Kind::FixedArray:
{
- const FixedArrayRttiInfo* fixedArrayRttiInfo = static_cast<const FixedArrayRttiInfo*>(rttiInfo);
+ const FixedArrayRttiInfo* fixedArrayRttiInfo =
+ static_cast<const FixedArrayRttiInfo*>(rttiInfo);
const auto elementType = fixedArrayRttiInfo->m_elementType;
const auto elementCount = Index(fixedArrayRttiInfo->m_elementCount);
const auto elementSize = elementType->m_size;
@@ -441,21 +484,22 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void*
out = m_container->createArray(dstValues.getBuffer(), elementCount);
return SLANG_OK;
}
- case RttiInfo::Kind::Dictionary:
+ case RttiInfo::Kind::Dictionary:
{
- const DictionaryRttiInfo* listRttiInfo = static_cast<const DictionaryRttiInfo*>(rttiInfo);
+ const DictionaryRttiInfo* listRttiInfo =
+ static_cast<const DictionaryRttiInfo*>(rttiInfo);
const auto keyRttiInfo = listRttiInfo->m_keyType;
const auto valueRttiInfo = listRttiInfo->m_valueType;
SLANG_UNUSED(keyRttiInfo);
SLANG_UNUSED(valueRttiInfo);
- // We can *only* serialize this into a straight JSON object iff the key is a string-like type
- // We could turn into (say) an array of keys and values
+ // We can *only* serialize this into a straight JSON object iff the key is a string-like
+ // type We could turn into (say) an array of keys and values
break;
}
- case RttiInfo::Kind::Other:
+ case RttiInfo::Kind::Other:
{
if (rttiInfo == GetRttiInfo<JSONValue>::get())
{
@@ -468,13 +512,16 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void*
}
break;
}
- default: break;
+ default: break;
}
return SLANG_E_NOT_IMPLEMENTED;
}
-SlangResult NativeToJSONConverter::convertStructToArray(const RttiInfo* rttiInfo, const void* in, JSONValue& out)
+SlangResult NativeToJSONConverter::convertStructToArray(
+ const RttiInfo* rttiInfo,
+ const void* in,
+ JSONValue& out)
{
if (rttiInfo->m_kind != RttiInfo::Kind::Struct)
{
@@ -485,7 +532,8 @@ SlangResult NativeToJSONConverter::convertStructToArray(const RttiInfo* rttiInfo
// Work out the total amount of fields, and all invloved struct types
Index totalFieldsCount = 0;
ShortList<const StructRttiInfo*, 8> infos;
- for (const StructRttiInfo* cur = static_cast<const StructRttiInfo*>(rttiInfo); cur; cur = cur->m_super)
+ for (const StructRttiInfo* cur = static_cast<const StructRttiInfo*>(rttiInfo); cur;
+ cur = cur->m_super)
{
totalFieldsCount += Index(cur->m_fieldCount);
infos.add(cur);
@@ -511,7 +559,8 @@ SlangResult NativeToJSONConverter::convertStructToArray(const RttiInfo* rttiInfo
{
const auto& field = structRttiInfo->m_fields[j];
// Convert the field
- SLANG_RETURN_ON_FAIL(convert(field.m_type, argsBase + field.m_offset, argsArray[argsArrayIndex++]));
+ SLANG_RETURN_ON_FAIL(
+ convert(field.m_type, argsBase + field.m_offset, argsArray[argsArrayIndex++]));
}
}
}