diff --git a/core/shared/src/main/scala-3/caseapp/core/parser/LowPriorityParserImplicits.scala b/core/shared/src/main/scala-3/caseapp/core/parser/LowPriorityParserImplicits.scala index f2dfe87..61f03ee 100644 --- a/core/shared/src/main/scala-3/caseapp/core/parser/LowPriorityParserImplicits.scala +++ b/core/shared/src/main/scala-3/caseapp/core/parser/LowPriorityParserImplicits.scala @@ -77,7 +77,10 @@ object LowPriorityParserImplicits { ${ tupleParserImpl[T] } private def tupleParserImpl[T](using q: Quotes, t: Type[T]): Expr[Parser[_]] = { import quotes.reflect.* - val tSym = TypeTree.of[T].symbol + val (tSym, params) = TypeRepr.of[T] match { + case AppliedType(base, params) => (base.typeSymbol, Some(params)) + case _ => (TypeTree.of[T].symbol, None) + } val origin = shortName[T] val fields0 = fields[T] @@ -99,7 +102,8 @@ object LowPriorityParserImplicits { .map(_.name) val values = body.collect { case d @ DefDef(name, _, _, _) if name.startsWith("$lessinit$greater$default") => - Ref(d.symbol).asExpr + val ref = Ref(d.symbol) + params.fold(ref)(ref.appliedToTypes).asExpr } names.zip(values).toMap case None => diff --git a/tests/shared/src/test/scala/caseapp/CaseAppTests.scala b/tests/shared/src/test/scala/caseapp/CaseAppTests.scala index 96fc229..3f60a23 100644 --- a/tests/shared/src/test/scala/caseapp/CaseAppTests.scala +++ b/tests/shared/src/test/scala/caseapp/CaseAppTests.scala @@ -635,7 +635,7 @@ object CaseAppTests extends TestSuite { val expectedRes = Right( - (GenericArgs("v1", SharedOptions("v2")), RemainingArgs(List(), List())) + (GenericArgs("v1", SharedOptions("v2"), ""), RemainingArgs(List(), List())) ) assert(res == expectedRes) } diff --git a/tests/shared/src/test/scala/caseapp/demo/Demo.scala b/tests/shared/src/test/scala/caseapp/demo/Demo.scala index 7664175..7a8460b 100644 --- a/tests/shared/src/test/scala/caseapp/demo/Demo.scala +++ b/tests/shared/src/test/scala/caseapp/demo/Demo.scala @@ -121,5 +121,6 @@ object ManualSubCommandStuff { case class GenericArgs[Shared]( main: String, - @Recurse() shared: Shared + @Recurse() shared: Shared, + opt: String = "" )