Skip to content

Commit 34651f1

Browse files
author
José Valim
committed
Format errors_test.exs
1 parent 874fa06 commit 34651f1

File tree

8 files changed

+386
-412
lines changed

8 files changed

+386
-412
lines changed

.formatter.exs

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
assert_same: 1,
1212
assert_same: 2,
1313

14+
# Errors tests
15+
assert_eval_raise: 3,
16+
1417
# Mix tests
1518
in_fixture: 2,
1619
in_tmp: 2

lib/elixir/src/elixir.erl

+1
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ string_to_tokens(String, StartLine, File, Opts) when is_integer(StartLine), is_b
280280

281281
tokens_to_quoted(Tokens, File, Opts) ->
282282
handle_parsing_opts(File, Opts),
283+
283284
try elixir_parser:parse(Tokens) of
284285
{ok, Forms} -> {ok, Forms};
285286
{error, {{Line, _, _}, _, [Error, Token]}} -> {error, {Line, to_binary(Error), to_binary(Token)}};

lib/elixir/src/elixir_errors.erl

+9
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ parse_error(Line, File, {ErrorPrefix, ErrorSuffix}, Token) when is_binary(ErrorP
9898
Message = <<ErrorPrefix/binary, Token/binary, ErrorSuffix/binary >>,
9999
raise(Line, File, 'Elixir.SyntaxError', Message);
100100

101+
%% Misplaced char tokens (e.g., {char, _, 97}) are translated by Erlang into
102+
%% the char literal (i.e., the token in the previous example becomes $a),
103+
%% because {char, _, _} is a valid Erlang token for an Erlang char literal. We
104+
%% want to represent that token as ?a in the error, according to the Elixir
105+
%% syntax.
106+
parse_error(Line, File, <<"syntax error before: ">>, <<$$, Char/binary>>) ->
107+
Message = <<"syntax error before: ?", Char/binary>>,
108+
raise(Line, File, 'Elixir.SyntaxError', Message);
109+
101110
%% Everything else is fine as is
102111
parse_error(Line, File, Error, Token) when is_binary(Error), is_binary(Token) ->
103112
Message = <<Error/binary, Token/binary >>,

lib/elixir/src/elixir_parser.yrl

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Terminals
4040
capture_op rel_op
4141
'true' 'false' 'nil' 'do' eol ';' ',' '.'
4242
'(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'
43-
int float
43+
int float char
4444
.
4545

4646
Rootsymbol grammar.
@@ -263,6 +263,7 @@ access_expr -> max_expr : '$1'.
263263

264264
%% Augment integer literals with representation format if formatter_metadata option is true
265265
number -> int : handle_literal(number_value('$1'), '$1', [{original, ?exprs('$1')}]).
266+
number -> char : handle_literal(?exprs('$1'), '$1', [{original, number_value('$1')}]).
266267
number -> float : handle_literal(number_value('$1'), '$1', [{original, ?exprs('$1')}]).
267268

268269
%% Aliases and properly formed calls. Used by map_expr.

lib/elixir/src/elixir_tokenizer.erl

+2-2
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ tokenize([$~, S, H | _] = Original, Line, Column, _Scope, Tokens) when ?is_upcas
215215

216216
tokenize([$?, $\\, H | T], Line, Column, Scope, Tokens) ->
217217
Char = elixir_interpolation:unescape_map(H),
218-
Token = {int, {Line, {Column, Column + 3}, Char}, [$?, $\\, H]},
218+
Token = {char, {Line, {Column, Column + 3}, [$?, $\\, H]}, Char},
219219
tokenize(T, Line, Column + 3, Scope, [Token | Tokens]);
220220

221221
tokenize([$?, Char | T], Line, Column, Scope, Tokens) ->
@@ -227,7 +227,7 @@ tokenize([$?, Char | T], Line, Column, Scope, Tokens) ->
227227
false ->
228228
ok
229229
end,
230-
Token = {int, {Line, {Column, Column + 2}, Char}, [$?, Char]},
230+
Token = {char, {Line, {Column, Column + 2}, [$?, Char]}, Char},
231231
tokenize(T, Line, Column + 2, Scope, [Token | Tokens]);
232232

233233
% Heredocs

0 commit comments

Comments
 (0)