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)