コード例 #1
0
        protected override ISyntaxVisitorAction Enter(
            FieldNode node,
            IDocumentValidatorContext context)
        {
            if (IntrospectionFields.TypeName.Equals(node.Name.Value))
            {
                return(Skip);
            }

            if (context.Types.TryPeek(out IType type))
            {
                INamedType namedType = type.NamedType();

                if (context.Schema.QueryType == namedType &&
                    (IntrospectionFields.Schema.Equals(node.Name.Value) ||
                     IntrospectionFields.Type.Equals(node.Name.Value)))
                {
                    context.Errors.Add(context.IntrospectionNotAllowed(node));
                    return(Break);
                }

                if (namedType is IComplexOutputType ct)
                {
                    if (ct.Fields.TryGetField(node.Name.Value, out IOutputField? of))
                    {
                        if (node.SelectionSet is null ||
                            node.SelectionSet.Selections.Count == 0 ||
                            of.Type.NamedType().IsLeafType())
                        {
                            return(Skip);
                        }

                        context.OutputFields.Push(of);
                        context.Types.Push(of.Type);
                        return(Continue);
                    }

                    return(Skip);
                }
            }

            context.UnexpectedErrorsDetected = true;
            return(Skip);
        }