Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ object CompanionCrimper {
def applyFactory[C <: blackbox.Context](
c: C,
log: Logger
)(targetType: c.Type): Option[(List[List[c.Symbol]], List[List[c.Tree]] => c.Tree)] = {
)(targetType: c.Type): Option[(c.Symbol, List[List[c.Symbol]], List[List[c.Tree]] => c.Tree)] = {
import c.universe._

lazy val apply: Option[Symbol] = CompanionCrimper
Expand All @@ -92,7 +92,8 @@ object CompanionCrimper {
for {
params <- applyParamLists
applyMethod <- applySelect
} yield (params, factory(applyMethod)(_))
a <- apply
} yield (a, params, factory(applyMethod)(_))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ object ConstructorCrimper {
c: C,
log: Logger
)(targetType: c.Type, resolver: (c.Symbol, c.Type) => c.Tree): Option[c.Tree] =
constructorFactory(c, log)(targetType).map { case (paramLists, factory) =>
constructorFactory(c, log)(targetType).map { case (_, paramLists, factory) =>
import c.universe._

lazy val targetTypeD: Type = targetType.dealias
Expand All @@ -119,7 +119,7 @@ object ConstructorCrimper {
def constructorFactory[C <: blackbox.Context](
c: C,
log: Logger
)(targetType: c.Type): Option[(List[List[c.Symbol]], List[List[c.Tree]] => c.Tree)] = {
)(targetType: c.Type): Option[(c.Symbol, List[List[c.Symbol]], List[List[c.Tree]] => c.Tree)] = {
import c.universe._

lazy val targetTypeD: Type = targetType.dealias
Expand All @@ -128,13 +128,17 @@ object ConstructorCrimper {

val constructorParamLists: Option[List[List[Symbol]]] =
constructor.map(_.asMethod.paramLists.filterNot(_.headOption.exists(_.isImplicit)))

val constructionMethodTree: Tree = Select(New(Ident(targetTypeD.typeSymbol)), termNames.CONSTRUCTOR)

def factory(constructorArgs: List[List[Tree]]): Tree = {
val constructionMethodTree: Tree = Select(New(Ident(targetTypeD.typeSymbol)), termNames.CONSTRUCTOR)
constructorArgs.foldLeft(constructionMethodTree)((acc: Tree, args: List[Tree]) => Apply(acc, args))
}

constructorParamLists.map(cpl => (cpl, factory(_)))
for {
cpl <- constructorParamLists
c <- constructor
} yield (c, cpl, factory(_))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,20 @@ trait CatsProviders[C <: blackbox.Context] {

sealed trait Provider {
def resultType: c.Type
def dependencies: List[List[Option[Provider]]]
def dependencies: List[List[(c.Symbol, Provider)]]
def ident: c.Tree
def value: c.Tree
def symbol: c.Symbol
}

class Effect(rawValue: c.Tree) extends Provider {

override def symbol: c.Symbol = rawValue.symbol

import c.universe._

lazy val resultType: Type = Effect.underlyingType(typeCheckUtil.typeCheckIfNeeded(rawValue))
lazy val dependencies: List[List[Option[Provider]]] = List.empty
lazy val dependencies: List[List[(c.Symbol, Provider)]] = List.empty
lazy val asResource = new Resource(q"cats.effect.kernel.Resource.eval[cats.effect.IO, ${resultType}]($rawValue)")
lazy val value: Tree = asResource.value
lazy val ident: Tree = asResource.ident
Expand All @@ -39,10 +43,13 @@ trait CatsProviders[C <: blackbox.Context] {
}

class Resource(val value: c.Tree) extends Provider {

override def symbol: c.Symbol = value.symbol

import c.universe._

lazy val resultType: Type = Resource.underlyingType(typeCheckUtil.typeCheckIfNeeded(value))
lazy val dependencies: List[List[Option[Provider]]] = List.empty
lazy val dependencies: List[List[(c.Symbol, Provider)]] = List.empty
lazy val ident: Tree = Ident(TermName(c.freshName()))
}

Expand All @@ -62,17 +69,16 @@ trait CatsProviders[C <: blackbox.Context] {
}

class FactoryMethod(
val symbol: c.Symbol,
methodType: c.Type,
val resultType: c.Type,
val dependencies: List[List[Option[Provider]]],
val dependencies: List[List[(c.Symbol, Provider)]],
apply: List[List[c.Tree]] => c.Tree
) extends Provider {
import c.universe._

private lazy val appliedTree: Tree = apply(dependencies.map(_.map(_.get.ident)))
// log.withBlock(s"Applied tree for [$fun] from deps: [${dependencies.map(_.mkString(", ")).mkString(", ")}]") {
// dependencies.map(_.map(_.get.ident)).foldLeft(fun)((acc: Tree, args: List[Tree]) => Apply(acc, args))
// }
private lazy val appliedTree: Tree = apply(dependencies.map(_.map(_._2.ident)))

lazy val result: Provider = log.withResult {
val fmResultType = resultType
//TODO support for FactoryMethods
Expand Down Expand Up @@ -127,10 +133,21 @@ trait CatsProviders[C <: blackbox.Context] {

class Instance(val value: c.Tree) extends Provider {

override def dependencies: List[List[Option[Provider]]] = List.empty
override def symbol: c.Symbol = value.symbol


override def dependencies: List[List[(c.Symbol, Provider)]] = List.empty

lazy val resultType: c.Type = typeCheckUtil.typeCheckIfNeeded(value)
lazy val ident: c.Tree = value

}

class NotResolvedProvider(val resultType: c.Type, val symbol: c.Symbol) extends Provider {
override def dependencies: List[List[(c.Symbol, Provider)]] = c.abort(c.enclosingPosition, s"Internal Error: Not resolved provider for type [$resultType]")
override def ident: c.Tree = c.abort(c.enclosingPosition, s"Internal Error: Not resolved provider for type [$resultType]")
override def value: c.Tree = c.abort(c.enclosingPosition, s"Internal Error: Not resolved provider for type [$resultType]")


}
}
Loading