Browse Source

Fix for dialyzer warnings in our customized yecc header (#111)

Andreas Stenius 11 years ago
parent
commit
9960ef9e85
1 changed files with 15 additions and 10 deletions
  1. 15 10
      include/erlydtl_preparser.hrl

+ 15 - 10
include/erlydtl_preparser.hrl

@@ -31,7 +31,7 @@
 
 
 -export([parse/1, parse_and_scan/1, format_error/1, resume/1]).
 -export([parse/1, parse_and_scan/1, format_error/1, resume/1]).
 
 
--type yecc_ret() :: {'error', _} | {'ok', _}.
+-type yecc_ret() :: {'error', _, _} | {'ok', _}.
 
 
 -spec parse(Tokens :: list()) -> yecc_ret().
 -spec parse(Tokens :: list()) -> yecc_ret().
 parse(Tokens) ->
 parse(Tokens) ->
@@ -72,20 +72,23 @@ return_state() ->
 yeccpars0(Tokens, Tzr, State, States, Vstack) ->
 yeccpars0(Tokens, Tzr, State, States, Vstack) ->
     try yeccpars1(Tokens, Tzr, State, States, Vstack)
     try yeccpars1(Tokens, Tzr, State, States, Vstack)
     catch 
     catch 
-        error: Error ->
-            Stacktrace = erlang:get_stacktrace(),
-            try yecc_error_type(Error, Stacktrace) of
-                Desc ->
-                    erlang:raise(error, {yecc_bug, ?CODE_VERSION, Desc},
-                                 Stacktrace)
-            catch _:_ -> erlang:raise(error, Error, Stacktrace)
+        error:function_clause = Error ->
+            case erlang:get_stacktrace() of
+                %% [{atom() | tuple(),atom(),[any()] | byte(),[{'file',string()} | {'line',pos_integer()}]}]
+                [{?MODULE, F, ArityOrArgs, _Source}|_]=Stacktrace ->
+                    erlang:raise(
+                      error,
+                      yecc_error_type(Error, F, ArityOrArgs),
+                      Stacktrace);
+                Stacktrace ->
+                    erlang:raise(error, Error, Stacktrace)
             end;
             end;
         %% Probably thrown from return_error/2:
         %% Probably thrown from return_error/2:
         throw: {error, {_Line, ?MODULE, _M}} = Error ->
         throw: {error, {_Line, ?MODULE, _M}} = Error ->
             Error
             Error
     end.
     end.
 
 
-yecc_error_type(function_clause, [{?MODULE,F,ArityOrArgs} | _]) ->
+yecc_error_type(function_clause=Error, F, ArityOrArgs) ->
     case atom_to_list(F) of
     case atom_to_list(F) of
         "yeccgoto_" ++ SymbolL ->
         "yeccgoto_" ++ SymbolL ->
             {ok,[{atom,_,Symbol}],_} = erl_scan:string(SymbolL),
             {ok,[{atom,_,Symbol}],_} = erl_scan:string(SymbolL),
@@ -93,7 +96,9 @@ yecc_error_type(function_clause, [{?MODULE,F,ArityOrArgs} | _]) ->
                         [S,_,_,_,_,_,_] -> S;
                         [S,_,_,_,_,_,_] -> S;
                         _ -> state_is_unknown
                         _ -> state_is_unknown
                     end,
                     end,
-            {Symbol, State, missing_in_goto_table}
+            Desc = {Symbol, State, missing_in_goto_table},
+            {yecc_bug, ?CODE_VERSION, Desc};
+        _ -> Error
     end.
     end.
 
 
 -define(checkparse(CALL, STATE),
 -define(checkparse(CALL, STATE),