We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent 874fa06 commit 34651f1Copy full SHA for 34651f1
.formatter.exs
@@ -11,6 +11,9 @@
11
assert_same: 1,
12
assert_same: 2,
13
14
+ # Errors tests
15
+ assert_eval_raise: 3,
16
+
17
# Mix tests
18
in_fixture: 2,
19
in_tmp: 2
lib/elixir/src/elixir.erl
@@ -280,6 +280,7 @@ string_to_tokens(String, StartLine, File, Opts) when is_integer(StartLine), is_b
280
281
tokens_to_quoted(Tokens, File, Opts) ->
282
handle_parsing_opts(File, Opts),
283
284
try elixir_parser:parse(Tokens) of
285
{ok, Forms} -> {ok, Forms};
286
{error, {{Line, _, _}, _, [Error, Token]}} -> {error, {Line, to_binary(Error), to_binary(Token)}};
lib/elixir/src/elixir_errors.erl
@@ -98,6 +98,15 @@ parse_error(Line, File, {ErrorPrefix, ErrorSuffix}, Token) when is_binary(ErrorP
98
Message = <<ErrorPrefix/binary, Token/binary, ErrorSuffix/binary >>,
99
raise(Line, File, 'Elixir.SyntaxError', Message);
100
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
110
%% Everything else is fine as is
111
parse_error(Line, File, Error, Token) when is_binary(Error), is_binary(Token) ->
112
Message = <<Error/binary, Token/binary >>,
lib/elixir/src/elixir_parser.yrl
@@ -40,7 +40,7 @@ Terminals
40
capture_op rel_op
41
'true' 'false' 'nil' 'do' eol ';' ',' '.'
42
'(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'
43
- int float
+ int float char
44
.
45
46
Rootsymbol grammar.
@@ -263,6 +263,7 @@ access_expr -> max_expr : '$1'.
263
264
%% Augment integer literals with representation format if formatter_metadata option is true
265
number -> int : handle_literal(number_value('$1'), '$1', [{original, ?exprs('$1')}]).
266
+number -> char : handle_literal(?exprs('$1'), '$1', [{original, number_value('$1')}]).
267
number -> float : handle_literal(number_value('$1'), '$1', [{original, ?exprs('$1')}]).
268
269
%% Aliases and properly formed calls. Used by map_expr.
lib/elixir/src/elixir_tokenizer.erl
@@ -215,7 +215,7 @@ tokenize([$~, S, H | _] = Original, Line, Column, _Scope, Tokens) when ?is_upcas
215
216
tokenize([$?, $\\, H | T], Line, Column, Scope, Tokens) ->
217
Char = elixir_interpolation:unescape_map(H),
218
- Token = {int, {Line, {Column, Column + 3}, Char}, [$?, $\\, H]},
+ Token = {char, {Line, {Column, Column + 3}, [$?, $\\, H]}, Char},
219
tokenize(T, Line, Column + 3, Scope, [Token | Tokens]);
220
221
tokenize([$?, Char | T], Line, Column, Scope, Tokens) ->
@@ -227,7 +227,7 @@ tokenize([$?, Char | T], Line, Column, Scope, Tokens) ->
227
false ->
228
ok
229
end,
230
- Token = {int, {Line, {Column, Column + 2}, Char}, [$?, Char]},
+ Token = {char, {Line, {Column, Column + 2}, [$?, Char]}, Char},
231
tokenize(T, Line, Column + 2, Scope, [Token | Tokens]);
232
233
% Heredocs
0 commit comments