diff --git a/lib/graphql/language/lexer.rb b/lib/graphql/language/lexer.rb index 23c88d88ad..8e395a3429 100644 --- a/lib/graphql/language/lexer.rb +++ b/lib/graphql/language/lexer.rb @@ -130,7 +130,7 @@ def debug_token_value(token_name) elsif token_name == :STRING string_value elsif @scanner.matched_size.nil? - @scanner.peek(1) + @string.byteslice(@scanner.pos - 1, 1) else token_value end diff --git a/lib/graphql/language/parser.rb b/lib/graphql/language/parser.rb index de176cf2e4..23ed0bf301 100644 --- a/lib/graphql/language/parser.rb +++ b/lib/graphql/language/parser.rb @@ -806,7 +806,7 @@ def at?(expected_token_name) def expect_token(expected_token_name) unless @token_name == expected_token_name - raise_parse_error("Expected #{expected_token_name}, actual: #{token_name || "(none)"} (#{debug_token_value.inspect})") + raise_parse_error("Expected #{expected_token_name}, #{@token_name == false ? "not end of file" : "actual: #{@token_name} (#{debug_token_value.inspect})"}") end advance_token end diff --git a/spec/graphql/language/parser_spec.rb b/spec/graphql/language/parser_spec.rb index 9f5a366c15..f00a17fa4b 100644 --- a/spec/graphql/language/parser_spec.rb +++ b/spec/graphql/language/parser_spec.rb @@ -235,6 +235,19 @@ assert_equal expected_msg, err.message end + it "shows the right character in error messages" do + err = assert_raises(GraphQL::ParseError) { + GraphQL.parse("query # comment\n ~ { a b }") + } + expected_msg = if USING_C_PARSER + "syntax error, unexpected invalid token (\"~\"), expecting LCURLY at [2, 2]" + else + "Expected NAME, actual: UNKNOWN_CHAR (\"~\") at [2, 2]" + end + + assert_equal expected_msg, err.message + end + it "can reject name start at the end of numbers" do prev_reject_numers_followed_by_names = GraphQL.reject_numbers_followed_by_names GraphQL.reject_numbers_followed_by_names = false diff --git a/spec/graphql/query_spec.rb b/spec/graphql/query_spec.rb index 0c5dc5fa91..dcbf44269e 100644 --- a/spec/graphql/query_spec.rb +++ b/spec/graphql/query_spec.rb @@ -680,7 +680,7 @@ def execute_multiplex(multiplex:) if USING_C_PARSER expected_err = "syntax error, unexpected end of file at [1, 2]" else - expected_err = "Expected NAME, actual: (none) (\" \") at [1, 2]" + expected_err = "Expected NAME, not end of file at [1, 2]" end expected_locations = [{"line" => 1, "column" => 2}] assert_equal expected_err, res["errors"][0]["message"] @@ -691,7 +691,7 @@ def execute_multiplex(multiplex:) if USING_C_PARSER expected_err = "syntax error, unexpected end of file at [1, 1]" else - expected_err = "Expected NAME, actual: (none) (\"\") at [1, 1]" + expected_err = "Expected NAME, not end of file at [1, 1]" end expected_locations = [{"line" => 1, "column" => 1}] assert_equal expected_err, res["errors"][0]["message"]