code: def collect_subfields(
          self, return_type: GraphQLObjectType, field_nodes: List[FieldNode]
      ) -> Dict[str, List[FieldNode]]:
          
          cache_key = return_type, tuple(field_nodes)
          sub_field_nodes = self._subfields_cache.get(cache_key)
          if sub_field_nodes is None:
              sub_field_nodes = {}
              visited_fragment_names: Set[str] = set()
              for field_node in field_nodes:
                  selection_set = field_node.selection_set
                  if selection_set:
                      sub_field_nodes = self.collect_fields(
                          return_type,
                          selection_set,
                          sub_field_nodes,
                          visited_fragment_names,
                      )
              self._subfields_cache[cache_key] = sub_field_nodes
          return sub_field_nodes
docs: Collect subfields.
  
          A cached collection of relevant subfields with regard to the return type is
          kept in the execution context as `_subfields_cache`. This ensures the
          subfields are not repeatedly calculated, which saves overhead when resolving
          lists of values.