@@ -109,8 +109,8 @@ store_definition(Kind, Line, CheckClauses, Module, Call, Body, RawS) ->
109
109
assert_no_aliases_name (Line , Name , Args , S ),
110
110
store_definition (Kind , Line , CheckClauses , Module , Name , Args , Guards , Body , S ).
111
111
112
- store_definition (Kind , Line , _CheckClauses , nil , _Name , _Args , _Guards , _Body , # elixir_scope {} = S ) ->
113
- elixir_errors :syntax_error (Line , S # elixir_scope . file , " cannot define function outside module, invalid scope for ~ts " , [ Kind ] );
112
+ store_definition (Kind , Line , _CheckClauses , nil , _Name , _Args , _Guards , _Body , # elixir_scope {file = File } ) ->
113
+ elixir_errors :form_error (Line , File , ? MODULE , { no_module , Kind } );
114
114
115
115
store_definition (Kind , Line , CheckClauses , Module , Name , Args , Guards , Body , # elixir_scope {} = DS ) ->
116
116
Arity = length (Args ),
@@ -196,9 +196,12 @@ translate_definition(Kind, Line, Name, RawArgs, RawGuards, RawBody, S) when is_i
196
196
Function = { function , Line , Name , Arity , Clauses },
197
197
{ Function , Defaults , TS }.
198
198
199
- translate_clause (_Line , _Kind , _Unpacked , _Guards , nil , S ) ->
199
+ translate_clause (_Line , _Kind , _Unpacked , [] , nil , S ) ->
200
200
{ [], S };
201
201
202
+ translate_clause (Line , Kind , _Unpacked , _Guards , nil , # elixir_scope {file = File }) ->
203
+ elixir_errors :syntax_error (Line , File , " missing keyword do in ~ts " , [Kind ]);
204
+
202
205
translate_clause (Line , Kind , Unpacked , Guards , Body , S ) ->
203
206
Expr = expr_from_body (Line , Body ),
204
207
@@ -311,8 +314,8 @@ store_each(Check, Kind, File, Location, Table, CTable, Defaults, {function, Line
311
314
FinalLocation = StoredLocation ,
312
315
FinalDefaults = max (Defaults , StoredDefaults ),
313
316
check_valid_kind (Line , File , Name , Arity , Kind , StoredKind ),
314
- check_valid_defaults (Line , File , Name , Arity , Defaults , StoredDefaults ),
315
- (Check and StoredCheck ) andalso check_valid_clause (Line , File , Name , Arity , Table );
317
+ check_valid_defaults (Line , File , Name , Arity , Kind , Defaults , StoredDefaults ),
318
+ (Check and StoredCheck ) andalso check_valid_clause (Line , File , Name , Arity , Kind , Table );
316
319
[] ->
317
320
FinalLine = Line ,
318
321
FinalLocation = Location ,
@@ -329,38 +332,41 @@ check_valid_kind(Line, File, Name, Arity, Kind, StoredKind) ->
329
332
elixir_errors :form_error (Line , File , ? MODULE ,
330
333
{ changed_kind , { Name , Arity , StoredKind , Kind } }).
331
334
332
- check_valid_clause (Line , File , Name , Arity , Table ) ->
335
+ check_valid_clause (Line , File , Name , Arity , Kind , Table ) ->
333
336
case ets :lookup_element (Table , last , 2 ) of
334
337
{Name ,Arity } -> [];
335
338
[] -> [];
336
339
_ ->
337
340
elixir_errors :handle_file_warning (File , { Line , ? MODULE ,
338
- { override_function , { Name , Arity } } })
341
+ { override_function , { Kind , Name , Arity } } })
339
342
end .
340
343
341
- check_valid_defaults (_Line , _File , _Name , _Arity , 0 , _ ) -> [];
342
- check_valid_defaults (Line , File , Name , Arity , _ , 0 ) ->
343
- elixir_errors :handle_file_warning (File , { Line , ? MODULE , { out_of_order_defaults , { Name , Arity } } });
344
- check_valid_defaults (Line , File , Name , Arity , _ , _ ) ->
345
- elixir_errors :handle_file_warning (File , { Line , ? MODULE , { clauses_with_defaults , { Name , Arity } } }).
344
+ check_valid_defaults (_Line , _File , _Name , _Arity , _Kind , 0 , _ ) -> [];
345
+ check_valid_defaults (Line , File , Name , Arity , Kind , _ , 0 ) ->
346
+ elixir_errors :handle_file_warning (File , { Line , ? MODULE , { out_of_order_defaults , { Kind , Name , Arity } } });
347
+ check_valid_defaults (Line , File , Name , Arity , Kind , _ , _ ) ->
348
+ elixir_errors :handle_file_warning (File , { Line , ? MODULE , { clauses_with_defaults , { Kind , Name , Arity } } }).
346
349
347
350
assert_no_aliases_name (Line , '__aliases__' , [Atom ], # elixir_scope {file = File }) when is_atom (Atom ) ->
348
351
Message = " function names should start with lowercase characters or underscore, invalid name ~ts " ,
349
- elixir_errors :syntax_error (Line , File , Message , [atom_to_binary ( Atom , utf8 ) ]);
352
+ elixir_errors :syntax_error (Line , File , Message , [Atom ]);
350
353
351
354
assert_no_aliases_name (_Meta , _Aliases , _Args , _S ) ->
352
355
ok .
353
356
354
357
% % Format errors
355
358
356
- format_error ({clauses_with_defaults ,{Name ,Arity }}) ->
357
- io_lib :format (" function ~ts /~B has default values and multiple clauses, use a separate clause for declaring defaults" , [Name , Arity ]);
359
+ format_error ({no_module ,{Kind ,Name ,Arity }}) ->
360
+ io_lib :format (" cannot define function outside module, invalid scope for ~ts ~ts /~B " , [Kind , Name , Arity ]);
361
+
362
+ format_error ({clauses_with_defaults ,{Kind ,Name ,Arity }}) ->
363
+ io_lib :format (" ~ts ~ts /~B has default values and multiple clauses, use a separate clause for declaring defaults" , [Kind , Name , Arity ]);
358
364
359
- format_error ({out_of_order_defaults ,{Name ,Arity }}) ->
360
- io_lib :format (" clause with defaults should be the first clause in function ~ts /~B " , [Name , Arity ]);
365
+ format_error ({out_of_order_defaults ,{Kind , Name ,Arity }}) ->
366
+ io_lib :format (" clause with defaults should be the first clause in ~ts ~ts /~B " , [Kind , Name , Arity ]);
361
367
362
- format_error ({override_function ,{Name ,Arity }}) ->
363
- io_lib :format (" trying to override previously defined function ~ts /~B " , [Name , Arity ]);
368
+ format_error ({override_function ,{Kind , Name ,Arity }}) ->
369
+ io_lib :format (" trying to override previously defined ~ts ~ts /~B " , [Kind , Name , Arity ]);
364
370
365
371
format_error ({changed_kind ,{Name ,Arity ,Previous ,Current }}) ->
366
372
io_lib :format (" ~ts ~ts /~B already defined as ~ts " , [Current , Name , Arity , Previous ]).
0 commit comments