Skip to content

Commit d85c72a

Browse files
committed
Polyfill Kernel#warn category parameter
1 parent 335a193 commit d85c72a

File tree

5 files changed

+46
-2
lines changed

5 files changed

+46
-2
lines changed

lib/prism.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def self.load(source, serialized, freeze = false)
6868
end
6969

7070
require_relative "prism/polyfill/byteindex"
71+
require_relative "prism/polyfill/warn"
7172
require_relative "prism/node"
7273
require_relative "prism/node_ext"
7374
require_relative "prism/parse_result"

lib/prism/node_ext.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def deprecated(*replacements) # :nodoc:
99
location = location[0].label if location
1010
suggest = replacements.map { |replacement| "#{self.class}##{replacement}" }
1111

12-
warn(<<~MSG)
12+
warn(<<~MSG, uplevel: 1, category: :deprecated)
1313
[deprecation]: #{self.class}##{location} is deprecated and will be \
1414
removed in the next major version. Use #{suggest.join("/")} instead.
1515
#{(caller(1, 3) || []).join("\n")}

lib/prism/polyfill/warn.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# frozen_string_literal: true
2+
3+
# Polyfill for Kernel#warn with the category parameter. Not all Ruby engines
4+
# have Method#parameters implemented, so we check the arity instead if
5+
# necessary.
6+
if (method = Kernel.instance_method(:warn)).respond_to?(:parameters) ? method.parameters.none? { |_, name| name == :category } : (method.arity == -1)
7+
Kernel.prepend(
8+
Module.new {
9+
def warn(*msgs, uplevel: nil, category: nil) # :nodoc:
10+
uplevel =
11+
case uplevel
12+
when nil
13+
1
14+
when Integer
15+
uplevel + 1
16+
else
17+
uplevel.to_int + 1
18+
end
19+
20+
super(*msgs, uplevel: uplevel)
21+
end
22+
}
23+
)
24+
25+
Object.prepend(
26+
Module.new {
27+
def warn(*msgs, uplevel: nil, category: nil) # :nodoc:
28+
uplevel =
29+
case uplevel
30+
when nil
31+
1
32+
when Integer
33+
uplevel + 1
34+
else
35+
uplevel.to_int + 1
36+
end
37+
38+
super(*msgs, uplevel: uplevel)
39+
end
40+
}
41+
)
42+
end

lib/prism/translation/parser.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def initialize(message, level, reason, location)
6060
#
6161
def initialize(builder = Prism::Translation::Parser::Builder.new, parser: Prism)
6262
if !builder.is_a?(Prism::Translation::Parser::Builder)
63-
warn(<<~MSG, uplevel: 1)
63+
warn(<<~MSG, uplevel: 1, category: :deprecated)
6464
[deprecation]: The builder passed to `Prism::Translation::Parser.new` is not a \
6565
`Prism::Translation::Parser::Builder` subclass. This will raise in the next major version.
6666
MSG

prism.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ Gem::Specification.new do |spec|
8989
"lib/prism/polyfill/append_as_bytes.rb",
9090
"lib/prism/polyfill/byteindex.rb",
9191
"lib/prism/polyfill/unpack1.rb",
92+
"lib/prism/polyfill/warn.rb",
9293
"lib/prism/reflection.rb",
9394
"lib/prism/relocation.rb",
9495
"lib/prism/serialize.rb",

0 commit comments

Comments
 (0)