macwire icon indicating copy to clipboard operation
macwire copied to clipboard

"scala.reflect.macros.TypecheckException: not found" when importing a member

Open htmldoug opened this issue 7 years ago • 1 comments

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

htmldoug avatar Dec 12 '17 02:12 htmldoug

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

Krever avatar Jan 26 '20 12:01 Krever