/* @flow */
/**
 *  Copyright (c) 2015, Facebook, Inc.
 *  All rights reserved.
 *
 *  This source code is licensed under the BSD-style license found in the
 *  LICENSE file in the root directory of this source tree. An additional grant
 *  of patent rights can be found in the PATENTS file in the same directory.
 */

import type { ValidationContext } from '../index';
import { GraphQLError } from '../../error';
import type { Field } from '../../language/ast';
import { isLeafType } from '../../type/definition';
import type { GraphQLType } from '../../type/definition';


export function noSubselectionAllowedMessage(
  field: string,
  type: GraphQLType
): string {
  return `Field "${field}" of type "${String(type)}" must not have a ` +
    'sub selection.';
}

export function requiredSubselectionMessage(
  field: string,
  type: GraphQLType
): string {
  return `Field "${field}" of type "${String(type)}" must have a ` +
    'sub selection.';
}

/**
 * Scalar leafs
 *
 * A GraphQL document is valid only if all leaf fields (fields without
 * sub selections) are of scalar or enum types.
 */
export function ScalarLeafs(context: ValidationContext): any {
  return {
    Field(node: Field) {
      const type = context.getType();
      if (type) {
        if (isLeafType(type)) {
          if (node.selectionSet) {
            context.reportError(new GraphQLError(
              noSubselectionAllowedMessage(node.name.value, type),
              [ node.selectionSet ]
            ));
          }
        } else if (!node.selectionSet) {
          context.reportError(new GraphQLError(
            requiredSubselectionMessage(node.name.value, type),
            [ node ]
          ));
        }
      }
    }
  };
}

@@ -613,32 +613,36 @@
 Message(%0A  field
+Name
 : string,%0A  type
@@ -627,32 +627,32 @@
 ldName: string,%0A
-
   type: GraphQLT
@@ -695,77 +695,97 @@
 ield
-%7D%22 of type %22$%7BString(type)%7D%22 must not have a %60 +%0A    'sub selection.'
+Name%7D%22 must not have a selection since %60 +%0A    %60type %22$%7BString(type)%7D%22 has no subfields.%60
 ;%0A%7D%0A
@@ -837,16 +837,20 @@
 %0A  field
+Name
 : string
@@ -907,16 +907,20 @@
 %22$%7Bfield
+Name
 %7D%22 of ty
@@ -964,13 +964,9 @@
     
-'sub 
+%60
 sele
@@ -974,10 +974,60 @@
 tion
-.'
+ of subfields. Did you mean %22$%7BfieldName%7D %7B ... %7D%22?%60
 ;%0A%7D%0A

Improve error message related to sub-selection validation