Repository: 7mind/izumi
Pull request #1356 (2021-01-09 20:52:09)

Fix `DefaultModule` for ZIO+Cats, include cats-effect typeclass instances when `interop-cats` is on the classpath, not just when `cats-effect` is on the classpath


Patch:
diff --git a/build.sbt b/build.sbt
index 1b249477d..507e57c38 100644
--- a/build.sbt
+++ b/build.sbt
@@ -847,7 +847,8 @@ lazy val `fundamentals-orphans` = project.in(file("fundamentals/fundamentals-orp
       "dev.zio" %% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
       "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Optional,
       "io.monix" %% "monix" % V.monix % Optional,
-      "io.monix" %% "monix-bio" % V.monix_bio % Optional
+      "io.monix" %% "monix-bio" % V.monix_bio % Optional,
+      "dev.zio" %% "zio-interop-cats" % V.zio_interop_cats % Optional excludeAll("dev.zio" %% "izumi-reflect")
     )
   )
   .settings(
diff --git a/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala b/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala
index a74bd73bf..c255e9cb2 100644
--- a/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala
+++ b/distage/distage-core-api/src/main/scala/izumi/distage/model/PlannerInput.scala
@@ -3,6 +3,7 @@ package izumi.distage.model
 import izumi.distage.model.definition.{Activation, ModuleBase}
 import izumi.distage.model.plan.Roots
 import izumi.distage.model.reflection.DIKey
+import izumi.fundamentals.collections.nonempty.NonEmptySet
 import izumi.reflect.Tag
 
 /**
@@ -30,27 +31,46 @@ object PlannerInput {
   /**
     * Instantiate `roots` and the dependencies of `roots`, discarding bindings that are unrelated.
     *
-    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph
-    * that can be described by `bindings`
+    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph that can be described by `bindings`
     */
-  def apply(bindings: ModuleBase, activation: Activation, roots: Set[_ <: DIKey]): PlannerInput = PlannerInput(bindings, activation, Roots(roots))
+  def apply(bindings: ModuleBase, activation: Activation, roots: NonEmptySet[_ <: DIKey]): PlannerInput = PlannerInput(bindings, activation, Roots(roots))
 
-  /** Instantiate `root`, `roots` and their dependencies, discarding bindings that are unrelated. */
+  /**
+    * Instantiate `roots` and the dependencies of `roots`, discarding bindings that are unrelated.
+    *
+    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph that can be described by `bindings`
+    */
+  def apply(bindings: ModuleBase, activation: Activation, roots: Set[_ <: DIKey])(implicit d: DummyImplicit): PlannerInput =
+    PlannerInput(bindings, activation, Roots(roots))
+
+  /** Instantiate `root`, `roots` and their dependencies, discarding bindings that are unrelated.
+    *
+    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph that can be described by `bindings`
+    */
   def apply(bindings: ModuleBase, activation: Activation, root: DIKey, roots: DIKey*): PlannerInput = PlannerInput(bindings, activation, Roots(root, roots: _*))
 
-  /** Instantiate `T` and the dependencies of `T`, discarding bindings that are unrelated. */
+  /** Instantiate `T` and the dependencies of `T`, discarding bindings that are unrelated.
+    *
+    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph that can be described by `bindings`
+    */
   def target[T: Tag](bindings: ModuleBase, activation: Activation): PlannerInput = PlannerInput(bindings, activation, DIKey.get[T])
 
   /** Instantiate `T @Id(name)` and the dependencies of `T @Id(name)`, discarding bindings that are unrelated.
+    *
+    * Effectively, this selects and creates a *sub-graph* of the largest possible object graph that can be described by `bindings`
     *
     * @see [[izumi.distage.model.definition.Id @Id annotation]]
     */
   def target[T: Tag](name: String)(bindings: ModuleBase, activation: Activation): PlannerInput = PlannerInput(bindings, activation, DIKey.get[T].named(name))
 
-  /** Disable all pruning. Every binding in `bindings` will be instantiated eagerly, without selection of the root bindings */
+  /** Disable all dependency pruning. Every binding in `bindings` will be instantiated, without selection of the root components. There's almost always a better way to model things though. */
+  def everything(bindings: ModuleBase, activation: Activation = Activation.empty): PlannerInput = PlannerInput(bindings, activation, Roots.Everything)
+
+  /** Disable all dependency pruning. Every binding in `bindings` will be instantiated, without selection of the root components. There's almost always a better way to model things though. */
+  @deprecated("renamed to .everything", "old name will be removed in 0.11.1")
   def noGC(bindings: ModuleBase, activation: Activation = Activation.empty): PlannerInput = PlannerInput(bindings, activation, Roots.Everything)
 
-  /** Disable all pruning. Every binding in `bindings` will be instantiated eagerly, without selection of the root bindings */
-  @deprecated("use noGC", "will be removed in 0.11.1")
+  /** Disable all dependency pruning. Every binding in `bindings` will be instantiated, without selection of the root components. There's almost always a better way to model things though. */
+  @deprecated("renamed to .everything", "old name  will be removed in 0.11.1")
   def noGc(bindings: ModuleBase, activation: Activation = Activation.empty): PlannerInput = PlannerInput(bindings, activation, Roots.Everything)
 }
diff --git a/distage/distage-core-api/src/main/scala/izumi/distage/model/plan/Roots.scala b/distage/distage-core-api/src/main/scala/izumi/distage/model/plan/Roots.scala
index 3dde6e37c..e1161a28b 100644
--- a/distage/distage-core-api/src/main/scala/izumi/distage/model/plan/Roots.scala
+++ b/distage/distage-core-api/src/main/scala/izumi/distage/model/plan/Roots.scala
@@ -5,19 +5,18 @@ import izumi.fundamentals.collections.nonempty.NonEmptySet
 import izumi.reflect.Tag
 
 /**
-  * `Roots` designate the components to choose as "garbage collection roots" for the object graph,
-  * designated components and their dependencies will be created and
+  * `Roots` designate the components to choose as "garbage collection roots" for the object graph.
   *
-  * The purpose of the `Roots`/`garbage collection` mechanism is to allow you is to allow
-  * oversupplying the injector with bindings that may not be required to create a specific object graph,
-  * instead of carefully curating bindings to shape the graph, choosing root nodes allows you to "pluck"
-  * the sub-graph that you care about and instantiate just that sub-graph, ignoring all the other bindings.
+  * The purpose of the `Roots`/`garbage collection` mechanism is to allow you to pass to the injector more bindings
+  * than strictly necessary and defer the choice of what specific components to construct from those bindings.
+  * Effectively, this selects a *sub-graph* of the largest possible object graph that can be described by bindings.
   *
-  * `distage-testkit` and `distage-framework`'s Roles make heavy use of the mechanism.
-  * Roles are effectively just a root components that come with command-line arguments.
-  * distage-testkit's test cases designate their parameters as roots and instantiate only the sub-graph
-  * required for the test case.
+  * Tests in `distage-testkit` and roles in `distage-framework` are built on this mechanism.
+  * `distage-testkit`'s test cases designate their parameters as roots and instantiate only the sub-graph
+  * required for a given test case. `distage-framework`'s roles are effectively just allow you to choose root components
+  * and pass them command-line parameters.
   *
+  * @see [[https://izumi.7mind.io/distage/basics#activation-axis               Activations       ]]
   * @see [[https://izumi.7mind.io/distage/advanced-features#garbage-collection Garbage Collection]]
   * @see [[https://izumi.7mind.io/distage/distage-framework#roles              Roles             ]]
   * @see [[https://izumi.7mind.io/distage/distage-testkit                      Testkit           ]]
@@ -36,16 +35,19 @@ object Roots {
   def apply(root: DIKey, roots: DIKey*): Roots = {
     Roots.Of(NonEmptySet(root, roots: _*))
   }
-  def apply(roots: Set[_ <: DIKey]): Roots = {
+  def apply(roots: NonEmptySet[_ <: DIKey]): Roots = {
+    Roots.Of(roots.widen)
+  }
+  def apply(roots: Set[_ <: DIKey])(implicit d: DummyImplicit): Roots = {
     require(roots.nonEmpty, "GC roots set cannot be empty")
-    Roots.Of(NonEmptySet.from(roots.toSet[DIKey]).get)
+    Roots.Of(NonEmptySet.from(roots).get.widen)
   }
-  def target[T: Tag]: Roots = Roots(Set(DIKey.get[T]))
-  def target[T: Tag](name: String): Roots = Roots(Set(DIKey.get[T].named(name)))
+  def target[T: Tag]: Roots = Roots(NonEmptySet(DIKey.get[T]))
+  def target[T: Tag](name: String): Roots = Roots(NonEmptySet(DIKey.get[T].named(name)))
 
   final case class Of(roots: NonEmptySet[DIKey]) extends Roots
 
-  /** Disable garbage collection and try to instantiate every single binding. */
+  /** Disable garbage collection and try to instantiate every single binding. There's almost always a better way to model things though. */
   case object Everything extends Roots
 
   @deprecated("GCMode.NoGC has been renamed to `Roots.Everything`", "old name will be deleted in 1.1.1")
diff --git a/distage/distage-core/src/main/scala/izumi/distage/modules/DefaultModule.scala b/distage/distage-core/src/main/scala/izumi/distage/modules/DefaultModule.scala
index 30155a312..25a6621a4 100644
--- a/distage/distage-core/src/main/scala/izumi/distage/modules/DefaultModule.scala
+++ b/distage/distage-core/src/main/scala/izumi/distage/modules/DefaultModule.scala
@@ -58,7 +58,7 @@ sealed trait LowPriorityDefaultModulesInstances1 extends LowPriorityDefaultModul
     */
   implicit def forZIOPlusCats[K[_], ZIO[_, _, _], R](
     implicit
-    @unused ensureCatsEffectOnClasspath: `cats.effect.IO`[K],
+    @unused ensureInteropCatsOnClasspath: `cats.effect.IO`[K],
     @unused l: `zio.ZIO`[ZIO],
   ): DefaultModule2[ZIO[R, ?, ?]] = {
     DefaultModule(ZIOSupportModule ++ ZIOCatsEffectInstancesModule)
diff --git a/distage/distage-core/src/main/scala/izumi/distage/modules/typeclass/ZIOCatsEffectInstancesModule.scala b/distage/distage-core/src/main/scala/izumi/distage/modules/typeclass/ZIOCatsEffectInstancesModule.scala
index 01b459bc2..5c3eb04ad 100644
--- a/distage/distage-core/src/main/scala/izumi/distage/modules/typeclass/ZIOCatsEffectInstancesModule.scala
+++ b/distage/distage-core/src/main/scala/izumi/distage/modules/typeclass/ZIOCatsEffectInstancesModule.scala
@@ -5,7 +5,6 @@ import java.util.concurrent.ThreadPoolExecutor
 import cats.effect.{Blocker, ConcurrentEffect, ContextShift, Timer}
 import cats.{Parallel, effect}
 import distage.{Id, ModuleDef}
-import zio.interop.catz
 import zio.{IO, Runtime, Task}
 
 import scala.concurrent.ExecutionContext
@@ -26,12 +25,16 @@ trait ZIOCatsEffectInstancesModule extends ModuleDef {
 
   make[ConcurrentEffect[Task]].from {
     r: Runtime[Any] =>
-      catz.taskEffectInstance(r)
+      zio.interop.catz.taskEffectInstance(r)
+  }
+  make[Parallel[Task]].from {
+    zio.interop.catz.parallelInstance[Any, Throwable]
   }
-  make[Parallel[Task]].from(catz.parallelInstance[Any, Throwable])
   make[Timer[Task]].from[ZIOClockTimer[Throwable]]
 
-  make[ContextShift[Task]].from(catz.zioContextShift[Any, Throwable])
+  make[ContextShift[Task]].from {
+    zio.interop.catz.zioContextShift[Any, Throwable]
+  }
   make[Blocker].from {
     pool: ThreadPoolExecutor @Id("zio.io") =>
       Blocker.liftExecutionContext(ExecutionContext.fromExecutorService(pool))
diff --git a/fundamentals/fundamentals-collections/src/main/scala/izumi/fundamentals/collections/nonempty/NonEmptySet.scala b/fundamentals/fundamentals-collections/src/main/scala/izumi/fundamentals/collections/nonempty/NonEmptySet.scala
index bc064b328..4d7a0bbd6 100644
--- a/fundamentals/fundamentals-collections/src/main/scala/izumi/fundamentals/collections/nonempty/NonEmptySet.scala
+++ b/fundamentals/fundamentals-collections/src/main/scala/izumi/fundamentals/collections/nonempty/NonEmptySet.scala
@@ -976,6 +976,8 @@ final class NonEmptySet[T] private (val toSet: Set[T]) extends AnyVal {
     * @return A new <code>NonEmptySet</code> containing pairs consisting of all elements of this <code>NonEmptySet</code> paired with their index. Indices start at 0.
     */
   def zipWithIndex: NonEmptySet[(T, Int)] = new NonEmptySet(toSet.zipWithIndex)
+
+  def widen[U >: T]: NonEmptySet[U] = new NonEmptySet(toSet.toSet[U])
 }
 
 /**
diff --git a/fundamentals/fundamentals-orphans/src/main/scala/izumi/fundamentals/orphans/OrphanDefs.scala b/fundamentals/fundamentals-orphans/src/main/scala/izumi/fundamentals/orphans/OrphanDefs.scala
index 11783087d..34940c48d 100644
--- a/fundamentals/fundamentals-orphans/src/main/scala/izumi/fundamentals/orphans/OrphanDefs.scala
+++ b/fundamentals/fundamentals-orphans/src/main/scala/izumi/fundamentals/orphans/OrphanDefs.scala
@@ -127,6 +127,13 @@ object `zio.ZIO` {
   @inline implicit final def get: `zio.ZIO`[zio.ZIO] = null
 }
 
+// zio-interop-cats
+
+final abstract class `zio.interop.CatsEffectPlatform`[A]
+object `zio.interop.CatsEffectPlatform` {
+  @inline implicit final def get: `zio.interop.CatsEffectPlatform`[zio.interop.CatsEffectPlatform] = null
+}
+
 // monix-bio
 
 final abstract class `monix.bio.IO`[K[_, _]]
diff --git a/project/Deps.sc b/project/Deps.sc
index 4d30db2fd..8a41a3528 100644
--- a/project/Deps.sc
+++ b/project/Deps.sc
@@ -409,7 +409,7 @@ object Izumi {
       ),
       Artifact(
         name = Projects.fundamentals.orphans,
-        libs = allMonadsOptional,
+        libs = allMonadsOptional ++ Seq(zio_interop_cats in Scope.Optional.all),
         depends = Seq.empty,
         platforms = Targets.cross,
       ),


Test patch:
diff --git a/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/CatsExtensionsTestJvm.scala b/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/CatsExtensionsTestJvm.scala
index 4282999b4..c96911b1e 100644
--- a/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/CatsExtensionsTestJvm.scala
+++ b/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/CatsExtensionsTestJvm.scala
@@ -23,7 +23,7 @@ final class CatsExtensionsTestJvm extends AnyWordSpec with GivenWhenThen {
       import BasicCase1._
       import CircularCase3._
 
-      val definition1 = PlannerInput.noGC(new ModuleDef {
+      val definition1 = PlannerInput.everything(new ModuleDef {
         make[SelfReference]
       })
 
@@ -40,7 +40,7 @@ final class CatsExtensionsTestJvm extends AnyWordSpec with GivenWhenThen {
       Then("traverse should substitute")
       final case class TestDependency1Eq(unresolved: NotInContext) extends TestDependency1
       val testDependencyPlan = injector.plan(
-        PlannerInput.noGC(new ModuleDef {
+        PlannerInput.everything(new ModuleDef {
           make[TestDependency1].from(TestDependency1Eq(_: NotInContext): TestDependency1)
         })
       )
diff --git a/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/ZIOResourcesTestJvm.scala b/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/ZIOResourcesTestJvm.scala
index 6f404ebef..9d1c3f74f 100644
--- a/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/ZIOResourcesTestJvm.scala
+++ b/distage/distage-core/.jvm/src/test/scala/izumi/distage/compat/ZIOResourcesTestJvm.scala
@@ -74,7 +74,7 @@ final class ZIOResourcesTestJvm extends AnyWordSpec with GivenWhenThen {
       }
 
       val injector = Injector()
-      val plan = injector.plan(PlannerInput.noGC(definition, Activation.empty))
+      val plan = injector.plan(PlannerInput.everything(definition, Activation.empty))
 
       def assert1(ctx: Locator) = {
         IO {
@@ -103,8 +103,7 @@ final class ZIOResourcesTestJvm extends AnyWordSpec with GivenWhenThen {
 
       unsafeRun {
         import izumi.functional.bio.catz.BIOToBracket
-        ctxResource
-          .toCats
+        ctxResource.toCats
           .use(assert1)
           .flatMap((assert2 _).tupled)
       }
@@ -179,7 +178,7 @@ final class ZIOResourcesTestJvm extends AnyWordSpec with GivenWhenThen {
       }
 
       val injector = Injector()
-      val plan = injector.plan(PlannerInput.noGC(definition, Activation.empty))
+      val plan = injector.plan(PlannerInput.everything(definition, Activation.empty))
 
       def assert1(ctx: Locator) = {
         IO {
@@ -208,8 +207,7 @@ final class ZIOResourcesTestJvm extends AnyWordSpec with GivenWhenThen {
 
       unsafeRun {
         import izumi.functional.bio.catz.BIOToBracket
-        ctxResource
-          .toCats
+        ctxResource.toCats
           .use(assert1)
           .flatMap((assert2 _).tupled)
       }
diff --git a/distage/distage-core/.jvm/src/test/scala/izumi/distage/injector/CglibProxiesTestJvm.scala b/distage/distage-core/.jvm/src/test/scala/izumi/distage/injector/CglibProxiesTestJvm.scala
index 4f98f322b..f969596e2 100644
--- a/distage/distage-core/.jvm/src/test/scala/izumi/distage/injector/CglibProxiesTestJvm.scala
+++ b/distage/distage-core/.jvm/src/test/scala/izumi/distage/injector/CglibProxiesTestJvm.scala
@@ -21,7 +21,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support circular dependencies" in {
       import CircularCase1._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Circular2]
         make[Circular1]
       })
@@ -38,7 +38,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support circular dependencies with final class implementations" in {
       import CircularCase1._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Circular2].from[Circular2Impl]
         make[Circular1].from[Circular1Impl]
       })
@@ -55,7 +55,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support circular dependencies in providers" in {
       import CircularCase1._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Circular2].from {
           c: Circular1 => new Circular2(c)
         }
@@ -80,7 +80,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "Supports self-referencing circulars" in {
       import CircularCase3._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[SelfReference]
       })
 
@@ -96,7 +96,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "Support self-referencing provider" in {
       import CircularCase3._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[SelfReference].from {
           self: SelfReference =>
             new SelfReference(self)
@@ -115,7 +115,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support proxy circular dependencies involving a primitive type" in {
       import CircularCase8._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Circular2]
         make[Circular1]
         make[Int].from(1)
@@ -139,7 +139,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support circular dependencies that use another object in their constructor that isn't involved in a cycle" in {
       import CircularCase9._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Circular2]
         make[Circular1]
         make[IntHolder]
@@ -164,7 +164,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support fully generic circular dependencies" in {
       import CircularCase5._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[GenericCircular[Dependency]]
         make[Dependency]
       })
@@ -182,7 +182,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support named circular dependencies" in {
       import CircularCase4._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[IdTypeCircular]
         make[IdParamCircular]
         make[Dependency[IdTypeCircular]].named("special")
@@ -203,7 +203,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "support type refinements in circular dependencies" in {
       import CircularCase6._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Dependency { def dep: RefinedCircular }].from[RealDependency]
         make[RefinedCircular]
       })
@@ -244,7 +244,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "Regression test 1: isolated cycles causing spooky action at a distance" in {
       import CircularCase7._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         // cycle
         make[DynamoDDLService]
         make[DynamoComponent]
@@ -293,7 +293,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
         import InnerClassStablePathsCase._
         import StableObjectInheritingTrait._
 
-        val definition = PlannerInput.noGC(new ModuleDef {
+        val definition = PlannerInput.everything(new ModuleDef {
           make[Circular1]
           make[Circular2]
         })
@@ -312,7 +312,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
         import InnerClassUnstablePathsCase._
         val testProviderModule = new TestModule
 
-        val definition = PlannerInput.noGC(new ModuleDef {
+        val definition = PlannerInput.everything(new ModuleDef {
           //        make[testProviderModule.type].from[testProviderModule.type](testProviderModule: testProviderModule.type)
           make[testProviderModule.Circular1]
           make[testProviderModule.Circular2]
@@ -334,7 +334,7 @@ class CglibProxiesTestJvm extends AnyWordSpec with MkInjector {
     "Support self-referencing circular effects" in {
       import izumi.distage.fixtures.CircularCases.CircularCase3._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Ref[Fn, Boolean]].fromEffect(Ref[Fn](false))
         make[SelfReference].fromEffect {
           (ref: Ref[Fn, Boolean], self: SelfReference) =>
diff --git a/distage/distage-core/src/test/scala/izumi/distage/compat/CatsResourcesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/compat/CatsResourcesTest.scala
index 7bba8a9b0..5ab7a4711 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/compat/CatsResourcesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/compat/CatsResourcesTest.scala
@@ -73,7 +73,7 @@ final class CatsResourcesTest extends AnyWordSpec with GivenWhenThen {
     }
 
     val injector = Injector[Identity]()
-    val plan = injector.plan(PlannerInput.noGC(definition ++ new ModuleDef {
+    val plan = injector.plan(PlannerInput.everything(definition ++ new ModuleDef {
       addImplicit[Sync[IO]]
     }))
 
@@ -101,8 +101,7 @@ final class CatsResourcesTest extends AnyWordSpec with GivenWhenThen {
       .flatMap((assert2 _).tupled)
       .unsafeRunSync()
 
-    ctxResource
-      .toCats
+    ctxResource.toCats
       .use(assert1)
       .flatMap((assert2 _).tupled)
       .unsafeRunSync()
diff --git a/distage/distage-core/src/test/scala/izumi/distage/dsl/DSLTest.scala b/distage/distage-core/src/test/scala/izumi/distage/dsl/DSLTest.scala
index 7f60f25b7..4fede592f 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/dsl/DSLTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/dsl/DSLTest.scala
@@ -77,15 +77,14 @@ class DSLTest extends AnyWordSpec with MkInjector {
       }
 
       assert(
-        Module
-          .bindings.find(_.key.tpe == DIKey[TestClass].tpe).exists {
-            case Binding.SingletonBinding(_, ImplDef.ProviderImpl(_, function), _, _, _) =>
-              function.diKeys.exists {
-                case DIKey.IdKey(tpe, id, _) => DIKey[TestDependency0].tpe == tpe && id == "test_param"
-                case _ => false
-              }
-            case _ => false
-          }
+        Module.bindings.find(_.key.tpe == DIKey[TestClass].tpe).exists {
+          case Binding.SingletonBinding(_, ImplDef.ProviderImpl(_, function), _, _, _) =>
+            function.diKeys.exists {
+              case DIKey.IdKey(tpe, id, _) => DIKey[TestDependency0].tpe == tpe && id == "test_param"
+              case _ => false
+            }
+          case _ => false
+        }
       )
     }
 
@@ -487,27 +486,27 @@ class DSLTest extends AnyWordSpec with MkInjector {
     "support bindings to multiple interfaces (injector test)" in {
       import BasicCase6._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[ImplXYZ]
           .named("my-impl")
           .aliased[TraitX]
           .aliased[TraitY]("Y")
       })
 
-      val defWithoutSugar = PlannerInput.noGC(new ModuleDef {
+      val defWithoutSugar = PlannerInput.everything(new ModuleDef {
         make[ImplXYZ].named("my-impl")
         make[TraitX].using[ImplXYZ]("my-impl")
         make[TraitY].named("Y").using[ImplXYZ]("my-impl")
       })
 
-      val defWithTags = PlannerInput.noGC(new ModuleDef {
+      val defWithTags = PlannerInput.everything(new ModuleDef {
         make[ImplXYZ]
           .named("my-impl").tagged("tag1")
           .aliased[TraitX]
           .aliased[TraitY]
       })
 
-      val defWithTagsWithoutSugar = PlannerInput.noGC(new ModuleDef {
+      val defWithTagsWithoutSugar = PlannerInput.everything(new ModuleDef {
         make[ImplXYZ].named("my-impl").tagged("tag1")
         make[TraitX].tagged("tag1").using[ImplXYZ]("my-impl")
         make[TraitY].tagged("tag1").using[ImplXYZ]("my-impl")
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedBindingsTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedBindingsTest.scala
index 219f81fc2..f988e714e 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedBindingsTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedBindingsTest.scala
@@ -16,13 +16,13 @@ class AdvancedBindingsTest extends AnyWordSpec with MkInjector {
 
     val injector = mkInjector()
 
-    val def1 = PlannerInput.noGC(new ModuleDef {
+    val def1 = PlannerInput.everything(new ModuleDef {
       todo[TestDependency0]
     })
-    val def2 = PlannerInput.noGC(new ModuleDef {
+    val def2 = PlannerInput.everything(new ModuleDef {
       make[TestDependency0].todo
     })
-    val def3 = PlannerInput.noGC(new ModuleDef {
+    val def3 = PlannerInput.everything(new ModuleDef {
       make[TestDependency0].named("fug").todo
     })
 
@@ -38,7 +38,7 @@ class AdvancedBindingsTest extends AnyWordSpec with MkInjector {
   "Set element references are the same as their referees" in {
     import SetCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Service1]
 
       many[Service]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedTypesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedTypesTest.scala
index b5ddb57a8..2a600f62e 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedTypesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/AdvancedTypesTest.scala
@@ -17,7 +17,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "support generics" in {
     import TypesCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[List[Dep]].named("As").from(List(DepA()))
       make[List[Dep]].named("Bs").from(List(DepB()))
       make[List[DepA]].from(List(DepA(), DepA(), DepA()))
@@ -37,7 +37,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "support classes with typealiases" in {
     import TypesCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[DepA]
       make[TestClass2[TypeAliasDepA]]
     })
@@ -52,7 +52,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "support traits with typealiases" in {
     import TypesCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[DepA]
       make[TestTrait]
     })
@@ -67,7 +67,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "type annotations in di keys do not result in different keys" in {
     import TraitCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency1 @Id("special")]
       make[Trait1]
     })
@@ -85,7 +85,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "handle `with` types" in {
     import TypesCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep]
       make[Dep2]
       make[Trait2 with Trait1].from[Trait6]
@@ -103,7 +103,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "light type tags can handle refinement & structural types" in {
     import TypesCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep]
       make[Dep2]
       make[Trait1 { def dep: Dep2 }].from[Trait3[Dep2]]
@@ -137,7 +137,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkInjector()
-    val plan = injector.plan(PlannerInput.noGC(new Definition[Dep2]))
+    val plan = injector.plan(PlannerInput.everything(new Definition[Dep2]))
     val context = injector.produce(plan).unsafeGet()
 
     val instantiated = context.get[Trait1[Dep, Dep2]]
@@ -155,7 +155,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
       make[T { def dep: Dep }].from[G]
     }
 
-    val definition = PlannerInput.noGC(new Definition[Trait1, Trait1])
+    val definition = PlannerInput.everything(new Definition[Trait1, Trait1])
 
     val injector = mkInjector()
     val plan = injector.plan(definition)
@@ -176,7 +176,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
       make[T with Trait1].from[G]
     }
 
-    val definition = PlannerInput.noGC(new Definition[Trait3[Dep], Trait3[Dep], Trait5[Dep]])
+    val definition = PlannerInput.everything(new Definition[Trait3[Dep], Trait3[Dep], Trait5[Dep]])
 
     val injector = mkInjector()
     val plan = injector.plan(definition)
@@ -202,7 +202,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
       make[Trait3[T] with K].from[Trait5[T]]
     }
 
-    val definition = PlannerInput.noGC(new Definition[Dep, Trait4])
+    val definition = PlannerInput.everything(new Definition[Dep, Trait4])
 
     val injector = mkInjector()
     val plan = injector.plan(definition)
@@ -215,7 +215,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "support newtypes" in {
     import TypesCase5._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[WidgetId].from(WidgetId(1))
       make[Dep]
     })
@@ -231,7 +231,7 @@ class AdvancedTypesTest extends AnyWordSpec with MkInjector {
   "empty refinements are supported in class strategy" in {
     import TypesCase4._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep {}]
     })
 
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/ArityTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/ArityTest.scala
index 46c1d5deb..c8ba6a731 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/ArityTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/ArityTest.scala
@@ -10,7 +10,7 @@ class ArityTest extends AnyWordSpec with MkInjector {
   "Support classes with more than 22-argument constructors" in {
     import BasicCase8._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Beep[Int]]
       make[Bop[Int]]
     })
@@ -23,7 +23,7 @@ class ArityTest extends AnyWordSpec with MkInjector {
   "Support traits with more than 22-argument constructors" in {
     import BasicCase8._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Beep[Int]]
       make[BopTrait[Int]]
     })
@@ -37,7 +37,7 @@ class ArityTest extends AnyWordSpec with MkInjector {
   "Support abstract classes with more than 22-argument constructors" in {
     import BasicCase8._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Beep[Int]]
       make[BopAbstractClass[Int]]
     })
@@ -52,7 +52,7 @@ class ArityTest extends AnyWordSpec with MkInjector {
   "Support factories with more than 22-argument constructors" in {
     import BasicCase8._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Beep[Int]]
       make[BopFactory[Int]]
     })
@@ -68,7 +68,7 @@ class ArityTest extends AnyWordSpec with MkInjector {
   "Support types with no parameters" in {
     import BasicCase8._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[NoArgClass]
       make[NoArgTrait]
       make[NoArgAbstractClass]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/AutoSetTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/AutoSetTest.scala
index c349818a9..e844929d0 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/AutoSetTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/AutoSetTest.scala
@@ -25,7 +25,7 @@ class AutoSetTest extends AnyWordSpec with MkInjector {
         .add(new AutoSetHook[Ordered, Ordered])
     })
 
-    val autoset = injector.produce(PlannerInput.noGC(definition)).unsafeGet().get[Set[Ordered]]
+    val autoset = injector.produce(PlannerInput.everything(definition)).unsafeGet().get[Set[Ordered]]
 
     assert(autoset.toSeq == autoset.toSeq.sortBy(_.order))
   }
@@ -46,7 +46,7 @@ class AutoSetTest extends AnyWordSpec with MkInjector {
         .add(new AutoSetHook[Int, Int])
     })
 
-    val autoset = injector.produce(PlannerInput.noGC(definition)).unsafeGet().get[Set[Int]]
+    val autoset = injector.produce(PlannerInput.everything(definition)).unsafeGet().get[Set[Int]]
 
     assert(autoset == Set(1, 2, 3, 4, 5))
   }
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/AutoTraitsTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/AutoTraitsTest.scala
index 26523485f..e96f9bd12 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/AutoTraitsTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/AutoTraitsTest.scala
@@ -35,7 +35,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkNoCyclesInjector()
-    val plan = injector.plan(PlannerInput.noGC(definition))
+    val plan = injector.plan(PlannerInput.everything(definition))
 
     val context = injector.produce(plan).unsafeGet()
     val instantiated = context.get[TestTrait]
@@ -52,7 +52,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkNoCyclesInjector()
-    val plan = injector.plan(PlannerInput.noGC(definition))
+    val plan = injector.plan(PlannerInput.everything(definition))
 
     val context = injector.produce(plan).unsafeGet()
     val instantiated = context.get[TestTrait]("named-trait")
@@ -73,7 +73,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkNoCyclesInjector()
-    val plan = injector.plan(PlannerInput.noGC(definition))
+    val plan = injector.plan(PlannerInput.everything(definition))
 
     val context = injector.produce(plan).unsafeGet()
     val instantiated1 = context.get[Trait1]
@@ -99,7 +99,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkNoCyclesInjector()
-    val plan = injector.plan(PlannerInput.noGC(definition))
+    val plan = injector.plan(PlannerInput.everything(definition))
 
     val context = injector.produce(plan).unsafeGet()
     val instantiated3 = context.get[Trait2]
@@ -110,7 +110,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "support trait fields" in {
     import TraitCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[ATraitWithAField]
     })
 
@@ -124,7 +124,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "support named bindings in cglib traits" in {
     import TraitCase4._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep].named("A").from[DepA]
       make[Dep].named("B").from[DepB]
       make[Trait]
@@ -148,7 +148,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "override protected defs in cglib traits" in {
     import TraitCase5._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestTrait]
       make[Dep]
     })
@@ -165,7 +165,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "can instantiate traits with refinements" in {
     import TraitCase5._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestTraitAny { def dep: Dep }]
       make[Dep]
     })
@@ -179,7 +179,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   }
 
   "can instantiate structural types" in {
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[{ def a: Int }]
       make[Int].from(5)
     })
@@ -194,7 +194,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "can instantiate `with` types" in {
     import TypesCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep]
       make[Dep2]
       make[Trait2 with (Trait2 with (Trait2 with Trait1))]
@@ -213,7 +213,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "can handle AnyVals" in {
     import TraitCase6._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep]
       make[AnyValDep]
       make[TestTrait]
@@ -232,7 +232,7 @@ class AutoTraitsTest extends AnyWordSpec with MkInjector {
   "can handle abstract classes" in {
     import TraitCase7._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency1]
       make[Dependency2]
       make[X].from[XImpl]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/BasicTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/BasicTest.scala
index 61652f75a..5f86edca8 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/BasicTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/BasicTest.scala
@@ -53,7 +53,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "correctly handle empty typed sets" in {
     import SetCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TypedService[Int]].from[ServiceWithTypedSet]
       many[ExampleTypedCaseClass[Int]]
     })
@@ -71,7 +71,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "provide LocatorRef during initialization" in {
     import BasicCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestClass0]
       make[TestClass2].from {
         (ref: LocatorRef, test: TestClass0) =>
@@ -111,7 +111,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "regression test: issue #762 example (Predef.String vs. java.lang.String)" in {
     import BasicCaseIssue762._
 
-    val definition = PlannerInput.noGC(MyClassModule ++ ConfigModule)
+    val definition = PlannerInput.everything(MyClassModule ++ ConfigModule)
 
     val injector = mkInjector()
 
@@ -124,7 +124,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
 
   "support multiple bindings" in {
     import BasicCase1._
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       many[JustTrait].named("named.empty.set")
 
       many[JustTrait]
@@ -152,7 +152,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "support nested multiple bindings" in {
     // https://github.com/7mind/izumi/issues/261
     import BasicCase1._
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       many[JustTrait]
         .add(new Impl1)
     })
@@ -171,7 +171,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
 
   "support named bindings" in {
     import BasicCase2._
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestClass]
         .named("named.test.class")
       make[TestDependency0].from[TestImpl0Bad]
@@ -182,8 +182,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
         .named("named.test")
         .from(TestInstanceBinding())
       // test SetIdFromImplName
-      make[TestDependency0]
-        .namedByImpl
+      make[TestDependency0].namedByImpl
         .from[TestImpl0Good]
       make[TestDependency0]
         .from[TestImpl0Bad]
@@ -200,7 +199,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "fail on unsolvable conflicts" in {
     import BasicCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency].from[Impl1]
       make[Dependency].from[Impl2]
     })
@@ -211,19 +210,18 @@ class BasicTest extends AnyWordSpec with MkInjector {
     }
     assert(exc.conflicts.size == 1)
     assert(
-      exc
-        .conflicts.exists(
-          e =>
-            e.isInstanceOf[ConflictResolutionError.ConflictingDefs[_, _]] &&
-            e.asInstanceOf[ConflictResolutionError.ConflictingDefs[DIKey, Nothing]].defs.keySet.exists(_.key == DIKey.get[Dependency])
-        )
+      exc.conflicts.exists(
+        e =>
+          e.isInstanceOf[ConflictResolutionError.ConflictingDefs[_, _]] &&
+          e.asInstanceOf[ConflictResolutionError.ConflictingDefs[DIKey, Nothing]].defs.keySet.exists(_.key == DIKey.get[Dependency])
+      )
     )
   }
 
   // BasicProvisionerTest
   "instantiate simple class" in {
     import BasicCase1._
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestCaseClass2]
       make[TestInstanceBinding].from(new TestInstanceBinding)
     })
@@ -239,7 +237,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "handle set bindings" in {
     import SetCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Service2]
       make[Service0]
       make[Service1]
@@ -283,7 +281,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
 //  "support Plan.providerImport and Plan.resolveImport" in {
 //    import BasicCase1._
 //
-//    val definition = PlannerInput.noGC(new ModuleDef {
+//    val definition = PlannerInput.everything(new ModuleDef {
 //      make[TestCaseClass2]
 //    })
 //
@@ -307,7 +305,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "preserve type annotations" in {
     import BasicCase4._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency].named("special")
       make[TestClass]
     })
@@ -321,7 +319,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   }
 
   "handle set inclusions" in {
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Set[Int]].named("x").from(Set(1, 2, 3))
       make[Set[Int]].named("y").from(Set(4, 5, 6))
       many[Int].refSet[Set[Int]]("x")
@@ -340,7 +338,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   }
 
   "handle multiple set element binds" in {
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Int].from(7)
 
       many[Int].add(0)
@@ -362,7 +360,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
 
   "support empty sets" in {
     import BasicCase5._
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       many[TestDependency]
       make[TestImpl1]
     })
@@ -374,7 +372,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
 
   "preserve tags in multi set bindings" in {
     import izumi.distage.dsl.TestTagOps._
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       many[Int]
         .named("zzz")
         .add(5).tagged("t3")
@@ -383,17 +381,16 @@ class BasicTest extends AnyWordSpec with MkInjector {
     })
 
     assert(
-      definition
-        .bindings.bindings.collectFirst {
-          case SetElementBinding(_, _, s, _) if Set.apply[BindingTag]("t1", "t2").diff(s).isEmpty => true
-        }.nonEmpty
+      definition.bindings.bindings.collectFirst {
+        case SetElementBinding(_, _, s, _) if Set.apply[BindingTag]("t1", "t2").diff(s).isEmpty => true
+      }.nonEmpty
     )
   }
 
   "Can abstract over Id annotations with type aliases" in {
     import BasicCase7._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Int].named("port").from(80)
       make[String].named("address").from("localhost")
       make[ServerConfig].from(ServerConfig)
@@ -408,7 +405,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "support mutations" in {
     import Mutations01._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[SomethingUseful].fromValue(SomethingUseful("x"))
       make[Mutable].fromValue(Mutable(1, None))
       modify[Mutable].by {
@@ -427,7 +424,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "support mutations with axis tags when axis is configured" in {
     import Mutations01._
 
-    val definition = PlannerInput.noGC(
+    val definition = PlannerInput.everything(
       new ModuleDef {
         make[SomethingUseful].fromValue(SomethingUseful("x"))
 
@@ -463,7 +460,7 @@ class BasicTest extends AnyWordSpec with MkInjector {
   "support mutations with axis tags when axis is unconfigured" in {
     import Mutations01._
 
-    val definition = PlannerInput.noGC(
+    val definition = PlannerInput.everything(
       new ModuleDef {
         make[SomethingUseful].fromValue(SomethingUseful("x"))
 
@@ -509,4 +506,4 @@ class BasicTest extends AnyWordSpec with MkInjector {
     assert(error.getMessage.contains("String"))
   }
 
-}
\ No newline at end of file
+}
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/CircularDependenciesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/CircularDependenciesTest.scala
index 4d7b79798..ec342559b 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/CircularDependenciesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/CircularDependenciesTest.scala
@@ -16,7 +16,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "support trait initialization" in {
     import CircularCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[CircularBad1]
       make[CircularBad2]
     })
@@ -35,7 +35,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "support complex circular dependencies" in {
     import CircularCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Circular3]
       make[Circular1]
       make[Circular2]
@@ -62,7 +62,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "Support by-name self-referencing circulars" in {
     import CircularCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[ByNameSelfReference]
     })
 
@@ -78,7 +78,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "Support self-referencing traits" in {
     import CircularCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TraitSelfReference]
     })
 
@@ -96,7 +96,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
 
     FactoryConstructor[FactorySelfReference]
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[ByNameSelfReference]
       make[FactorySelfReference]
     })
@@ -127,7 +127,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "Locator.instances returns instances in the order they were created in" in {
     import CircularCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Circular3]
       make[Circular1]
       make[Circular2]
@@ -139,16 +139,15 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
     val plan = injector.plan(definition)
     val context = injector.produce(plan).unsafeGet()
 
-    val planTypes: Seq[SafeType] = plan
-      .steps
+    val planTypes: Seq[SafeType] = plan.steps
       .collect {
         case i: InstantiationOp => i
         case i: MakeProxy => i
       }
       .map(_.target.tpe)
     val internalArtifacts = Set(SafeType.get[ProxyDispatcher], SafeType.get[LocatorRef])
-    val instanceTypes = context
-      .instances.map(_.key.tpe)
+    val instanceTypes = context.instances
+      .map(_.key.tpe)
       .filterNot(internalArtifacts.contains) // remove internal artifacts: proxy stuff, locator ref
 
     assert(instanceTypes == planTypes)
@@ -160,7 +159,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "support by-name circular dependencies" in {
     import ByNameCycle._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Circular2]
       make[Circular1]
       make[Int].from(1)
@@ -184,7 +183,7 @@ class CircularDependenciesTest extends AnyWordSpec with MkInjector {
   "support generic circular dependencies when generics are erased by type-erasure" in {
     import CircularCase5._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[ErasedCircular[Dependency]]
       make[PhantomDependency[Dependency]]
     })
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/CompactPlanFormatterTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/CompactPlanFormatterTest.scala
index f17d95ea7..39a88d1d6 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/CompactPlanFormatterTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/CompactPlanFormatterTest.scala
@@ -25,7 +25,7 @@ object CompactPlanFormatterTest {
 class CompactPlanFormatterTest extends AnyWordSpec with MkInjector {
   "PlanFormatterTest should produce short class names if it's unique in plan" in {
     val injector = mkInjector()
-    val plan = injector.plan(PlannerInput.noGC(new ModuleDef {
+    val plan = injector.plan(PlannerInput.everything(new ModuleDef {
       make[JustTrait].from[Impl1]
       make[OptionT[scala.Either[Nothing, ?], Unit]].from(OptionT[Either[Nothing, ?], Unit](Right(None)))
       make[K1[T1]].from(new K1[T1] {})
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/FactoriesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/FactoriesTest.scala
index bdde7b1a8..2347bce1b 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/FactoriesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/FactoriesTest.scala
@@ -15,7 +15,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "handle factory injections" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Factory]
       make[Dependency]
       make[OverridingFactory]
@@ -55,7 +55,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
 
     FactoryConstructor[GenericAssistedFactory]
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[GenericAssistedFactory]
       make[Dependency].from(ConcreteDep())
     })
@@ -74,7 +74,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "handle named assisted dependencies in cglib factory methods" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[NamedAssistedFactory]
       make[Dependency]
       make[Dependency].named("special").from(SpecialDep())
@@ -98,7 +98,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "handle factories with mixed assisted and non-assisted methods" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[MixedAssistendNonAssisted]
       make[Dependency]
     })
@@ -119,7 +119,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "handle assisted abstract factories with multiple parameters of the same type" in {
     import FactoryCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[AssistedAbstractFactory]
       make[Dependency]
     })
@@ -140,7 +140,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "handle higher-kinded assisted abstract factories with multiple parameters of the same type" in {
     import FactoryCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[AssistedAbstractFactoryF[Identity]]
       make[Identity[Dependency]]
     })
@@ -166,7 +166,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
       }
     ]
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[{
           def makeConcreteDep(): Dependency @With[ConcreteDep]
         }
@@ -209,7 +209,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "cglib factory always produces new instances" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency]
       make[TestClass]
       make[Factory]
@@ -228,7 +228,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "can handle factory methods with implicit parameters" in {
     import FactoryCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dep1]
       make[Dep2]
       make[TC[Any]].fromValue(TC1)
@@ -257,7 +257,7 @@ class FactoriesTest extends AnyWordSpec with MkInjector {
   "can handle abstract classes" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency]
       make[TestClass]
       make[AbstractClassFactory]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/HigherKindsTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/HigherKindsTest.scala
index e3eac4bbc..baa3f6cf0 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/HigherKindsTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/HigherKindsTest.scala
@@ -35,7 +35,7 @@ class HigherKindsTest extends AnyWordSpec with MkInjector {
     }
 
     val listInjector = mkInjector()
-    val listPlan = listInjector.plan(PlannerInput.noGC(Definition[List](5)))
+    val listPlan = listInjector.plan(PlannerInput.everything(Definition[List](5)))
     val listContext = listInjector.produce(listPlan).unsafeGet()
 
     assert(listContext.get[TestTrait].get == List(5))
@@ -48,7 +48,7 @@ class HigherKindsTest extends AnyWordSpec with MkInjector {
     assert(listContext.get[List[Either[Int, List[String]]]] == List(Right(List("hello"))))
 
     val optionTInjector = mkInjector()
-    val optionTPlan = optionTInjector.plan(PlannerInput.noGC(Definition[OptionT[List, ?]](5)))
+    val optionTPlan = optionTInjector.plan(PlannerInput.everything(Definition[OptionT[List, ?]](5)))
     val optionTContext = optionTInjector.produce(optionTPlan).unsafeGet()
 
     assert(optionTContext.get[TestTrait].get == OptionT(List(Option(5))))
@@ -57,7 +57,7 @@ class HigherKindsTest extends AnyWordSpec with MkInjector {
     assert(optionTContext.get[OptionT[List, String]] == OptionT(List(Option("Hello 5!"))))
 
     val eitherInjector = mkInjector()
-    val eitherPlan = eitherInjector.plan(PlannerInput.noGC(Definition[Either[String, ?]](5)))
+    val eitherPlan = eitherInjector.plan(PlannerInput.everything(Definition[Either[String, ?]](5)))
 
     val eitherContext = eitherInjector.produce(eitherPlan).unsafeGet()
 
@@ -71,7 +71,7 @@ class HigherKindsTest extends AnyWordSpec with MkInjector {
     )
 
     val idInjector = mkInjector()
-    val idPlan = idInjector.plan(PlannerInput.noGC(Definition[id](5)))
+    val idPlan = idInjector.plan(PlannerInput.everything(Definition[id](5)))
     val idContext = idInjector.produce(idPlan).unsafeGet()
 
     assert(idContext.get[TestTrait].get == 5)
@@ -156,7 +156,7 @@ class HigherKindsTest extends AnyWordSpec with MkInjector {
     val value: Either[String, Int] = Right(5)
     val definition = new Definition[Either, Option, Int](value)
 
-    val context = Injector.Standard().produce(PlannerInput.noGC(definition)).unsafeGet()
+    val context = Injector.Standard().produce(PlannerInput.everything(definition)).unsafeGet()
     assert(context != null)
 
     assert(definition.t0.tag =:= LTag[TestCovariantTC[Either]].tag)
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/ImplicitInjectionTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/ImplicitInjectionTest.scala
index ec303d592..5770255a6 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/ImplicitInjectionTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/ImplicitInjectionTest.scala
@@ -12,7 +12,7 @@ class ImplicitInjectionTest extends AnyWordSpec with MkInjector {
   "Handle multiple parameter lists" in {
     import ImplicitCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestDependency2]
       make[TestDependency1]
       make[TestDependency3]
@@ -32,7 +32,7 @@ class ImplicitInjectionTest extends AnyWordSpec with MkInjector {
   "populates implicit parameters in class constructor from explicit DI object graph instead of scala's implicit resolution" in {
     import ImplicitCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestClass]
       make[Dep]
       make[DummyImplicit].from[MyDummyImplicit]
@@ -51,7 +51,7 @@ class ImplicitInjectionTest extends AnyWordSpec with MkInjector {
   "Implicit parameters are injected from the DI object graph, not from Scala's lexical implicit scope" in {
     import ImplicitCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       @nowarn implicit val testDependency3: TestDependency3 = new TestDependency3
 
       make[TestDependency1]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/InnerClassesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/InnerClassesTest.scala
index a29368f0e..114fedea7 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/InnerClassesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/InnerClassesTest.scala
@@ -10,7 +10,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
   "can instantiate inner classes from stable objects where the classes are inherited from a trait" in {
     import InnerClassStablePathsCase._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[StableObjectInheritingTrait.TestDependency]
       make[StableObjectInheritingTrait1.TestDependency]
     })
@@ -26,7 +26,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
     import InnerClassStablePathsCase._
     import StableObjectInheritingTrait._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestDependency]
       make[TestClass]
     })
@@ -41,7 +41,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
 
     val testProviderModule = new TestModule
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[testProviderModule.type].from[testProviderModule.type](testProviderModule: testProviderModule.type)
       make[testProviderModule.TestDependency]
       make[testProviderModule.TestClass]
@@ -60,7 +60,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
 
       val testProviderModule = new TestModule
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
 //        make[testProviderModule.type].from[testProviderModule.type](testProviderModule: testProviderModule.type)
         make[testProviderModule.TestClass]
         make[testProviderModule.TestDependency]
@@ -101,7 +101,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
 
     val testProviderModule = new TestModule
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
 //      make[testProviderModule.type].from[testProviderModule.type](testProviderModule: testProviderModule.type)
       make[testProviderModule.TestDependency]
       make[testProviderModule.TestClass]
@@ -119,7 +119,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
   }
 
   "can handle class local path-dependent injections (macros can)" in {
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TopLevelPathDepTest.type].from[TopLevelPathDepTest.type](TopLevelPathDepTest: TopLevelPathDepTest.type)
       make[TopLevelPathDepTest.TestClass]
       make[TopLevelPathDepTest.TestDependency]
@@ -136,7 +136,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
   "Can handle factories inside stable objects that contain inner classes from inherited traits that depend on types defined inside trait (macros can't)" in {
     import InnerClassStablePathsCase.StableObjectInheritingTrait.{TestClass, TestDependency, TestFactory}
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestFactory]
     })
 
@@ -149,7 +149,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
     import InnerClassStablePathsCase._
     import StableObjectInheritingTrait._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[ByNameCircular1]
       make[ByNameCircular2]
     })
@@ -181,7 +181,7 @@ class InnerClassesTest extends AnyWordSpec with MkInjector {
   }
 
   class InnerPathDepTest extends InnerClassUnstablePathsCase.TestModule {
-    private val definition = PlannerInput.noGC(new ModuleDef {
+    private val definition = PlannerInput.everything(new ModuleDef {
       make[InnerPathDepTest.this.type].from[InnerPathDepTest.this.type](InnerPathDepTest.this: InnerPathDepTest.this.type)
       make[TestClass]
       make[TestDependency]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/JSRAnnotationTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/JSRAnnotationTest.scala
index e2e421058..efcbc4ff9 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/JSRAnnotationTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/JSRAnnotationTest.scala
@@ -9,7 +9,7 @@ import org.scalatest.wordspec.AnyWordSpec
 class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
   "JSR330 @Named anno" should {
     "work with combined annos when no functoid is involved" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
@@ -27,7 +27,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with field annos when no functoid is involved" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port1").from(90)
         make[String].named("address1").from("localhost1")
         make[ServerConfigWithFieldAnnos]
@@ -40,7 +40,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with alias annos when no functoid is involved" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[ServerConfigWithTypeAnnos]
@@ -52,7 +52,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with param annos when no functoid is involved" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
@@ -70,7 +70,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with field annos when functoid takes .apply" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port1").from(90)
         make[String].named("address1").from("localhost1")
         make[ServerConfigWithFieldAnnos].from(ServerConfigWithFieldAnnos.apply _)
@@ -83,7 +83,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with alias annos when functoid takes .apply" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[ServerConfigWithTypeAnnos].from(ServerConfigWithTypeAnnos.apply _)
@@ -95,7 +95,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with combined annos when functoid takes .apply" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
@@ -113,7 +113,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with param annos when functoid takes .apply" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
@@ -131,7 +131,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with field annos when functoid takes overriden companion as function" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port1").from(90)
         make[String].named("address1").from("localhost1")
         make[ServerConfigWithFieldAnnos].from(ServerConfigWithFieldAnnos)
@@ -144,7 +144,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with alias annos when functoid takes companion as function" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[ServerConfigWithTypeAnnos].from(ServerConfigWithTypeAnnos)
@@ -156,7 +156,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with combined annos when functoid takes companion as function" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
@@ -174,7 +174,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with param annos when functoid takes companion as function" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
@@ -192,7 +192,7 @@ class JSRAnnotationTest extends AnyWordSpec with MkGcInjector {
     }
 
     "work with param annos when functoid takes overriden companion as function" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Int].named("port").from(80)
         make[String].named("address").from("localhost")
         make[Int].named("port1").from(90)
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/ProvidersTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/ProvidersTest.scala
index cccfd8fe9..fafbbcdd9 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/ProvidersTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/ProvidersTest.scala
@@ -10,7 +10,7 @@ class ProvidersTest extends AnyWordSpec with MkInjector {
   "instantiate provider bindings" in {
     import ProviderCase2._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestClass].from((_: Dependency1) => new TestClass(null))
       make[Dependency1].from(() => new Dependency1Sub {})
     })
@@ -27,7 +27,7 @@ class ProvidersTest extends AnyWordSpec with MkInjector {
   "support named bindings in method reference providers" in {
     import ProviderCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestDependency].named("classdeftypeann1")
       make[TestClass].from(implType _)
     })
@@ -45,7 +45,7 @@ class ProvidersTest extends AnyWordSpec with MkInjector {
   "support named bindings in lambda providers" in {
     import ProviderCase3._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[TestDependency].named("classdeftypeann1")
       make[TestClass].from {
         t: TestDependency @Id("classdeftypeann1") => new TestClass(t)
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/ResourceEffectBindingsTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/ResourceEffectBindingsTest.scala
index 116b41ede..319692a23 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/ResourceEffectBindingsTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/ResourceEffectBindingsTest.scala
@@ -68,7 +68,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     "execute effects again in reference bindings" in {
       val execIncrement = (_: Ref[Fn, Int]).update(_ + 1)
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Ref[Fn, Int]].fromEffect(Ref[Fn](0))
 
         make[Fn[Int]].from(execIncrement)
@@ -107,7 +107,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     }
 
     "work with set bindings" in {
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Ref[Fn, Set[Char]]].fromEffect(Ref[Fn](Set.empty[Char]))
 
         many[Char]
@@ -222,7 +222,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     "work in a basic case in Identity monad" in {
       import ClassResourceCase._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Res].fromResource[SimpleResource]
       })
 
@@ -242,7 +242,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     "work in a basic case in Suspend2 monad" in {
       import ClassResourceCase._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Res].fromResource[SuspendResource]
       })
 
@@ -263,7 +263,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     "work with set bindings" in {
       import izumi.distage.fixtures.ResourceCases.ClassResourceCase._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         many[Res]
           .addResource[SimpleResource]
           .addResource[SuspendResource]
@@ -292,7 +292,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     "incompatible effects error aborts interpreter before any work is done" in {
       import BasicCase1._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[NotInContext]
         make[TestClass]
         make[TestDependency3]
@@ -334,7 +334,7 @@ class ResourceEffectBindingsTest extends AnyWordSpec with MkInjector with GivenW
     "deallocate correctly in case of exceptions" in {
       import ResourceCase1._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[mutable.Queue[Ops]].fromEffect(queueEffect)
         make[X].fromResource[XResource]
         make[Y].fromResource[YResource]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala
index a5e71e029..5546d7896 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala
@@ -74,7 +74,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
       assert(error.getMessage contains "Int")
 
       val injector = mkNoCyclesInjector()
-      val plan = injector.plan(PlannerInput.noGC(definition))
+      val plan = injector.plan(PlannerInput.everything(definition))
 
       val context = unsafeRun(injector.produceCustomF[Task](plan).unsafeGet())
 
@@ -101,7 +101,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
       }
 
       val injector = mkNoCyclesInjector()
-      val plan = injector.plan(PlannerInput.noGC(definition))
+      val plan = injector.plan(PlannerInput.everything(definition))
 
       val context = unsafeRun(injector.produceCustomF[Task](plan).unsafeGet())
       val instantiated = context.get[TestClass2[Dep]]
@@ -120,7 +120,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
         value: Has[Dep @Id("B")] => ZIO(TestClass2(value.get))
       }
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Dep].named("A").from[DepA]
         make[Dep].named("B").from[DepB]
         make[TestClass2[Dep]].named("A").fromHas(ctorA)
@@ -147,7 +147,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
       def getDep1 = ZIO.access[Has[Dependency1]](_.get)
       def getDep2 = ZIO.access[Has[Dependency2]](_.get)
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Dependency1]
         make[Dependency2]
         make[Dependency3]
@@ -216,7 +216,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
     "polymorphic ZIOHas injection" in {
       import TraitCase2._
 
-      def definition[F[-_, +_, +_]: TagK3: Local3] = PlannerInput.noGC(new ModuleDef {
+      def definition[F[-_, +_, +_]: TagK3: Local3] = PlannerInput.everything(new ModuleDef {
         make[Dependency1]
         make[Dependency2]
         make[Dependency3]
@@ -269,7 +269,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
     "can handle AnyVals" in {
       import TraitCase6._
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[Dep]
         make[AnyValDep]
         make[TestTrait].fromHas(
diff --git a/distage/distage-core/src/test/scala/izumi/distage/staticinjector/MacroAutoFactoriesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/staticinjector/MacroAutoFactoriesTest.scala
index 9329df27c..ff29b1a23 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/staticinjector/MacroAutoFactoriesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/staticinjector/MacroAutoFactoriesTest.scala
@@ -11,7 +11,7 @@ class MacroAutoFactoriesTest extends AnyWordSpec with MkInjector {
   "handle macro factory injections" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Factory]
       make[Dependency]
       make[OverridingFactory]
@@ -48,7 +48,7 @@ class MacroAutoFactoriesTest extends AnyWordSpec with MkInjector {
   "handle generic arguments in macro factory methods" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[GenericAssistedFactory]
       make[Dependency].from(ConcreteDep())
     })
@@ -67,7 +67,7 @@ class MacroAutoFactoriesTest extends AnyWordSpec with MkInjector {
   "handle assisted dependencies in macro factory methods" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[AssistedFactory]
       make[Dependency].from(ConcreteDep())
     })
@@ -84,7 +84,7 @@ class MacroAutoFactoriesTest extends AnyWordSpec with MkInjector {
   "handle named assisted dependencies in macro factory methods" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[NamedAssistedFactory]
       make[Dependency]
       make[Dependency].named("special").from(SpecialDep())
@@ -125,7 +125,7 @@ class MacroAutoFactoriesTest extends AnyWordSpec with MkInjector {
   "macro factory always produces new instances" in {
     import FactoryCase1._
 
-    val definition = PlannerInput.noGC(new ModuleDef {
+    val definition = PlannerInput.everything(new ModuleDef {
       make[Dependency]
       make[TestClass]
       make[Factory]
diff --git a/distage/distage-core/src/test/scala/izumi/distage/staticinjector/StaticInnerClassesTest.scala b/distage/distage-core/src/test/scala/izumi/distage/staticinjector/StaticInnerClassesTest.scala
index 7669d2eca..5ffc63824 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/staticinjector/StaticInnerClassesTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/staticinjector/StaticInnerClassesTest.scala
@@ -15,7 +15,7 @@ class StaticInnerClassesTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkNoCyclesInjector()
-    val plan = injector.plan(PlannerInput.noGC(definition))
+    val plan = injector.plan(PlannerInput.everything(definition))
 
     val context = injector.produce(plan).unsafeGet()
 
@@ -37,7 +37,7 @@ class StaticInnerClassesTest extends AnyWordSpec with MkInjector {
     }
 
     val injector = mkNoCyclesInjector()
-    val plan = injector.plan(PlannerInput.noGC(definition))
+    val plan = injector.plan(PlannerInput.everything(definition))
 
     val context = injector.produce(plan).unsafeGet()
 
@@ -52,7 +52,7 @@ class StaticInnerClassesTest extends AnyWordSpec with MkInjector {
       make[TestDependency]
     }
 
-    val context = mkNoCyclesInjector().produce(PlannerInput.noGC(definition)).unsafeGet()
+    val context = mkNoCyclesInjector().produce(PlannerInput.everything(definition)).unsafeGet()
 
     assert(context.get[TestDependency] == TestDependency())
   }
@@ -66,7 +66,7 @@ class StaticInnerClassesTest extends AnyWordSpec with MkInjector {
       make[TestClass]
     }
 
-    val context = mkNoCyclesInjector().produce(PlannerInput.noGC(definition)).unsafeGet()
+    val context = mkNoCyclesInjector().produce(PlannerInput.everything(definition)).unsafeGet()
 
     assert(context.get[TestClass] == TestClass(TestDependency()))
   }
@@ -94,7 +94,7 @@ class StaticInnerClassesTest extends AnyWordSpec with MkInjector {
 
     def testCase = {
       val injector = mkNoCyclesInjector()
-      val plan = injector.plan(PlannerInput.noGC(definition))
+      val plan = injector.plan(PlannerInput.everything(definition))
 
       val context = injector.produce(plan).unsafeGet()
 
diff --git a/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigApp.scala b/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigApp.scala
index 5aeb6cf30..f4cc077d2 100644
--- a/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigApp.scala
+++ b/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigApp.scala
@@ -46,7 +46,7 @@ class HttpServer2(val listenOn: HostPort @Id("HttpServer2.HostPort.listenOn")) e
 }
 
 object TestConfigApp {
-  final val definition = PlannerInput.noGC(new ConfigModuleDef {
+  final val definition = PlannerInput.everything(new ConfigModuleDef {
     make[HttpServer1]
     make[HttpServer2]
     makeConfigNamed[HostPort]("HttpServer1.HostPort")
diff --git a/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigReaders.scala b/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigReaders.scala
index 6badebb30..3be9a474d 100644
--- a/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigReaders.scala
+++ b/distage/distage-extension-config/src/test/scala/com/github/pshirshov/configapp/TestConfigReaders.scala
@@ -62,47 +62,47 @@ case class Wrapper[A](wrap: A)
 case class Service[A](conf: A)
 
 object TestConfigReaders {
-  final val mapDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val mapDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[MapCaseClass]]
     makeConfig[MapCaseClass]("MapCaseClass")
   })
 
-  final val listDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val listDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[ListCaseClass]]
     makeConfig[ListCaseClass]("ListCaseClass")
   })
 
-  final val optDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val optDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[OptionCaseClass]]
     makeConfig[OptionCaseClass]("OptionCaseClass")
   })
 
-  final val backticksDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val backticksDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[BackticksCaseClass]]
     makeConfig[BackticksCaseClass]("BackticksCaseClass")
   })
 
-  final val sealedDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val sealedDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[SealedCaseClass]]
     makeConfig[SealedCaseClass]("SealedCaseClass")
   })
 
-  final val tupleDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val tupleDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[TupleCaseClass]]
     makeConfig[TupleCaseClass]("TupleCaseClass")
   })
 
-  final val customCodecDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val customCodecDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[CustomCaseClass]]
     makeConfig[CustomCaseClass]("CustomCaseClass")
   })
 
-  final val privateFieldsCodecDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val privateFieldsCodecDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[PrivateCaseClass]]
     makeConfig[PrivateCaseClass]("PrivateCaseClass")
   })
 
-  final val partiallyPrivateFieldsCodecDefinition = PlannerInput.noGC(new ConfigModuleDef {
+  final val partiallyPrivateFieldsCodecDefinition = PlannerInput.everything(new ConfigModuleDef {
     make[Service[PartiallyPrivateCaseClass]]
     makeConfig[PartiallyPrivateCaseClass]("PartiallyPrivateCaseClass")
   })
diff --git a/distage/distage-extension-logstage/src/test/scala/izumi/logstage/distage/LoggerInjectionTest.scala b/distage/distage-extension-logstage/src/test/scala/izumi/logstage/distage/LoggerInjectionTest.scala
index a45ae753e..37d04ccc3 100644
--- a/distage/distage-extension-logstage/src/test/scala/izumi/logstage/distage/LoggerInjectionTest.scala
+++ b/distage/distage-extension-logstage/src/test/scala/izumi/logstage/distage/LoggerInjectionTest.scala
@@ -26,7 +26,7 @@ class LoggerInjectionTest extends AnyWordSpec {
       val testSink = new TestSink()
       val router = ConfigurableLogRouter(IzLogger.Level.Trace, testSink)
 
-      val definition = PlannerInput.noGC(new ModuleDef {
+      val definition = PlannerInput.everything(new ModuleDef {
         make[ExampleService]
         make[ExampleApp]
       })