softwaremill / softwaremill/macwire

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

Open
#123 1 comment 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Scala
Stars
1.3k
Forks
77
Avg merge
9m
Merged PRs (30d)
4

Description

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

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the minimal MacwireTest example first, then trace the reported failure from TypeCheckUtil.scala:58 through EligibleValuesFinder.scala:224 and the wire path in ConstructorCrimper.scala. Determine why importing cow.udders makes the macro fail to resolve udders, add a regression test for the example, and verify compilation succeeds.

Written by the indexing model from the issue text.

Assessment

Tech stack
scala
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.