diff --git a/lib/graphql/language/lexer.rb b/lib/graphql/language/lexer.rb index 871824465b..1aeb1da4c0 100644 --- a/lib/graphql/language/lexer.rb +++ b/lib/graphql/language/lexer.rb @@ -72,7 +72,10 @@ def advance # Check for a matched decimal: @scanner[1] ? :FLOAT : :INT else - raise_parse_error("Expected a number, but it was malformed (#{@string[@pos].inspect})") + # Attempt to find the part after the `-` + value = @scanner.scan(/-\s?[a-z0-9]*/i) + invalid_byte_for_number_error_message = "Expected type 'number', but it was malformed#{value.nil? ? "" : ": #{value.inspect}"}." + raise_parse_error(invalid_byte_for_number_error_message) end when ByteFor::ELLIPSIS if @string.getbyte(@pos + 1) != 46 || @string.getbyte(@pos + 2) != 46 diff --git a/spec/graphql/language/parser_spec.rb b/spec/graphql/language/parser_spec.rb index c3feafcc5a..b3fad1adfd 100644 --- a/spec/graphql/language/parser_spec.rb +++ b/spec/graphql/language/parser_spec.rb @@ -116,7 +116,62 @@ expected_message = if USING_C_PARSER "syntax error, unexpected invalid token (\"-\") at [1, 8]" else - "Expected a number, but it was malformed (\"-\")" + "Expected type 'number', but it was malformed: \"-c\"." + end + assert_equal expected_message, err.message + end + + it "handles invalid minus signs in variable default values" do + err = assert_raises GraphQL::ParseError do + GraphQL.parse("query($something: Int = -foo) { }") + end + expected_message = if USING_C_PARSER + "syntax error, unexpected invalid token (\"-\") at [1, 25]" + else + "Expected type 'number', but it was malformed: \"-foo\"." + end + assert_equal expected_message, err.message + end + + it "handles invalid minus signs in deeply nested input objects" do + err = assert_raises GraphQL::ParseError do + GraphQL.parse("{ doSomething(a: { b: { c: { d: -foo } } }) }") + end + expected_message = if USING_C_PARSER + "syntax error, unexpected invalid token (\"-\") at [1, 33]" + else + "Expected type 'number', but it was malformed: \"-foo\"." + end + assert_equal expected_message, err.message + end + + it "handles invalid minus signs in schema definitions" do + err = assert_raises GraphQL::ParseError do + GraphQL.parse(" + type Query { + someField(a: Int = -foo): Int + } + ") + end + expected_message = if USING_C_PARSER + "syntax error, unexpected invalid token (\"-\") at [3, 28]" + else + "Expected type 'number', but it was malformed: \"-foo\"." + end + assert_equal expected_message, err.message + end + + it "handles invalid minus signs in list literals" do + err = assert_raises GraphQL::ParseError do + GraphQL.parse("{ + a1: a(b: [1,2,3]) + a2: a(b: [1, 2, -foo]) + }") + end + expected_message = if USING_C_PARSER + "syntax error, unexpected invalid token (\"-\") at [3, 25]" + else + "Expected type 'number', but it was malformed: \"-foo\"." end assert_equal expected_message, err.message end @@ -192,7 +247,7 @@ expected_msg = if USING_C_PARSER "syntax error, unexpected invalid token (\"-\") at [1, 19]" else - "Expected a number, but it was malformed (\"-\")" + "Expected type 'number', but it was malformed: \"-b\"." end assert_equal expected_msg, err.message