canonicalizationで高精度数値の折り畳みを防止

tailwindlabs/tailwindcss

Tailwind CSS の canonicalization が、calc 除算で生成される高精度パーセンテージを自動折り畳みしないように変更され、提案結果がユーザーフレンドリーになりました。

背景

Tailwind CSS はクラス名の canonicalization 時に calc 式の除算結果を数値化し、w-[calc(100%/3.5)]w-[28.571428571428573%] のように展開していました。計算結果は数値的に正しいものの、小数点以下が多数桁にわたることで IDE の IntelliSense 提案が読みにくくなるという実務上の課題がありました。この問題は tailwindlabs/tailwindcss-intellisense#1591 で報告されています。

このため、ユーザーが期待する「元の calc 式をそのまま提示する」振る舞いへの変更が求められました。

技術的な変更

packages/tailwindcss/src/constant-fold-declaration.tsconstantFoldDeclaration 関数に、高精度判定ロジックが追加されました。除算処理で一度 computed = lhs[0] / rhs[0] を算出し、Math.round(computed * 100) / 100 !== computed が true であれば折り畳みを中断します。これにより小数点以下が .xx を超える結果は保持されます。

変更前:

if (lhs[1] === null && rhs[1] === null) {
  folded = true
  return WalkAction.ReplaceSkip(ValueParser.word(`${lhs[0] / rhs[0]}${lhs[1] ?? ''}`))
}

変更後:

if (lhs[1] === null && rhs[1] === null) {
  let computed = lhs[0] / rhs[0]
  // Only fold with .xx precision, anything beyond that might be a bit too much.
  if (Math.round(computed * 100) / 100 !== computed) {
    break
  }
  folded = true
  return WalkAction.ReplaceSkip(ValueParser.word(`${computed}${lhs[1] ?? ''}`))
}

テストも同時に拡充され、packages/tailwindcss/src/constant-fold-declaration.test.ts に高精度結果が折り畳まれないことを確認するケースが追加されました。また canonicalize-candidates.test.tsw-[calc(100%/3.5)] がそのまま保持される回帰テストが導入されています。

設計判断

この変更は 「小数点以下 2 桁までの精度でのみ定数畳み込みを許容」 という明確な閾値を設ける設計判断に基づきます。既存ロジックに最小限の分岐を加えることで後方互換性を保ちつつ、数値の可読性を優先する方針が反映されています。計算結果の正確性は変わらず保持され、ユーザー体験の向上が得られます。

まとめ

canonicalization が高精度数値を折り畳まないようになったことで、calc 式をそのまま提示できるようになり、IDE の提案が読みやすくなります。追加されたテストは回帰防止を保証し、変更の意図と挙動を明確にしています。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
2bf1ee94

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、設計判断、まとめが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは正しい `言語:ファイルパス` 形式ですが、PRリンクの記法が `[PR #20221](URL)` となっており、推奨の `[#20221](URL)` 形式と異なります。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門的なエンジニア向けの内容で、余計な初心者向け解説はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論の構成で、段落はトピックセンテンスで始まり、一段落一トピック、長さも適切です。空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックはDiffの変更点と整合しており、ロジックやファイルパスも一致しています。コメントの一部省略は情報の欠落にはなっていません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「canonicalization」「constant fold」「high precision」などの用語はPRで使用されているものと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的主張はPRの説明とDiffのコードに基づいており、因果関係も正しく記述されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

すべての主張がPRタイトル・説明・Diffで裏付けられており、推測や捏造はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号やファイルパスなどの数値・固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルはPRの内容(高精度数値の折り畳み防止)を正確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

外部知識(LTS、リリース日等)は一切記載されていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PRの記述と一致しています。