try! Swift San Joseの作業メモ

WWDC18 に付随して行われた try! Swift San Jose に参加してきた。前半は Swift コミッターによるパネルディスカッション、後半は Open Source Swift にコントリビュートするというワークショップだった。このワークショップを通して apple/swiftPull Request を送ることができた。

最近読んだ id:higepon さんの ログのすすめ をとても良いと感じていて、ワークショップの作業はログを書きながら行ってみた。ログを残すことによって、自分が今取り組んでいる課題は何か、次に行うべき作業は何か、かなり明確にすることができた。特に Swift コンパイラという普段自分が扱っているコードベースとは全く異なる環境ではかなり助けになる実感があった。 せっかくなので、その時の作業メモを残しておく。


バグチケット

https://bugs.swift.org/browse/SR-7844?filter=10451

<stdin>:3:3: error: computed property must have accessors specified
  }
  ^

こうしたい

<stdin>:3:3: error: subscript must have accessors specified
  }
  ^

作業ログ

# ゴール

- [x]subscript の diagnostics が computed property になっているのを修正する
   -  [x]どういう時に出るエラーか
        - getter がない時に出る

# 分からないこと

- [x] 開発環境
    - Xcode or Vim?
    - どっちでもいい
- [x] デバッグの仕方
    - バグを再現するテストを書いて、直ったことを確認する
    - PRにはテストが必要
    - テストは短ければ短いほどいい
- [x]テストの書き方

# やること

- [x] issue に自分をアサインする
- [x] bug をバイナリで reproduce する
    - ビルドした swift を実行する
        - <unknown>:0: error: Swift does not support the SDK 'MacOSX10.13.sdk’
        - xcode-select で Xcode10beta見るようにしたら直った
- [x] テストを動かす
- [x] バグを再現するテスト書く
        - test/decl/subscript/subscripting.swift 173行目
- [x] computed property の方のテストが壊れていないことを確認する
        - test/decl/var/properties.swift 379行目
- [x] どこをどうやって修正するか
    - include/swift/AST/DiagnosticsParse.def
        - 251行目、プレースホルダを使うように文言を修正する
        - "%select{variable|subscript}0 must provide either a getter or “ こういうやつ???
    - [x] %select を使って修正する
        - https://github.com/apple/swift/blob/master/docs/Diagnostics.md
    - [x] 呼び元で引数を渡す
        - lib/Parse/ParseDecl.cpp
            - computed propertyとsubscriptを区別する
            - bool Parser::parseGetSetImpl 多分ここにisSubscript を渡さないといけない
            - static void diagnoseRedundantAccessors の引数に isSubscript というのがある (lib/Parse/ParseDecl.cpp 4016行目)

- [x] 自分の環境に fork して clone する
- [x] 自分がforkした方に修正を入れる
- [ ] 自分がforkした方でビルドする
- [ ] 自分がforkした方でテストを通す
    - [x] fork し直すのではなく、git の remote origin を変更した
- [x] PRを作る

このようにゴール、分からないこと、やることのアウトラインを先に書いて、作業を進めながら詳細を書き足していった。