Return top-level unions/messages in dependency order.
(self)
| 404 | lines.append(f"class {message.name};") |
| 405 | |
| 406 | def get_definition_order(self) -> List: |
| 407 | """Return top-level unions/messages in dependency order.""" |
| 408 | items: List = [] |
| 409 | for union in self.schema.unions: |
| 410 | if self.is_imported_type(union): |
| 411 | continue |
| 412 | items.append(("union", union)) |
| 413 | for message in self.schema.messages: |
| 414 | if self.is_imported_type(message): |
| 415 | continue |
| 416 | items.append(("message", message)) |
| 417 | |
| 418 | name_to_index = {} |
| 419 | for idx, (kind, item) in enumerate(items): |
| 420 | name_to_index[item.name] = idx |
| 421 | |
| 422 | dependencies: Dict[int, Set[int]] = {i: set() for i in range(len(items))} |
| 423 | reverse_edges: Dict[int, Set[int]] = {i: set() for i in range(len(items))} |
| 424 | |
| 425 | for idx, (kind, item) in enumerate(items): |
| 426 | deps: Set[str] = set() |
| 427 | if kind == "union": |
| 428 | self.collect_union_dependencies(item, [], deps) |
| 429 | else: |
| 430 | self.collect_message_dependencies(item, [], deps) |
| 431 | for dep_name in deps: |
| 432 | dep_idx = name_to_index.get(dep_name) |
| 433 | if dep_idx is None or dep_idx == idx: |
| 434 | continue |
| 435 | dependencies[idx].add(dep_idx) |
| 436 | reverse_edges[dep_idx].add(idx) |
| 437 | |
| 438 | in_degree = {idx: len(dependencies[idx]) for idx in dependencies} |
| 439 | available = [idx for idx, degree in in_degree.items() if degree == 0] |
| 440 | ordered: List = [] |
| 441 | |
| 442 | while available: |
| 443 | available.sort() |
| 444 | idx = available.pop(0) |
| 445 | ordered.append(items[idx]) |
| 446 | for neighbor in reverse_edges[idx]: |
| 447 | in_degree[neighbor] -= 1 |
| 448 | if in_degree[neighbor] == 0: |
| 449 | available.append(neighbor) |
| 450 | |
| 451 | if len(ordered) != len(items): |
| 452 | raise ValueError("C++ generator cannot resolve type order for unions.") |
| 453 | |
| 454 | return ordered |
| 455 | |
| 456 | def collect_message_dependencies( |
| 457 | self, message: Message, parent_stack: List[Message], deps: Set[str] |
no test coverage detected