Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.

Commit a5b6804

Browse files
authored
Bump to dotty 0.27.0-RC1 (#67)
* Bump Dotty version * Bump Dotty version to 0.27.0-RC1 - The biggest change in 0.27.0-RC1 is the change in the extension methods syntax - Because of [#9688](scala/scala3#9688) a temporary fix was applied in calls to `log.xxx` that pass in a single object to log * Organise code snippets * Fix extension method syntax/Fix indentation * Switch to Significant Indentation Based Syntax - Switch to SIB syntax for exercise 3 and later * Remove option for .sbtopts that will be deprecated in the future
1 parent 1b038b1 commit a5b6804

File tree

146 files changed

+967
-1458
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+967
-1458
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ collectedLogs.zip
1313
.bloop/
1414
.metals/
1515
.swp
16-
project/metals.sbt
16+
**/project/metals.sbt
1717

1818
# sbt specific
1919
.cache/

code-snippets/build.sbt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
val dottyVersion = "0.24.0-RC1"
1+
val dottyVersion = "0.27.0-RC1"
22

33
Global / onChangedBuildSource := ReloadOnSourceChanges
44

@@ -9,8 +9,8 @@ lazy val `dotty-snippets` = project
99
name := "dotty-simple",
1010
version := "0.1.0",
1111

12-
ThisBuild / scalaVersion := dottyVersion,
13-
//ThisBuild / scalaVersion := dottyLatestNightlyBuild.get,
12+
//ThisBuild / scalaVersion := dottyVersion,
13+
ThisBuild / scalaVersion := dottyLatestNightlyBuild.get,
1414

1515
libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % "test"
1616
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.lunatech.dotty.extensionmethods.collective
2+
3+
extension (i: Int)
4+
def isEven: Boolean = i % 2 == 0
5+
6+
def unary_! : Int = -i
7+
8+
def square : Int = i * i
9+
10+
extension [T](xs: List[T]):
11+
def second: T = xs.tail.head
12+
def third: T = xs.tail.second
13+
14+
@main def collective() =
15+
println(List(1,2,3).second)
16+
println(! 5)
17+
println(5.isEven)
18+
println(5.square)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.lunatech.dotty.extensionmethods
2+
3+
extension (a: String) def < (b: String): Boolean = a.compareTo(b) < 0
4+
5+
extension (a: Int) def +++: (b: List[Int]) = a::b
6+
7+
@main def extensionOperators() =
8+
println("abc" < "pqr") // true
9+
println(1 +++: List(2,3,4)) // val lst: List[Int] = List(1, 2, 3, 4)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.lunatech.dotty.extensionmethods
2+
3+
extension [T](xs: List[T])
4+
def second =
5+
xs.tail.head
6+
7+
extension [T](xs: List[List[T]])
8+
def flattened =
9+
xs.foldLeft[List[T]](Nil)(_ ++ _)
10+
11+
extension [T: Numeric](x: T)
12+
def + (y: T): T =
13+
summon[Numeric[T]].plus(x, y)
14+
15+
def [T: Numeric](x: T) - (y: T) = summon[Numeric[T]].plus(x, y)
16+
17+
case class Circle(x: Double, y: Double, radius: Double)
18+
def (c: Circle).circumference: Double = c.radius * math.Pi * 2
19+
20+
@main def circles() =
21+
println(s"Circle: ${Circle(1.0, 2.0, 4).circumference}")
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package org.lunatech.dotty.extensionmethods
22

3-
trait IntOps {
4-
def (i: Int).isEven: Boolean = i % 2 == 0
3+
extension (i: Int):
4+
def isEven: Boolean = i % 2 == 0
55

6-
def (i: Int).unary_! : Int = -i
7-
}
8-
9-
object IntOperations {
6+
def unary_! : Int = -i
107

118
// 1. An extension method is applicable if it is visible under a simple name,
129
// by being defined or inherited or imported in a scope enclosing the application
@@ -17,10 +14,7 @@ object IntOperations {
1714
// we could define this object as `IntOperations extends IntOps`.
1815
// A more elegant way to bring `IntOps` to the context is by using a `given`
1916

20-
given IntOps
17+
@main def show(): Unit =
18+
println(2.isEven) // true
19+
println(!5) // -5
2120

22-
@main def show(): Unit = {
23-
println(2.isEven) // true
24-
println(!5) // -5
25-
}
26-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
trait IntOps:
2+
extension (i: Int) def isZero: Boolean = i == 0
3+
4+
extension (i: Int) def safeMod(x: Int): Option[Int] =
5+
// extension method defined in same scope IntOps
6+
if x.isZero then None
7+
else Some(i % x)
8+
9+
object IntOpsEx extends IntOps:
10+
extension (i: Int) def safeDiv(x: Int): Option[Int] =
11+
// extension method brought into scope via inheritance from IntOps
12+
if x.isZero then None
13+
else Some(i / x)
14+
15+
object SafeDiv:
16+
import IntOpsEx._ // brings safeDiv and safeMod into scope
17+
18+
extension (i: Int) def divide(d: Int) : Option[(Int, Int)] =
19+
// extension methods imported and thus in scope
20+
(i.safeDiv(d), i.safeMod(d)) match
21+
case (Some(d), Some(r)) => Some((d, r))
22+
case _ => None
23+
24+
val d1 = 25.divide(3)
25+
val d2 = 25.divide(0)
26+
27+
SafeDiv.d1
28+
SafeDiv.d2
29+
30+
given IntOps
31+
32+
20.safeMod(0)
33+
20.safeMod(3)
34+
35+
extension [T](xs: List[List[T]])
36+
def flatten: List[T] = xs.foldLeft(Nil: List[T])(_ ++ _)
37+
38+
given [T: Ordering] as Ordering[List[T]]:
39+
override def compare(l1: List[T], l2: List[T]): Int = 1
40+
extension (xs: List[T])
41+
def < (ys: List[T]): Boolean = summon[Ordering[T]].lt(xs.head, ys.head)
42+
43+
44+
// extension method available since it is in the implicit scope of List[List[Int]]
45+
List(List(1, 2), List(3, 4)).flatten
46+
47+
// extension method available since it is in the given Ordering[List[T]],
48+
// which is itself in the implicit scope of List[Int]
49+
List(1, 2) < List(3)

code-snippets/src/main/scala/org/lunatech/dotty/opaquetypes/Units.scala renamed to code-snippets/contextual-abstractions/src/main/scala/org/lunatech/dotty/opaquetypes/Units.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,15 @@ object Scala3OpaqueTypeAliasesDefinitions {
138138
def apply(d: Double): Miles = d
139139
}
140140

141-
extension {
142-
def (a: Kilometres) + (b: Kilometres): Kilometres = a + b
143-
def (km: Kilometres).toMiles: Miles = km / 1.6
144-
}
141+
extension (a: Kilometres):
142+
def +(b: Kilometres): Kilometres = a + b
143+
def toMiles: Miles = a / 1.6
145144

146-
extension {
147-
def (a: Miles) + (b: Miles): Miles = a + b
148-
def (miles: Miles).toKm: Kilometres = miles * 1.6
149-
}
145+
146+
extension (a: Miles):
147+
// def +(b: Miles): Miles = a + b
148+
def toKm: Kilometres = a * 1.6
149+
150150

151151
}
152152

code-snippets/project/metals.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// DO NOT EDIT! This file is auto-generated.
22
// This file enables sbt-bloop to create bloop config files.
33

4-
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.0-RC1-229-b7c15aa9")
4+
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.3-31-b16d7e50")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// DO NOT EDIT! This file is auto-generated.
2+
// This file enables sbt-bloop to create bloop config files.
3+
4+
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.3-31-b16d7e50")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// DO NOT EDIT! This file is auto-generated.
2+
// This file enables sbt-bloop to create bloop config files.
3+
4+
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.3-31-b16d7e50")

code-snippets/src/main/scala/org/lunatech/dotty/extensionmethods/CollectiveExtensions.scala

Lines changed: 0 additions & 14 deletions
This file was deleted.

code-snippets/src/main/scala/org/lunatech/dotty/extensionmethods/ExtensionInstance.scala

Lines changed: 0 additions & 24 deletions
This file was deleted.

code-snippets/src/main/scala/org/lunatech/dotty/extensionmethods/ExtensionOperators.scala

Lines changed: 0 additions & 11 deletions
This file was deleted.

code-snippets/src/main/scala/org/lunatech/dotty/extensionmethods/GenericExtension.scala

Lines changed: 0 additions & 12 deletions
This file was deleted.

code-snippets/src/test/scala/Test1.scala

Lines changed: 0 additions & 8 deletions
This file was deleted.

exercises/.sbtopts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
-J-Xmx4G
2-
-J-XX:+CMSClassUnloadingEnabled
32
-J-Xss4M
43
-Duser.timezone=GMT

exercises/exercise_000_sudoku_solver_initial_state/src/main/scala/org/lunatechlabs/dotty/sudoku/SudokuProgressTracker.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class SudokuProgressTracker private (
4040
case NewUpdatesInFlight(updateCount) =>
4141
trackProgress(updatesInFlight + updateCount)
4242
case msg: SudokuDetailState =>
43-
context.log.error("Received unexpected message in state 'trackProgress': {}", msg)
43+
// context.log.error("Received unexpected message in state 'trackProgress': {}", msg)
44+
context.log.error(s"Received unexpected message in state 'trackProgress': ${msg}")
4445
Behaviors.same
4546
}
4647

@@ -58,7 +59,8 @@ class SudokuProgressTracker private (
5859
case detail: SudokuDetailState =>
5960
collectEndState(remainingRows = remainingRows - 1, detail +: endState)
6061
case msg: NewUpdatesInFlight =>
61-
context.log.error("Received unexpected message in state 'collectEndState': {}", msg)
62+
// context.log.error("Received unexpected message in state 'collectEndState': {}", msg)
63+
context.log.error(s"Received unexpected message in state 'collectEndState': ${msg}")
6264
Behaviors.same
6365
}
6466
}

exercises/exercise_000_sudoku_solver_initial_state/src/main/scala/org/lunatechlabs/dotty/sudoku/SudokuSolver.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ class SudokuSolver private (context: ActorContext[SudokuSolver.Command],
9090
progressTracker ! SudokuProgressTracker.NewUpdatesInFlight(rowUpdates.size)
9191
processRequest(Some(sender), System.currentTimeMillis())
9292
case unexpectedMsg =>
93-
context.log.error("Received an unexpected message in 'idle' state: {}", unexpectedMsg)
93+
// context.log.error("Received an unexpected message in 'idle' state: {}", unexpectedMsg)
94+
context.log.error(s"Received an unexpected message in 'idle' state: ${unexpectedMsg}")
9495
Behaviors.same
9596

9697
}

exercises/exercise_001_dotty_deprecated_syntax_rewriting/src/main/scala/org/lunatechlabs/dotty/sudoku/SudokuProgressTracker.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class SudokuProgressTracker private (
4040
case NewUpdatesInFlight(updateCount) =>
4141
trackProgress(updatesInFlight + updateCount)
4242
case msg: SudokuDetailState =>
43-
context.log.error("Received unexpected message in state 'trackProgress': {}", msg)
43+
// context.log.error("Received unexpected message in state 'trackProgress': {}", msg)
44+
context.log.error(s"Received unexpected message in state 'trackProgress': ${msg}")
4445
Behaviors.same
4546
}
4647

@@ -58,7 +59,8 @@ class SudokuProgressTracker private (
5859
case detail: SudokuDetailState =>
5960
collectEndState(remainingRows = remainingRows - 1, detail +: endState)
6061
case msg: NewUpdatesInFlight =>
61-
context.log.error("Received unexpected message in state 'collectEndState': {}", msg)
62+
// context.log.error("Received unexpected message in state 'collectEndState': {}", msg)
63+
context.log.error(s"Received unexpected message in state 'collectEndState': ${msg}")
6264
Behaviors.same
6365
}
6466
}

exercises/exercise_001_dotty_deprecated_syntax_rewriting/src/main/scala/org/lunatechlabs/dotty/sudoku/SudokuSolver.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ class SudokuSolver private (context: ActorContext[SudokuSolver.Command],
9090
progressTracker ! SudokuProgressTracker.NewUpdatesInFlight(rowUpdates.size)
9191
processRequest(Some(sender), System.currentTimeMillis())
9292
case unexpectedMsg =>
93-
context.log.error("Received an unexpected message in 'idle' state: {}", unexpectedMsg)
93+
// context.log.error("Received an unexpected message in 'idle' state: {}", unexpectedMsg)
94+
context.log.error(s"Received an unexpected message in 'idle' state: ${unexpectedMsg}")
9495
Behaviors.same
9596

9697
}

exercises/exercise_002_dotty_new_syntax_and_indentation_based_syntax/src/main/scala/org/lunatechlabs/dotty/sudoku/SudokuProgressTracker.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class SudokuProgressTracker private (
4040
case NewUpdatesInFlight(updateCount) =>
4141
trackProgress(updatesInFlight + updateCount)
4242
case msg: SudokuDetailState =>
43-
context.log.error("Received unexpected message in state 'trackProgress': {}", msg)
43+
// context.log.error("Received unexpected message in state 'trackProgress': {}", msg)
44+
context.log.error(s"Received unexpected message in state 'trackProgress': ${msg}")
4445
Behaviors.same
4546
}
4647

@@ -58,7 +59,8 @@ class SudokuProgressTracker private (
5859
case detail: SudokuDetailState =>
5960
collectEndState(remainingRows = remainingRows - 1, detail +: endState)
6061
case msg: NewUpdatesInFlight =>
61-
context.log.error("Received unexpected message in state 'collectEndState': {}", msg)
62+
// context.log.error("Received unexpected message in state 'collectEndState': {}", msg)
63+
context.log.error(s"Received unexpected message in state 'collectEndState': ${msg}")
6264
Behaviors.same
6365
}
6466
}

exercises/exercise_002_dotty_new_syntax_and_indentation_based_syntax/src/main/scala/org/lunatechlabs/dotty/sudoku/SudokuSolver.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ class SudokuSolver private (context: ActorContext[SudokuSolver.Command],
9090
progressTracker ! SudokuProgressTracker.NewUpdatesInFlight(rowUpdates.size)
9191
processRequest(Some(sender), System.currentTimeMillis())
9292
case unexpectedMsg =>
93-
context.log.error("Received an unexpected message in 'idle' state: {}", unexpectedMsg)
93+
// context.log.error("Received an unexpected message in 'idle' state: {}", unexpectedMsg)
94+
context.log.error(s"Received an unexpected message in 'idle' state: ${unexpectedMsg}")
9495
Behaviors.same
9596

9697
}

exercises/exercise_003_top_level_definitions/src/main/scala/org/lunatechlabs/dotty/SudokuSolverMain.scala

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import org.lunatechlabs.dotty.sudoku.{ SudokuProblemSender, SudokuSolver, Sudoku
2828
import scala.io.StdIn
2929
import scala.Console.{ GREEN, RESET }
3030

31-
object Main {
31+
object Main:
3232
def apply(): Behavior[NotUsed] =
3333
Behaviors.setup { context =>
3434
val sudokuSolverSettings = SudokuSolverSettings("sudokusolver.conf")
@@ -44,16 +44,13 @@ object Main {
4444
Behaviors.stopped
4545
}
4646
}
47-
}
4847

49-
object SudokuSolverMain {
48+
object SudokuSolverMain:
5049

51-
def main(args: Array[String]): Unit = {
50+
def main(args: Array[String]): Unit =
5251

5352
val system = ActorSystem[NotUsed](Main(), "sudoku-solver-system")
5453

5554
println(s"${GREEN}Hit RETURN to stop solver${RESET}")
5655
StdIn.readLine()
5756
system.terminate()
58-
}
59-
}

0 commit comments

Comments
 (0)