scalafixやScala 2.13.3からの警告増加について

0
Kenji Yoshida @xuwei_k

scalafix有効にするには-Yrangeposやcompiler plugin設定しないといけなくて、少なくとも昔rangepos有効にするとcompile通るかどうか変わる、というの見かけたことがある気がするから、普段の状態であまり有効にしたくないのだけれど、でもそれ使い分けようとするとキャッシュが別になって面倒だから、

2020-06-26 08:45:25
Kenji Yoshida @xuwei_k

OEさんが作ったみたいなやつがあったら便利な気持ちもだいぶわかるのだけれども、あれの中身かるく見たら思ったより複雑なことやってそうで、使うべきか悩ましい twitter.com/OE_uia/status/…

2020-06-26 08:45:26
Taisuke OE @OE_uia

#scala_ks 勉強会で軽く紹介した github.com/taisukeoe/sbt-… の 0.1.0を、先ほどリリースしました。 ScalafixのRemoveUnused ruleと、-Xfatal-warningsなどのscalacOptionsを使い分けていきたい欲張りさん向けのsbt-pluginです。#scalajp twitter.com/OE_uia/status/…

2020-06-18 22:36:17
Taisuke OE @OE_uia

@xuwei_k 確かにsbt Keyのwiringが複雑なんですよね 単純にsourcesなどの最上流のkeyだけオリジナルを参照してもそれなりに動くんですが、下流のkeyなどが意味のない値を返したり、sbt plugin projectだと「オリジナルのcompile」が変なタイミングで呼ばれる、みたいな細かい罠が発生しがちで悩ましく……

2020-06-26 12:32:54
Taisuke OE @OE_uia

@xuwei_k なので現時点では、実装の単純さよりユーザーの罠を減らすことを優先、オリジナルの設定とtargetを汚さない(ので完璧に動かなくても被害はない?)方針でリリースまではしてみました、ぐらいの温度感でした。 罠をある程度防ぐことができて、もっと単純な実装があるなら変えていきたいですね

2020-06-26 12:40:02
Taisuke OE @OE_uia

いっそsbtで同じパスのサブプロジェクトを複数作れるようになると、こんな複雑なことをしなくて済むようになるような気もします。 とはいえtargetの重複は避ける必要あるけど、targetもただのKeyでしかない以上、重複を排除する仕組みが難しいな、とか考えて悩ましい。 twitter.com/xuwei_k/status…

2020-06-26 15:14:48
Kenji Yoshida @xuwei_k

@OE_uia よく考えたらsbt-crossproject github.com/portable-scala… ってある意味そういうことやってるけれど、そこに独自Platform作って crossProject(JVMPlatform, MyPlatfrom) とかじゃ駄目なんですかね?

2020-06-26 15:31:54
Taisuke OE @OE_uia

@xuwei_k おお、アイディアありがとうございます。 sbt-crossprojectでも、同じソースに対し別々の設定を適用してビルドはできました。 github.com/taisukeoe/sbt-… crossprojectと同じように、CompositeProjectを使って、マクロで複数サブプロジェクトを生やすって方針はアリかもしれません。

2020-06-26 22:32:05
Taisuke OE @OE_uia

@xuwei_k sbt-crossprojectの場合、(元々の用途を考えれば自然ですが)依存サブプロジェクトも全てcrossProjectにして、対応Platformを揃えるが必須、かつPlatformをまたいだ依存はできない、みたいな制約が色々あるので、そのまま使うにはちょっと面倒かもしれません。 github.com/portable-scala…

2020-06-26 22:33:33
Kenji Yoshida @xuwei_k

Scala 2.13.3からDottyの準備として - ゼロ引数のメソッドで、定義側に()があるのに、呼び出し側に()付与していない - Javaの引数ゼロのメソッドを()なしで呼び出し などで警告が出るけれど、これ github.com/scala/scala-re… で基本的に全自動書き換えできるっぽい?

2020-06-27 23:39:35
YHWH @vertical_blank

Java側の副作用なしのメソッド、例えばgetterなんかは()付けないのが好ましいと聞いた記憶があるけど最近そうでもないのかな。 twitter.com/xuwei_k/status…

2020-06-27 23:56:19
Kenji Yoshida @xuwei_k

github.com/scalikejdbc/sc… scalikejdbcの場合、1095箇所!? 自動書き換えうまく動いたけれど、これそもそも、副作用ないのに()ついてるかも、という意味で、定義側直したほうがいいやつあるのでは疑惑があり、どうしようかなぁ・・・🤔

2020-06-27 23:56:25
Kenji Yoshida @xuwei_k

@vertical_blank DottyやScala本体の議論をちゃんと追ってないので、個人的な推測ですけれど、 Scala側で、Javaのメソッドがgetterなのか(副作用ないのか)どうか?は、判別不可能な気がするので、一律で付与するようにしたんですかね・・・?🤔

2020-06-27 23:58:30
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k うへぇ、なんだかなぁ。これ、元々の理由としては、定義側が () ついてても () つけなくていいわけだから、将来どうしても引数取りたくなったときのために定義側はこれで統一しようという意図だったんですよね。なので、私自身も () つけずに使ってはいたが(続)

2020-06-27 23:59:15
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k IDE の自動保管がイマイチになったりする副作用もあるし、今となってはこれに引数追加するつもりもないから、定義側を変えてもよいかなと思ってはいますね。で、これをやるならメジャーバージョンアップデートかなと思っています。(続)

2020-06-28 00:01:17
Kenji Yoshida @xuwei_k

ちなみに、いくつかのライブラリでDotty対応やってみて、この変更は以前からなんとなく知っていたけれど、いよいよScala 2.13に先に取り込まれて警告出るようになった、ということは、よほどのことがない限り、この方針は確定ということなのかなぁ🤔

2020-06-28 00:03:54
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k パッチバージョンでこういうの来るかーというのが、最初の「なんだかなぁ」という反応で、まぁこれ自体に意義はないんだけど 2.13.0 でやらないのは計画性足りないのでは?と思った。まぁ、いいんですけど。ということで 3.5 は普通に出した後で 4.0 で () を定義側でとりますかねぇ..

2020-06-28 00:04:32
Kenji Yoshida @xuwei_k

@seratch_ja あくまでdottyに向けた警告なので・・・(若干苦しい擁護) 以前まではScala 2.14出す予定だったから "Dottyの仕様固まる時期" と "2.13.0リリースされる時期" の、2つのタイミング的に、まだ2.13.0ですべてDottyに近づける必要なかったというか、それ待ってたらすごく遅れてしまうので、

2020-06-28 00:09:45
Kenji Yoshida @xuwei_k

@seratch_ja こうなったんでしょうけど、2.14出すのもデメリットあるという判断が下されて、2.13がDottyの直前のversionになった以上、結局2.13のうちに今後もどんどんこういう警告増えるパターンはありそうですね

2020-06-28 00:09:57
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k ありがとうございます。やれることは粛々とやっていこうと思います。

2020-06-28 00:50:59
Kenji Yoshida @xuwei_k

これでも、裏技的(?)に、compilerのインスタンスを生成している?せいか、すごく遅い気がする。 github.com/scala/scala-re… 1度試して失敗したらもう一度試して、それでも駄目なら無視する、という、よくわかってないけれど、だいぶ辛そうなコード書いてあるし・・・なにこれ・・・

2020-06-28 21:16:58
Taisuke OE @OE_uia

@xuwei_k SemanticRuleでも、SemanticDBからとれる情報で不十分なときにPresentationCompilerを使ってる、ExplicitResultTypesと同じ方式っぽいですね…(つらい) github.com/scalacenter/sc…

2020-06-28 21:41:08
Taisuke OE @OE_uia

@xuwei_k ここで一度失敗しても再施行している直接の理由にはたどり着けてないんですけど、metalsのissueとかでもmacro paradise(のコードの展開?)でクラッシュしたときに再起動してる話書いてたり、restartするってのが割とカジュアルな方策として採用されてるっぽさを感じてます。 github.com/scalameta/meta…

2020-06-28 21:42:34
Kenji Yoshida @xuwei_k

@OE_uia えぇ・・・。そのせいなのか何なのか、遅いだけならまだしも、変なエラー吐いて死んだりする場合あるし、scalafixそのものをデフォルト有効にしておくのちょっと厳しいですねこれ

2020-06-28 21:53:03
Taisuke OE @OE_uia

@xuwei_k よしださんのおっしゃる「変なエラー」問題をまだ理解できてないのですが: - `scalafix`実行しない限りこのコードは呼ばれないので、「デフォルト有効」は関係ないかも? - PresentationCompilerに依存してるruleは少ない(ExplicitResultTypesとこれぐらい?)ので、Scalafixというかruleの問題?

2020-06-28 22:04:03