Browse Source

Fix bug when library module implements several behaviours

Sergey Kudryashov 10 years ago
parent
commit
aa1aaee0be
3 changed files with 22 additions and 8 deletions
  1. 3 0
      .gitignore
  2. 12 8
      src/erlydtl_compiler_utils.erl
  3. 7 0
      test/erlydtl_lib_test1.erl

+ 3 - 0
.gitignore

@@ -10,3 +10,6 @@ tests/output
 deps
 deps
 .emacs*
 .emacs*
 .eunit
 .eunit
+/.edts
+/.rebar/
+/*.beam

+ 12 - 8
src/erlydtl_compiler_utils.erl

@@ -483,22 +483,27 @@ lib_module(Name, #dtl_context{ libraries=Libs }) ->
     Mod = proplists:get_value(Name, Libs, Name),
     Mod = proplists:get_value(Name, Libs, Name),
     case code:ensure_loaded(Mod) of
     case code:ensure_loaded(Mod) of
         {module, Mod} ->
         {module, Mod} ->
-            IsLib = case proplists:get_value(behaviour, Mod:module_info(attributes)) of
-                        Behaviours when is_list(Behaviours) ->
-                            lists:member(erlydtl_library, Behaviours);
-                        _ -> false
-                    end,
-            if IsLib ->
+            case is_library_behaviour_implemented(Mod) of
+                true ->
                     case Mod:version() of
                     case Mod:version() of
                         ?LIB_VERSION -> {ok, Mod};
                         ?LIB_VERSION -> {ok, Mod};
                         V -> {load_library, Name, Mod, {version, V}}
                         V -> {load_library, Name, Mod, {version, V}}
                     end;
                     end;
-               true -> {load_library, Name, Mod, behaviour}
+               false -> {load_library, Name, Mod, behaviour}
             end;
             end;
         {error, Reason} ->
         {error, Reason} ->
             {load_library, Name, Mod, Reason}
             {load_library, Name, Mod, Reason}
     end.
     end.
 
 
+is_library_behaviour_implemented(Mod) ->
+    lists:any(
+      fun({behaviour, BehavioursList}) ->
+              lists:member(erlydtl_library, BehavioursList);
+         (_) ->
+              false
+      end,
+      Mod:module_info(attributes)).
+
 read_library(Mod, Section, Which) ->
 read_library(Mod, Section, Which) ->
     [{Name, lib_function(Mod, Fun)}
     [{Name, lib_function(Mod, Fun)}
      || {Name, Fun} <- read_inventory(Mod, Section),
      || {Name, Fun} <- read_inventory(Mod, Section),
@@ -530,4 +535,3 @@ remove_first_quote(String) ->
 
 
 remove_last_quote(String) ->
 remove_last_quote(String) ->
     lists:reverse(remove_first_quote(lists:reverse(String))).
     lists:reverse(remove_first_quote(lists:reverse(String))).
-  

+ 7 - 0
test/erlydtl_lib_test1.erl

@@ -1,8 +1,15 @@
 -module(erlydtl_lib_test1).
 -module(erlydtl_lib_test1).
+-behaviour(erlydtl_lib_test1). %% for test multiple behaviours
 -behaviour(erlydtl_library).
 -behaviour(erlydtl_library).
 
 
 -export([version/0, inventory/1, reverse/1]).
 -export([version/0, inventory/1, reverse/1]).
 
 
+-export([behaviour_info/1]).
+
+behaviour_info(callbacks) ->
+    [
+    ].
+
 version() -> 1.
 version() -> 1.
 
 
 inventory(filters) -> [reverse];
 inventory(filters) -> [reverse];