/** * Not exactly the same as the executor's definition of getFieldDef, in this * statically evaluated environment we do not always have an Object type, * and need to handle Interface and Union types. * * @param Schema $schema * @param Type $parentType * @param Field $fieldAST * * @return FieldDefinition */ protected static function getFieldDefinition(Schema $schema, Type $parentType, Field $fieldAST) { $name = $fieldAST->get('name')->get('value'); $schemaMeta = Introspection::schemaMetaFieldDefinition(); if ($name === $schemaMeta->getName() && $schema->getQueryType() === $parentType) { return $schemaMeta; } $typeMeta = Introspection::typeMetaFieldDefinition(); if ($name === $typeMeta->getName() && $schema->getQueryType() === $parentType) { return $typeMeta; } $typeNameMeta = Introspection::typeNameMetaFieldDefinition(); if ($name === $typeNameMeta->getName() && ($parentType instanceof ObjectType || $parentType instanceof InterfaceType || $parentType instanceof UnionType)) { return $typeNameMeta; } if ($parentType instanceof ObjectType || $parentType instanceof InterfaceType) { $fields = $parentType->getFields(); return isset($fields[$name]) ? $fields[$name] : NULL; } return NULL; }