Skip to content

fix(registrum): 保持创造栏物品集合可变 - #111

Merged
PigeonNian merged 1 commit into
dev/1.21.1from
fff/1.21.1-fix3
Aug 31, 2026
Merged

fix(registrum): 保持创造栏物品集合可变#111
PigeonNian merged 1 commit into
dev/1.21.1from
fff/1.21.1-fix3

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

No description provided.

@Gugle2308

Copy link
Copy Markdown

⚠️ Dangerous command requires approval:

curl -sL "https://api.github.com/repos/Anvil-Dev/AnvilLib/pulls/111/commits" -o /tmp/pr111_commits.json && python3 -c "
import json
data = json.load(open('/tmp/pr111_commits.json'))
for c in data:
   ...

Reason: script execution via -e/-c flag

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@Gugle2308

Copy link
Copy Markdown

PR head 相对基线只有 2 个文件的真实变更,mixin 未动。结论已完整:

核心事实链:

  1. PR fix(registrum): 保持创造栏物品集合可变 #111(WhereisFff):arrange/fold 返回可变集合,fold 空组早退返回 new ArrayList<>(original)。但 mixin 没改——arrangelayout==null 早退路径仍返回原始传入集合,而该传入集合是原版 displayItems(可变性取决于原版字段,通常是可变 ArrayList),所以那一路不构成新问题。
  2. 关键盲区:foldeligible.isEmpty() 早退现在返回 new ArrayList<>(original),但 mixin 调用 fold(this.displayItems) 时传的是原版 displayItems 本身。这个新 ArrayList 与原 displayItems 无关,fold 内对 original 只读、折叠结果也来自 group.source()/原栈拷贝——arrange 紧随其后把整个集合重新赋给 displayItems,所以中间的可变/不可变差异被抹平了。真正要紧的是最终赋给 displayItems 的集合必须可变,而 PR 只改了 arrange 的非早退路径。
  3. 最大的坑:Gugle 已在本地 bb260c8 用「mixin 层 new ArrayList<>(...) 包装」修复同一问题(commit message 明确提到 bits_n_bobs 的 removeIf 崩溃),该提交尚未合入 dev/1.21.1。PR fix(registrum): 保持创造栏物品集合可变 #111 的修复位置(工具方法内部)与 bb260c8 不同——如果两者都合入,会双重包装,且 PR fix(registrum): 保持创造栏物品集合可变 #111 未覆盖 arrange 的早退路径,修复不完整。存在提交冲突/重复修复风险,需协调确认。

审查意见已成型,直接输出(webhook 自动投递,不执行任何 gh 发表命令)。标题「fix(registrum): 保持创造栏物品集合可变」准确,无需修改。

代码审查摘要 — PR #111

操作: opened
范围: 2 个文件 (2 Java) / 35 行 diff
PR: fix(registrum): 保持创造栏物品集合可变 — WhereisFff → fff/1.21.1-fix3dev/1.21.1

变更内容

CreativeTabSections.arrange()CreativeVariantPickerRegistry.fold() 的返回集合从 List.copyOf(...)(不可变)改为可变集合,目的是保持 CreativeModeTab.displayItems 可变,兼容其他 mod(如 bits_n_bobs)在同一 mixin 注入点对 displayItems 调用 removeIf 的操作,避免 UnsupportedOperationException 崩溃。

🔴 关键问题

  1. 与已有未合并修复重复/冲突(需协调)

    • 本地克隆 AnvilLibbb260c8(Gugle,2026-08-29)提交了同一问题的修复,但方案是改 CreativeModeTabMixinthis.displayItems = new ArrayList<>(fold(...)) / new ArrayList<>(arrange(...)),commit message 明确提到「bits_n_bobs 等 mod 的 mixin 对 displayItems 调用 removeIf 崩溃」。
    • 该提交尚未合入 dev/1.21.1git merge-base --is-ancestor bb260c8 origin/dev/1.21.1 = NO)。
    • 本 PR 走的是「工具方法内部返回可变集合」路线,与 bb260c8 的「mixin 层包装」路线同时合入会双重包装(虽然无害,但冗余),且本 PR 未覆盖 arrangelayout == null 早退路径——两条路线需取舍,建议与 Gugle 协调:要么只合本 PR(并在 mixin 补 new ArrayList<> 兜底),要么只合 bb260c8。
  2. arrange()layout == null 早退路径未覆盖

    • if (layout == null) return items; 仍直接返回传入集合。当前基线 mixin 是 this.displayItems = CreativeTabSections.arrange(tabId, this.displayItems),若该 tab 无 layout,返回的就是原始 displayItems——它本身可能是可变集合(原版字段),不构成新崩溃,但可变性契约依赖原版字段类型,未显式保证。若按 bb260c8 思路在 mixin 统一包 new ArrayList<>,则此路径也覆盖;本 PR 未处理。

⚠️ 警告

  1. fold()eligible.isEmpty() 早退返回 new ArrayList<>(original) 的语义
    • 该分支本可直接 return originaloriginal 本身就是 List.copyOf(items) 的新列表),现在包一层 new ArrayList<> 只是复制一份,无实际收益(不改变可变性:List.copyOf 结果仍不可变,new ArrayList<>(不可变) 才可变)。真正保证可变的是 new ArrayList<>(original) 这个包装本身,逻辑正确但表达冗余——建议直接 return new ArrayList<>(original) 或改为先 new ArrayList<>(items) 再返回。不影响正确性,仅为可读性。

💡 建议

  1. arrange() 返回的 arranged 是 ArrayList,但未用 List.copyOf 包装 — 现在直接 return arranged,调用方(mixin)拿到的是共享的可变列表。目前 mixin 是唯一调用方且随即赋给 displayItems,安全;但若未来其他代码复用该方法并对结果做修改,可能意外污染。可考虑在方法内明确返回 new ArrayList<>(arranged) 或加注释说明「返回值保持可变以符合 displayItems 契约」。

🟢 看起来不错

  • 改动极小(2 文件 3 处),方向正确:修复了 fold/arrange 非早退路径返回不可变集合导致其他 mod removeIf 崩溃的根因。
  • foldemitted 去重 + group.source() 拷贝语义未受影响,折叠行为保持。

📋 声称验证表

声称 状态 说明
保持创造栏物品集合可变 arrange/fold 主路径返回可变集合
兼容其他 mod 的 removeIf ⚠️ 主路径已覆盖,arrange 早退路径未覆盖,且与 bb260c8 重复

结论

REQUEST_CHANGES — 核心修复方向正确,但需:

  1. 与 Gugle 的 bb260c8(mixin 层 new ArrayList<> 方案)协调去重——该提交已在本地但未合入 dev/1.21.1,两条路线只保留一条;
  2. 补齐 arrangelayout == null 早退路径的可变性保证(或在 mixin 统一兜底);
  3. 简化 fold 空组早退的冗余包装。

如仅合入本 PR,建议 mixin 保持 new ArrayList<>(...) 包装作为统一兜底,覆盖所有路径。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched SKILL.md in skill 'pr-diff-scope-reconciliation' (1 replacement).

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ✅ Compatible 0
collision ✅ Compatible 0
config ✅ Compatible 0
integration ✅ Compatible 0
moveable-entity-block ✅ Compatible 0
network ✅ Compatible 0
rendering ⚪ Skipped
space-select ✅ Compatible 0
font ✅ Compatible 0
util ✅ Compatible 0
explosion ✅ Compatible 0
rpc ✅ Compatible 0
multiblock ✅ Compatible 0
recipe ✅ Compatible 0
registrum ✅ Compatible 0
sync ✅ Compatible 0
wheel ✅ Compatible 0
main ✅ Compatible 0

Full CSVs: see the Artifacts section of this workflow run.

@PigeonNian
PigeonNian merged commit 5716117 into dev/1.21.1 Aug 31, 2026
36 checks passed
@Gugle2308

Copy link
Copy Markdown

PR #111 的 action 为 closed,按约束停止处理,不下载 diff、不执行审查、不发布评论。

@ZhuRuoLing
ZhuRuoLing deleted the fff/1.21.1-fix3 branch August 31, 2026 09:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants