@@ -3716,26 +3716,25 @@ defmodule Kernel do
3716
3716
3717
3717
case function? do
3718
3718
true ->
3719
- value =
3720
- case Module . __get_attribute__ ( env . module , name , line , false ) do
3721
- { _ , doc } when doc_attr? -> doc
3722
- other -> other
3723
- end
3719
+ case Module . __get_attribute__ ( env . module , name , line , false ) do
3720
+ { _ , doc } when doc_attr? ->
3721
+ do_at_escape ( name , doc )
3722
+
3723
+ % { __struct__: Regex , source: source , opts: opts } = regex ->
3724
+ case :erlang . system_info ( :otp_release ) < [ ?2 , ?8 ] do
3725
+ true -> do_at_escape ( name , regex )
3726
+ false -> quote ( do: Regex . compile! ( unquote ( source ) , unquote ( opts ) ) )
3727
+ end
3724
3728
3725
- try do
3726
- :elixir_quote . escape ( value , :none , false )
3727
- rescue
3728
- ex in [ ArgumentError ] ->
3729
- raise ArgumentError ,
3730
- "cannot inject attribute @#{ name } into function/macro because " <>
3731
- Exception . message ( ex )
3729
+ value ->
3730
+ do_at_escape ( name , value )
3732
3731
end
3733
3732
3734
3733
false when doc_attr? ->
3735
3734
quote do
3736
3735
case Module . __get_attribute__ ( __MODULE__ , unquote ( name ) , unquote ( line ) , false ) do
3737
3736
{ _ , doc } -> doc
3738
- other -> other
3737
+ value -> value
3739
3738
end
3740
3739
end
3741
3740
@@ -3770,6 +3769,17 @@ defmodule Kernel do
3770
3769
raise ArgumentError , "expected 0 or 1 argument for @#{ name } , got: #{ length ( args ) } "
3771
3770
end
3772
3771
3772
+ defp do_at_escape ( name , value ) do
3773
+ try do
3774
+ :elixir_quote . escape ( value , :none , false )
3775
+ rescue
3776
+ ex in [ ArgumentError ] ->
3777
+ raise ArgumentError ,
3778
+ "cannot inject attribute @#{ name } into function/macro because " <>
3779
+ Exception . message ( ex )
3780
+ end
3781
+ end
3782
+
3773
3783
# Those are always compile-time dependencies, so we can skip the trace.
3774
3784
defp collect_traces ( :before_compile , arg , _env ) , do: { arg , [ ] }
3775
3785
defp collect_traces ( :after_compile , arg , _env ) , do: { arg , [ ] }
@@ -6461,6 +6471,7 @@ defmodule Kernel do
6461
6471
end
6462
6472
6463
6473
defp compile_regex ( binary_or_tuple , options ) do
6474
+ # TODO: Remove this when we require Erlang/OTP 28+
6464
6475
case is_binary ( binary_or_tuple ) and :erlang . system_info ( :otp_release ) < [ ?2 , ?8 ] do
6465
6476
true ->
6466
6477
Macro . escape ( Regex . compile! ( binary_or_tuple , :binary . list_to_bin ( options ) ) )
0 commit comments