How to generate constructor invocation on generic case class? #19363
              
                Unanswered
              
          
                  
                    
                      ChAoSUnItY
                    
                  
                
                  asked this question in
                Metaprogramming
              
            Replies: 1 comment
-
| The constructors expects type arguments first.   val baseCtorTerm = Select(New(ownerType), ctor)
  val typeAppliedCtorTerm =
    if ownerTypeArgs.isEmpty then baseCtorTerm
    else TypeApply(baseCtorTerm, ownerTypeArgs.map(t => TypeTree.ref(t.typeSymbol)))
  //     ^^^^^^^^^^^^^^^^^^^^^^^ here
  var ctorTerm = Apply(typeAppliedCtorTerm, paramGens.map(_.asTerm)) // drop the .asExprOf[T], it's not valid Expr yet
  var finalTerm = if !ownerTypeArgs.isEmpty then
    val genTypeArgs = ownerTypeArgs.map(genTpe => {
      genTpe.asType match
        case '[g] => getGen[g].asTerm
        case _ =>
          report.errorAndAbort(
            s"Illegal Generator Type: `${Type.show[T]}`, not an valid generator type"
          )
    })
    Apply(ctorTerm, genTypeArgs)
  else ctorTerm
  finalTerm.asExprOf[T] | 
Beta Was this translation helpful? Give feedback.
                  
                    0 replies
                  
                
            
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment
  
        
    
Uh oh!
There was an error while loading. Please reload this page.
-
Currently I have a type class that indicates a type is generate-able and having both a non generic and a generic case class to test the constructor invocation:
And here is my attempt to generate constructor invocation through macro:
But after I invokes
fakeGenon typePersonandCont[String], the first one works without any issue, however, the second one generates an incomplete constructor invocation based on what dotty told me:constructor Cont in class Cont does not take parameters, which is even more confusing after I dumped 2 constructor invocations throughExpr[T].show(as shown below):Person:new Person(given_Generator_String.generate(), given_Generator_Int.generate())Cont:new Cont[scala.Predef.String](given_Generator_String.generate(), given_Generator_Int.generate())(given_Generator_String)Any suggestion about how to fix or complete the incomplete part of constructor invocation would be appreciated!
Beta Was this translation helpful? Give feedback.
All reactions