MCPcopy Create free account
hub / github.com/apache/fory / get_definition_order

Method get_definition_order

compiler/fory_compiler/generators/cpp.py:406–454  ·  view source on GitHub ↗

Return top-level unions/messages in dependency order.

(self)

Source from the content-addressed store, hash-verified

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]

Callers 1

generate_headerMethod · 0.95

Calls 10

is_imported_typeMethod · 0.95
itemsMethod · 0.80
sortMethod · 0.80
getMethod · 0.65
addMethod · 0.65
setFunction · 0.50
appendMethod · 0.45
popMethod · 0.45

Tested by

no test coverage detected