| 1067 | } |
| 1068 | |
| 1069 | data_map CGenerator::getStructDefinitionTemplateData(Group *group, StructType *structType, data_map structInfo) |
| 1070 | { |
| 1071 | // reset list numbering. |
| 1072 | listCounter = 0; |
| 1073 | |
| 1074 | structInfo["hasNullableMember"] = false; |
| 1075 | structInfo["needTempVariableI32"] = false; |
| 1076 | structInfo["genStructWrapperF"] = !isBinaryStruct(structType); |
| 1077 | structInfo["noSharedMem"] = (findAnnotation(structType, NO_SHARED_ANNOTATION) != nullptr); |
| 1078 | |
| 1079 | setTemplateComments(structType, structInfo); |
| 1080 | |
| 1081 | // set struct members template data |
| 1082 | data_list members; |
| 1083 | assert(dynamic_cast<DataList *>(structInfo["members"].get().get())); |
| 1084 | data_list baseMembers = dynamic_cast<DataList *>(structInfo["members"].get().get())->getlist(); |
| 1085 | data_list membersToFree; |
| 1086 | |
| 1087 | for (StructMember *member : structType->getMembers()) |
| 1088 | { |
| 1089 | data_map member_info; |
| 1090 | |
| 1091 | // find base member template |
| 1092 | for (data_ptr mt : baseMembers) |
| 1093 | { |
| 1094 | if (mt->getmap()["name"]->getvalue() == getOutputName(member)) |
| 1095 | { |
| 1096 | member_info = mt->getmap(); |
| 1097 | break; |
| 1098 | } |
| 1099 | } |
| 1100 | if (member_info.empty()) |
| 1101 | { |
| 1102 | Log::info("Could not find base member template for member '%s'\n", member->getName().c_str()); |
| 1103 | continue; |
| 1104 | } |
| 1105 | |
| 1106 | // member data type |
| 1107 | DataType *dataType = member->getDataType(); |
| 1108 | DataType *trueDataType = member->getDataType()->getTrueDataType(); |
| 1109 | string memberName = getOutputName(member); |
| 1110 | |
| 1111 | bool isPtrType = (member->isByref() || trueDataType->isBinary() || trueDataType->isString() || |
| 1112 | trueDataType->isList() || trueDataType->isFunction()); |
| 1113 | // When forward declaration is used member should be present as pointer to data. |
| 1114 | if (!isPtrType && isMemberDataTypeUsingForwardDeclaration(structType, dataType)) |
| 1115 | { |
| 1116 | throw syntax_error( |
| 1117 | format_string("line %d: Struct member shall use byref option. Member is using forward declared type.", |
| 1118 | member->getFirstLine())); |
| 1119 | } |
| 1120 | // Handle nullable annotation |
| 1121 | bool isNullable = |
| 1122 | ((findAnnotation(member, NULLABLE_ANNOTATION) != nullptr) && |
| 1123 | (isPtrType || (trueDataType->isStruct() && (isListStruct(dynamic_cast<StructType *>(trueDataType)) || |
| 1124 | (isBinaryStruct(dynamic_cast<StructType *>(trueDataType))))))); |
| 1125 | member_info["isNullable"] = isNullable; |
| 1126 | member_info["structElements"] = ""; |
nothing calls this directly
no test coverage detected