// funcscanner_scan_methods_min.hako — FuncScannerBox._scan_methods minimal harness
//
// 目的:
//   - static box TestBox/Main を含むソースから TestBox.body 部分だけを切り出し、
//     FuncScannerBox._scan_methods(source, "TestBox", 0, 1) を直接呼び出す。
//   - params 部分のパースと _parse_params/_trim の呼び出しが SSA 的に安全であることを確認する。
//
// 振る舞い:
//   - fib と同等の TestBox/Main を src に埋め込む。
//   - FuncScannerBox._find_matching_brace で TestBox の '{'〜'}' 範囲を取得。
//   - 本文だけを body1 として抜き出し、FuncScannerBox._scan_methods に渡す。
//   - defs.len と各定義の box/name をログに出力する（Stage‑B 側と比較しやすくする）。

using lang.compiler.entry.func_scanner as FuncScannerBox

static box Main {
  method main(args) {
    local src = "static box TestBox {\n  method fib(n) {\n    local i = 0\n    local a = 0\n    local b = 1\n    loop(i < n) {\n      local t = a + b\n      a = b\n      b = t\n      i = i + 1\n    }\n    return b\n  }\n}\n\nstatic box Main {\n  method main(args) {\n    local t = new TestBox()\n    return t.fib(6)\n  }\n}\n"

    // TestBox 本体の brace 範囲を FuncScannerBox の実装で検出
    local open1 = 19
    local close1 = FuncScannerBox._find_matching_brace(src, open1)
    print("[scan_methods] brace1 open=" + ("" + open1) + " close=" + ("" + close1))
    if close1 < 0 { return 1 }

    // "box TestBox {" の直後から close1 直前までを body1 として切り出す
    local body1 = src.substring(open1 + 1, close1)
    print("[scan_methods] body1_len=" + ("" + body1.length()))

    // FuncScannerBox._scan_methods を直接呼び出してメソッド定義を抽出
    local defs1 = FuncScannerBox._scan_methods(body1, "TestBox", 0, 1)
    local n1 = defs1.length()
    print("[scan_methods] defs1.len=" + ("" + n1))
    local i = 0
    loop(i < n1) {
      local d = defs1.get(i)
      print("[scan_methods] def1[" + ("" + i) + "] box=" + ("" + d.get("box")) + " name=" + ("" + d.get("name")))
      i = i + 1
    }

    return 0
  }
}
