Skip to content

Commit 5646cac

Browse files
ctf: Allow structs to have ctf2 data
Change-Id: Ie35533f33a482aff519f9472b0a34b088be1506e Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
1 parent f28fce3 commit 5646cac

1 file changed

Lines changed: 29 additions & 11 deletions

File tree

  • ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/metadata/tsdl/struct

ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/metadata/tsdl/struct/StructParser.java

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.eclipse.tracecompass.internal.ctf.core.utils.JsonMetadataStrings;
3232

3333
import com.google.gson.JsonElement;
34+
import com.google.gson.JsonObject;
3435

3536
/**
3637
*
@@ -70,9 +71,9 @@
7071
* `typedef`:
7172
*
7273
* <pre>
73-
struct {
74-
// ...
75-
}
74+
* struct {
75+
* // ...
76+
* }
7677
*
7778
* </pre>
7879
*
@@ -189,26 +190,43 @@ public StructDeclaration parse(ICTFMetadataNode struct, ICommonTreeParserParamet
189190
structName = identifier.getText();
190191
hasName = true;
191192
}
192-
} else if (struct instanceof JsonStructureFieldMetadataNode) {
193-
JsonStructureFieldMetadataNode structNode = (JsonStructureFieldMetadataNode) struct;
193+
} else if (struct instanceof JsonStructureFieldMetadataNode structNode) {
194194
if (structNode.getMinimumAlignment() != 0) {
195195
structAlign = AlignmentParser.INSTANCE.parse(struct, null);
196196
}
197197
if (structNode.getMemberClasses() != null) {
198198
hasBody = true;
199199
structBody = struct;
200200
}
201-
} else if (struct instanceof JsonStructureFieldMemberMetadataNode) {
202-
JsonStructureFieldMemberMetadataNode memberNode = (JsonStructureFieldMemberMetadataNode) struct;
201+
} else if (struct instanceof JsonStructureFieldMemberMetadataNode memberNode) {
203202
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);
205209
if (minimumAlignment != null) {
206210
structAlign = minimumAlignment.getAsLong();
207211
}
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()) {
210214
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;
212230
}
213231
}
214232
}

0 commit comments

Comments
 (0)