LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 1233-syntax_tools-Add-support-for-if-and-elif.patch of Package erlang (Project home:Ledest:erlang:20)

From 71bb5d9272bfa046c3cfe8a419bf70877f141146 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 19 Oct 2015 14:04:13 +0200
Subject: [PATCH 3/4] syntax_tools: Add support for -if and -elif

---
 lib/syntax_tools/src/epp_dodger.erl     | 36 +++++++++++++++++++++++++++++++--
 lib/syntax_tools/src/erl_prettypr.erl   |  7 ++++++-
 lib/syntax_tools/src/erl_syntax_lib.erl |  2 ++
 3 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/lib/syntax_tools/src/epp_dodger.erl b/lib/syntax_tools/src/epp_dodger.erl
index 0a12e8fd8b..7e741cc649 100644
--- a/lib/syntax_tools/src/epp_dodger.erl
+++ b/lib/syntax_tools/src/epp_dodger.erl
@@ -502,6 +502,10 @@ quickscan_form([{'-', _L}, {atom, La, ifdef} | _Ts]) ->
     kill_form(La);
 quickscan_form([{'-', _L}, {atom, La, ifndef} | _Ts]) ->
     kill_form(La);
+quickscan_form([{'-', _L}, {'if', La} | _Ts]) ->
+    kill_form(La);
+quickscan_form([{'-', _L}, {atom, La, elif} | _Ts]) ->
+    kill_form(La);
 quickscan_form([{'-', _L}, {atom, La, else} | _Ts]) ->
     kill_form(La);
 quickscan_form([{'-', _L}, {atom, La, endif} | _Ts]) ->
@@ -615,8 +619,13 @@ filter_form(T) ->
 %% ---------------------------------------------------------------------
 %% Normal parsing - try to preserve all information
 
-normal_parser(Ts, Opt) ->
-    rewrite_form(parse_tokens(scan_form(Ts, Opt))).
+normal_parser(Ts0, Opt) ->
+    case scan_form(Ts0, Opt) of
+	Ts when is_list(Ts) ->
+	    rewrite_form(parse_tokens(Ts));
+	Node ->
+	    Node
+    end.
 
 scan_form([{'-', _L}, {atom, La, define} | Ts], Opt) ->
     [{atom, La, ?pp_form}, {'(', La}, {')', La}, {'->', La},
@@ -636,12 +645,26 @@ scan_form([{'-', _L}, {atom, La, ifdef} | Ts], Opt) ->
 scan_form([{'-', _L}, {atom, La, ifndef} | Ts], Opt) ->
     [{atom, La, ?pp_form}, {'(', La}, {')', La}, {'->', La},
      {atom, La, ifndef} | scan_macros(Ts, Opt)];
+scan_form([{'-', _L}, {'if', La} | Ts], Opt) ->
+    [{atom, La, ?pp_form}, {'(', La}, {')', La}, {'->', La},
+     {atom, La, 'if'} | scan_macros(Ts, Opt)];
+scan_form([{'-', _L}, {atom, La, elif} | Ts], Opt) ->
+    [{atom, La, ?pp_form}, {'(', La}, {')', La}, {'->', La},
+     {atom, La, 'elif'} | scan_macros(Ts, Opt)];
 scan_form([{'-', _L}, {atom, La, else} | Ts], Opt) ->
     [{atom, La, ?pp_form}, {'(', La}, {')', La}, {'->', La},
      {atom, La, else} | scan_macros(Ts, Opt)];
 scan_form([{'-', _L}, {atom, La, endif} | Ts], Opt) ->
     [{atom, La, ?pp_form}, {'(', La}, {')', La}, {'->', La},
      {atom, La, endif} | scan_macros(Ts, Opt)];
+scan_form([{'-', _L}, {atom, La, error} | Ts], _Opt) ->
+    Desc = build_info_string("-error", Ts),
+    ErrorInfo = {La, ?MODULE, {error, Desc}},
+    erl_syntax:error_marker(ErrorInfo);
+scan_form([{'-', _L}, {atom, La, warning} | Ts], _Opt) ->
+    Desc = build_info_string("-warning", Ts),
+    ErrorInfo = {La, ?MODULE, {warning, Desc}},
+    erl_syntax:error_marker(ErrorInfo);
 scan_form([{'-', L}, {'?', L1}, {Type, _, _}=N | [{'(', _} | _]=Ts], Opt)
   when Type =:= atom; Type =:= var ->
     %% minus, macro and open parenthesis at start of form - assume that
@@ -657,6 +680,11 @@ scan_form([{'?', L}, {Type, _, _}=N | [{'(', _} | _]=Ts], Opt)
 scan_form(Ts, Opt) ->
     scan_macros(Ts, Opt).
 
+build_info_string(Prefix, Ts0) ->
+    Ts = lists:droplast(Ts0),
+    String = lists:droplast(tokens_to_string(Ts)),
+    Prefix ++ " " ++ String ++ ".".
+
 scan_macros(Ts, Opt) ->
     scan_macros(Ts, [], Opt).
 
@@ -865,6 +893,10 @@ tokens_to_string([]) ->
 
 format_error(macro_args) ->
     errormsg("macro call missing end parenthesis");
+format_error({error, Error}) ->
+    Error;
+format_error({warning, Error}) ->
+    Error;
 format_error({unknown, Reason}) ->
     errormsg(io_lib:format("unknown error: ~tP", [Reason, 15])).
 
diff --git a/lib/syntax_tools/src/erl_prettypr.erl b/lib/syntax_tools/src/erl_prettypr.erl
index 60a15c8e3f..6906ef1553 100644
--- a/lib/syntax_tools/src/erl_prettypr.erl
+++ b/lib/syntax_tools/src/erl_prettypr.erl
@@ -675,7 +675,12 @@ lay_2(Node, Ctxt) ->
 	    %% attribute name, without following parentheses.
 	    Ctxt1 = reset_prec(Ctxt),
             Args = erl_syntax:attribute_arguments(Node),
-            N = erl_syntax:attribute_name(Node),
+            N = case erl_syntax:attribute_name(Node) of
+                    {atom, _, 'if'} ->
+                        erl_syntax:variable('if');
+                    N0 ->
+                        N0
+                end,
             D = case attribute_type(Node) of
                     spec ->
                         [SpecTuple] = Args,
diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl
index c7f477c4d2..ced0dba3e2 100644
--- a/lib/syntax_tools/src/erl_syntax_lib.erl
+++ b/lib/syntax_tools/src/erl_syntax_lib.erl
@@ -1317,6 +1317,8 @@ analyze_attribute(Node) ->
                 include_lib -> preprocessor;
                 ifdef -> preprocessor;
                 ifndef -> preprocessor;
+                'if' -> preprocessor;
+                elif -> preprocessor;
                 else -> preprocessor;
                 endif -> preprocessor;
                 A ->
-- 
2.16.3