diff --git a/library/src/scala/util/CommandLineParser.scala b/library/src/scala/util/CommandLineParser.scala index 50de98040e2d..5b0c49b483e6 100644 --- a/library/src/scala/util/CommandLineParser.scala +++ b/library/src/scala/util/CommandLineParser.scala @@ -41,4 +41,49 @@ object CommandLineParser { else s" after ${err.idx} arguments" println(s"Illegal command line$where: ${err.msg}") } + + trait FromString[T] { + /** Can throw java.lang.IllegalArgumentException */ + def fromString(s: String): T + + def fromStringOption(s: String): Option[T] = + try Some(fromString(s)) + catch { + case ex: IllegalArgumentException => None + } + } + + object FromString { + given FromString[String] { + def fromString(s: String) = s + } + + given FromString[Boolean] { + def fromString(s: String) = s.toBoolean + } + + given FromString[Byte] { + def fromString(s: String) = s.toByte + } + + given FromString[Short] { + def fromString(s: String) = s.toShort + } + + given FromString[Int] { + def fromString(s: String) = s.toInt + } + + given FromString[Long] { + def fromString(s: String) = s.toLong + } + + given FromString[Float] { + def fromString(s: String) = s.toFloat + } + + given FromString[Double] { + def fromString(s: String) = s.toDouble + } + } } diff --git a/library/src/scala/util/FromString.scala b/library/src/scala/util/FromString.scala deleted file mode 100644 index 943bdf656471..000000000000 --- a/library/src/scala/util/FromString.scala +++ /dev/null @@ -1,47 +0,0 @@ -package scala.util - -trait FromString[T] { - /** Can throw java.lang.IllegalArgumentException */ - def fromString(s: String): T - - def fromStringOption(s: String): Option[T] = - try Some(fromString(s)) - catch { - case ex: IllegalArgumentException => None - } -} - -object FromString { - - given FromString[String] { - def fromString(s: String) = s - } - - given FromString[Boolean] { - def fromString(s: String) = s.toBoolean - } - - given FromString[Byte] { - def fromString(s: String) = s.toByte - } - - given FromString[Short] { - def fromString(s: String) = s.toShort - } - - given FromString[Int] { - def fromString(s: String) = s.toInt - } - - given FromString[Long] { - def fromString(s: String) = s.toLong - } - - given FromString[Float] { - def fromString(s: String) = s.toFloat - } - - given FromString[Double] { - def fromString(s: String) = s.toDouble - } -} diff --git a/tests/neg/main-functions2.scala b/tests/neg/main-functions2.scala index 7831df56560b..ef99cbffb383 100644 --- a/tests/neg/main-functions2.scala +++ b/tests/neg/main-functions2.scala @@ -8,6 +8,6 @@ class Foo { @main def g(x: Int*)(y: Int*) = () // error: varargs parameter of @main method must come last -@main def h[T: util.FromString](x: T) = () // error: @main method cannot have type parameters +@main def h[T: util.CommandLineParser.FromString](x: T) = () // error: @main method cannot have type parameters @main def i(x: Int)(using Foo) = () // error: @main method cannot have implicit parameters diff --git a/tests/pos/main-method-scheme-class-based.scala b/tests/pos/main-method-scheme-class-based.scala index 4dece92c9817..3cef1a3667ef 100644 --- a/tests/pos/main-method-scheme-class-based.scala +++ b/tests/pos/main-method-scheme-class-based.scala @@ -13,7 +13,7 @@ import collection.mutable */ trait MainAnnotation extends StaticAnnotation: - /** The class used for argument string parsing. E.g. `scala.util.FromString`, + /** The class used for argument string parsing. E.g. `scala.util.CommandLineParser.FromString`, * but could be something else */ type ArgumentParser[T] @@ -44,7 +44,7 @@ end MainAnnotation class main extends MainAnnotation: - type ArgumentParser[T] = util.FromString[T] + type ArgumentParser[T] = util.CommandLineParser.FromString[T] type MainResultType = Any def command(args: Array[String]): Command = new Command: @@ -202,4 +202,4 @@ Error: invalid argument for num: binary Error: unused argument: 01 Usage: add num inc? -*/ \ No newline at end of file +*/ diff --git a/tests/pos/main-method-scheme.scala b/tests/pos/main-method-scheme.scala index ce8ea3ac3c19..c65f7c928efd 100644 --- a/tests/pos/main-method-scheme.scala +++ b/tests/pos/main-method-scheme.scala @@ -22,7 +22,7 @@ class main(progName: String, args: Array[String], docComment: String) extends Ma def this() = this("", Array(), "") - type ArgumentParser[T] = util.FromString[T] + type ArgumentParser[T] = util.CommandLineParser.FromString[T] /** A buffer of demanded argument names, plus * "?" if it has a default @@ -167,4 +167,4 @@ Error: unknown argument name: --foo Usage: add num inc? Adds two numbers -*/ \ No newline at end of file +*/ diff --git a/tests/run/decorators/main.scala b/tests/run/decorators/main.scala index a73760252049..ace7f1f73cf2 100644 --- a/tests/run/decorators/main.scala +++ b/tests/run/decorators/main.scala @@ -5,7 +5,7 @@ import collection.mutable */ class main extends EntryPoint.Annotation: - type ArgumentParser[T] = util.FromString[T] + type ArgumentParser[T] = util.CommandLineParser.FromString[T] type EntryPointResult = Unit inline def wrapperName(entryPointName: String): String = diff --git a/tests/semanticdb/expect/toplevel.expect.scala b/tests/semanticdb/expect/toplevel.expect.scala index ad685d8a6269..ea8daac5008f 100644 --- a/tests/semanticdb/expect/toplevel.expect.scala +++ b/tests/semanticdb/expect/toplevel.expect.scala @@ -3,4 +3,4 @@ extension (x/*<-_empty_::toplevel$package.extension_combine().(x)*/: Int/*->scal def combine/*<-_empty_::toplevel$package.combine().*/(x/*<-_empty_::toplevel$package.combine().(x)*/: Int/*->scala::Int#*/, y/*<-_empty_::toplevel$package.combine().(y)*/: Int/*->scala::Int#*/, z/*<-_empty_::toplevel$package.combine().(z)*/: Int/*->scala::Int#*/) = x/*->_empty_::toplevel$package.combine().(x)*/ +/*->scala::Int#`+`(+4).*/ y/*->_empty_::toplevel$package.combine().(y)*/ +/*->scala::Int#`+`(+4).*/ z/*->_empty_::toplevel$package.combine().(z)*/ def combine/*<-_empty_::toplevel$package.combine(+1).*/ = 0 def foo/*<-_empty_::toplevel$package.foo().*/ = "foo" -/*<-_empty_::MyProgram#*//*->_empty_::toplevel$package.MyProgram().*//*->scala::util::CommandLineParser.parseArgument().*//*->_empty_::MyProgram#main().(args)*//*->scala::util::FromString.given_FromString_Int.*//*->scala::util::CommandLineParser.showError().*//*->local0*/@main/*->scala::main#*/ def MyProgram/*<-_empty_::toplevel$package.MyProgram().*/(times/*<-_empty_::toplevel$package.MyProgram().(times)*/: Int/*->scala::Int#*/): Unit/*->scala::Unit#*/ = (/*->scala::LowPriorityImplicits#intWrapper().*/1 to/*->scala::runtime::RichInt#to().*/ times/*->_empty_::toplevel$package.MyProgram().(times)*/) foreach/*->scala::collection::immutable::Range#foreach().*/ (_ => println/*->scala::Predef.println(+1).*/("hello")) +/*<-_empty_::MyProgram#*//*->_empty_::toplevel$package.MyProgram().*//*->scala::util::CommandLineParser.parseArgument().*//*->_empty_::MyProgram#main().(args)*//*->scala::util::CommandLineParser.FromString.given_FromString_Int.*//*->scala::util::CommandLineParser.showError().*//*->local0*/@main/*->scala::main#*/ def MyProgram/*<-_empty_::toplevel$package.MyProgram().*/(times/*<-_empty_::toplevel$package.MyProgram().(times)*/: Int/*->scala::Int#*/): Unit/*->scala::Unit#*/ = (/*->scala::LowPriorityImplicits#intWrapper().*/1 to/*->scala::runtime::RichInt#to().*/ times/*->_empty_::toplevel$package.MyProgram().(times)*/) foreach/*->scala::collection::immutable::Range#foreach().*/ (_ => println/*->scala::Predef.println(+1).*/("hello")) diff --git a/tests/semanticdb/metac.expect b/tests/semanticdb/metac.expect index 90c39945db6f..44b24919b9c2 100644 --- a/tests/semanticdb/metac.expect +++ b/tests/semanticdb/metac.expect @@ -3973,7 +3973,7 @@ Occurrences: [5:0..5:0): -> _empty_/toplevel$package.MyProgram(). [5:0..5:0): -> scala/util/CommandLineParser.parseArgument(). [5:0..5:0): -> _empty_/MyProgram#main().(args) -[5:0..5:0): -> scala/util/FromString.given_FromString_Int. +[5:0..5:0): -> scala/util/CommandLineParser.FromString.given_FromString_Int. [5:0..5:0): -> scala/util/CommandLineParser.showError(). [5:0..5:0): -> local0 [5:1..5:5): main -> scala/main#