macwire
macwire copied to clipboard
"scala.reflect.macros.TypecheckException: not found" when importing a member
Failing example (slightly realistic for motivation)
This is vaguely what I want to do:
import akka.actor.ActorSystem
import akka.stream.{ActorMaterializer, Materializer}
import com.softwaremill.macwire._
class MaterializerModule(actorSystem: ActorSystem) {
implicit val materializer: Materializer = ActorMaterializer()(actorSystem)
}
class Service(implicit mat: Materializer)
class ServiceModule {
implicit lazy val actorSystem: ActorSystem = ActorSystem()
lazy val materializerModule: MaterializerModule = wire[MaterializerModule]
import materializerModule.materializer // into normal scala implicit scope.
lazy val service: Service = wire[Service]
}
Compiler error:
Error:(17, 57) exception during macro expansion:
scala.reflect.macros.TypecheckException: not found: value materializer
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:34)
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:28)
at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
at scala.reflect.macros.contexts.Typers$class.withContext$1(Typers.scala:25)
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
at scala.reflect.macros.contexts.Typers$class.withWrapping$1(Typers.scala:26)
at scala.reflect.macros.contexts.Typers$class.typecheck(Typers.scala:28)
at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
at com.softwaremill.macwire.internals.TypeCheckUtil.typeCheckExpressionOfType(TypeCheckUtil.scala:58)
at com.softwaremill.macwire.internals.TypeCheckUtil.typeCheckIfNeeded(TypeCheckUtil.scala:34)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$16.apply(EligibleValuesFinder.scala:224)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$16.apply(EligibleValuesFinder.scala:224)
at scala.Option.getOrElse(Option.scala:121)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues.put(EligibleValuesFinder.scala:224)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$putAll$1.apply(EligibleValuesFinder.scala:215)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$putAll$1.apply(EligibleValuesFinder.scala:214)
at scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124)
at scala.collection.immutable.List.foldLeft(List.scala:84)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues.putAll(EligibleValuesFinder.scala:214)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$9.apply(EligibleValuesFinder.scala:109)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$9.apply(EligibleValuesFinder.scala:94)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.EligibleValuesFinder.com$softwaremill$macwire$internals$EligibleValuesFinder$$doFind$1(EligibleValuesFinder.scala:94)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$find$2.apply(EligibleValuesFinder.scala:122)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$find$2.apply(EligibleValuesFinder.scala:121)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.EligibleValuesFinder.find(EligibleValuesFinder.scala:120)
at com.softwaremill.macwire.internals.DependencyResolver.eligibleValues$lzycompute(DependencyResolver.scala:13)
at com.softwaremill.macwire.internals.DependencyResolver.eligibleValues(DependencyResolver.scala:13)
at com.softwaremill.macwire.internals.DependencyResolver.resolve(DependencyResolver.scala:21)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1$$anonfun$apply$10.apply(ConstructorCrimper.scala:56)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1$$anonfun$apply$10.apply(ConstructorCrimper.scala:56)
at scala.collection.immutable.List.map(List.scala:284)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1.apply(ConstructorCrimper.scala:56)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1.apply(ConstructorCrimper.scala:56)
at scala.collection.immutable.List.map(List.scala:284)
at com.softwaremill.macwire.internals.ConstructorCrimper.wireConstructorParams(ConstructorCrimper.scala:56)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2$$anonfun$apply$7.apply(ConstructorCrimper.scala:48)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2$$anonfun$apply$7.apply(ConstructorCrimper.scala:48)
at scala.Option.map(Option.scala:146)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2.apply(ConstructorCrimper.scala:48)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2.apply(ConstructorCrimper.scala:48)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorArgs$lzycompute(ConstructorCrimper.scala:47)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorArgs(ConstructorCrimper.scala:47)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorTree$2.apply(ConstructorCrimper.scala:53)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorTree$2.apply(ConstructorCrimper.scala:51)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorTree$lzycompute(ConstructorCrimper.scala:51)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorTree(ConstructorCrimper.scala:51)
at com.softwaremill.macwire.MacwireMacros$.wire_impl(MacwireMacros.scala:27)
lazy val materializerModule: MaterializerModule = wire[MaterializerModule]
Minimal failing example (for narrowing the problem)
Given some classes (no implicits this time):
class Grass
class Udders
class Cow(grass: Grass) {
val udders: Udders = new Udders
}
object MacwireTest {
import com.softwaremill.macwire._
val grass: Grass = new Grass
val cow: Cow = wire[Cow]
import cow.udders // Fails here.
}
Compiler error:
Error:(18, 22) exception during macro expansion:
Error:(13, 22) exception during macro expansion:
scala.reflect.macros.TypecheckException: not found: value udders
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:34)
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:28)
at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
at scala.reflect.macros.contexts.Typers$class.withContext$1(Typers.scala:25)
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
at scala.reflect.macros.contexts.Typers$class.withWrapping$1(Typers.scala:26)
at scala.reflect.macros.contexts.Typers$class.typecheck(Typers.scala:28)
at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
at com.softwaremill.macwire.internals.TypeCheckUtil.typeCheckExpressionOfType(TypeCheckUtil.scala:58)
at com.softwaremill.macwire.internals.TypeCheckUtil.typeCheckIfNeeded(TypeCheckUtil.scala:34)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$16.apply(EligibleValuesFinder.scala:224)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$16.apply(EligibleValuesFinder.scala:224)
at scala.Option.getOrElse(Option.scala:121)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues.put(EligibleValuesFinder.scala:224)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$putAll$1.apply(EligibleValuesFinder.scala:215)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues$$anonfun$putAll$1.apply(EligibleValuesFinder.scala:214)
at scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124)
at scala.collection.immutable.List.foldLeft(List.scala:84)
at com.softwaremill.macwire.internals.EligibleValuesFinder$EligibleValues.putAll(EligibleValuesFinder.scala:214)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$9.apply(EligibleValuesFinder.scala:109)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$9.apply(EligibleValuesFinder.scala:94)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.EligibleValuesFinder.com$softwaremill$macwire$internals$EligibleValuesFinder$$doFind$1(EligibleValuesFinder.scala:94)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$find$2.apply(EligibleValuesFinder.scala:122)
at com.softwaremill.macwire.internals.EligibleValuesFinder$$anonfun$find$2.apply(EligibleValuesFinder.scala:121)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.EligibleValuesFinder.find(EligibleValuesFinder.scala:120)
at com.softwaremill.macwire.internals.DependencyResolver.eligibleValues$lzycompute(DependencyResolver.scala:13)
at com.softwaremill.macwire.internals.DependencyResolver.eligibleValues(DependencyResolver.scala:13)
at com.softwaremill.macwire.internals.DependencyResolver.resolve(DependencyResolver.scala:21)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1$$anonfun$apply$10.apply(ConstructorCrimper.scala:56)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1$$anonfun$apply$10.apply(ConstructorCrimper.scala:56)
at scala.collection.immutable.List.map(List.scala:284)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1.apply(ConstructorCrimper.scala:56)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$wireConstructorParams$1.apply(ConstructorCrimper.scala:56)
at scala.collection.immutable.List.map(List.scala:284)
at com.softwaremill.macwire.internals.ConstructorCrimper.wireConstructorParams(ConstructorCrimper.scala:56)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2$$anonfun$apply$7.apply(ConstructorCrimper.scala:48)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2$$anonfun$apply$7.apply(ConstructorCrimper.scala:48)
at scala.Option.map(Option.scala:146)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2.apply(ConstructorCrimper.scala:48)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorArgs$2.apply(ConstructorCrimper.scala:48)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorArgs$lzycompute(ConstructorCrimper.scala:47)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorArgs(ConstructorCrimper.scala:47)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorTree$2.apply(ConstructorCrimper.scala:53)
at com.softwaremill.macwire.internals.ConstructorCrimper$$anonfun$constructorTree$2.apply(ConstructorCrimper.scala:51)
at com.softwaremill.macwire.internals.Logger.withBlock(Logger.scala:15)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorTree$lzycompute(ConstructorCrimper.scala:51)
at com.softwaremill.macwire.internals.ConstructorCrimper.constructorTree(ConstructorCrimper.scala:51)
at com.softwaremill.macwire.MacwireMacros$.wire_impl(MacwireMacros.scala:27)
val cow: Cow = wire[Cow]
Notes
- macwire v2.3.0
- scala 2.11
I was just hit by this, with a slight difference though. In my case it fails on wire but with the same error. The difference might be that I'm using lazy vals.
macwire v2.3.3 scala 2.12.8