summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rebar_erlc_compiler.erl26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl
index bea7efd..a9c652f 100644
--- a/src/rebar_erlc_compiler.erl
+++ b/src/rebar_erlc_compiler.erl
@@ -110,17 +110,27 @@ 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
+ % Split RestErls so that parse_transforms and behaviours are instead added
+ % to erl_first_files, parse transforms first.
% This should probably be somewhat combined with inspect_epp
- SortedRestErls = [K || {K, _V} <- lists:keysort(2,
- [{F, compile_priority(F)} || F <- RestErls ])],
-
+ [ParseTransforms, Behaviours, OtherErls] = lists:foldl(fun(F, [A, B, C]) ->
+ case compile_priority(F) of
+ parse_transform ->
+ [[F | A], B, C];
+ behaviour ->
+ [A, [F | B], C];
+ _ ->
+ [A, B, [F | C]]
+ end
+ end, [[], [], []], RestErls),
+
+ NewFirstErls = FirstErls ++ ParseTransforms ++ Behaviours,
%% Make sure that ebin/ exists and is on the path
ok = filelib:ensure_dir(filename:join("ebin", "dummy.beam")),
CurrPath = code:get_path(),
code:add_path("ebin"),
- rebar_base_compiler:run(Config, FirstErls, SortedRestErls,
+ rebar_base_compiler:run(Config, NewFirstErls, OtherErls,
fun(S, C) -> internal_erl_compile(S, C, OutDir,
ErlOpts)
end),
@@ -297,11 +307,11 @@ compile_priority(File) ->
F2 = fun({tree,arity_qualifier,_,
{arity_qualifier,{tree,atom,_,behaviour_info},
{tree,integer,_,1}}}, _) ->
- 2;
+ behaviour;
({tree,arity_qualifier,_,
{arity_qualifier,{tree,atom,_,parse_transform},
{tree,integer,_,2}}}, _) ->
- 1;
+ parse_transform;
(_, Acc) ->
Acc
end,
@@ -313,7 +323,7 @@ compile_priority(File) ->
Acc
end,
- lists:foldl(F, 10, Trees)
+ lists:foldl(F, normal, Trees)
end.
%%