Skip to content

Commit 6c96746

Browse files
committed
Narrow Resolv::DNS resource methods by typeclass
`Resolv::DNS#getresource` / `#getresources` / `#each_resource` / `#extract_resources` accept a typeclass argument (e.g. `Resolv::DNS::Resource::IN::MX`) that fully determines the returned resource subclass. The signatures returned the upper bound `Resolv::DNS::Resource`, dropping that information; callers using subclass-specific methods like `MX#exchange` then need a downcast. A bounded generic (`[T < Resolv::DNS::Resource] (..., singleton(T)) -> Array[T]`) would be the cleanest shape, but RBS does not currently accept a type variable inside `singleton(...)` (`Could not find ::T`). Fall back to per-subclass overloads for the `Resolv::DNS::Resource::IN::*` leaf types and `Generic`, with the previous wide overload kept as the trailing fallback (which also covers `Resource::ANY` and other classes under `Resolv::DNS::Query`).
1 parent fcc1685 commit 6c96746

1 file changed

Lines changed: 61 additions & 5 deletions

File tree

stdlib/resolv/0/resolv.rbs

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,37 @@ class Resolv::DNS
218218
# Iterates over all `typeclass` DNS resources for `name`. See #getresource for
219219
# argument details.
220220
#
221-
def each_resource: (dns_name name, singleton(Resolv::DNS::Query) typeclass) { (Resolv::DNS::Resource) -> void } -> void
222-
223-
def extract_resources: (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Query) typeclass) { (Resolv::DNS::Resource) -> void } -> void
221+
def each_resource: (dns_name name, singleton(Resolv::DNS::Resource::IN::A) typeclass) { (Resolv::DNS::Resource::IN::A) -> void } -> void
222+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::AAAA) typeclass) { (Resolv::DNS::Resource::IN::AAAA) -> void } -> void
223+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::CNAME) typeclass) { (Resolv::DNS::Resource::IN::CNAME) -> void } -> void
224+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::HINFO) typeclass) { (Resolv::DNS::Resource::IN::HINFO) -> void } -> void
225+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::LOC) typeclass) { (Resolv::DNS::Resource::IN::LOC) -> void } -> void
226+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::MINFO) typeclass) { (Resolv::DNS::Resource::IN::MINFO) -> void } -> void
227+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::MX) typeclass) { (Resolv::DNS::Resource::IN::MX) -> void } -> void
228+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::NS) typeclass) { (Resolv::DNS::Resource::IN::NS) -> void } -> void
229+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::PTR) typeclass) { (Resolv::DNS::Resource::IN::PTR) -> void } -> void
230+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::SOA) typeclass) { (Resolv::DNS::Resource::IN::SOA) -> void } -> void
231+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::SRV) typeclass) { (Resolv::DNS::Resource::IN::SRV) -> void } -> void
232+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::TXT) typeclass) { (Resolv::DNS::Resource::IN::TXT) -> void } -> void
233+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::WKS) typeclass) { (Resolv::DNS::Resource::IN::WKS) -> void } -> void
234+
| (dns_name name, singleton(Resolv::DNS::Resource::Generic) typeclass) { (Resolv::DNS::Resource::Generic) -> void } -> void
235+
| (dns_name name, singleton(Resolv::DNS::Query) typeclass) { (Resolv::DNS::Resource) -> void } -> void
236+
237+
def extract_resources: (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::A) typeclass) { (Resolv::DNS::Resource::IN::A) -> void } -> void
238+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::AAAA) typeclass) { (Resolv::DNS::Resource::IN::AAAA) -> void } -> void
239+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::CNAME) typeclass) { (Resolv::DNS::Resource::IN::CNAME) -> void } -> void
240+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::HINFO) typeclass) { (Resolv::DNS::Resource::IN::HINFO) -> void } -> void
241+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::LOC) typeclass) { (Resolv::DNS::Resource::IN::LOC) -> void } -> void
242+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::MINFO) typeclass) { (Resolv::DNS::Resource::IN::MINFO) -> void } -> void
243+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::MX) typeclass) { (Resolv::DNS::Resource::IN::MX) -> void } -> void
244+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::NS) typeclass) { (Resolv::DNS::Resource::IN::NS) -> void } -> void
245+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::PTR) typeclass) { (Resolv::DNS::Resource::IN::PTR) -> void } -> void
246+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::SOA) typeclass) { (Resolv::DNS::Resource::IN::SOA) -> void } -> void
247+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::SRV) typeclass) { (Resolv::DNS::Resource::IN::SRV) -> void } -> void
248+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::TXT) typeclass) { (Resolv::DNS::Resource::IN::TXT) -> void } -> void
249+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::IN::WKS) typeclass) { (Resolv::DNS::Resource::IN::WKS) -> void } -> void
250+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Resource::Generic) typeclass) { (Resolv::DNS::Resource::Generic) -> void } -> void
251+
| (Resolv::DNS::Message msg, dns_name name, singleton(Resolv::DNS::Query) typeclass) { (Resolv::DNS::Resource) -> void } -> void
224252

225253
# <!--
226254
# rdoc-file=lib/resolv.rb
@@ -299,7 +327,21 @@ class Resolv::DNS
299327
# Returned resource is represented as a Resolv::DNS::Resource instance, i.e.
300328
# Resolv::DNS::Resource::IN::A.
301329
#
302-
def getresource: (dns_name name, singleton(Resolv::DNS::Query) typeclass) -> Resolv::DNS::Resource
330+
def getresource: (dns_name name, singleton(Resolv::DNS::Resource::IN::A) typeclass) -> Resolv::DNS::Resource::IN::A
331+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::AAAA) typeclass) -> Resolv::DNS::Resource::IN::AAAA
332+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::CNAME) typeclass) -> Resolv::DNS::Resource::IN::CNAME
333+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::HINFO) typeclass) -> Resolv::DNS::Resource::IN::HINFO
334+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::LOC) typeclass) -> Resolv::DNS::Resource::IN::LOC
335+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::MINFO) typeclass) -> Resolv::DNS::Resource::IN::MINFO
336+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::MX) typeclass) -> Resolv::DNS::Resource::IN::MX
337+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::NS) typeclass) -> Resolv::DNS::Resource::IN::NS
338+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::PTR) typeclass) -> Resolv::DNS::Resource::IN::PTR
339+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::SOA) typeclass) -> Resolv::DNS::Resource::IN::SOA
340+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::SRV) typeclass) -> Resolv::DNS::Resource::IN::SRV
341+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::TXT) typeclass) -> Resolv::DNS::Resource::IN::TXT
342+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::WKS) typeclass) -> Resolv::DNS::Resource::IN::WKS
343+
| (dns_name name, singleton(Resolv::DNS::Resource::Generic) typeclass) -> Resolv::DNS::Resource::Generic
344+
| (dns_name name, singleton(Resolv::DNS::Query) typeclass) -> Resolv::DNS::Resource
303345

304346
# <!--
305347
# rdoc-file=lib/resolv.rb
@@ -308,7 +350,21 @@ class Resolv::DNS
308350
# Looks up all `typeclass` DNS resources for `name`. See #getresource for
309351
# argument details.
310352
#
311-
def getresources: (dns_name name, singleton(Resolv::DNS::Query) typeclass) -> Array[Resolv::DNS::Resource]
353+
def getresources: (dns_name name, singleton(Resolv::DNS::Resource::IN::A) typeclass) -> Array[Resolv::DNS::Resource::IN::A]
354+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::AAAA) typeclass) -> Array[Resolv::DNS::Resource::IN::AAAA]
355+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::CNAME) typeclass) -> Array[Resolv::DNS::Resource::IN::CNAME]
356+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::HINFO) typeclass) -> Array[Resolv::DNS::Resource::IN::HINFO]
357+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::LOC) typeclass) -> Array[Resolv::DNS::Resource::IN::LOC]
358+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::MINFO) typeclass) -> Array[Resolv::DNS::Resource::IN::MINFO]
359+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::MX) typeclass) -> Array[Resolv::DNS::Resource::IN::MX]
360+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::NS) typeclass) -> Array[Resolv::DNS::Resource::IN::NS]
361+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::PTR) typeclass) -> Array[Resolv::DNS::Resource::IN::PTR]
362+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::SOA) typeclass) -> Array[Resolv::DNS::Resource::IN::SOA]
363+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::SRV) typeclass) -> Array[Resolv::DNS::Resource::IN::SRV]
364+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::TXT) typeclass) -> Array[Resolv::DNS::Resource::IN::TXT]
365+
| (dns_name name, singleton(Resolv::DNS::Resource::IN::WKS) typeclass) -> Array[Resolv::DNS::Resource::IN::WKS]
366+
| (dns_name name, singleton(Resolv::DNS::Resource::Generic) typeclass) -> Array[Resolv::DNS::Resource::Generic]
367+
| (dns_name name, singleton(Resolv::DNS::Query) typeclass) -> Array[Resolv::DNS::Resource]
312368

313369
def lazy_initialize: () -> untyped
314370

0 commit comments

Comments
 (0)