JPMartha's Pancake

This blog is the way to brush up my poor English.

`$ swift build -Xswiftc -fixit-code` と `python apply-fixit-edits.py ...` で Fix it ✨ #swiftlang

https://github.com/apple/swift/blob/master/utils/apply-fixit-edits.py

@cockscomb さんに教えていただいたヤツですがさっそく試してみました。

python 事情に明るくないですが任意のディレクトリで次のコマンドを実行してヘルプが表示されたら使えるものと考えてよいですかね。

$ python -h

usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
...

概要

  1. Swift Package Manager で -Xswiftc -fixit-code をオプションをつけてビルドします。
  2. *.swift ごとに *.swift.remap ファイルが生成されます。
  3. .build ディレクトリを指定して apply-fixit-edits.py を実行すると Swift 3.0 仕様に一気に書き換えてくれるように見えます。

⚠️ パッと見でしか確認していませんので細かいところはこれからです。

?追記: さすがに一撃ですべて解決とはいきませんでした。

手順

Package.swift 設定

import PackageDescription

let package = Package(
    name: "Pokemon",
    dependencies: [
        .Package(url: "https://github.com/ishkawa/APIKit.git",
            versions: Version(1, 0, 0)..<Version(3, 0, 0)),
        .Package(url: "https://github.com/ikesyo/Himotoki.git",
            versions: Version(1, 0, 0)..<Version(3, 0, 0))
    ]
)

ビルド

$ swift build -Xswiftc -fixit-code

Fix it 的なエラーが大量に出ますが次のものが生成されます。

Packages

Packages
├── APIKit-2.0.0-beta.3
├── Himotoki-2.0.0
└── Result-1.0.2

(⚠️ なぜプレリリース版が入るのかはとりあえず無視)

.build/debug

*.swift ごとに*.swift.remap が 生成されます。

.build
├── debug
│   ├── Himotoki.build
│   │   └── *.swift.remap
│   └── Result.build
│       └── *.swift.remap

(⚠️ なぜ APIKit ができないのかはとりあえず無視)

apply-fixit-edits.py に期待 ?

$ python apply-fixit-edits.py /Users/.../Pokemon/.build

Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/StandardLib.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/decode.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/RawRepresentable.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/Decodable.swift
Updating /Users/.../Pokemon/Packages/Result-1.0.2/Result/Result.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/DecodeError.swift
Updating /Users/.../Pokemon/Packages/Result-1.0.2/Result/ResultType.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/Operators.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/NSNumber.swift
Updating /Users/.../Pokemon/Packages/Himotoki-2.0.0/Sources/Extractor.swift

結果

長いので Gist でご確認ください。

https://gist.github.com/JPMartha/eaea62ec21d97baa78f7ff8a882084b2

補足

ほかに -fixit-all もあるので試しました。

$ swift build -Xswiftc -fixit-all

エラーにはなりませんでしたが *.swift.remap ファイルは生成されませんでした。

swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a 時点)