99-export ([start_cli /0 , start /0 ]).
1010-export ([start /2 , stop /1 , config_change /3 ]).
1111-export ([
12- string_to_tokens /5 , tokens_to_quoted /3 , 'string_to_quoted!' /5 ,
12+ string_to_tokens /5 , tokens_to_quoted /3 , string_to_quoted / 5 , 'string_to_quoted!' /5 ,
1313 env_for_eval /1 , quoted_to_erl /2 , eval_forms /3 , eval_quoted /3 ,
1414 eval_quoted /4 , eval_local_handler /2 , eval_external_handler /3 ,
15- format_token_error / 1
15+ emit_warnings / 3
1616]).
1717-include (" elixir.hrl" ).
1818-define (system , 'Elixir.System' ).
@@ -445,38 +445,34 @@ quoted_to_erl(Quoted, ErlS, ExS, Env) ->
445445
446446string_to_tokens (String , StartLine , StartColumn , File , Opts ) when is_integer (StartLine ), is_binary (File ) ->
447447 case elixir_tokenizer :tokenize (String , StartLine , StartColumn , Opts ) of
448- {ok , _Line , _Column , [], Tokens , []} ->
449- {ok , lists :reverse (Tokens )};
450448 {ok , _Line , _Column , Warnings , Tokens , Terminators } ->
451- (lists :keyfind (emit_warnings , 1 , Opts ) /= {emit_warnings , false }) andalso
452- [elixir_errors :erl_warn (L , File , M ) || {L , M } <- lists :reverse (Warnings )],
453- {ok , lists :reverse (Tokens , Terminators )};
449+ {ok , lists :reverse (Tokens , Terminators ), Warnings };
454450 {error , Info , _Rest , _Warnings , _SoFar } ->
455- {error , format_token_error (Info )}
451+ {error , elixir_tokenizer : format_error (Info )}
456452 end .
457453
458- format_token_error ({Location , {ErrorPrefix , ErrorSuffix }, Token }) ->
459- {Location , {to_binary (ErrorPrefix ), to_binary (ErrorSuffix )}, to_binary (Token )};
460- format_token_error ({Location , Error , Token }) ->
461- {Location , to_binary (Error ), to_binary (Token )}.
462-
463- tokens_to_quoted (Tokens , WarningFile , Opts ) ->
464- handle_parsing_opts (WarningFile , Opts ),
454+ tokens_to_quoted (Tokens , _WarningFile , Opts ) ->
455+ put_parsing_state (Opts ),
465456
466457 try elixir_parser :parse (Tokens ) of
467458 {ok , Forms } ->
468- {ok , Forms };
459+ {ok , Forms , get ( elixir_parser_warnings ) };
469460 {error , {Line , _ , [{ErrorPrefix , ErrorSuffix }, Token ]}} ->
470461 {error , {parser_location (Line ), {to_binary (ErrorPrefix ), to_binary (ErrorSuffix )}, to_binary (Token )}};
471462 {error , {Line , _ , [Error , Token ]}} ->
472463 {error , {parser_location (Line ), to_binary (Error ), to_binary (Token )}}
473464 after
474- erase (elixir_parser_warning_file ),
465+ erase (elixir_parser_warnings ),
475466 erase (elixir_parser_columns ),
476467 erase (elixir_token_metadata ),
477468 erase (elixir_literal_encoder )
478469 end .
479470
471+ emit_warnings (Warnings , File , Opts ) ->
472+ (Warnings /= []) andalso
473+ (lists :keyfind (emit_warnings , 1 , Opts ) /= {emit_warnings , false }) andalso
474+ [elixir_errors :erl_warn (L , File , M ) || {L , M } <- lists :reverse (Warnings )].
475+
480476parser_location ({Line , Column , _ }) ->
481477 [{line , Line }, {column , Column }];
482478parser_location (Meta ) ->
@@ -491,17 +487,28 @@ parser_location(Meta) ->
491487 false -> [{line , Line }]
492488 end .
493489
494- ' string_to_quoted!' (String , StartLine , StartColumn , File , Opts ) ->
490+ string_to_quoted (String , StartLine , StartColumn , File , Opts ) ->
495491 case string_to_tokens (String , StartLine , StartColumn , File , Opts ) of
496- {ok , Tokens } ->
492+ {ok , Tokens , Warnings1 } ->
493+ emit_warnings (Warnings1 , File , Opts ),
494+
497495 case tokens_to_quoted (Tokens , File , Opts ) of
498- {ok , Forms } ->
499- Forms ;
500- { error , { Meta , Error , Token }} ->
501- Indentation = proplists : get_value ( indentation , Opts , 0 ),
502- Input = { String , StartLine , StartColumn , Indentation },
503- elixir_errors : parse_error ( Meta , File , Error , Token , Input )
496+ {ok , Forms , Warnings2 } ->
497+ emit_warnings ( Warnings2 , File , Opts ),
498+ { ok , Forms };
499+
500+ { error , Error } ->
501+ { error , Error }
504502 end ;
503+
504+ {error , Error } ->
505+ {error , Error }
506+ end .
507+
508+ 'string_to_quoted!' (String , StartLine , StartColumn , File , Opts ) ->
509+ case string_to_quoted (String , StartLine , StartColumn , File , Opts ) of
510+ {ok , Forms } ->
511+ Forms ;
505512 {error , {Meta , Error , Token }} ->
506513 Indentation = proplists :get_value (indentation , Opts , 0 ),
507514 Input = {String , StartLine , StartColumn , Indentation },
@@ -511,20 +518,15 @@ parser_location(Meta) ->
511518to_binary (List ) when is_list (List ) -> elixir_utils :characters_to_binary (List );
512519to_binary (Atom ) when is_atom (Atom ) -> atom_to_binary (Atom ).
513520
514- handle_parsing_opts (File , Opts ) ->
515- WarningFile =
516- case lists :keyfind (emit_warnings , 1 , Opts ) of
517- {emit_warnings , false } -> nil ;
518- _ -> File
519- end ,
521+ put_parsing_state (Opts ) ->
520522 LiteralEncoder =
521523 case lists :keyfind (literal_encoder , 1 , Opts ) of
522524 {literal_encoder , Fun } -> Fun ;
523525 false -> false
524526 end ,
525527 TokenMetadata = lists :keyfind (token_metadata , 1 , Opts ) == {token_metadata , true },
526528 Columns = lists :keyfind (columns , 1 , Opts ) == {columns , true },
527- put (elixir_parser_warning_file , WarningFile ),
529+ put (elixir_parser_warnings , [] ),
528530 put (elixir_parser_columns , Columns ),
529531 put (elixir_token_metadata , TokenMetadata ),
530532 put (elixir_literal_encoder , LiteralEncoder ).
0 commit comments