Skip to content

handoff: P4 fallback=0 セッション (2026-06-26) — #43 codegen根治継続 / #32 第2段 string-concat fold widening の再開手順 #40

Description

@opaopa6969

このセッションの成果(全て landing / Central 公開済み)

P4 fallback=0(#32)に向け、生成マッパーの #43系バグを root から潰すサイクルを継続。

リリース済み

マージ済み

#32 進捗(if-source shadow 無効化で計測)

  • P4BackendParityTest: 2 → 0
  • P4AstEvaluatorCalculatorTest: 10 → 6
  • ⚠️ if-source shadow(tryEvaluateIfFromSource / tryEvaluateStructuredStringLeaf 等)はまだ ON のまま。AST 経路が完全に忠実になるまで外してはいけない(外すと上記失敗が顕在化)。現状の fallback 観測数は ~170(import/external/multi-arg 等が主因、別軸)。

🎯 次にやること: #32 第2段 — string-concat fold オペランドの Object 化

設計(検証済み・クリーン)

ASTGenerator.inferTypeFromElement の RuleRef ケースで、透過 mapped choice(@mapping無し・選択肢が≥2の異なるASTクラスにマップ。例 StringTerm)を String でなく Object と推論する。すると StringConcatExpr.left/right が Object になり、既存の mapTransparentValue(3.0.6で追加済み)が実ノードを解決、leaf は String のまま Object に保持。P4TypedAstEvaluator.resolveStringLeaf(Object) は既に node/String 両対応。
(unlaxer-dsl 内部フルビルド=ubnf/tinycalc 含む=はこの変更で通ることを確認済み。)

残ブロッカー(前回 revert した理由。ここを埋めれば完成)

  1. 生成マッパーが非コンパイル: leftAssoc fold の right 出力が List<String> のまま(フィールドは List<Object>)。MapperRuleEmitter の fold/list emission を Object operand に対応させる(mapper 生成 line ~1456 の型不整合)。
  2. tinyexpression consumer 約8箇所を Object 化(opList<String> のまま):
    • evaluator/ast/P4TypedAstEvaluator.java: evalStringConcatExpr 周辺(~384, 1650-1651)
    • evaluator/javacode/P4TypedJavaCodeEmitter.java: ~231, 825-826
    • evaluator/javacode/P4DefaultJavaCodeEmitter.java: ~257, 622-623
      resolveStringLeaf(Object) 相当が既にあるので機械的。
  3. golden 更新(unlaxer-dsl/src/test/resources/golden/mapper*_snapshot.java.txt。使い捨てテストで実出力を書き出す手法が楽)。
  4. revision 3.0.7 に bump → Central デプロイ(手順下記)→ tinyexpression を 3.0.7 に追従。

第2段で直るのは string-concat 系のみ。残6件の他要因は別物(それぞれ別タスク):

  • slice 受け手が関数結果: toUpperCase('x')[4:6].in(...)SliceExpr.value(受け手) が String。受け手も node 化が必要。
  • multi-arg startsWith/endsWith/contains: $m.startsWith('a','b','c') — 文法ギャップ。
  • import / external 宣言: P4 未対応(fallback の主因)。
  • testMin/testMax/testInDayTimeRange/testTypeInference: 個別調査要。

ビルド/検証コマンド

  • tinyexpression フル: mvn -o test -Dtinyexpression.skipRailroad=true -Dgpg.skip=true -Dmaven.javadoc.skip=true -Dspotbugs.skip=true -Derrorprone.skip=true
  • 緑判定はゲート: bash tools/ci/check-test-baseline.shmvn test 自体は既知失敗で BUILD FAILURE になる。test-baseline.txt の唯一の既知失敗 = testTernaryInSinWithDoubleParensStillWorks=二重カッコ三項の指数バックトラック=issue perf: 生成パーサの指数バックトラック — 二重カッコ三項/ソース再パース経路で秒〜分単位の遅延 #38)。
  • 再生成: rm -rf target/generated-sources target/classes
  • unlaxer-dsl を .m2 に入れ替え: cd unlaxer-parser && mvn -o -q install -pl .,unlaxer-common,unlaxer-dsl -DskipTests -Dgpg.skip=true ...ローカル検証は revision を 3.0.7-SNAPSHOT 等にして 3.0.6 を汚さないこと。3.0.6 は公開済み)
  • Central デプロイ: cd unlaxer-parser && mvn -B -pl .,unlaxer-common,unlaxer-dsl clean deploy(autoPublish、GPG loopback 設定済み、~15-60分で repo1 同期)。CHANGELOG 起票必須。
  • if 除去診断: evalIfExprtryEvaluateIfFromSource 早期returnを一時無効化 → -Dtest=P4BackendParityTest,P4AstEvaluatorCalculatorTest(後者は if-off だとバックトラックで ~1000秒)。計測後 revert。

運用メモ(ユーザー方針)

  • 速度優先: ローカル緑なら admin マージ可。Central→repo1 同期ラグで downstream PR の CI が一時赤になるのは許容(同期後 gh run rerun)。
  • 不可逆な公開操作(Central deploy)・issueコメント投稿は権限ゲートあり。デプロイはユーザー承認済みの方針。
  • .flattened-pom.xml / package-lock.json はビルド生成物。コミット前に git checkout -- で戻す。

関連 issue

#32(fallback=0計画), #35(workaround真っ当化), #22(機能ギャップ/dotメソッドリテラル受け手), #38(perf:指数バックトラック), unlaxer-parser #40(packrat)/#41/#42
memory: p4-issue32-stringconcat-blocker, p4-issue35-cycle-landscape, tinyexpression-ci-baseline-gate, workflow-speed-over-green-ci, p4-fallback-zero-project

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions