Skip to content

Commit 505d3ef

Browse files
authored
Make wireWith work better with scala3 (#356)
1 parent b99be6b commit 505d3ef

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

macros/src/main/scala-3/com/softwaremill/macwire/internals/MacwireMacros.scala

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,28 @@ object MacwireMacros {
6161

6262
val dependencyResolver = DependencyResolver.throwErrorOnResolutionFailure[q.type, T](log)
6363

64-
val (params, fun) = factory.asTerm match {
65-
case Inlined(_, _, Block(List(DefDef(_, List(p), _, Some(Apply(f, _)))), _)) => (p.params, f)
66-
case _ => report.errorAndAbort(s"Not supported factory type: [$factory]")
64+
def functionParamTypes(t: TypeRepr): List[List[TypeRepr]] = {
65+
if (t.isFunctionType) {
66+
// Handle curried function
67+
t.typeArgs.init :: functionParamTypes(t.typeArgs.last)
68+
} else {
69+
Nil
70+
}
6771
}
68-
69-
val values = params.map {
70-
// case vd@ValDef(_, name, tpt, rhs) => dependencyResolver.resolve(vd.symbol, typeCheckIfNeeded(tpt))
71-
case vd @ ValDef(name, tpt, rhs) => dependencyResolver.resolve(vd.symbol, tpt.tpe)
72+
// Implicit params are pre-applied while passing to wireWith
73+
val values = functionParamTypes(factory.asTerm.tpe).zipWithIndex.map { case (paramList, i) =>
74+
paramList.zipWithIndex.map { case (tpe, j) =>
75+
// Resolve require a symbol, create a fake symbol here
76+
val fakeSymbol = Symbol.newVal(Symbol.noSymbol, s"p_${i}_${j}", tpe, Flags.Param, Symbol.noSymbol)
77+
dependencyResolver.resolve(fakeSymbol, tpe)
78+
}
7279
}
73-
74-
val code = Apply(fun, values).asExprOf[T]
80+
val funApply: Term = Select.unique(factory.asTerm, "apply")
81+
val code = values
82+
.foldLeft(funApply) { (fun, args) =>
83+
Apply(fun, args)
84+
}
85+
.asExprOf[T]
7586
log(s"Generated code: ${code.show}")
7687
code
7788
}

tests/src/test/resources/test-cases/simpleGenericClass.success

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ object Test {
1010
val b = wire[B[IO]]
1111
}
1212

13-
require(Test.lb.la == Test.la)
14-
require(Test.b.a == Test.a)
13+
require(Test.lb.la eq Test.la)
14+
require(Test.b.a eq Test.a)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
case class A(s: String)
2+
3+
object A {
4+
def create() = {
5+
val s = "foo"
6+
wire[A]
7+
}
8+
}
9+
require(A.create().s == "foo")

tests/src/test/resources/test-cases/wireWith.scala2.success renamed to tests/src/test/resources/test-cases/wireWith.success

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ case class A()
22
case class B()
33

44
object Test {
5-
case class C(a: A, b: B, s: String)
5+
case class C(a: A, b: B)
66

77
object C {
88
def factory(a: A, b: B): C = {
9-
val s = "hey!"
109
wire[C]
1110
}
1211
}
@@ -17,6 +16,5 @@ object Test {
1716
lazy val c: C = wireWith(C.factory _)
1817
}
1918

20-
require(Test.c.s == "hey!")
2119
require(Test.c.a eq Test.a)
22-
require(Test.c.b eq Test.b)
20+
require(Test.c.b eq Test.b)

tests/src/test/resources/test-cases/wireWithImplicits.scala2.success renamed to tests/src/test/resources/test-cases/wireWithImplicits.success

File renamed without changes.

0 commit comments

Comments
 (0)