packages and forgotten imports

Ulf Wiger <>
Thu Apr 17 17:19:06 CEST 2003

I've been playing around with packages in Erlang for a
while, and must say that it happens annoyingly often that I
forget to insert 'import' clauses for OTP modules that I
want to use.

The standard Erlang problem of calling undefined external
functions is usually not a very big one, IMHO, but it
becomes decidedly more common with packages due to the
legacy treatment of "the empty package".

A suggestion: if a module with a package name is compiled,
the linter could issue a warning if an implicitly named
module is not found in the 'outdir'.

It's not difficult to order modules in the Makefile so that
compilation is done in dependency order; this has to be done
anyway if one defines custom behaviours or parse transforms
(I know, that doesn't happen every day.)

I've attached a suggested patch to erl_lint.erl.

Given the following test module (test.erl):


%% forgotten -import(lists).

foo() ->
   lists:foldl(fun(X,A) -> [X|A] end, [], [a,b,c]).

1> compile:file(test,[{outdir,"../ebin"},return_warnings]).

42> compile:file(test,[{outdir,"../ebin"},report_warnings]).
./test.erl:7: Warning: Missing import for module lists

Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson AB, Connectivity and Control Nodes

-------------- next part --------------
> format_error({maybe_missing_import, Name}) ->
>     io_lib:format("Missing import for module ~s", [Name]);
<                             M1 = packages:concat(St1#lint.package,
> 			    St2 = add_warning(
> 				    not(exists_in_package(Name, St1)),
> 				    L, {maybe_missing_import,Name}, St1),
>                             M1 = packages:concat(St2#lint.package,
<                             {{atom,L,list_to_atom(M1)}, St1}
>                             {{atom,L,list_to_atom(M1)}, St2}
>     end.
> exists_in_package(Name, St) ->
>     OutDir = proplists:get_value(outdir,St#lint.compile),
>     case file:read_file_info(
> 	   filename:join(OutDir, Name ++ code:objfile_extension())) of
> 	{ok, _} ->
> 	    true;
> 	_ ->
> 	    false

More information about the erlang-patches mailing list