Skip to content

Commit d39c75b

Browse files
committed
step4を加筆
1 parent 9980090 commit d39c75b

20 files changed

+286
-42
lines changed

build.sbt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ ThisBuild / scalaVersion := "3.0.0-RC1"
22
ThisBuild / version := "0.0.1-SNAPSHOT"
33

44
ThisBuild / scalacOptions ++= Seq(
5-
"-explain",
6-
"-explain-types"
7-
85
// TODO
96
)
107

@@ -52,14 +49,19 @@ lazy val step04 =
5249
.settings(commonSettings)
5350
.settings(
5451
scalacOptions ++= Seq(
52+
// Scala 3.0 Migration mode
53+
5554
// 以下のコンパイラオプションを有効にすることで、
56-
// MigrationMode.scala のエラーが警告になったり、自動的に書き換わります
55+
// Scala 2.13 と Scala 3.0 の非互換性に関する詳細なエラーを表示したり、
56+
// コードが自動的に書き換わります
57+
58+
// 以下を有効にすると詳細なエラーが表示されます
59+
// "-explain",
5760

58-
// このコメントアウトを外すと、
59-
// マイグレーションモードとして Scala3 でのコンパイルエラーが警告に変わります
61+
// 以下を有効にすると、非互換性のエラーが警告に変わります
6062
// "-source:3.0-migration"
6163

62-
// このコメントアウトを外すと、MigrationMode.scala が書き換わります
64+
// 以下を有効にすると、非互換性の警告箇所が自動的に書き換わります
6365
// "-source:3.0-migration", "-rewrite"
6466
)
6567
)

docs/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ Enums や Algebraic Data Types (ADTs) で新しいシンタックスが追加さ
1616

1717
### Step4
1818

19-
Scala2 と Scala3 の互換性で、モジュール間の依存関係や移行ツール、マイグレーションモードについて触れていきます。
19+
Step4 では、主に Scala2 と Scala3 の互換性・非互換性について取り上げます。ソースコードレベルやコンパイルタイム、ランタイム、メタプログラミング、モジュール間でどのような互換性・非互換性があるかを確認し、非互換性に対してどのようなツールを使用して Scala3 へ移行するのかを確認します。
20+
2021

2122
### Step5
2223

docs/step01/04_Migration_guideを俯瞰してみる.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,14 @@ https://scalacenter.github.io/scala-3-migration-guide/docs/tutorials/sbt-migrati
6161

6262
https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/table.html
6363

64-
Reference と内容が重複してるので今回は対象外とします。
65-
6664
```plantuml
6765
@startmindmap
6866
* Incompatibilities
6967
**[#38c0c4] Incompatibility Table
70-
** Syntactic Changes
71-
** Dropped Features
68+
**[#38c0c4] Syntactic Changes
69+
**[#38c0c4] Dropped Features
7270
** Contextual Abstractions
73-
** Other Changed Features
71+
**[#38c0c4] Other Changed Features
7472
@endmindmap
7573
```
7674

docs/step04/01_CompatibilityReference.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
## 概要
2424

25-
Scala 2.13 と Scala 3.0 の互換性について、Source Level、Compile Time、Runtime、Metaprogramming の観点で確認します。また、それぞれのバージョンの依存関係についても、公式ドキュメントに分かりやすい例が記載されているので見ていきたいと思います
25+
Scala 2.13 と Scala 3.0 の互換性について、Source Level、Compile Time、Runtime、Metaprogramming の観点で確認します。また、それぞれのバージョンの依存関係についても、公式ドキュメントに分かりやすい例が記載されているので併せて見ていきたいと思います
2626

2727
## ドキュメント参照先
2828

@@ -37,16 +37,16 @@ Scala 2.13 と Scala 3.0 の互換性について、Source Level、Compile Time
3737
- いくつかの構文は単純化されたり、制限されたり、完全に削除されたりしている
3838
- これらの決定は正当な理由があってなされたものであり、適切な回避策が可能であることを考慮されたもの
3939
- いずれにしても、すべての非互換性に対応したクロスコンパイルソリューションがあるため、移行は簡単かつスムーズに行える
40-
- 非互換性については、この後の Incompatibility Table で確認します
41-
- Scala 2.13 のソースコードは、マイグレーションモードや各種ツールを使うことで、Scala3 のソースコードへ簡単に変換することができる
40+
- 非互換性については、この後の Incompatibility Table で確認する
41+
- Scala 2.13 のソースコードは、Scala 3 Migration Mode や各種ツールを使うことで、Scala3 のソースコードへ簡単に変換することができる
4242

4343
## Compile Time
4444

4545
- コンパイラが、型やメソッドのシグネチャなどの情報をクラスファイルから読み取る際のフォーマットが、Scala2 と Scala3 で異なる
4646
- Scala2 では、シグネチャは Pickle format で格納されている
4747
- Scala3 では、シグネチャのレイアウトよりも多くの機能を持つ TASTy format で格納されている
4848
- Scala3 コンパイラは、Scala 2.13 の Pickle format と TASTy format の両方を読み取ることができる
49-
- Scala 2.13.4 では、Scala 3.0 ライブラリの利用を可能にする TASTy reader が追加されていて、従来のすべての機能に加え、以下の新機能もサポートする
49+
- Scala 2.13.4 では、Scala 3.0 ライブラリの利用を可能にする TASTy reader が追加されていて、従来のすべての機能に加え、以下の新機能もサポートしている
5050
- Enums
5151
- Intersection types
5252
- Higher-kinded type lambdas
@@ -62,7 +62,7 @@ Scala 2.13 と Scala 3.0 の互換性について、Source Level、Compile Time
6262
(Scala 2.13.4)-->(Scala 2.13.4 アーティファクト)
6363
```
6464

65-
**:warning: TASTy reader は、Scala3 のすべての機能をサポートしているわけではないので、注意が必要**
65+
**:warning: TASTy reader は、Scala3 のすべての機能をサポートしているわけではないので注意が必要**
6666

6767

6868
## Runtime

docs/step04/02_TourOfTheMigrationTools.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ Scala 2.13 から Scala 3.0 への移行をサポートするいくつかのツ
3030
## The Scala 3 compiler
3131

3232
- Scala3 コンパイラ自体が強力な移行ツールとなっている
33-
- Scala 2.13 のコードをコンパイルするのに最適なマイグレーションモードを備えていて、必要に応じてコードを書き換えてくれる
34-
- 詳細は、次の Scala 3 Migration Mode で確認します
33+
- Scala 3 Migration Mode を備えていて、必要に応じて Scala 2.13 のコードを Scala3 のコードへ書き換えてくれる
34+
- 詳細は、この後の Scala 3 Migration Mode で確認する
3535
- このツールを使用して、コミュニティではすでにかなりの数のライブラリが移行されている
3636
- [Scala 3 Community Build](https://github.com/lampepfl/dotty/tree/master/community-build/community-projects)
3737

docs/step04/03_Scala3MigrationMode.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
## 概要
1717

18-
Scala 2.13 のコードベースを Scala 3.0 へ移植していく際のマイグレーションモードについて確認しましょう
18+
Scala 2.13 のコードベースを Scala 3.0 へ移行していく際の Migration Mode について確認しましょう
1919

2020
## ドキュメント参照先
2121

@@ -32,15 +32,13 @@ Scala 2.13 のコードベースを Scala 3.0 へ移植していく際のマイ
3232
## Automatic rewrites
3333

3434
- Migration Mode の `-source:3.0-migration``-rewrite` オプションを指定してコンパイルすると、ほとんどすべての警告はコンパイラによって自動的に解決してくれる
35-
- `-rewrite` は、Step1 で確認したとおり、コードを自動的に書き換えてくれる機能
35+
- `-rewrite` は、Step1 で確認したとおり、コードを自動的に書き換えてくれるコンパイラオプション
3636
- Migration Mode でコンパイルエラーになった場合は、`-rewrite` が適用されない
3737

38-
:bulb: 本リポジトリの step04 プロジェクトでは、Scala3 で予約語となっている `given``enum` をクラス名や変数名にしていた場合に、どのような警告が表示され、どのように書き換えられるかを試すことができます。
39-
4038
## Error explanations
4139

4240
- Migration Modeの `-source:3.0-migration` は、すべての機能を処理できるわけではなくて、場合によっては、 Scala 2.13 と Scala 3.0 の非互換性のためにエラーが残ることもある
43-
- この場合は`-source:3.0-migration``-explain``-explain-types` と組み合わせて指定することで、エラーの詳細を知ることができる
41+
- その場合は`-source:3.0-migration``-explain``-explain-types` と組み合わせて指定することで、エラーの詳細を知ることができる
4442
- `-explain` : エラーの詳細を表示する
4543
- `-explain-types` 型エラーを詳細に表示する
46-
- `-explain``-explain-types` は、移行モードに限定されるものではなくて、Scala3 の学習やコーディングを支援してくれる
44+
- `-explain``-explain-types` は、移行モードに限定されるものではなくて、Scala3 の学習やコーディングを支援してくれるコンパイラオプション
Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,50 @@
1-
# IncompatibilityTable {ignore=true}
1+
# Incompatibility Table {ignore=true}
22

33
<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
44

55
<!-- code_chunk_output -->
66

77
- [概要](#概要)
88
- [ドキュメント参照先](#ドキュメント参照先)
9-
- [Incompatibility Table](#incompatibility-table)
9+
- [Incompatibility Table](#incompatibility-table-1)
1010

1111
<!-- /code_chunk_output -->
1212

1313
## 概要
1414

15-
*** TO BE FILLED IN ***
15+
最後に Scala 2.13 と Scala 3.0 との非互換性について確認しましょう。
1616

17+
ここで言う非互換性とは、Scala 2.13 ではコンパイルできても Scala 3.0 ではコンパイルできないコードのことを指します。コードベースを Scala 2.13 から Scala 3.0 へ移行するには、ソースコードの非互換性をすべて見つけ出して修正する必要があります。
1718

1819
## ドキュメント参照先
1920

2021
[Scala 3 Migration guide](https://scalacenter.github.io/scala-3-migration-guide/) からこちらを参照します。
2122

2223
- [Incompatibility Table](https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/table.html)
2324

25+
補足としてこちらも参照します。
26+
27+
- [Syntactic Changes](https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/syntactic-changes.html)
28+
- [Dropped Features](https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/dropped-features.html)
29+
- [Other Changed Features](https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/other-changed-features.html)
30+
2431
## Incompatibility Table
2532

2633
https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/table.html
2734

28-
*** TO BE FILLED IN ***
35+
Incompatibility Table は、Scala 2.13 と Scala 3.0 のそれぞれの非互換性について、どのような移行方法があるのかがまとめられています。
36+
37+
観点としては、
38+
39+
- Scala 2.13 で Deprecation だったかどうか
40+
- Scala 3.0 Migration Mode で自動的に書き換えられるか
41+
- Scalafix Rule で検出できるか
42+
43+
また、まれに Scala 2.13 と Scala 3.0 で実行時の非互換性が発生することもあるので注意が必要です。
44+
45+
---
46+
47+
ここからは、Incompatibility Table をざっと眺めながら、Scala 3.0 Migration Mode の rewrite を実際に動かしてみたいと思います。
48+
49+
本リポジトリの step04 のプロジェクトには、非互換なソースコードがコメントアウトの状態で書いてあります。それらのコメントアウトを一つずつ外し、`build.sbt` のコンパイラオプションを切り替えることで、エラーが警告になったり、rewrite が発動したりを確認することができます。
50+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `01_restrictedKeywords`
4+
5+
// Scala 3.0 Migration mode の動作確認をします
6+
// 以下のコメントアウトを外して、
7+
// build.sbt の step04 の scalacOptions の設定を変えてみてください
8+
9+
//---
10+
// scalacOptions の以下を順番に有効にしてみてください
11+
// - "-explain"
12+
// - "-source:3.0-migration"
13+
// - "-source:3.0-migration", "-rewrite"
14+
15+
// object given {
16+
// val enum = ???
17+
// println(enum)
18+
// }
19+
20+
//---
21+
// scalacOptions の以下を有効にしてみてください
22+
// - "-explain"
23+
// (これに関してはマイグレーションモードが効かないらしい)
24+
25+
// def then(): Unit = ()
26+
27+
object Dummy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `02_procedureSyntax`
4+
5+
//---
6+
// scalacOptions の以下を順番に有効にしてみてください
7+
// - "-explain"
8+
// - "-source:3.0-migration"
9+
// - "-source:3.0-migration", "-rewrite"
10+
11+
// trait Foo {
12+
// def print()
13+
// }
14+
15+
// object Bar {
16+
// def print() {
17+
// println("bar")
18+
// }
19+
// }
20+
21+
object Dummy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `03_parenthesesAroundLambdaParameter`
4+
5+
//---
6+
// scalacOptions の以下を順番に有効にしてみてください
7+
// - "-source:3.0-migration"
8+
// - "-source:3.0-migration", "-rewrite"
9+
10+
// val f = { x: Int => x * x }
11+
12+
object Dummy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `04_openBraceIndentationForPassingAnArgument`
4+
5+
def test(name: String)(f: => Unit) = ???
6+
7+
//---
8+
// scalacOptions の以下を順番に有効にしてみてください
9+
// - "-explain"
10+
// - "-source:3.0-migration"
11+
12+
// Scala2 では、改行後の引数を中括弧で囲めるが推奨されていない
13+
// Scala3 では警告が表示される
14+
// def no1(): Unit =
15+
// test("my test")
16+
// {
17+
// assert(1 == 1)
18+
// }
19+
20+
// Scala2 では、このように書くのが正しい
21+
def no2(): Unit =
22+
test("my test") {
23+
assert(1 == 1)
24+
}
25+
26+
// no1 を Scala3 で敢えて書くならこう書くのが正しい
27+
def no3(): Unit =
28+
test("my test")
29+
{
30+
assert(1 == 1)
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `05_wrongIndentation`
4+
5+
// 以下のコメントアウトしているコードは、Scala2 ではコンパイルが通るが、
6+
// Scala3 ではインデントが間違ってるのでコンパイルが通らない
7+
// この場合は、scalafmt などでコードフォーマットする必要がある
8+
9+
// val foo_wrong =
10+
// Vector(1) ++
11+
// Vector(2) ++
12+
// Vector(3)
13+
14+
// def bar_wrong: (Int, Int) = {
15+
// val foo = 1.0
16+
// val bar = foo
17+
// (1, 1)
18+
// }
19+
20+
val foo =
21+
Vector(1) ++
22+
Vector(2) ++
23+
Vector(3)
24+
25+
def bar: (Int, Int) = {
26+
val foo = 1.0
27+
val bar = foo
28+
(1, 1)
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `06__AsATypeParameter`
4+
5+
trait Foo[T]
6+
7+
// Scala2 では、これはコンパイルが通る
8+
// def foo[_: Foo]: Unit = ???
9+
10+
// これは、fooというメソッドの型パラメータ `_` に Context Bound として `trait Foo[_]` を指定したものだが、
11+
// このような書き方は、Scala コンパイラのバグを巧みに利用したもので、想定外な使われ方だったため、Scala3 では廃止された
12+
//
13+
// 参考)
14+
// https://www.reddit.com/r/scala/comments/fczcvo/mysterious_context_bounds_in_fastparse_2/fjecokn/
15+
16+
// Scala3 からは型パラメータを明示する
17+
def foo[T: Foo]: Unit = ???
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `01_syntacticChange`
3+
package `07_+and-AsTypeParameter`
4+
5+
// Scala2 では、型パラメータに `+` や `-` を指定してもコンパイルが通ったが、Scala3 ではエラーになる
6+
// def foo[+]: Unit = ???
7+
// def foo[-]: Unit = ???
8+
9+
// Scala3 ではこのようにする
10+
def foo[T]: Unit = ???
11+
12+
// ただし、型の識別子としての `+` や `-` はまだ有効
13+
type + = String
14+
type - = Int
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `02_droppedFeatures`
3+
package `01_SymbolLiterals`
4+
5+
//---
6+
// scalacOptions の以下を順番に有効にしてみてください
7+
// - "-explain"
8+
// - "-source:3.0-migration"
9+
// - "-source:3.0-migration", "-rewrite"
10+
11+
// val values: Map[Symbol, Int] = Map('abc -> 1)
12+
13+
// val abc = values('abc)
14+
15+
object Dummy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.shinharad.gettingStartedWithScala3
2+
package `02_droppedFeatures`
3+
package `02_DoWhileConstruct`
4+
5+
//---
6+
// scalacOptions の以下を順番に有効にしてみてください
7+
// - "-source:3.0-migration"
8+
// - "-source:3.0-migration", "-rewrite"
9+
10+
def no1(): Unit = {
11+
def f(i: Int): Int = ???
12+
var i = 1
13+
14+
// do {
15+
// i += 1
16+
// } while (f(i) == 0)
17+
}

0 commit comments

Comments
 (0)