|
31 | 31 | import org.eclipse.tracecompass.internal.ctf.core.utils.JsonMetadataStrings; |
32 | 32 |
|
33 | 33 | import com.google.gson.JsonElement; |
| 34 | +import com.google.gson.JsonObject; |
34 | 35 |
|
35 | 36 | /** |
36 | 37 | * |
|
70 | 71 | * `typedef`: |
71 | 72 | * |
72 | 73 | * <pre> |
73 | | -struct { |
74 | | - // ... |
75 | | -} |
| 74 | + * struct { |
| 75 | + * // ... |
| 76 | + * } |
76 | 77 | * |
77 | 78 | * </pre> |
78 | 79 | * |
@@ -189,26 +190,43 @@ public StructDeclaration parse(ICTFMetadataNode struct, ICommonTreeParserParamet |
189 | 190 | structName = identifier.getText(); |
190 | 191 | hasName = true; |
191 | 192 | } |
192 | | - } else if (struct instanceof JsonStructureFieldMetadataNode) { |
193 | | - JsonStructureFieldMetadataNode structNode = (JsonStructureFieldMetadataNode) struct; |
| 193 | + } else if (struct instanceof JsonStructureFieldMetadataNode structNode) { |
194 | 194 | if (structNode.getMinimumAlignment() != 0) { |
195 | 195 | structAlign = AlignmentParser.INSTANCE.parse(struct, null); |
196 | 196 | } |
197 | 197 | if (structNode.getMemberClasses() != null) { |
198 | 198 | hasBody = true; |
199 | 199 | structBody = struct; |
200 | 200 | } |
201 | | - } else if (struct instanceof JsonStructureFieldMemberMetadataNode) { |
202 | | - JsonStructureFieldMemberMetadataNode memberNode = (JsonStructureFieldMemberMetadataNode) struct; |
| 201 | + } else if (struct instanceof JsonStructureFieldMemberMetadataNode memberNode) { |
203 | 202 | if (memberNode.getFieldClass().isJsonObject()) { |
204 | | - JsonElement minimumAlignment = memberNode.getFieldClass().getAsJsonObject().get(JsonMetadataStrings.MINIMUM_ALIGNMENT); |
| 203 | + JsonElement fieldClassElement = memberNode.getFieldClass(); |
| 204 | + if (fieldClassElement == null || !fieldClassElement.isJsonObject()) { |
| 205 | + throw new ParseException(getClass().getName() + " fieldclass must be a json object."); //$NON-NLS-1$ |
| 206 | + } |
| 207 | + JsonObject outerFieldClass = fieldClassElement.getAsJsonObject(); |
| 208 | + JsonElement minimumAlignment = outerFieldClass.get(JsonMetadataStrings.MINIMUM_ALIGNMENT); |
205 | 209 | if (minimumAlignment != null) { |
206 | 210 | structAlign = minimumAlignment.getAsLong(); |
207 | 211 | } |
208 | | - JsonElement memberClasses = memberNode.getFieldClass().getAsJsonObject().get(JsonMetadataStrings.MEMBER_CLASSES); |
209 | | - if (memberClasses != null) { |
| 212 | + JsonElement memberClasses = outerFieldClass.get(JsonMetadataStrings.MEMBER_CLASSES); |
| 213 | + if (memberClasses != null && memberClasses.isJsonArray()) { |
210 | 214 | hasBody = true; |
211 | | - structBody = struct; |
| 215 | + for (JsonElement memberElement : memberClasses.getAsJsonArray()) { |
| 216 | + if (memberElement.isJsonObject()) { |
| 217 | + String name = memberElement.getAsJsonObject().get(JsonMetadataStrings.NAME).getAsString(); |
| 218 | + JsonObject memberObj = memberElement.getAsJsonObject(); |
| 219 | + JsonElement nameElement = memberObj.get(JsonMetadataStrings.NAME); |
| 220 | + JsonElement fieldClass = memberObj.get(JsonMetadataStrings.FIELD_CLASS); |
| 221 | + if (nameElement == null || fieldClass == null || !fieldClass.isJsonObject()) { |
| 222 | + throw new ParseException("Member class requires 'name' and 'field-class' properties"); //$NON-NLS-1$ |
| 223 | + } |
| 224 | + name = nameElement.getAsString(); |
| 225 | + JsonStructureFieldMemberMetadataNode childNode = new JsonStructureFieldMemberMetadataNode(memberNode, "", "", name, fieldClass.getAsJsonObject()); //$NON-NLS-1$ //$NON-NLS-2$ |
| 226 | + memberNode.addChild(childNode); |
| 227 | + } |
| 228 | + } |
| 229 | + structBody = memberNode; |
212 | 230 | } |
213 | 231 | } |
214 | 232 | } |
|
0 commit comments