@@ -3723,26 +3723,32 @@ defmodule Kernel do
3723
3723
3724
3724
case function? do
3725
3725
true ->
3726
- value =
3727
- case Module . __get_attribute__ ( env . module , name , line , false ) do
3728
- { _ , doc } when doc_attr? -> doc
3729
- other -> other
3730
- end
3726
+ case Module . __get_attribute__ ( env . module , name , line , false ) do
3727
+ { _ , doc } when doc_attr? ->
3728
+ do_at_escape ( name , doc )
3729
+
3730
+ % { __struct__: Regex , source: source , opts: opts } = regex ->
3731
+ # TODO: Remove this in Elixir v2.0
3732
+ IO . warn (
3733
+ "storing and reading regexes from module attributes is deprecated, " <>
3734
+ "inline the regex inside the function definition instead" ,
3735
+ env
3736
+ )
3737
+
3738
+ case :erlang . system_info ( :otp_release ) < [ ?2 , ?8 ] do
3739
+ true -> do_at_escape ( name , regex )
3740
+ false -> quote ( do: Regex . compile! ( unquote ( source ) , unquote ( opts ) ) )
3741
+ end
3731
3742
3732
- try do
3733
- :elixir_quote . escape ( value , :none , false )
3734
- rescue
3735
- ex in [ ArgumentError ] ->
3736
- raise ArgumentError ,
3737
- "cannot inject attribute @#{ name } into function/macro because " <>
3738
- Exception . message ( ex )
3743
+ value ->
3744
+ do_at_escape ( name , value )
3739
3745
end
3740
3746
3741
3747
false when doc_attr? ->
3742
3748
quote do
3743
3749
case Module . __get_attribute__ ( __MODULE__ , unquote ( name ) , unquote ( line ) , false ) do
3744
3750
{ _ , doc } -> doc
3745
- other -> other
3751
+ value -> value
3746
3752
end
3747
3753
end
3748
3754
@@ -3777,6 +3783,17 @@ defmodule Kernel do
3777
3783
raise ArgumentError , "expected 0 or 1 argument for @#{ name } , got: #{ length ( args ) } "
3778
3784
end
3779
3785
3786
+ defp do_at_escape ( name , value ) do
3787
+ try do
3788
+ :elixir_quote . escape ( value , :none , false )
3789
+ rescue
3790
+ ex in [ ArgumentError ] ->
3791
+ raise ArgumentError ,
3792
+ "cannot inject attribute @#{ name } into function/macro because " <>
3793
+ Exception . message ( ex )
3794
+ end
3795
+ end
3796
+
3780
3797
# Those are always compile-time dependencies, so we can skip the trace.
3781
3798
defp collect_traces ( :before_compile , arg , _env ) , do: { arg , [ ] }
3782
3799
defp collect_traces ( :after_compile , arg , _env ) , do: { arg , [ ] }
@@ -6500,6 +6517,7 @@ defmodule Kernel do
6500
6517
end
6501
6518
6502
6519
defp compile_regex ( binary_or_tuple , options ) do
6520
+ # TODO: Remove this when we require Erlang/OTP 28+
6503
6521
case is_binary ( binary_or_tuple ) and :erlang . system_info ( :otp_release ) < [ ?2 , ?8 ] do
6504
6522
true ->
6505
6523
Macro . escape ( Regex . compile! ( binary_or_tuple , :binary . list_to_bin ( options ) ) )
0 commit comments