このセッションの成果(全て 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 した理由。ここを埋めれば完成)
生成マッパーが非コンパイル : leftAssoc fold の right 出力が List<String> のまま(フィールドは List<Object>)。MapperRuleEmitter の fold/list emission を Object operand に対応させる(mapper 生成 line ~1456 の型不整合)。
tinyexpression consumer 約8箇所 を Object 化(op は List<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) 相当が既にあるので機械的。
golden 更新(unlaxer-dsl/src/test/resources/golden/mapper*_snapshot.java.txt。使い捨てテストで実出力を書き出す手法が楽)。
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.sh(mvn 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 除去診断: evalIfExpr の tryEvaluateIfFromSource 早期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。
このセッションの成果(全て landing / Central 公開済み)
P4 fallback=0(#32)に向け、生成マッパーの #43系バグを root から潰すサイクルを継続。
リリース済み
v3.0.5): chore: adopt unlaxer-dsl 3.0.9 (nested-slice multi-rule dispatch; #32) #43 MapperGenerator 根治(異種assocオペランド/variadic/findDescendants)。PR handoff: P4 fallback=0 セッション (2026-06-27) — #32 codegen根治継続 (3.0.7/3.0.8/3.0.9 release) / 残り C=var宣言・型推論 #44。v3.0.6): heterogeneous@valueを実ASTノードへ解決。PR fix: declared-type-aware AST equality for var declarations (#32 "C") #45。マージ済み
1648931, revision 3.0.6, clean)642f049, unlaxer-dsl 3.0.6, clean)#32 進捗(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 した理由。ここを埋めれば完成)
right出力がList<String>のまま(フィールドはList<Object>)。MapperRuleEmitterの fold/list emission を Object operand に対応させる(mapper 生成 line ~1456 の型不整合)。opはList<String>のまま):evaluator/ast/P4TypedAstEvaluator.java: evalStringConcatExpr 周辺(~384, 1650-1651)evaluator/javacode/P4TypedJavaCodeEmitter.java: ~231, 825-826evaluator/javacode/P4DefaultJavaCodeEmitter.java: ~257, 622-623resolveStringLeaf(Object)相当が既にあるので機械的。unlaxer-dsl/src/test/resources/golden/mapper*_snapshot.java.txt。使い捨てテストで実出力を書き出す手法が楽)。第2段で直るのは string-concat 系のみ。残6件の他要因は別物(それぞれ別タスク):
toUpperCase('x')[4:6].in(...)—SliceExpr.value(受け手) が String。受け手も node 化が必要。$m.startsWith('a','b','c')— 文法ギャップ。ビルド/検証コマンド
mvn -o test -Dtinyexpression.skipRailroad=true -Dgpg.skip=true -Dmaven.javadoc.skip=true -Dspotbugs.skip=true -Derrorprone.skip=truebash tools/ci/check-test-baseline.sh(mvn test自体は既知失敗で BUILD FAILURE になる。test-baseline.txtの唯一の既知失敗 =testTernaryInSinWithDoubleParensStillWorks=二重カッコ三項の指数バックトラック=issue perf: 生成パーサの指数バックトラック — 二重カッコ三項/ソース再パース経路で秒〜分単位の遅延 #38)。rm -rf target/generated-sources target/classescd 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 は公開済み)cd unlaxer-parser && mvn -B -pl .,unlaxer-common,unlaxer-dsl clean deploy(autoPublish、GPG loopback 設定済み、~15-60分で repo1 同期)。CHANGELOG 起票必須。evalIfExprのtryEvaluateIfFromSource早期returnを一時無効化 →-Dtest=P4BackendParityTest,P4AstEvaluatorCalculatorTest(後者は if-off だとバックトラックで ~1000秒)。計測後 revert。運用メモ(ユーザー方針)
gh run rerun)。.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。