- for m in j['messages']:
- try:
- msg = self.message_class(self.logger, m, self.types,
- self.struct_type_class,
- self.simple_type_class,
- self.field_class)
- if msg.name in self.messages:
- raise ParseError("Duplicate message `%s'" % msg.name)
- except ParseError as e:
- self.exceptions.append(e)
- continue
- self.messages[msg.name] = msg
- self.messages_by_json[path][msg.name] = msg
+ prev_length = len(self.messages)
+ processed = []
+ while True:
+ exceptions = []
+ for m in j['messages']:
+ if m in processed:
+ continue
+ try:
+ msg = self.message_class(self.logger, m, self.types,
+ self.struct_type_class,
+ self.simple_type_class,
+ self.field_class)
+ if msg.name in self.messages:
+ raise ParseError(
+ "Duplicate message `%s'" % msg.name)
+ except ParseError as e:
+ exceptions.append(e)
+ continue
+ self.messages[msg.name] = msg
+ self.messages_by_json[path][msg.name] = msg
+ processed.append(m)
+ if prev_length == len(self.messages):
+ # cannot make forward progress ...
+ self.exceptions.extend(exceptions)
+ break
+ prev_length = len(self.messages)