|
23 | 23 | GraphQLAbstractType, |
24 | 24 | GraphQLCompositeType, |
25 | 25 | GraphQLField, |
| 26 | + GraphQLInputObjectType, |
26 | 27 | GraphQLInputType, |
27 | 28 | GraphQLInterfaceType, |
28 | 29 | GraphQLNamedType, |
29 | 30 | GraphQLObjectType, |
30 | 31 | GraphQLType, |
31 | | - get_named_type, |
| 32 | + GraphQLUnionType, |
| 33 | + GraphQLWrappingType, |
32 | 34 | is_input_object_type, |
33 | 35 | is_interface_type, |
34 | 36 | is_object_type, |
@@ -739,26 +741,36 @@ def with_initial_types(cls, types: Collection[GraphQLType]) -> TypeSet: |
739 | 741 |
|
740 | 742 | def collect_referenced_types(self, type_: GraphQLType) -> None: |
741 | 743 | """Recursive function supplementing the type starting from an initial type.""" |
742 | | - named_type = get_named_type(type_) |
| 744 | + # Hot path when building schemas: unlike GraphQL.js, we avoid get_named_type() |
| 745 | + # and the is_*_type() helpers, because function calls are costly in Python. |
| 746 | + named_type: GraphQLType | None = None |
| 747 | + if type_: |
| 748 | + named_type = type_ |
| 749 | + while isinstance(named_type, GraphQLWrappingType): |
| 750 | + named_type = named_type.of_type |
743 | 751 |
|
744 | 752 | if named_type in self: |
745 | 753 | return |
746 | 754 |
|
| 755 | + if TYPE_CHECKING: |
| 756 | + named_type = cast("GraphQLNamedType", named_type) |
747 | 757 | self[named_type] = None |
748 | 758 |
|
749 | | - collect_referenced_types = self.collect_referenced_types |
750 | | - if is_union_type(named_type): |
| 759 | + if isinstance(named_type, GraphQLUnionType): |
| 760 | + collect_referenced_types = self.collect_referenced_types |
751 | 761 | for member_type in named_type.types: |
752 | 762 | collect_referenced_types(member_type) |
753 | | - elif is_object_type(named_type) or is_interface_type(named_type): |
| 763 | + elif isinstance(named_type, (GraphQLObjectType, GraphQLInterfaceType)): |
| 764 | + collect_referenced_types = self.collect_referenced_types |
754 | 765 | for interface_type in named_type.interfaces: |
755 | 766 | collect_referenced_types(interface_type) |
756 | 767 |
|
757 | 768 | for field in named_type.fields.values(): |
758 | 769 | collect_referenced_types(field.type) |
759 | 770 | for arg in field.args.values(): |
760 | 771 | collect_referenced_types(arg.type) |
761 | | - elif is_input_object_type(named_type): |
| 772 | + elif isinstance(named_type, GraphQLInputObjectType): |
| 773 | + collect_referenced_types = self.collect_referenced_types |
762 | 774 | for field in named_type.fields.values(): |
763 | 775 | collect_referenced_types(field.type) |
764 | 776 |
|
|
0 commit comments