From bc5c09bb7388b3c064a840cc5f9b64233316a708 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 9 Mar 2021 15:53:08 +0100 Subject: [PATCH 1/5] Add Conversion.into method --- library/src/scala/Conversion.scala | 3 +++ tests/pos/conversion-into.scala | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/pos/conversion-into.scala diff --git a/library/src/scala/Conversion.scala b/library/src/scala/Conversion.scala index bb66a068e09c..01f08162bfc6 100644 --- a/library/src/scala/Conversion.scala +++ b/library/src/scala/Conversion.scala @@ -21,3 +21,6 @@ package scala @java.lang.FunctionalInterface abstract class Conversion[-T, +U] extends Function1[T, U]: def apply(x: T): U +object Conversion: + extension [T](x: T) + def into[U](using c: Conversion[T, U]) = c(x) diff --git a/tests/pos/conversion-into.scala b/tests/pos/conversion-into.scala new file mode 100644 index 000000000000..252dd1f1fac6 --- /dev/null +++ b/tests/pos/conversion-into.scala @@ -0,0 +1,7 @@ +import Conversion.into + +given Conversion[String, Int] = _.length +given Conversion[Int, String] = _.toString + +def f(x: String): Int = x.into +def g(x: Int): String = x.into[String] From 4408853b6265ac8f14960d4a6a9e287ec862568c Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 9 Mar 2021 15:57:53 +0100 Subject: [PATCH 2/5] Add doc comments on Conversion methods --- library/src/scala/Conversion.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/src/scala/Conversion.scala b/library/src/scala/Conversion.scala index 01f08162bfc6..67b38fac7f76 100644 --- a/library/src/scala/Conversion.scala +++ b/library/src/scala/Conversion.scala @@ -17,10 +17,16 @@ package scala * Also note that in bootstrapped dotty, `Predef.<:<` should inherit from * `Conversion`. This would cut the number of special cases in `discardForView` * from two to one. +* +* The `Conversion` class can also be used to convert explicitly, using +* the `into` extension method. */ @java.lang.FunctionalInterface abstract class Conversion[-T, +U] extends Function1[T, U]: + /** Convert value `x` of type `T` to type `U` */ def apply(x: T): U object Conversion: + extension [T](x: T) + /** `x.into[U]` converts a value `x` of type `T` to type `U` */ def into[U](using c: Conversion[T, U]) = c(x) From 6501dc491be7c2c91bb40b1d041d5b7e4e3b95ac Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 9 Mar 2021 22:02:13 +0100 Subject: [PATCH 3/5] Update CompletionTest --- .../test/dotty/tools/languageserver/CompletionTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/language-server/test/dotty/tools/languageserver/CompletionTest.scala b/language-server/test/dotty/tools/languageserver/CompletionTest.scala index 28e9f1a37882..cbb9ff13ba86 100644 --- a/language-server/test/dotty/tools/languageserver/CompletionTest.scala +++ b/language-server/test/dotty/tools/languageserver/CompletionTest.scala @@ -30,7 +30,7 @@ class CompletionTest { @Test def completionFromScalaPackage: Unit = { code"class Foo { val foo: Conv${m1} }".withSource - .completion(m1, Set(("Conversion", Class, "scala.Conversion"))) + .completion(m1, Set(("Conversion", Class, "class and object Conversion"))) } @Test def completionFromScalaPackageObject: Unit = { From abca5b0556871c14de8af32f5c240ca8687cf867 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 10 Mar 2021 10:56:17 +0100 Subject: [PATCH 4/5] Rename `into` to `convert` --- library/src/scala/Conversion.scala | 2 +- tests/pos/conversion-into.scala | 7 ------- tests/pos/convert.scala | 7 +++++++ 3 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 tests/pos/conversion-into.scala create mode 100644 tests/pos/convert.scala diff --git a/library/src/scala/Conversion.scala b/library/src/scala/Conversion.scala index 67b38fac7f76..7f9ae7a23112 100644 --- a/library/src/scala/Conversion.scala +++ b/library/src/scala/Conversion.scala @@ -29,4 +29,4 @@ object Conversion: extension [T](x: T) /** `x.into[U]` converts a value `x` of type `T` to type `U` */ - def into[U](using c: Conversion[T, U]) = c(x) + def convert[U](using c: Conversion[T, U]) = c(x) diff --git a/tests/pos/conversion-into.scala b/tests/pos/conversion-into.scala deleted file mode 100644 index 252dd1f1fac6..000000000000 --- a/tests/pos/conversion-into.scala +++ /dev/null @@ -1,7 +0,0 @@ -import Conversion.into - -given Conversion[String, Int] = _.length -given Conversion[Int, String] = _.toString - -def f(x: String): Int = x.into -def g(x: Int): String = x.into[String] diff --git a/tests/pos/convert.scala b/tests/pos/convert.scala new file mode 100644 index 000000000000..155af5f763dc --- /dev/null +++ b/tests/pos/convert.scala @@ -0,0 +1,7 @@ +import Conversion.convert + +given Conversion[String, Int] = _.length +given Conversion[Int, String] = _.toString + +def f(x: String): Int = x.convert +def g(x: Int): String = x.convert[String] From 6fa607ba4f9f8b6c38de519f02d3642aeab99b5b Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 10 Mar 2021 17:51:00 +0100 Subject: [PATCH 5/5] Fix name in comments --- library/src/scala/Conversion.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/scala/Conversion.scala b/library/src/scala/Conversion.scala index 7f9ae7a23112..21239503b137 100644 --- a/library/src/scala/Conversion.scala +++ b/library/src/scala/Conversion.scala @@ -19,7 +19,7 @@ package scala * from two to one. * * The `Conversion` class can also be used to convert explicitly, using -* the `into` extension method. +* the `convert` extension method. */ @java.lang.FunctionalInterface abstract class Conversion[-T, +U] extends Function1[T, U]: @@ -28,5 +28,5 @@ abstract class Conversion[-T, +U] extends Function1[T, U]: object Conversion: extension [T](x: T) - /** `x.into[U]` converts a value `x` of type `T` to type `U` */ + /** `x.convert[U]` converts a value `x` of type `T` to type `U` */ def convert[U](using c: Conversion[T, U]) = c(x)