Skip to content

Commit

Permalink
Show correct source of errors and warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
urbanserj committed Sep 6, 2017
1 parent 592046d commit 3751b5a
Show file tree
Hide file tree
Showing 11 changed files with 98 additions and 49 deletions.
6 changes: 3 additions & 3 deletions src/issues_spec.hrl
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
-ifndef(issues_spec_hrl).
-define(issues_spec_hrl, included).

-type warning() :: {warning, Line::pos_integer(), Description::string()}.
-type error() :: {error, Description::string()} |
{error, Line::pos_integer(), Description::string()}.
-type warning() :: {warning, Filename::file:filename(), Line::pos_integer(), Description::string()}.
-type error() :: {error, Filename::file:filename(), Description::string()} |
{error, Filename::file:filename(), Line::pos_integer(), Description::string()}.

-type issue() :: warning() | error().

Expand Down
4 changes: 2 additions & 2 deletions src/syntaxerl.erl
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ check_syntax(FileName, BaseFileName, Debug) ->
syntaxerl_logger:debug(Debug, "Selected handler: ~p", [Handler]),
case Handler:check_syntax(FileName, BaseFileName, Debug) of
{ok, Issues} ->
syntaxerl_utils:print_issues(FileName, Issues),
syntaxerl_utils:print_issues(BaseFileName, FileName, Issues),
halt(?EXIT_SUCCESS);
{error, Issues} ->
syntaxerl_utils:print_issues(FileName, Issues),
syntaxerl_utils:print_issues(BaseFileName, FileName, Issues),
halt(?EXIT_FAILURE)
end.

Expand Down
20 changes: 15 additions & 5 deletions src/syntaxerl_escript.erl
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,20 @@ check_syntax(FileName, BaseFileName, Debug) ->
{ok, _ModuleName} ->
{ok, []};
{ok, _ModuleName, Warnings} ->
io:format("Warnings: ~p~n", [Warnings]),
Warnings0 = fix_file_names(NewFileName, FileName, Warnings),
{ok, syntaxerl_format:format_warnings(
?MODULE, fix_line_numbers(Warnings))};
?MODULE, fix_line_numbers(Warnings0))};
{error, Errors, Warnings} ->
Errors0 = fix_file_names(NewFileName, FileName, Errors),
Warnings0 = fix_file_names(NewFileName, FileName, Warnings),
case syntaxerl_format:format_errors(
?MODULE, fix_line_numbers(Errors)) of
?MODULE, fix_line_numbers(Errors0)) of
[] ->
{ok, syntaxerl_format:format_warnings(
?MODULE, fix_line_numbers(Warnings))};
?MODULE, fix_line_numbers(Warnings0))};
Errors2 ->
{error, Errors2 ++ syntaxerl_format:format_warnings(
?MODULE, fix_line_numbers(Warnings))}
?MODULE, fix_line_numbers(Warnings0))}
end
end;
{error, Reason} ->
Expand All @@ -73,6 +75,14 @@ output_warning(_) -> true.
%% Internal
%% ===================================================================

fix_file_names(TmpFileName, FileName, ErrorList) ->
[fix_file_name(TmpFileName, FileName, Error) || Error <- ErrorList].

fix_file_name(TmpFileName, FileName, {TmpFileName, ErrorList}) ->
{FileName, ErrorList};
fix_file_name(_TmpFileName, _FileName, {FileName, ErrorList}) ->
{FileName, ErrorList}.

fix_line_numbers(ErrorList) ->
ErrorList0 = skip_expected_errors(ErrorList),
[{F, [{fix_line_number(L), M, E} || {L, M, E} <- Es]}
Expand Down
32 changes: 15 additions & 17 deletions src/syntaxerl_format.erl
Original file line number Diff line number Diff line change
Expand Up @@ -12,33 +12,31 @@
%% API
%% ===================================================================

-spec format_errors(module(), error_list()) ->
[{error, integer(), string()}].
format_errors(_Handler, []) ->
[];
format_errors(Handler, [{_FileName, Errors} | _]) ->
[format_error(E) || E <- Errors, Handler:output_error(E)].

-spec format_warnings(module(), warning_list()) ->
[{warning, integer(), string()}].
format_warnings(_Handler, []) ->
[];
format_warnings(Handler, [{_FileName, Warnings} | _]) ->
[format_warning(W) || W <- Warnings, Handler:output_warning(W)].
-spec format_errors(module(), error_list()) -> [error()].
format_errors(Handler, List) ->
lists:flatmap(fun ({FileName, Errors}) ->
[format_error(FileName, E) || E <- Errors, Handler:output_error(E)]
end, List).

-spec format_warnings(module(), warning_list()) -> [warning()].
format_warnings(Handler, List) ->
lists:flatmap(fun ({FileName, Warnings}) ->
[format_warning(FileName, W) || W <- Warnings, Handler:output_warning(W)]
end, List).

%% ===================================================================
%% Internal
%% ===================================================================

format_error({Line, _Module, _Term} = Error) ->
format_error(FileName, {Line, _Module, _Term} = Error) ->
Description = error_description(Error),
FixedLine = fix_line_number(Line),
{error, FixedLine, Description}.
{error, FileName, FixedLine, Description}.

format_warning({Line, _Module, _Term} = Error) ->
format_warning(FileName, {Line, _Module, _Term} = Error) ->
Description = error_description(Error),
FixedLine = fix_line_number(Line),
{warning, FixedLine, Description}.
{warning, FileName, FixedLine, Description}.

-spec error_description({integer(), module(), term()}) -> string().
error_description({_Line, Module, Error}) ->
Expand Down
24 changes: 18 additions & 6 deletions src/syntaxerl_hrl.erl
Original file line number Diff line number Diff line change
Expand Up @@ -43,24 +43,27 @@ check_syntax(FileName, BaseFileName, Debug) ->
{ok, _ModuleName} ->
{ok, []};
{ok, _ModuleName, Warnings} ->
Warnings0 = fix_file_names(NewFileName, FileName, Warnings),
{ok, syntaxerl_format:format_warnings(
?MODULE, fix_line_numbers(Warnings))};
?MODULE, fix_line_numbers(Warnings0))};
{error, Errors, Warnings} ->
Errors0 = fix_file_names(NewFileName, FileName, Errors),
Warnings0 = fix_file_names(NewFileName, FileName, Warnings),
case syntaxerl_format:format_errors(
?MODULE, fix_line_numbers(Errors)) of
?MODULE, fix_line_numbers(Errors0)) of
[] ->
{ok, syntaxerl_format:format_warnings(
?MODULE, fix_line_numbers(Warnings))};
?MODULE, fix_line_numbers(Warnings0))};
Errors2 ->
{error, Errors2 ++ syntaxerl_format:format_warnings(
?MODULE, fix_line_numbers(Warnings))}
?MODULE, fix_line_numbers(Warnings0))}
end
end;
{error, Reason} ->
{error, [{error, file:format_error(Reason)}]}
{error, [{FileName, file:format_error(Reason)}]}
end;
{error, Reason} ->
{error, [{error, file:format_error(Reason)}]}
{error, [{FileName, file:format_error(Reason)}]}
end.

%% skip errors that might occur in pure header files.
Expand All @@ -76,6 +79,15 @@ output_warning(_) -> true.
%% Internal
%% ===================================================================

fix_file_names(TmpFileName, FileName, ErrorList) ->
[fix_file_name(TmpFileName, FileName, Error) || Error <- ErrorList].

fix_file_name(TmpFileName, FileName, {TmpFileName, ErrorList}) ->
{FileName, ErrorList};
fix_file_name(_TmpFileName, _FileName, {FileName, ErrorList}) ->
{FileName, ErrorList}.


fix_line_numbers(ErrorList) ->
[{F, [{fix_line_number(L), M, E} || {L, M, E} <- Es]}
|| {F, Es} <- ErrorList].
Expand Down
21 changes: 19 additions & 2 deletions src/syntaxerl_script.erl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
-export([
check_syntax/3,
output_error/1,
output_warning/1
output_warning/1,
format_error/2
]).

-include("check_syntax_spec.hrl").
Expand All @@ -20,9 +21,25 @@ check_syntax(FileName, _BaseFileName, _Debug) ->
{ok, _} ->
{ok, []};
{error, Error} ->
{error, [{error, file:format_error(Error)}]}
%% unfortunately the `file:consult' returns only the first error.
format_error(FileName, Error)
end.

output_error(_) -> true.

output_warning(_) -> true.

%% ===================================================================
%% Internal
%% ===================================================================

-spec format_error(file:filename(), Error) -> {ok, term()} | {error, error()}
when Error :: file:posix() | badarg | terminated | system_limit |
{Line :: integer(), Mod :: module(), Term :: term()}.
format_error(FileName, {Line, Mod, Term}) ->
ErrorStrPrefix = iolist_to_binary(io_lib:format("~p: ", [Line])),
ErrorStr = iolist_to_binary(file:format_error({Line, Mod, Term})),
[<<>>, ErrorStr0] = binary:split(ErrorStr, ErrorStrPrefix),
{error, [{error, FileName, Line, ErrorStr0}]};
format_error(FileName, Error) ->
{error, [{error, FileName, 1, file:format_error(Error)}]}.
8 changes: 4 additions & 4 deletions src/syntaxerl_terms.erl
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
%% ===================================================================

check_syntax(FileName, _BaseFileName, _Debug) ->
case file:eval(FileName) of
ok ->
case file:consult(FileName) of
{ok, _} ->
{ok, []};
{error, Error} ->
%% unfortunately the `file:eval' returns only the first error.
{error, [{error, file:format_error(Error)}]}
%% unfortunately the `file:consult' returns only the first error.
syntaxerl_script:format_error(FileName, Error)
end.

output_error(_) -> true.
Expand Down
26 changes: 16 additions & 10 deletions src/syntaxerl_utils.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

-export([
incls_deps_opts/1,
print_issues/2,
print_issues/3,
consult_file/1
]).

Expand Down Expand Up @@ -134,18 +134,16 @@ deps_opts(BaseDir, OtpStdDirs, ErlcStdOpts, Profile) ->
UniqErlcOpts = uniq(ErlcStdOpts ++ ErlcOpts),
{UniqDepsDirs, UniqErlcOpts}.

-spec print_issues(FileName::file:filename(), Issues::[issue()]) -> ok.
print_issues(_FileName, []) ->
ok;
print_issues(FileName, [Issue | Issues]) ->
print_issue(FileName, Issue),
print_issues(FileName, Issues).
-spec print_issues(FileName::file:filename(), BaseFileName::file:filename(), Issues::[issue()]) -> ok.
print_issues(OrigFileName, BaseFileName, List) ->
List0 = fix_file_names(OrigFileName, BaseFileName, List),
lists:foreach(fun print_issue/1, List0).

print_issue(FileName, {warning, Line, Description}) ->
print_issue({warning, FileName, Line, Description}) ->
io:format("~s:~p: warning: ~s~n", [FileName, Line, Description]);
print_issue(FileName, {error, Description}) ->
print_issue({error, FileName, Description}) ->
io:format("~s:~s~n", [FileName, Description]);
print_issue(FileName, {error, Line, Description}) ->
print_issue({error, FileName, Line, Description}) ->
io:format("~s:~p: ~s~n", [FileName, Line, Description]).

-spec consult_file(file:filename()) -> {ok, term()} | {error, error()}.
Expand Down Expand Up @@ -443,6 +441,14 @@ try_consult(File) ->
syntaxerl_logger:debug(true, "Failed to read config file ~s: ~p~n", [File, Reason])
end.

fix_file_names(FileName, BaseFileName, ErrorList) ->
[fix_file_name(FileName, BaseFileName, Error) || Error <- ErrorList].

fix_file_name(FileName, BaseFileName, {Type, FileName, Line, Description}) ->
{Type, BaseFileName, Line, Description};
fix_file_name(_TmpFileName, _FileName, Issue) ->
Issue.

bs(Vars) ->
lists:foldl(fun({K,V}, Bs) ->
erl_eval:add_binding(K, V, Bs)
Expand Down
1 change: 1 addition & 0 deletions test/projects/rebar3-apps/apps/app1/include/bad.hrl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-define(macros).
3 changes: 3 additions & 0 deletions test/projects/rebar3-apps/apps/app1/src/include.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-module(include).

-include("bad.hrl").
2 changes: 2 additions & 0 deletions test/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,6 @@ check projects/rebar3-apps/apps/app1/src/subdir/subsrc.erl code 0 w/ ""
check projects/rebar3-apps/_build/default/lib/lib2/src/src.erl code 0 w/ ""
check projects/rebar3-apps/apps/app1/src/types.erl code 0 w/ ""

check projects/rebar3-apps/apps/app1/src/include.erl code 1 w/ "bad.hrl:1: badly formed 'define'"

exit ${EXIT}

0 comments on commit 3751b5a

Please sign in to comment.