diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2024-10-29 14:49:26 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-29 14:49:26 +0800 |
| commit | f65d756bff8d4c5cbc15bd0322a2ae8e6b896a21 (patch) | |
| tree | ea1d61342cd29368e19135000ec2948813096205 /source/compiler-core/slang-json-native.cpp | |
| parent | a729c15e9dce9f5116a38afc66329ab2ca4cea54 (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.cpp | 171 |
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++])); } } } |
