def _recurse_through_generics(ref): yield ref if isinstance(ref, ConfigTypeMeta) and ConfigTypeKind.is_closed_generic( ref.kind): for type_param_ref in ref.type_param_refs: for inner_ref in _recurse_through_generics(type_param_ref): yield inner_ref
def get_child_type_keys(self): if ConfigTypeKind.is_closed_generic(self.kind): return self.type_param_keys elif ConfigTypeKind.has_fields(self.kind): return [field.type_key for field in self.fields] else: return []
def _get_next_level_refs(ref): # if a generic type, get type params # if a type with fields, get refs of the fields if ConfigTypeKind.is_closed_generic(ref.kind): return ref.type_param_refs elif (ConfigTypeKind.has_fields(ref.kind) and ref.fields): # still check fields because permissive return [field_meta.type_ref for field_meta in ref.fields]
def type_ref_of(config_type): check.inst_param(config_type, 'config_type', ConfigType) if ConfigTypeKind.is_closed_generic(config_type.kind): return meta_from_config_type(config_type) else: return NonGenericTypeRefMeta(key=config_type.key)