From e5b9932a62989ea386d96b6f47aed60d2fd715a4 Mon Sep 17 00:00:00 2001
From: Kazuhiro NISHIYAMA
Date: Tue, 14 Jul 2026 22:11:43 +0900
Subject: [PATCH] =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E3=83=9A=E3=83=BC?=
=?UTF-8?q?=E3=82=B8=E3=81=AB=E3=80=8C=E5=86=8D=E5=AE=9A=E7=BE=A9=E3=81=95?=
=?UTF-8?q?=E3=82=8C=E3=81=9F=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=80=8D?=
=?UTF-8?q?=E3=82=BB=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E8=BF=BD?=
=?UTF-8?q?=E5=8A=A0=E3=81=99=E3=82=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
同名で再定義されたメソッド(kind が :redefined。例: mathn が Integer#/
を再定義)は、これまで partitioned_entries で :defined と合算され、
「インスタンスメソッド」等のセクションに混ざって表示されていた。これを
独立した「再定義されたメソッド」セクションに分けて表示する。
- ClassEntry::Parts に redefined バケットを追加し、partitioned_entries
で :defined と :redefined を別々に振り分ける
- 各クラステンプレート(offline/epub/lillia/legacy)に再定義メソッドの
セクションを追加する。offline では祖先メソッド抑制用の集合にも
再定義メソッド名を含め、継承メソッド一覧との重複を防ぐ
- カタログに "Redefined Methods"/「再定義されたメソッド」を追加
- RBS(Parts)を更新し、test_entry / test_class_screen にテストを追加
fix rurema/bitclust#167
Co-Authored-By: Claude Opus 4.8 (1M context)
---
data/bitclust/catalog/ja_JP.UTF-8 | 2 ++
data/bitclust/template.epub/class | 1 +
data/bitclust/template.lillia/class | 1 +
data/bitclust/template.offline/class | 5 ++--
data/bitclust/template/class | 35 ++++++++++++++++++++++++++++
lib/bitclust/classentry.rb | 9 +++++--
sig/bitclust/classentry.rbs | 2 ++
test/test_class_screen.rb | 10 ++++++++
test/test_entry.rb | 19 +++++++++++++++
9 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/data/bitclust/catalog/ja_JP.UTF-8 b/data/bitclust/catalog/ja_JP.UTF-8
index 01b02440..c9b81c20 100644
--- a/data/bitclust/catalog/ja_JP.UTF-8
+++ b/data/bitclust/catalog/ja_JP.UTF-8
@@ -84,6 +84,8 @@ Private Instance Methods
privateメソッド
Protected Instance Methods
protectedメソッド
+Redefined Methods
+再定義されたメソッド
Private Singleton Methods
private特異メソッド
Required Libraries
diff --git a/data/bitclust/template.epub/class b/data/bitclust/template.epub/class
index e8b65fbb..c0eb586b 100644
--- a/data/bitclust/template.epub/class
+++ b/data/bitclust/template.epub/class
@@ -59,6 +59,7 @@
[_('Private Instance Methods'), ents.private_instance_methods ],
[_('Protected Instance Methods'),ents.protected_instance_methods ],
[_('Module Functions'), ents.module_functions ],
+ [_('Redefined Methods'), ents.redefined ],
[_('Constants'), ents.constants ],
[_('Special Variables'), ents.special_variables ,'$']] %>
<%= headline(_("Index")) %>
diff --git a/data/bitclust/template.lillia/class b/data/bitclust/template.lillia/class
index 154b5920..3986e5a6 100644
--- a/data/bitclust/template.lillia/class
+++ b/data/bitclust/template.lillia/class
@@ -63,6 +63,7 @@
[_('Module Functions'), ents.module_functions ],
[_('Constants'), ents.constants ],
[_('Special Variables'), ents.special_variables ],
+ [_('Redefined Methods'), ents.redefined ],
[_('Added Methods'), ents.added ] ]\
.each do |label, entries|
unless entries.empty? %>
diff --git a/data/bitclust/template.offline/class b/data/bitclust/template.offline/class
index 00c75dc6..ff93fe2c 100644
--- a/data/bitclust/template.offline/class
+++ b/data/bitclust/template.offline/class
@@ -122,6 +122,7 @@
[_('Private Instance Methods'), ents.private_instance_methods ],
[_('Protected Instance Methods'),ents.protected_instance_methods ],
[_('Module Functions'), ents.module_functions ],
+ [_('Redefined Methods'), ents.redefined ],
[_('Undefined Methods for Explanation'), ents.nomethod ],
[_('Constants'), ents.constants ],
[_('Special Variables'), ents.special_variables ,'$']] %>
@@ -148,8 +149,8 @@
<%
_myself, *ancestors = @entry.ancestors.reject { |c| %w[Object Kernel BasicObject].include?(c.name) }
-displayed_instance_methods = Set.new(ents.instance_methods.flat_map(&:names))
-displayed_singleton_methods = Set.new(ents.singleton_methods.flat_map(&:names))
+displayed_instance_methods = Set.new((ents.instance_methods + ents.redefined.select(&:instance_method?)).flat_map(&:names))
+displayed_singleton_methods = Set.new((ents.singleton_methods + ents.redefined.select(&:singleton_method?)).flat_map(&:names))
undefined_methods = @entry.partitioned_entries.undefined
undefined_instance_methods = undefined_methods.select(&:instance_method?)
undefined_singleton_methods = undefined_methods.select(&:singleton_method?)
diff --git a/data/bitclust/template/class b/data/bitclust/template/class
index d4a9f67e..845f68f2 100644
--- a/data/bitclust/template/class
+++ b/data/bitclust/template/class
@@ -114,6 +114,41 @@
<% end %>
+<%
+ [[_('Redefined Methods'), ents.redefined]]\
+ .each do |label, entries|
+ unless entries.empty? %>
+<%= headline(label) %>
+
+
+ | <%= _('Signature') %> |
+ <%= _('Description') %> |
+ <%= _('Library') %> |
+
+<%
+ headline_push
+ entries.each do |m|
+ foreach_method_chunk(m.source) do |sigs, src| %>
+
+
+
+ <%= sigs.map {|sig| h(sig.friendly_string) }.join(" ") %>
+
+ |
+<%= compile_rd(src) %> |
+<%= library_link(m.library.name) %> |
+
+<%
+ end
+ end
+ headline_pop
+%>
+
+<%
+ end
+ end
+%>
+
<%
[[_('Added Methods'), ents.added]]\
.each do |label, entries|
diff --git a/lib/bitclust/classentry.rb b/lib/bitclust/classentry.rb
index f2a917eb..8eb9222b 100644
--- a/lib/bitclust/classentry.rb
+++ b/lib/bitclust/classentry.rb
@@ -257,6 +257,7 @@ def add_method(m)
:instance_methods, :private_instance_methods, :protected_instance_methods,
:module_functions,
:constants, :special_variables,
+ :redefined,
:added, :undefined, :nomethod)
def partitioned_entries(level = 0)
@@ -268,6 +269,7 @@ def partitioned_entries(level = 0)
# @type var mf: Array[MethodEntry]
# @type var c: Array[MethodEntry]
# @type var v: Array[MethodEntry]
+ # @type var redefined: Array[MethodEntry]
# @type var added: Array[MethodEntry]
# @type var undefined: Array[MethodEntry]
# @type var nomethod: Array[MethodEntry]
@@ -275,12 +277,13 @@ def partitioned_entries(level = 0)
i = []; ipv = []; ipt = []
mf = []
c = []; v = []
+ redefined = []
added = []
undefined = []
nomethod = []
entries(level).sort_by(&:name).each do |m|
case m.kind
- when :defined, :redefined
+ when :defined
case m.type
when :singleton_method
(m.public? ? s : spv).push m
@@ -297,6 +300,8 @@ def partitioned_entries(level = 0)
else
raise "must not happen: m.type=#{m.type.inspect} (#{m.inspect})"
end
+ when :redefined
+ redefined.push m
when :added
added.push m
when :undefined
@@ -306,7 +311,7 @@ def partitioned_entries(level = 0)
end
end
# steep:ignore:start
- Parts.new(s,spv, i,ipv,ipt, mf, c, v, added, undefined, nomethod)
+ Parts.new(s,spv, i,ipv,ipt, mf, c, v, redefined, added, undefined, nomethod)
# steep:ignore:end
end
diff --git a/sig/bitclust/classentry.rbs b/sig/bitclust/classentry.rbs
index 4dd38340..2544ae99 100644
--- a/sig/bitclust/classentry.rbs
+++ b/sig/bitclust/classentry.rbs
@@ -98,6 +98,7 @@ module BitClust
attr_accessor module_functions: Array[MethodEntry]
attr_accessor constants: Array[MethodEntry]
attr_accessor special_variables: Array[MethodEntry]
+ attr_accessor redefined: Array[MethodEntry]
attr_accessor added: Array[MethodEntry]
attr_accessor undefined: Array[MethodEntry]
attr_accessor nomethod: Array[MethodEntry]
@@ -106,6 +107,7 @@ module BitClust
Array[MethodEntry] instance_methods, Array[MethodEntry] private_instance_methods, Array[MethodEntry] protected_instance_methods,
Array[MethodEntry] module_functions,
Array[MethodEntry] constants, Array[MethodEntry] special_variables,
+ Array[MethodEntry] redefined,
Array[MethodEntry] added, Array[MethodEntry] undefined, Array[MethodEntry] nomethod) -> void
end
diff --git a/test/test_class_screen.rb b/test/test_class_screen.rb
index be7e32b4..2c149fd1 100644
--- a/test/test_class_screen.rb
+++ b/test/test_class_screen.rb
@@ -39,6 +39,11 @@ class TestClassScreen < Test::Unit::TestCase
--- explanatory_method
{: nomethod}
説明のために記載しているメソッドです。
+
+= redefine Sub
+== Instance Methods
+--- redefined_instance_method
+redefined instance method
HERE
def setup
@@ -93,4 +98,9 @@ def test_ancestor_instance_methods_include_modules
assert_include(@html, 'Mixinから継承しているメソッド')
assert_include(@html, 'mixin_instance_method')
end
+
+ def test_redefined_method_is_listed_in_its_own_section
+ assert_include(@html, '再定義されたメソッド')
+ assert_include(@html, 'redefined_instance_method')
+ end
end
diff --git a/test/test_entry.rb b/test/test_entry.rb
index a8f580c1..c8dd09ed 100644
--- a/test/test_entry.rb
+++ b/test/test_entry.rb
@@ -163,6 +163,25 @@ def test_nomethod_is_partitioned_separately
assert_equal([], parts.instance_methods.map(&:name))
end
+ def test_redefined_is_partitioned_separately
+ klass = parse_class(<