😬

[Swift6に向けて] SE-0274: Concise magic file names

2024/03/16に公開

要約

変更点

#fileの挙動が変わる

  • ASIS: そのファイルへのFullPathを含むString (e.g. /Users/becca/Desktop/0274-magic-file.swift)
  • TOBE: ModuleNameとFileNameを含むString (e.g. MagicFile/0274-magic-file.swift)

いつから

Swift6で導入される
Feature Flagで有効にできる(ConciseMagicFile)

対応の難易度

影響がありそうなこと

  • コードベース上で #fileを使っている箇所
    • e.g. データの読み込む/書き込む場所を#fileの値を利用して指定している(e.g. Cache, SnapshotTest)
    • e.g. デバッグログに#fileの値を利用している

対応すべきこと

  • #fileの挙動の変更で困る箇所があるなら、#filePathで置き換える
    (#filePathは新しく登場したMagic Idenfitierで、既存の#fileと同じ挙動をする)

Proposalの内容

モチベーション

現在#fileは、 そのファイルへのFullPathを含むSrtingとして評価される
#fileがFullPathを表示する挙動には、以下の欠点がある

  • usernameなどのsensitiveな情報が含まれる可能性がある
  • FullPathは文字列として長く、成果物のbinaryサイズが大きくなってしまい、パフォーマンスが悪くなる
  • FullPathの値は、実行するマシンや環境によって値が変化するため、生成されるBinaryやハッシュ値が変わる

新しい提案

  • #fileは、FullPathではなく、<ModuleName>/<fileName>として評価される
  • 互換性のため、既存の#fileと同じ挙動の、#filePathを導入する
    標準ライブラリの関数は#fileを使っているものがある(e.g. fatalError)ので、それらのログも影響を受ける
print(#file)
// MagicFile/0274-magic-file.swift

print(#filePath)
// /Users/becca/Desktop/0274-magic-file.swift

fatalError("Something bad happened!")
// Fatal error: Something bad happened!: file MagicFile/0274-magic-file.swift, line 3

いまのところ、同一モジュールに同じ名前のファイルは存在できないので、#fileの値はユニークなまま。

実装の詳細

文字列のフォーマット

file-string → module-name "/"  file-name
file-string → module-name "/" disambiguator "/" file-name   // Reserved for future use

将来的に、文字列にdisambiguatorが挿入される可能性がある
/でsplitするときは、ModuleNameは最初の要素、fileNameは最後の要素というようにアクセスしたほうがよい

既存のコードとの互換性

#fileの挙動が変わるので、使用している箇所には影響がある
既存の#fileの挙動(FullPath)を使用したいなら、#filePathを使用できる

影響がありそうなこと

  • ログ内のパスの表示が少し変わる(FullPath -> ModuleName/FullPath)
  • #fileのFullPathの部分文字列を切り出す操作をしていたら、値が変わる
  • ファイルの読み出し/書き出しの場所を#fileで指定していると、場所が変わる

まとめ

#fileの挙動が変わる

  • ASIS: そのファイルへのFullPathを含むString (e.g. /Users/becca/Desktop/0274-magic-file.swift)

  • TOBE: ModuleNameとFileNameを含むString (e.g. MagicFile/0274-magic-file.swift)

  • コードベース上で #fileを使っている箇所は影響がある可能性があるので、ひとつひとつチェックする。

Refs

Discussion