diff options
Diffstat (limited to 'src/rebar_erlc_compiler.erl')
-rw-r--r-- | src/rebar_erlc_compiler.erl | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 6eb71e2..33014cf 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -80,10 +80,16 @@ doterl_compile(Config, OutDir, MoreSources) -> RestErls = [Source || Source <- gather_src(SrcDirs, []) ++ MoreSources, lists:member(Source, FirstErls) == false], + % Sort RestErls so that parse_transforms and behaviours are first + % This should probably be somewhat combined with inspect_epp + SortedRestErls = [K || {K, _V} <- lists:keysort(2, + [{F, compile_priority(F)} || F <- RestErls ])], + + %% Make sure that ebin/ is on the path CurrPath = code:get_path(), code:add_path("ebin"), - rebar_base_compiler:run(Config, FirstErls, RestErls, + rebar_base_compiler:run(Config, FirstErls, SortedRestErls, fun(S, C) -> internal_erl_compile(S, C, OutDir) end), code:set_path(CurrPath), ok. @@ -211,3 +217,32 @@ delete_dir(Dir, []) -> delete_dir(Dir, Subdirs) -> lists:foreach(fun(D) -> delete_dir(D, dirs(D)) end, Subdirs), file:del_dir(Dir). + +-spec compile_priority(File::string()) -> pos_integer(). +compile_priority(File) -> + case epp_dodger:parse_file(File) of + {error, _} -> + 10; % couldn't parse the file, default priority + {ok, Trees} -> + ?DEBUG("Computing priority of ~p\n", [File]), + F2 = fun({tree,arity_qualifier,_, + {arity_qualifier,{tree,atom,_,behaviour_info}, + {tree,integer,_,1}}}, _) -> + 2; + ({tree,arity_qualifier,_, + {arity_qualifier,{tree,atom,_,parse_transform}, + {tree,integer,_,2}}}, _) -> + 1; + (_, Acc) -> + Acc + end, + + F = fun({tree, attribute, _, {attribute, {tree, atom, _, export}, + [{tree, list, _, {list, List, none}}]}}, Acc) -> + lists:foldl(F2, Acc, List); + (_, Acc) -> + Acc + end, + + lists:foldl(F, 10, Trees) + end. |