File 6111-Add-erl_anno-set_end_location-2.patch of Package erlang

From 16ead333a7704610fd3daf8de44d227faa941964 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonatan=20K=C5=82osko?= <jonatanklosko@gmail.com>
Date: Tue, 12 Nov 2024 14:00:03 +0800
Subject: [PATCH] Add erl_anno:set_end_location/2

---
 lib/stdlib/src/erl_anno.erl        | 51 +++++++++++++++++++++++-------
 lib/stdlib/test/erl_anno_SUITE.erl | 26 ++++++++++++++-
 2 files changed, 64 insertions(+), 13 deletions(-)

diff --git a/lib/stdlib/src/erl_anno.erl b/lib/stdlib/src/erl_anno.erl
index 3a64c221b4..ef47d5a4df 100644
--- a/lib/stdlib/src/erl_anno.erl
+++ b/lib/stdlib/src/erl_anno.erl
@@ -75,7 +75,7 @@ for manipulating annotations in abstract code.
 -export([column/1, end_location/1, file/1, generated/1,
          line/1, location/1, record/1, text/1]).
 -export([set_file/2, set_generated/2, set_line/2, set_location/2,
-         set_record/2, set_text/2]).
+         set_end_location/2, set_record/2, set_text/2]).
 
 %% To be used when necessary to avoid Dialyzer warnings.
 -export([to_term/1, from_term/1]).
@@ -100,6 +100,7 @@ for manipulating annotations in abstract code.
 -type annotation() :: {'file', filename()}
                     | {'generated', generated()}
                     | {'location', location()}
+                    | {'end_location', location()}
                     | {'record', record()}
                     | {'text', string()}.
 
@@ -251,17 +252,27 @@ column(Anno) ->
 -spec end_location(Anno) -> location() | 'undefined' when
       Anno :: anno().
 
+end_location(Line) when ?ALINE(Line) ->
+    undefined;
+end_location({Line, Column}) when ?ALINE(Line), ?ACOLUMN(Column) ->
+    undefined;
 end_location(Anno) ->
-    case text(Anno) of
+    case anno_info(Anno, end_location) of
         undefined ->
-            undefined;
-        Text ->
-            case location(Anno) of
-                {Line, Column} ->
-                    end_location(Text, Line, Column);
-                Line ->
-                    end_location(Text, Line)
-            end
+            case text(Anno) of
+                undefined ->
+                    undefined;
+                Text ->
+                    case location(Anno) of
+                        {Line, Column} ->
+                            end_location(Text, Line, Column);
+                        Line ->
+                            end_location(Text, Line)
+                    end
+            end;
+
+        Location ->
+            Location
     end.
 
 -spec file(Anno) -> filename() | 'undefined' when
@@ -403,6 +417,13 @@ set_location({L, C}=Loc, {Line, Column}) when ?ALINE(Line), ?ACOLUMN(Column),
 set_location(Location, Anno) ->
     set(location, Location, Anno).
 
+-spec set_end_location(Location, Anno) -> Anno when
+      Location :: location(),
+      Anno :: anno().
+
+set_end_location(Location, Anno) ->
+    set(end_location, Location, Anno).
+
 -spec set_record(Record, Anno) -> Anno when
       Record :: record(),
       Anno :: anno().
@@ -508,6 +531,10 @@ is_settable(location, Line) when ?LLINE(Line) ->
     true;
 is_settable(location, {Line, Column}) when ?LLINE(Line), ?LCOLUMN(Column) ->
     true;
+is_settable(end_location, Line) when ?LLINE(Line) ->
+    true;
+is_settable(end_location, {Line, Column}) when ?LLINE(Line), ?LCOLUMN(Column) ->
+    true;
 is_settable(record, Boolean) when Boolean; not Boolean ->
     true;
 is_settable(text, Text) ->
diff --git a/lib/stdlib/test/erl_anno_SUITE.erl b/lib/stdlib/test/erl_anno_SUITE.erl
index 71ea9c3e1e..bc95ee6582 100644
--- a/lib/stdlib/test/erl_anno_SUITE.erl
+++ b/lib/stdlib/test/erl_anno_SUITE.erl
@@ -131,6 +131,11 @@ end_location(_Config) ->
     test(1, [{text, "TEXT", [{end_location, 1}, {length, 4}]},
              {text, "TEXT\n", [{end_location, 2}, {length, 5}]},
              {text, "TEXT\ntxt", [{end_location, 2}, {length, 8}]}]),
+    test({1, 17}, [{end_location, {1, 21}, [{end_location, {1, 21}}]},
+                   {end_location, {2, 1}, [{end_location, {2, 1}}]}]),
+    test(1, [{end_location, 1, [{end_location, 1}]},
+             {end_location, 2, [{end_location, 2}]},
+             {end_location, {1, 2}, [{end_location, {1, 2}}]}]),
     ok.
 
 %% Test 'file'.
@@ -396,6 +401,8 @@ anno_set(line, Value, Anno) ->
     erl_anno:set_line(Value, Anno);
 anno_set(location, Value, Anno) ->
     erl_anno:set_location(Value, Anno);
+anno_set(end_location, Value, Anno) ->
+    erl_anno:set_end_location(Value, Anno);
 anno_set(record, Value, Anno) ->
     erl_anno:set_record(Value, Anno);
 anno_set(text, Value, Anno) ->
@@ -463,6 +470,23 @@ primary_value(line, State) ->
                Line ->
                    Line
            end};
+primary_value(end_location, State) ->
+    case lists:keyfind(end_location, 1, State) of
+        false ->
+            case lists:keyfind(text, 1, State) of
+                false ->
+                    undefined;
+                {text, Text} ->
+                    case lists:keyfind(location, 1, State) of
+                        false ->
+                            undefined;
+                        {location, Location} ->
+                            {end_location, erl_anno:end_location(erl_anno:set_text(Text, erl_anno:new(Location)))}
+                    end
+            end;
+        Tuple ->
+            Tuple
+    end;
 primary_value(Item, State) ->
     case lists:keyfind(Item, 1, State) of
         false ->
@@ -475,7 +499,7 @@ default() ->
     [{Tag, default_value(Tag)} || Tag <- default_items()].
 
 primary_items() ->
-    [file, generated, line, location, record, text].
+    [file, generated, line, location, end_location, record, text].
 
 secondary_items() ->
     %% 'length' has not been implemented
-- 
2.43.0

openSUSE Build Service is sponsored by