scala / scala3

The Scala 3 compiler, also known as Dotty.
https://dotty.epfl.ch
Apache License 2.0
5.72k stars 1.04k forks source link

Given CommandLineParser not importable for purposes of defining main #19261

Open som-snytt opened 7 months ago

som-snytt commented 7 months ago

Compiler version

3.3.1

Minimized code

import scala.concurrent.duration.*
import scala.util.CommandLineParser

object Instances {
  given finiteDurationClpFromString: CommandLineParser.FromString[FiniteDuration] with {
    override def fromString(s: String): FiniteDuration =
      Duration(s).asInstanceOf[FiniteDuration]
    }
}

import Instances.given

@main def foo(duration: FiniteDuration): Unit = println(s"hello, $duration")

def f: Unit = summon[CommandLineParser.FromString[FiniteDuration]]  // OK

Output

-- [E172] Type Error: duration-arg.scala:14:0 --------------------------------------------------------------------------
14 |@main def foo(duration: FiniteDuration): Unit = println(s"hello, $duration")
   |^
   |No given instance of type scala.util.CommandLineParser.FromString[concurrent.duration.FiniteDuration] was found for parameter fs of method parseArgument in object CommandLineParser
1 error found

Expectation

Works, as does the given in lexical scope:

import scala.concurrent.duration.*
import scala.util.CommandLineParser

//object Instances {
  given finiteDurationClpFromString: CommandLineParser.FromString[FiniteDuration] with {
    override def fromString(s: String): FiniteDuration =
      Duration(s).asInstanceOf[FiniteDuration]
    }
//}

//import Instances.given

@main def foo(duration: FiniteDuration): Unit = println(s"hello, $duration")

def f: Unit = summon[CommandLineParser.FromString[FiniteDuration]]

Observed at https://discord.com/channels/632150470000902164/632150470000902166/1184435716365746187

bishabosha commented 7 months ago

I also experienced this, e.g. this makes it impossible to define any default command line parsers along with the definition of a custom main annotation