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 = { diff --git a/library/src/scala/Conversion.scala b/library/src/scala/Conversion.scala index bb66a068e09c..21239503b137 100644 --- a/library/src/scala/Conversion.scala +++ b/library/src/scala/Conversion.scala @@ -17,7 +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 `convert` 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.convert[U]` converts a value `x` of type `T` to type `U` */ + def convert[U](using c: Conversion[T, U]) = c(x) 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]