lib/graphql/language/parser.y in graphql-0.19.3 vs lib/graphql/language/parser.y in graphql-0.19.4

- old
+ new

@@ -142,15 +142,15 @@ | ON | operation_type | schema_keyword name_list: - name { return [val[0].to_s]} - | name_list name { val[0] << val[1].to_s } + name { return [make_node(:TypeName, name: val[0])] } + | name_list name { val[0] << make_node(:TypeName, name: val[1]) } enum_value_definition: - enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[0], directives: val[1]) } + enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[0], directives: val[1], description: get_description(val[0])) } enum_value_definitions: enum_value_definition { return [val[0]] } | enum_value_definitions enum_value_definition { return val[0] << val[1] } @@ -268,24 +268,24 @@ | interface_type_definition | union_type_definition | enum_type_definition | input_object_type_definition - scalar_type_definition: SCALAR name directives_list_opt { return make_node(:ScalarTypeDefinition, name: val[1], directives: val[2]) } + scalar_type_definition: SCALAR name directives_list_opt { return make_node(:ScalarTypeDefinition, name: val[1], directives: val[2], description: get_description(val[0])) } object_type_definition: TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY { - return make_node(:ObjectTypeDefinition, name: val[1], interfaces: val[2], directives: val[3], fields: val[5]) + return make_node(:ObjectTypeDefinition, name: val[1], interfaces: val[2], directives: val[3], fields: val[5], description: get_description(val[0])) } implements_opt: /* none */ { return [] } | IMPLEMENTS name_list { return val[1] } input_value_definition: name COLON type default_value_opt directives_list_opt { - return make_node(:InputValueDefinition, name: val[0], type: val[2], default_value: val[3], directives: val[4]) + return make_node(:InputValueDefinition, name: val[0], type: val[2], default_value: val[3], directives: val[4], description: get_description(val[0])) } input_value_definition_list: input_value_definition { return [val[0]] } | input_value_definition_list input_value_definition { val[0] << val[1] } @@ -294,44 +294,44 @@ /* none */ { return [] } | LPAREN input_value_definition_list RPAREN { return val[1] } field_definition: name arguments_definitions_opt COLON type directives_list_opt { - return make_node(:FieldDefinition, name: val[0], arguments: val[1], type: val[3], directives: val[4]) + return make_node(:FieldDefinition, name: val[0], arguments: val[1], type: val[3], directives: val[4], description: get_description(val[0])) } field_definition_list: field_definition { return [val[0]] } | field_definition_list field_definition { val[0] << val[1] } interface_type_definition: INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY { - return make_node(:InterfaceTypeDefinition, name: val[1], directives: val[2], fields: val[4]) + return make_node(:InterfaceTypeDefinition, name: val[1], directives: val[2], fields: val[4], description: get_description(val[0])) } union_members: - name { return [val[0].to_s]} - | union_members PIPE name { val[0] << val[2].to_s } + name { return [make_node(:TypeName, name: val[0])]} + | union_members PIPE name { val[0] << make_node(:TypeName, name: val[2]) } union_type_definition: UNION name directives_list_opt EQUALS union_members { - return make_node(:UnionTypeDefinition, name: val[1], directives: val[2], types: val[4]) + return make_node(:UnionTypeDefinition, name: val[1], directives: val[2], types: val[4], description: get_description(val[0])) } enum_type_definition: ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY { - return make_node(:EnumTypeDefinition, name: val[1], directives: val[2], values: val[4]) + return make_node(:EnumTypeDefinition, name: val[1], directives: val[2], values: val[4], description: get_description(val[0])) } input_object_type_definition: INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY { - return make_node(:InputObjectTypeDefinition, name: val[1], directives: val[2], fields: val[4]) + return make_node(:InputObjectTypeDefinition, name: val[1], directives: val[2], fields: val[4], description: get_description(val[0])) } directive_definition: DIRECTIVE DIR_SIGN name arguments_definitions_opt ON directive_locations { - return make_node(:DirectiveDefinition, name: val[2], arguments: val[3], locations: val[5]) + return make_node(:DirectiveDefinition, name: val[2], arguments: val[3], locations: val[5], description: get_description(val[0])) } directive_locations: name { return [val[0].to_s] } | directive_locations PIPE name { val[0] << val[2].to_s } @@ -368,9 +368,28 @@ if lexer_token.nil? nil else [lexer_token.name, lexer_token] end +end + +def get_description(token) + comments = [] + + loop do + prev_token = token + token = token.prev_token + + break if token.nil? + break if token.name != :COMMENT + break if prev_token.line != token.line + 1 + + comments.unshift(token.to_s.sub(/^#\s*/, "")) + end + + return nil if comments.empty? + + comments.join("\n") end def on_error(parser_token_id, lexer_token, vstack) if lexer_token == "$" raise GraphQL::ParseError.new("Unexpected end of document", nil, nil, @query_string)