code: private function getFieldsAndFragmentNames(
          ValidationContext $context,
          $parentType,
          SelectionSetNode $selectionSet
      ) {
          if (isset($this->cachedFieldsAndFragmentNames[$selectionSet])) {
              $cached = $this->cachedFieldsAndFragmentNames[$selectionSet];
          } else {
              $astAndDefs    = [];
              $fragmentNames = [];
  
              $this->internalCollectFieldsAndFragmentNames(
                  $context,
                  $parentType,
                  $selectionSet,
                  $astAndDefs,
                  $fragmentNames
              );
              $cached                                            = [$astAndDefs, array_keys($fragmentNames)];
              $this->cachedFieldsAndFragmentNames[$selectionSet] = $cached;
          }
  
          return $cached;
      }
docs: Given a selection set, return the collection of fields (a mapping of response
  name to field ASTs and definitions) as well as a list of fragment names
  referenced via fragment spreads.
  
  @param CompositeType $parentType
  
  @return mixed[]|SplObjectStorage