From 7026d2aa53f85f2af9c9469d7e8c53e4f9ffc180 Mon Sep 17 00:00:00 2001 From: sijarsu <> Date: Fri, 22 May 2020 10:19:46 +0200 Subject: [PATCH] initial --- .../macwire/internals/DependencyResolver.scala | 14 ++++++++++++++ .../test/resources/test-cases/_t142.success | 14 ++++++++++++++ .../com/softwaremill/macwire/WireTest.scala | 18 ++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 tests/src/test/resources/test-cases/_t142.success create mode 100644 tests/src/test/scala/com/softwaremill/macwire/WireTest.scala diff --git a/macros/src/main/scala/com/softwaremill/macwire/internals/DependencyResolver.scala b/macros/src/main/scala/com/softwaremill/macwire/internals/DependencyResolver.scala index 05e71df8..55f10ec1 100644 --- a/macros/src/main/scala/com/softwaremill/macwire/internals/DependencyResolver.scala +++ b/macros/src/main/scala/com/softwaremill/macwire/internals/DependencyResolver.scala @@ -19,6 +19,11 @@ private[macwire] class DependencyResolver[C <: blackbox.Context](val c: C, debug def resolve(param: Symbol, t: Type): Tree = { eligibleValues.findInFirstScope(t).toList match { + case Nil if isOption(t) => + getOptionArg(t).flatMap(u => eligibleValues.findInFirstScope(u).toList.headOption) match { //FIXME: handle multiple values (tests, tests...) + case Some(argTree) => q"Some($argTree)" + case None => q"None" + } case Nil => c.abort(c.enclosingPosition, s"Cannot find a value of type: [$t]") case value :: Nil => val forwardValues = eligibleValues.findInScope(t, LocalForward) @@ -31,6 +36,15 @@ private[macwire] class DependencyResolver[C <: blackbox.Context](val c: C, debug } } + private def isOption(t: Type): Boolean = getOptionArg(t).nonEmpty + + private def getOptionArg(t: Type): Option[Type] = t.baseType(typeOf[Option[_]].typeSymbol) match { + case TypeRef(_, _, arg :: Nil) => Some(arg) + case NoType => None + } + + + /** @return all the instances of type `t` that are accessible. */ def resolveAll(t: Type): Iterable[Tree] = { diff --git a/tests/src/test/resources/test-cases/_t142.success b/tests/src/test/resources/test-cases/_t142.success new file mode 100644 index 00000000..4941ee2c --- /dev/null +++ b/tests/src/test/resources/test-cases/_t142.success @@ -0,0 +1,14 @@ +class A() +class B(val oa: Option[A]) + +object TestSome { + val a = new A() + val b = wire[B] +} + +object TestNone { + val b = wire[B] +} + +require(TestSome.b.oa.contains(TestSome.a)) +require(TestNone.b.oa.isEmpty) diff --git a/tests/src/test/scala/com/softwaremill/macwire/WireTest.scala b/tests/src/test/scala/com/softwaremill/macwire/WireTest.scala new file mode 100644 index 00000000..f52de70d --- /dev/null +++ b/tests/src/test/scala/com/softwaremill/macwire/WireTest.scala @@ -0,0 +1,18 @@ +package com.softwaremill.macwire + +object WireTest extends App { + class A() + class B(val oa: Option[A]) + + object TestSome { + val a = new A() + val b = wire[B] + } + + object TestNone { + val b = wire[B] + } + + require(TestSome.b.oa.contains(TestSome.a)) + require(TestNone.b.oa.isEmpty) +}