├── .git-blame-ignore-revs ├── .github ├── labeler.yml ├── release-drafter.yml └── workflows │ ├── ci.yml │ └── scala-steward.yml ├── .gitignore ├── .mergify.yml ├── .scala-steward.conf ├── .scalafmt.conf ├── LICENSE.txt ├── README.md ├── banner.png ├── build.sbt ├── examples ├── play24 │ ├── .gitignore │ ├── README.md │ ├── app │ │ └── com │ │ │ └── softwaremill │ │ │ └── play24 │ │ │ ├── AppApplicationLoader.scala │ │ │ ├── Seed.scala │ │ │ ├── controllers │ │ │ ├── CoffeeController.scala │ │ │ └── SupplierController.scala │ │ │ ├── dao │ │ │ ├── CoffeeDao.scala │ │ │ └── SupplierDao.scala │ │ │ ├── models │ │ │ ├── Coffee.scala │ │ │ └── Supplier.scala │ │ │ └── modules │ │ │ ├── ControllerModule.scala │ │ │ ├── DaoModule.scala │ │ │ └── DatabaseModule.scala │ ├── build.sbt │ ├── conf │ │ ├── application.conf │ │ ├── logback.xml │ │ └── routes │ ├── project │ │ ├── build.properties │ │ └── plugins.sbt │ └── test │ │ └── com │ │ └── softwaremill │ │ └── play24 │ │ ├── controllers │ │ ├── CoffeeControllerSpec.scala │ │ └── ControllerContext.scala │ │ ├── it │ │ ├── CoffeeSpec.scala │ │ ├── IntegrationContext.scala │ │ └── SupplierSpec.scala │ │ └── modules │ │ ├── MockDaoModule.scala │ │ └── MockWsClient.scala ├── scalajs │ ├── README.md │ ├── build.sbt │ ├── index.html │ ├── project │ │ ├── build.properties │ │ └── plugins.sbt │ └── src │ │ └── main │ │ └── scala │ │ └── com │ │ └── softwaremill │ │ ├── EarnLotsOfMoney.scala │ │ ├── MacwireScalajsExample.scala │ │ ├── MainModule.scala │ │ └── MoneyEarningBusinessLogic.scala └── scalatra │ └── src │ └── main │ ├── resources │ └── WEB-INF │ │ ├── layouts │ │ └── default.ssp │ │ └── views │ │ ├── index.ssp │ │ └── loginForm.ssp │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── examples │ └── scalatra │ ├── RunExample.scala │ ├── logic │ ├── LoggedInUser.scala │ ├── LogicModule.scala │ ├── Service1.scala │ ├── Service2.scala │ ├── Service3.scala │ └── SubmittedData.scala │ ├── servlet │ ├── AuthServlet.scala │ ├── ScopeFilter.scala │ ├── Servlet1.scala │ └── ServletModule.scala │ └── util │ └── TimingInterceptor.scala ├── macros └── src │ ├── main │ ├── scala-2 │ │ └── com │ │ │ └── softwaremill │ │ │ └── macwire │ │ │ ├── MacwireMacros.scala │ │ │ ├── internals │ │ │ ├── CompanionCrimper.scala │ │ │ ├── ConstructorCrimper.scala │ │ │ ├── DependencyResolver.scala │ │ │ ├── EligibleValuesFinder.scala │ │ │ ├── Logger.scala │ │ │ ├── TypeCheckUtil.scala │ │ │ └── package.scala │ │ │ └── package.scala │ └── scala-3 │ │ └── com │ │ └── softwaremill │ │ └── macwire │ │ ├── internals │ │ ├── CompanionCrimper.scala │ │ ├── ConstructorCrimper.scala │ │ ├── DependencyResolver.scala │ │ ├── EligibleValuesFinder.scala │ │ ├── Logger.scala │ │ ├── MacwireMacros.scala │ │ ├── TypeCheckUtil.scala │ │ ├── autowire │ │ │ ├── AutowireGraph.scala │ │ │ ├── AutowireProviders.scala │ │ │ ├── ReportError.scala │ │ │ ├── UniqueNames.scala │ │ │ ├── autowireImpl.scala │ │ │ └── creator.scala │ │ └── utils.scala │ │ └── macwire.scala │ └── test │ ├── scala-2 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ └── WireWithCodeGen.scala │ └── scala-3 │ └── com │ └── softwaremill │ └── macwire │ └── WireWithCodeGen.scala ├── macrosAkka └── src │ └── main │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── akkasupport │ ├── MacwireAkkaMacros.scala │ ├── internals │ └── Crimper.scala │ └── package.scala ├── macrosAkkaTests └── src │ └── test │ ├── resources │ └── test-cases │ │ ├── todo │ │ ├── wireActorWithFactory-10-makeActorInActor.success │ │ ├── wireAnonymousActorWithFactory-10-makeActorInActor.success │ │ └── wirePropsWithFactory-10-makeActorInActor.success │ │ ├── wireActor-1-simple.success │ │ ├── wireActor-10-makeActorInActor.success │ │ ├── wireActor-11-toManyInjectAnnotations.failure │ │ ├── wireActor-12-noPublicConstructor.failure │ │ ├── wireActor-13-missingImplicitDependency.failure │ │ ├── wireActor-14-implicitParameters.success │ │ ├── wireActor-15-injectAnnotationImplicit.success │ │ ├── wireActor-2-manyParameterLists.success │ │ ├── wireActor-3-missingDependency.failure │ │ ├── wireActor-3.1-missingActorRefFactoryDependency.failure │ │ ├── wireActor-4-noDependenciesAtAll.success │ │ ├── wireActor-5-injectAnnotation.success │ │ ├── wireActor-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireActor-7-notActor.failure │ │ ├── wireActor-9-subtypeDependencyInScope.success │ │ ├── wireActorWithFactory-1-simple.success │ │ ├── wireActorWithFactory-12-privateMethod.failure │ │ ├── wireActorWithFactory-14-implicitParameters.success │ │ ├── wireActorWithFactory-2-manyParameterLists.failure │ │ ├── wireActorWithFactory-3-missingDependency.failure │ │ ├── wireActorWithFactory-4-noDependenciesAtAll.success │ │ ├── wireActorWithFactory-7-notActorFactory.failure │ │ ├── wireActorWithFactory-9-subtypeDependencyInScope.success │ │ ├── wireActorWithProducer-1-simple.success │ │ ├── wireActorWithProducer-10-makeActorInActor.success │ │ ├── wireActorWithProducer-11-toManyInjectAnnotations.failure │ │ ├── wireActorWithProducer-12-noPublicConstructor.failure │ │ ├── wireActorWithProducer-13-missingImplicitDependency.failure │ │ ├── wireActorWithProducer-14-implicitParameters.success │ │ ├── wireActorWithProducer-15-injectAnnotationImplicit.success │ │ ├── wireActorWithProducer-2-manyParameterLists.success │ │ ├── wireActorWithProducer-3-missingDependency.failure │ │ ├── wireActorWithProducer-4-noDependenciesAtAll.success │ │ ├── wireActorWithProducer-5-injectAnnotation.success │ │ ├── wireActorWithProducer-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireActorWithProducer-7-notActorProducer.failure │ │ ├── wireActorWithProducer-9-subtypeDependencyInScope.success │ │ ├── wireAnonymousActor-1-simple.success │ │ ├── wireAnonymousActor-10-makeActorInActor.success │ │ ├── wireAnonymousActor-11-toManyInjectAnnotations.failure │ │ ├── wireAnonymousActor-12-noPublicConstructor.failure │ │ ├── wireAnonymousActor-13-missingImplicitDependency.failure │ │ ├── wireAnonymousActor-14-implicitParameters.success │ │ ├── wireAnonymousActor-15-injectAnnotationImplicit.success │ │ ├── wireAnonymousActor-2-manyParameterLists.success │ │ ├── wireAnonymousActor-3-missingDependency.failure │ │ ├── wireAnonymousActor-3.1-missingActorRefFactoryDependency.failure │ │ ├── wireAnonymousActor-4-noDependenciesAtAll.success │ │ ├── wireAnonymousActor-5-injectAnnotation.success │ │ ├── wireAnonymousActor-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireAnonymousActor-7-notActor.failure │ │ ├── wireAnonymousActor-9-subtypeDependencyInScope.success │ │ ├── wireAnonymousActorWithFactory-1-simple.success │ │ ├── wireAnonymousActorWithFactory-12-privateMethod.failure │ │ ├── wireAnonymousActorWithFactory-14-implicitParameters.success │ │ ├── wireAnonymousActorWithFactory-2-manyParameterLists.failure │ │ ├── wireAnonymousActorWithFactory-3-missingDependency.failure │ │ ├── wireAnonymousActorWithFactory-4-noDependenciesAtAll.success │ │ ├── wireAnonymousActorWithFactory-7-notActorFactory.failure │ │ ├── wireAnonymousActorWithFactory-9-subtypeDependencyInScope.success │ │ ├── wireAnonymousActorWithProducer-1-simple.success │ │ ├── wireAnonymousActorWithProducer-10-makeActorInActor.success │ │ ├── wireAnonymousActorWithProducer-11-toManyInjectAnnotations.failure │ │ ├── wireAnonymousActorWithProducer-12-noPublicConstructor.failure │ │ ├── wireAnonymousActorWithProducer-13-missingImplicitDependency.failure │ │ ├── wireAnonymousActorWithProducer-14-implicitParameters.success │ │ ├── wireAnonymousActorWithProducer-15-injectAnnotationImplicit.success │ │ ├── wireAnonymousActorWithProducer-2-manyParameterLists.success │ │ ├── wireAnonymousActorWithProducer-3-missingDependency.failure │ │ ├── wireAnonymousActorWithProducer-4-noDependenciesAtAll.success │ │ ├── wireAnonymousActorWithProducer-5-injectAnnotation.success │ │ ├── wireAnonymousActorWithProducer-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireAnonymousActorWithProducer-7-notActorProducer.failure │ │ ├── wireAnonymousActorWithProducer-9-subtypeDependencyInScope.success │ │ ├── wireProps-1-simple.success │ │ ├── wireProps-10-makeActorInActor.success │ │ ├── wireProps-11-toManyInjectAnnotations.failure │ │ ├── wireProps-12-noPublicConstructor.failure │ │ ├── wireProps-13-missingImplicitDependency.failure │ │ ├── wireProps-14-implicitParameters.success │ │ ├── wireProps-15-injectAnnotationImplicit.success │ │ ├── wireProps-2-manyParameterLists.success │ │ ├── wireProps-3-missingDependency.failure │ │ ├── wireProps-4-noDependenciesAtAll.success │ │ ├── wireProps-5-injectAnnotation.success │ │ ├── wireProps-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireProps-7-notActor.failure │ │ ├── wireProps-9-subtypeDependencyInScope.success │ │ ├── wirePropsWithFactory-1-simple.success │ │ ├── wirePropsWithFactory-12-privateMethod.failure │ │ ├── wirePropsWithFactory-14-implicitParameters.success │ │ ├── wirePropsWithFactory-2-manyParameterLists.failure │ │ ├── wirePropsWithFactory-3-missingDependency.failure │ │ ├── wirePropsWithFactory-4-noDependenciesAtAll.success │ │ ├── wirePropsWithFactory-7-notActorFactory.failure │ │ ├── wirePropsWithFactory-9-subtypeDependencyInScope.success │ │ ├── wirePropsWithProducer-1-simple.success │ │ ├── wirePropsWithProducer-10-makeActorInActor.success │ │ ├── wirePropsWithProducer-11-toManyInjectAnnotations.failure │ │ ├── wirePropsWithProducer-12-noPublicConstructor.failure │ │ ├── wirePropsWithProducer-13-missingImplicitDependency.failure │ │ ├── wirePropsWithProducer-14-implicitParameters.success │ │ ├── wirePropsWithProducer-15-injectAnnotationImplicit.success │ │ ├── wirePropsWithProducer-2-manyParameterLists.success │ │ ├── wirePropsWithProducer-3-missingDependency.failure │ │ ├── wirePropsWithProducer-4-noDependenciesAtAll.success │ │ ├── wirePropsWithProducer-5-injectAnnotation.success │ │ ├── wirePropsWithProducer-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wirePropsWithProducer-7-notActorProducer.failure │ │ └── wirePropsWithProducer-9-subtypeDependencyInScope.success │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── akkasupport │ ├── AfterAllTerminate.scala │ ├── CompileTests.scala │ └── demo │ └── Demo.scala ├── macrosAutoCats └── src │ └── main │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── autocats │ ├── MacwireAutoCatsMacros.scala │ ├── internals │ ├── CatsProviders.scala │ ├── CatsProvidersGraphContext.scala │ └── GraphBuilderUtils.scala │ └── package.scala ├── macrosAutoCatsTests └── src │ ├── main │ └── scala │ │ └── com │ │ └── softwaremill │ │ └── macwire │ │ └── CatsAutowireCompileTestsSupport.scala │ └── test │ ├── resources │ └── test-cases │ │ ├── ambiguousInstances.failure │ │ ├── ambiguousTraitImplementations.failure │ │ ├── chainingFactoryMethods.success │ │ ├── constructInputProvider.failure │ │ ├── constructInstanceWithFactoryMethod.success │ │ ├── doNotFallbackToEmptyConstructorIfNotRequired.success │ │ ├── factoryMethodCompanionWiredParam.success │ │ ├── factoryMethodWithWiredParam.success │ │ ├── factoryNoParameters.success │ │ ├── factoryWithAutoCreatedParameter.success │ │ ├── factoryWithParameter.success │ │ ├── factoryWithParameterFromIO.success │ │ ├── factoryWithParameterFromResource.success │ │ ├── ioProvidedParameter.success │ │ ├── missingApplyDependencies.failure │ │ ├── missingConstructorDependencies.failure │ │ ├── missingFactoryMethodDependencies.failure │ │ ├── missingMultipleConstructorDependencies.failure │ │ ├── mixedFactoryMethodParams.success │ │ ├── notUsedProvider.failure │ │ ├── resourceFactoryWithParameters.success │ │ ├── resourceMultiLevelProvidedParameter.success │ │ ├── resourceProvidedParameters.success │ │ ├── reuseCreatedInstances.success │ │ ├── reusingResourcesInFactoryMethods.success │ │ ├── simpleAutoParameters.success │ │ ├── simpleMissingDeps.failure │ │ ├── simpleMissingMultiLevelDeps.failure │ │ ├── simpleMultiLevelNoParameters.success │ │ ├── simpleMultiLevelProvidedParameter.success │ │ ├── simpleNoParameters.success │ │ ├── simpleProvidedParameter.success │ │ ├── simpleUsingCompanion.success │ │ ├── sortFactoryMethods.success │ │ ├── subtypeParameter.success │ │ ├── subtypeResourceParameter.success │ │ ├── taggingParameters.success │ │ └── todo │ │ ├── autowireTuples.success │ │ ├── creatorBacktracking.success │ │ └── passSomeParameters.success │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── autocats │ └── CompileTests.scala ├── macrosPekko └── src │ └── main │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── pekkosupport │ ├── MacwirePekkoMacros.scala │ ├── internals │ └── Crimper.scala │ └── package.scala ├── macrosPekkoTests └── src │ └── test │ ├── resources │ └── test-cases │ │ ├── todo │ │ ├── wireActorWithFactory-10-makeActorInActor.success │ │ ├── wireAnonymousActorWithFactory-10-makeActorInActor.success │ │ └── wirePropsWithFactory-10-makeActorInActor.success │ │ ├── wireActor-1-simple.success │ │ ├── wireActor-10-makeActorInActor.success │ │ ├── wireActor-11-toManyInjectAnnotations.failure │ │ ├── wireActor-12-noPublicConstructor.failure │ │ ├── wireActor-13-missingImplicitDependency.failure │ │ ├── wireActor-14-implicitParameters.success │ │ ├── wireActor-15-injectAnnotationImplicit.success │ │ ├── wireActor-2-manyParameterLists.success │ │ ├── wireActor-3-missingDependency.failure │ │ ├── wireActor-3.1-missingActorRefFactoryDependency.failure │ │ ├── wireActor-4-noDependenciesAtAll.success │ │ ├── wireActor-5-injectAnnotation.success │ │ ├── wireActor-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireActor-7-notActor.failure │ │ ├── wireActor-9-subtypeDependencyInScope.success │ │ ├── wireActorWithFactory-1-simple.success │ │ ├── wireActorWithFactory-12-privateMethod.failure │ │ ├── wireActorWithFactory-14-implicitParameters.success │ │ ├── wireActorWithFactory-2-manyParameterLists.failure │ │ ├── wireActorWithFactory-3-missingDependency.failure │ │ ├── wireActorWithFactory-4-noDependenciesAtAll.success │ │ ├── wireActorWithFactory-7-notActorFactory.failure │ │ ├── wireActorWithFactory-9-subtypeDependencyInScope.success │ │ ├── wireActorWithProducer-1-simple.success │ │ ├── wireActorWithProducer-10-makeActorInActor.success │ │ ├── wireActorWithProducer-11-toManyInjectAnnotations.failure │ │ ├── wireActorWithProducer-12-noPublicConstructor.failure │ │ ├── wireActorWithProducer-13-missingImplicitDependency.failure │ │ ├── wireActorWithProducer-14-implicitParameters.success │ │ ├── wireActorWithProducer-15-injectAnnotationImplicit.success │ │ ├── wireActorWithProducer-2-manyParameterLists.success │ │ ├── wireActorWithProducer-3-missingDependency.failure │ │ ├── wireActorWithProducer-4-noDependenciesAtAll.success │ │ ├── wireActorWithProducer-5-injectAnnotation.success │ │ ├── wireActorWithProducer-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireActorWithProducer-7-notActorProducer.failure │ │ ├── wireActorWithProducer-9-subtypeDependencyInScope.success │ │ ├── wireAnonymousActor-1-simple.success │ │ ├── wireAnonymousActor-10-makeActorInActor.success │ │ ├── wireAnonymousActor-11-toManyInjectAnnotations.failure │ │ ├── wireAnonymousActor-12-noPublicConstructor.failure │ │ ├── wireAnonymousActor-13-missingImplicitDependency.failure │ │ ├── wireAnonymousActor-14-implicitParameters.success │ │ ├── wireAnonymousActor-15-injectAnnotationImplicit.success │ │ ├── wireAnonymousActor-2-manyParameterLists.success │ │ ├── wireAnonymousActor-3-missingDependency.failure │ │ ├── wireAnonymousActor-3.1-missingActorRefFactoryDependency.failure │ │ ├── wireAnonymousActor-4-noDependenciesAtAll.success │ │ ├── wireAnonymousActor-5-injectAnnotation.success │ │ ├── wireAnonymousActor-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireAnonymousActor-7-notActor.failure │ │ ├── wireAnonymousActor-9-subtypeDependencyInScope.success │ │ ├── wireAnonymousActorWithFactory-1-simple.success │ │ ├── wireAnonymousActorWithFactory-12-privateMethod.failure │ │ ├── wireAnonymousActorWithFactory-14-implicitParameters.success │ │ ├── wireAnonymousActorWithFactory-2-manyParameterLists.failure │ │ ├── wireAnonymousActorWithFactory-3-missingDependency.failure │ │ ├── wireAnonymousActorWithFactory-4-noDependenciesAtAll.success │ │ ├── wireAnonymousActorWithFactory-7-notActorFactory.failure │ │ ├── wireAnonymousActorWithFactory-9-subtypeDependencyInScope.success │ │ ├── wireAnonymousActorWithProducer-1-simple.success │ │ ├── wireAnonymousActorWithProducer-10-makeActorInActor.success │ │ ├── wireAnonymousActorWithProducer-11-toManyInjectAnnotations.failure │ │ ├── wireAnonymousActorWithProducer-12-noPublicConstructor.failure │ │ ├── wireAnonymousActorWithProducer-13-missingImplicitDependency.failure │ │ ├── wireAnonymousActorWithProducer-14-implicitParameters.success │ │ ├── wireAnonymousActorWithProducer-15-injectAnnotationImplicit.success │ │ ├── wireAnonymousActorWithProducer-2-manyParameterLists.success │ │ ├── wireAnonymousActorWithProducer-3-missingDependency.failure │ │ ├── wireAnonymousActorWithProducer-4-noDependenciesAtAll.success │ │ ├── wireAnonymousActorWithProducer-5-injectAnnotation.success │ │ ├── wireAnonymousActorWithProducer-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireAnonymousActorWithProducer-7-notActorProducer.failure │ │ ├── wireAnonymousActorWithProducer-9-subtypeDependencyInScope.success │ │ ├── wireProps-1-simple.success │ │ ├── wireProps-10-makeActorInActor.success │ │ ├── wireProps-11-toManyInjectAnnotations.failure │ │ ├── wireProps-12-noPublicConstructor.failure │ │ ├── wireProps-13-missingImplicitDependency.failure │ │ ├── wireProps-14-implicitParameters.success │ │ ├── wireProps-15-injectAnnotationImplicit.success │ │ ├── wireProps-2-manyParameterLists.success │ │ ├── wireProps-3-missingDependency.failure │ │ ├── wireProps-4-noDependenciesAtAll.success │ │ ├── wireProps-5-injectAnnotation.success │ │ ├── wireProps-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wireProps-7-notActor.failure │ │ ├── wireProps-9-subtypeDependencyInScope.success │ │ ├── wirePropsWithFactory-1-simple.success │ │ ├── wirePropsWithFactory-12-privateMethod.failure │ │ ├── wirePropsWithFactory-14-implicitParameters.success │ │ ├── wirePropsWithFactory-2-manyParameterLists.failure │ │ ├── wirePropsWithFactory-3-missingDependency.failure │ │ ├── wirePropsWithFactory-4-noDependenciesAtAll.success │ │ ├── wirePropsWithFactory-7-notActorFactory.failure │ │ ├── wirePropsWithFactory-9-subtypeDependencyInScope.success │ │ ├── wirePropsWithProducer-1-simple.success │ │ ├── wirePropsWithProducer-10-makeActorInActor.success │ │ ├── wirePropsWithProducer-11-toManyInjectAnnotations.failure │ │ ├── wirePropsWithProducer-12-noPublicConstructor.failure │ │ ├── wirePropsWithProducer-13-missingImplicitDependency.failure │ │ ├── wirePropsWithProducer-14-implicitParameters.success │ │ ├── wirePropsWithProducer-15-injectAnnotationImplicit.success │ │ ├── wirePropsWithProducer-2-manyParameterLists.success │ │ ├── wirePropsWithProducer-3-missingDependency.failure │ │ ├── wirePropsWithProducer-4-noDependenciesAtAll.success │ │ ├── wirePropsWithProducer-5-injectAnnotation.success │ │ ├── wirePropsWithProducer-6-injectAnnotationButNoDependencyInScope.failure │ │ ├── wirePropsWithProducer-7-notActorProducer.failure │ │ └── wirePropsWithProducer-9-subtypeDependencyInScope.success │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── pekkosupport │ ├── AfterAllTerminate.scala │ ├── CompileTests.scala │ └── demo │ └── Demo.scala ├── notes └── classesNestedInTraits.txt ├── project ├── build.properties └── plugins.sbt ├── proxy └── src │ ├── main │ └── scala │ │ └── com │ │ └── softwaremill │ │ └── macwire │ │ ├── aop │ │ ├── Interceptor.scala │ │ ├── InvocationContext.scala │ │ ├── NoOpInterceptor.scala │ │ └── ProxyingInterceptor.scala │ │ ├── proxy │ │ └── ProxyCreator.scala │ │ └── scopes │ │ ├── NoOpScope.scala │ │ ├── ProxyingScope.scala │ │ ├── Scope.scala │ │ ├── ScopeStorage.scala │ │ ├── ThreadLocalScope.scala │ │ └── ThreadLocalScopeStorage.scala │ └── test │ └── scala │ └── com │ └── softwaremill │ └── macwire │ ├── aop │ └── ProxyingInterceptorTest.scala │ └── scopes │ └── ThreadLocalScopeTest.scala ├── test-util └── src │ └── main │ ├── resources │ └── include │ │ ├── commonClassesWithImplicitDependencies │ │ ├── commonClassesWithTraits │ │ ├── commonClassesWithTraitsNotNullCheck │ │ ├── commonHKTClasses │ │ ├── commonSimpleClasses │ │ ├── commonSimpleNotNullCheck │ │ └── commonTaggedClasses │ ├── scala-2 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ └── CompileTestsSupport.scala │ ├── scala-3 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ ├── CompileTestsSupport.scala │ │ └── Properties.scala │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── BaseCompileTestSupport.scala ├── tests └── src │ └── test │ ├── resources │ └── test-cases │ │ ├── anonFuncAndMethodsArgsWiredOk.success │ │ ├── anonFuncArgsWiredOk.success │ │ ├── autowire │ │ ├── autowireMembersOf.success │ │ ├── autowireMembersOfDuplicate.failure │ │ ├── classOf.success │ │ ├── cyclicDependency.failure │ │ ├── duplicate.failure │ │ ├── function1fromMethod.success │ │ ├── function2.success │ │ ├── function2constructorAsFunction.success │ │ ├── function2fromMethod.success │ │ ├── plainTrait.failure │ │ ├── primitives.failure │ │ ├── privateConstructor.failure │ │ ├── simpleApply.success │ │ ├── simpleNoDependencies.success │ │ ├── simpleOneDependency.success │ │ ├── simpleReuseDependency.success │ │ ├── simpleReuseWired.success │ │ ├── simpleTwoDependencies.success │ │ ├── unusedDependency.failure │ │ └── useGivens.success │ │ ├── callByNameCompanionObject.success │ │ ├── callByNameConstructorParameter.success │ │ ├── callByNameWireWith.scala2.success │ │ ├── classesWithTraitsLazyValsOkInTrait.success │ │ ├── companionFactory.success │ │ ├── companionFactoryAmbiguous.failure │ │ ├── companionObjectHasFakeApplyMethods.failure │ │ ├── companionObjectHasNoMethods.failure │ │ ├── defWithParameterAreIneligible.success │ │ ├── defWithoutParameter.success │ │ ├── diamondInheritance.success │ │ ├── explicitDepsNotWiredWithImplicitVals.failure │ │ ├── explicitDepsWiredWithImplicitValsFromEnclosingModuleScope.success │ │ ├── explicitDepsWiredWithImplicitValsFromMethodScope.failure │ │ ├── explicitDepsWiredWithImplicitValsFromParentsScope.success │ │ ├── forwardReferenceInBlock.scala2.warning │ │ ├── forwardReferenceInClass.success │ │ ├── functionApplication.scala2.success │ │ ├── functionApplication.scala3.success │ │ ├── implicitDepsWiredWithImplementedImplicitVals.success │ │ ├── implicitDepsWiredWithImplicitDefs.success │ │ ├── implicitDepsWiredWithImplicitVals.success │ │ ├── implicitDepsWiredWithImplicitValsFromEnclosingModuleScope.success │ │ ├── implicitDepsWiredWithImplicitValsFromMethodScope.scala2.success │ │ ├── implicitDepsWiredWithImplicitValsFromMethodScope.scala3.success │ │ ├── implicitDepsWiredWithImplicitValsFromParentsScope.success │ │ ├── import.scala2.success │ │ ├── importAmbiguous.scala2.failure │ │ ├── importImplicit.scala2.success │ │ ├── importPackage.scala2.success │ │ ├── importRename.scala2.success │ │ ├── importWildcard.scala2.success │ │ ├── importWildcardDoNotImportObjectMethods.scala2.success │ │ ├── importWildcardVisibility.scala2.success │ │ ├── inheritanceAbstractAndConcrete.success │ │ ├── inheritanceClassesWithTraitsLazyValsOkInTraits.success │ │ ├── inheritanceDoubleSimpleLazyValsOkInTraits.success │ │ ├── inheritanceHKT.scala2.success │ │ ├── inheritanceParametrized.success │ │ ├── inheritancePrivateMembersInParent.success │ │ ├── inheritanceProtectedMembersInParent.success │ │ ├── inheritancePublicMembersInParent.success │ │ ├── inheritanceSimpleDefsOkInTraits.success │ │ ├── inheritanceSimpleLazyValsOkInTraits.success │ │ ├── inheritanceTwoLevelSimpleLazyValsOkInTraits.success │ │ ├── inheritanceWireWith.scala2.success │ │ ├── methodContainingValDef.scala2.success │ │ ├── methodMixedOk.success │ │ ├── methodParamsInApplyOk.success │ │ ├── methodParamsOk.success │ │ ├── methodSingleParamOk.success │ │ ├── methodWithSingleImplicitParamOk.scala2.success │ │ ├── methodWithSingleImplicitParamOk.scala3.success │ │ ├── methodWithWiredWithinIfThenElse.success │ │ ├── methodWithWiredWithinPatternMatch.scala2.success │ │ ├── multipleMethodParameters.failure │ │ ├── nestedAnonFuncsWired.success │ │ ├── nestedMethodsWired.failure │ │ ├── nestedMethodsWired.success │ │ ├── nestedWithManyMatchingParamsWired.failure │ │ ├── nullaryMethodUsedAsCandidate.scala2.failure │ │ ├── parametrizedMethodNotUsedAsCandidate.success │ │ ├── phantomConstructor.failure │ │ ├── secondaryConstructorAnnotated.success │ │ ├── secondaryConstructorNotAnnotated.failure │ │ ├── selfType.success │ │ ├── selfTypeHKT.scala2.success │ │ ├── simpleDefsInTrait.success │ │ ├── simpleGenericClass.success │ │ ├── simpleLazyValsInTrait.success │ │ ├── simpleLazyValsNotInOrder.success │ │ ├── simpleValsDuplicateValue.failure │ │ ├── simpleValsImplicitParameterLists.success │ │ ├── simpleValsInClass.success │ │ ├── simpleValsInClassParameters.success │ │ ├── simpleValsInObject.success │ │ ├── simpleValsInTrait.success │ │ ├── simpleValsMissingValue.failure │ │ ├── simpleValsMultipleParameterLists.success │ │ ├── simpleValsReferenceWithAscription.success │ │ ├── simpleWithAbstract.success │ │ ├── simpleWithAbstractScope.success │ │ ├── t103.success │ │ ├── toManyInjectAnnotations.failure │ │ ├── todo │ │ ├── forwardReferenceLazyEligible.success │ │ └── simpleValsTypeAlias.success │ │ ├── valsFlaggedImplicit.success │ │ ├── wireLocalVal.scala2.success │ │ ├── wireRec.success │ │ ├── wireRecEmptyString.failure │ │ ├── wireRecMultiStage.success │ │ ├── wireSet.success │ │ ├── wireWith.success │ │ ├── wireWithEmptyParams.scala2.success │ │ ├── wireWithImplicits.success │ │ └── wireWithTwoParamsLists.failure │ ├── scala-2 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ └── CompileTests.scala │ └── scala-3 │ └── com │ └── softwaremill │ └── macwire │ ├── AutowireCompileTests.scala │ └── CompileTests.scala ├── tests2 └── src │ └── test │ ├── scala-2 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ ├── packages │ │ ├── A.scala │ │ ├── B.scala │ │ ├── ServletModule.scala │ │ └── child │ │ │ └── ChildModule.scala │ │ └── two_modules_and_scope │ │ ├── A.scala │ │ ├── B.scala │ │ ├── OtherModule.scala │ │ └── SomeModule.scala │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── implicits │ ├── ImplicitAndUsageInObject.scala │ └── ImplicitFromParentUsageInObject.scala ├── util-tests └── src │ └── test │ ├── resources │ └── test-cases │ │ ├── methodWithTaggedParams.success │ │ ├── methodWithTaggedParamsAmbiguous.failure │ │ ├── methodWithTaggedParamsNotFound.failure │ │ ├── moduleAmbiguousWithParent.scala2.failure │ │ ├── moduleAnnotationOnParent.success │ │ ├── moduleImportWithEmptyArgsList.scala2.success │ │ ├── moduleInCaseClass.success │ │ ├── moduleInClass.success │ │ ├── moduleInClassDoNotImportObjectMethods.success │ │ ├── moduleInClassOverlappedByImport.success │ │ ├── moduleInClassPriority.success │ │ ├── moduleInImport.scala2.success │ │ ├── moduleInMethod.scala2.success │ │ ├── moduleInParentMemberHaveLowerPriority.success │ │ ├── moduleInherited.success │ │ ├── moduleWireSet.success │ │ ├── moduleWithAscription.success │ │ ├── moduleWithEmptyArgsList.success │ │ ├── multipleValuesAnnotated.success │ │ ├── pluginExample.success │ │ ├── tagged.success │ │ ├── taggedAnd.success │ │ ├── taggedNoValueWithTag.failure │ │ ├── taggedPrimitive.success │ │ ├── wiredClassWithTypeParameters.scala2.success │ │ ├── wiredDefs.success │ │ ├── wiredFromClass.success │ │ ├── wiredInherited.success │ │ ├── wiredLazy.success │ │ ├── wiredPrimitive.success │ │ ├── wiredSimple.success │ │ ├── wiredVisibility.success │ │ └── wiredWithWire.success │ ├── scala-2 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ └── CompileTests.scala │ ├── scala-3 │ └── com │ │ └── softwaremill │ │ └── macwire │ │ └── CompileTests.scala │ └── scala │ └── com │ └── softwaremill │ └── macwire │ └── WiredTest.scala └── util └── src └── main └── scala └── com └── softwaremill └── macwire ├── DynamicInstantiate.scala ├── InstanceLookup.scala ├── Module.java ├── Wired.scala └── tagging └── package.scala /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # Scala Steward: Reformat with scalafmt 3.8.4 2 | f02d45a6f6abeed0724ab0224e05437fc58cbd56 3 | -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | labels: 3 | - label: "automerge" 4 | authors: ["softwaremill-ci"] 5 | files: 6 | - "build.sbt" 7 | - "project/plugins.sbt" 8 | - "project/build.properties" 9 | - label: "dependency" 10 | authors: ["softwaremill-ci"] 11 | files: 12 | - "build.sbt" 13 | - "project/plugins.sbt" 14 | - "project/build.properties" 15 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | template: | 2 | ## What’s Changed 3 | 4 | $CHANGES -------------------------------------------------------------------------------- /.github/workflows/scala-steward.yml: -------------------------------------------------------------------------------- 1 | name: Scala Steward 2 | 3 | # This workflow will launch at 00:00 every day 4 | on: 5 | schedule: 6 | - cron: '0 0 * * *' 7 | workflow_dispatch: 8 | 9 | jobs: 10 | scala-steward: 11 | uses: softwaremill/github-actions-workflows/.github/workflows/scala-steward.yml@main 12 | with: 13 | java-version: '17' 14 | secrets: 15 | repo-github-token: ${{secrets.REPO_GITHUB_TOKEN}} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | *.ipr 4 | target 5 | out 6 | .sbt 7 | .bsp 8 | .bloop 9 | .metals 10 | .vscode 11 | metals.sbt 12 | Workpad.scala -------------------------------------------------------------------------------- /.scala-steward.conf: -------------------------------------------------------------------------------- 1 | updates.pin = [ 2 | {groupId = "com.typesafe.akka", version = "2.6."}, 3 | {groupId = "org.scala-lang", artifactId = "scala3-library", version = "3.3."}, 4 | {groupId = "org.scala-lang", artifactId = "scala3-library_sjs1", version = "3.3."}, 5 | {groupId = "org.scala-lang", artifactId = "scala-library", version = "2.13."} 6 | ] 7 | -------------------------------------------------------------------------------- /.scalafmt.conf: -------------------------------------------------------------------------------- 1 | version = 3.9.2 2 | maxColumn = 120 3 | runner.dialect = scala213 4 | fileOverride { 5 | "glob:**/scala-3/**" { 6 | runner.dialect = scala3 7 | } 8 | } -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/macwire/278e0a9503bd7dd7ddc0df97d158ad8c73794f3d/banner.png -------------------------------------------------------------------------------- /examples/play24/.gitignore: -------------------------------------------------------------------------------- 1 | logs 2 | target 3 | /.idea 4 | /.idea_modules 5 | /.classpath 6 | /.project 7 | /.settings 8 | /RUNNING_PID 9 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/controllers/CoffeeController.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.controllers 2 | 3 | import com.softwaremill.play24.dao.CoffeeDao 4 | import play.api.libs.json.Json 5 | import play.api.mvc.{Action, Controller} 6 | 7 | import scala.concurrent.ExecutionContext 8 | 9 | class CoffeeController( 10 | coffeeDao: CoffeeDao 11 | )(implicit ec: ExecutionContext) 12 | extends Controller { 13 | 14 | def fetchAll() = Action.async { request => 15 | coffeeDao.all.map { coffees => 16 | Ok(Json.toJson(coffees)) 17 | } 18 | } 19 | 20 | def priced(price: Double) = Action.async { request => 21 | coffeeDao.byPriceWithSuppliers(price).map { result => 22 | Ok(Json.toJson(result.toMap)) 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/controllers/SupplierController.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.controllers 2 | 3 | import com.softwaremill.play24.dao.SupplierDao 4 | import play.api.libs.json.Json 5 | import play.api.mvc.{Action, Controller} 6 | 7 | import scala.concurrent.ExecutionContext 8 | 9 | class SupplierController( 10 | supplierDao: SupplierDao 11 | )(implicit ec: ExecutionContext) 12 | extends Controller { 13 | 14 | def fetchAll() = Action.async { request => 15 | supplierDao.all.map { suppliers => 16 | Ok(Json.toJson(suppliers)) 17 | } 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/dao/CoffeeDao.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.dao 2 | 3 | import com.softwaremill.play24.models.{Coffee, CoffeeTable} 4 | import slick.backend.DatabaseConfig 5 | import slick.driver.JdbcProfile 6 | 7 | import scala.concurrent.Future 8 | 9 | class CoffeeDao(dbConfig: DatabaseConfig[JdbcProfile], supplierDao: SupplierDao) { 10 | import dbConfig.driver.api._ 11 | 12 | val db = dbConfig.db 13 | val query = TableQuery[CoffeeTable] 14 | 15 | def all: Future[Seq[Coffee]] = db.run(query.result) 16 | 17 | // Table join example 18 | def byPriceWithSuppliers(price: Double): Future[Seq[(String, String)]] = { 19 | db.run { 20 | val q2 = for { 21 | c <- query if c.price < price 22 | s <- supplierDao.query if s.id === c.supID 23 | } yield (c.name, s.name) 24 | 25 | q2.result 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/dao/SupplierDao.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.dao 2 | 3 | import com.softwaremill.play24.models.{Supplier, SupplierTable} 4 | import slick.backend.DatabaseConfig 5 | import slick.driver.JdbcProfile 6 | 7 | import scala.concurrent.Future 8 | 9 | class SupplierDao(dbConfig: DatabaseConfig[JdbcProfile]) { 10 | import dbConfig.driver.api._ 11 | 12 | val db = dbConfig.db 13 | val query = TableQuery[SupplierTable] 14 | 15 | def all: Future[Seq[Supplier]] = db.run(query.result) 16 | } 17 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/modules/ControllerModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.modules 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.play24.controllers.{SupplierController, CoffeeController} 5 | import com.softwaremill.play24.dao.{CoffeeDao, SupplierDao} 6 | import play.api.libs.ws.WSClient 7 | 8 | import scala.concurrent.ExecutionContext 9 | 10 | trait ControllerModule { 11 | 12 | // Dependencies 13 | implicit def ec: ExecutionContext 14 | def wsClient: WSClient 15 | def supplierDao: SupplierDao 16 | def coffeeDao: CoffeeDao 17 | 18 | // Controllers 19 | lazy val supplierController = wire[SupplierController] 20 | lazy val coffeeController = wire[CoffeeController] 21 | } 22 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/modules/DaoModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.modules 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.play24.dao.{SupplierDao, CoffeeDao} 5 | import slick.backend.DatabaseConfig 6 | import slick.driver.JdbcProfile 7 | 8 | trait DaoModule { 9 | def dbConfig: DatabaseConfig[JdbcProfile] 10 | 11 | lazy val coffeeDao = wire[CoffeeDao] 12 | lazy val supplierDao = wire[SupplierDao] 13 | } 14 | -------------------------------------------------------------------------------- /examples/play24/app/com/softwaremill/play24/modules/DatabaseModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.modules 2 | 3 | import _root_.slick.driver.JdbcProfile 4 | import play.api.db.slick.{DbName, SlickComponents} 5 | 6 | trait DatabaseModule extends SlickComponents { 7 | lazy val dbConfig = api.dbConfig[JdbcProfile](DbName("default")) 8 | } 9 | -------------------------------------------------------------------------------- /examples/play24/build.sbt: -------------------------------------------------------------------------------- 1 | name := """play24""" 2 | 3 | version := "1.0-SNAPSHOT" 4 | 5 | lazy val root = (project in file(".")).enablePlugins(PlayScala) 6 | 7 | scalaVersion := "2.11.7" 8 | 9 | libraryDependencies ++= Seq( 10 | jdbc, 11 | cache, 12 | ws, 13 | specs2 % Test, 14 | "com.typesafe.play" %% "play-slick" % "1.1.1", 15 | "com.softwaremill.macwire" %% "macros" % "2.2.0" % "provided", 16 | "com.softwaremill.macwire" %% "util" % "2.2.0" 17 | ) 18 | 19 | resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases" 20 | 21 | // Play provides two styles of routers, one expects its actions to be injected, the 22 | // other, legacy style, accesses its actions statically. 23 | routesGenerator := InjectedRoutesGenerator 24 | -------------------------------------------------------------------------------- /examples/play24/conf/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %coloredLevel - %logger - %message%n%xException 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /examples/play24/conf/routes: -------------------------------------------------------------------------------- 1 | # Routes 2 | # This file defines all application routes (Higher priority routes first) 3 | # ~~~~ 4 | 5 | # Home page 6 | GET /supplier/all com.softwaremill.play24.controllers.SupplierController.fetchAll() 7 | GET /coffee/all com.softwaremill.play24.controllers.CoffeeController.fetchAll() 8 | GET /coffee/priced/:price com.softwaremill.play24.controllers.CoffeeController.priced(price: Double) 9 | 10 | 11 | # Map static resources from the /public folder to the /assets URL path 12 | GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) 13 | -------------------------------------------------------------------------------- /examples/play24/project/build.properties: -------------------------------------------------------------------------------- 1 | #Activator-generated Properties 2 | #Wed Jun 10 14:06:26 EDT 2015 3 | template.uuid=4dd0bfb4-5d69-4e44-a1a9-1a18a28af9b4 4 | sbt.version=0.13.8 5 | -------------------------------------------------------------------------------- /examples/play24/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | // The Play plugin 2 | addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.0") 3 | 4 | // web plugins 5 | 6 | addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") 7 | 8 | addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6") 9 | 10 | addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3") 11 | 12 | addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7") 13 | 14 | addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0") 15 | 16 | addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") 17 | -------------------------------------------------------------------------------- /examples/play24/test/com/softwaremill/play24/controllers/ControllerContext.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.controllers 2 | 3 | import com.softwaremill.play24.modules.{MockWsClient, MockDaoModule, ControllerModule} 4 | import org.specs2.matcher.MustThrownExpectations 5 | import org.specs2.specification.Scope 6 | 7 | import scala.concurrent.ExecutionContext 8 | 9 | trait ControllerContext 10 | extends ControllerModule 11 | with MockDaoModule 12 | with MockWsClient 13 | with Scope 14 | with MustThrownExpectations { 15 | implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global 16 | } 17 | -------------------------------------------------------------------------------- /examples/play24/test/com/softwaremill/play24/it/CoffeeSpec.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.it 2 | 3 | import play.api.test.{FakeRequest, PlaySpecification} 4 | 5 | class CoffeeSpec extends PlaySpecification { 6 | "/coffee/all" should { 7 | "return all coffees" in new IntegrationContext { 8 | val response = route(FakeRequest(GET, "/coffee/all")) 9 | 10 | println(status(response.get)) 11 | 12 | response must beSome.which(status(_) == OK) 13 | } 14 | } 15 | 16 | "/coffee/priced/" should { 17 | "return priced coffees" in new IntegrationContext { 18 | val response = route(FakeRequest(GET, "/coffee/priced/9")) 19 | 20 | response must beSome.which(status(_) == OK) 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/play24/test/com/softwaremill/play24/it/IntegrationContext.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.it 2 | 3 | import com.softwaremill.play24.AppApplicationLoader 4 | import play.api.test.WithApplicationLoader 5 | 6 | class IntegrationContext 7 | extends WithApplicationLoader( 8 | applicationLoader = new AppApplicationLoader 9 | ) 10 | -------------------------------------------------------------------------------- /examples/play24/test/com/softwaremill/play24/it/SupplierSpec.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.it 2 | 3 | class SupplierSpec {} 4 | -------------------------------------------------------------------------------- /examples/play24/test/com/softwaremill/play24/modules/MockDaoModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.modules 2 | 3 | import com.softwaremill.play24.dao.{CoffeeDao, SupplierDao} 4 | import org.specs2.mock.Mockito 5 | 6 | trait MockDaoModule extends Mockito { 7 | lazy val coffeeDao = mock[CoffeeDao] 8 | lazy val supplierDao = mock[SupplierDao] 9 | } 10 | -------------------------------------------------------------------------------- /examples/play24/test/com/softwaremill/play24/modules/MockWsClient.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.play24.modules 2 | 3 | import org.specs2.mock.Mockito 4 | import play.api.libs.ws.WSClient 5 | 6 | trait MockWsClient extends Mockito { 7 | lazy val wsClient = mock[WSClient] 8 | } 9 | -------------------------------------------------------------------------------- /examples/scalajs/README.md: -------------------------------------------------------------------------------- 1 | Scala.js+Macwire example 2 | === 3 | 4 | This is an example project showing that [Macwire](https://github.com/adamw/macwire) works with 5 | [Scala.js](http://www.scala-js.org/)! 6 | 7 | To see it yourself, follow these steps: 8 | 9 | 1. you need to have SBT installed 10 | 2. take a look at the sources. There's a very simple two-class object graph, being wired by Macwire in the 11 | `MainModule` trait 12 | 3. generate the javascript by running `fastOptJS` 13 | 4. now open `index.html` in a browser and enjoy the results! When clicking the button, a method on the wired 14 | object graph is invoked, and the object graph itself is printed as well. -------------------------------------------------------------------------------- /examples/scalajs/build.sbt: -------------------------------------------------------------------------------- 1 | enablePlugins(ScalaJSPlugin) 2 | 3 | name := "Scala.js+Macwire example" 4 | 5 | scalaVersion := "2.11.7" 6 | 7 | libraryDependencies += "com.softwaremill.macwire" %% "macros" % "2.2.0" 8 | 9 | libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "0.8.2" 10 | -------------------------------------------------------------------------------- /examples/scalajs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Scala.js+Macwire example 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /examples/scalajs/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=0.13.9 -------------------------------------------------------------------------------- /examples/scalajs/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.5") 2 | -------------------------------------------------------------------------------- /examples/scalajs/src/main/scala/com/softwaremill/EarnLotsOfMoney.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill 2 | 3 | case class EarnLotsOfMoney(moneyEarningBusinessLogic: MoneyEarningBusinessLogic) { 4 | def doIt(): String = { 5 | moneyEarningBusinessLogic.earnMoney(1000000) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /examples/scalajs/src/main/scala/com/softwaremill/MacwireScalajsExample.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill 2 | 3 | import scala.scalajs.js.JSApp 4 | import scala.scalajs.js.annotation.JSExport 5 | import org.scalajs.dom 6 | import dom.document 7 | 8 | object MacwireScalajsExample extends JSApp with MainModule { 9 | @JSExport 10 | def buttonClicked(): Unit = { 11 | val result = earnLotsOfMoney.doIt() 12 | val objectGraph = earnLotsOfMoney.toString 13 | appendTextInParagraph(document.body, s"$result, object graph: $objectGraph") 14 | } 15 | 16 | private def appendTextInParagraph(targetNode: dom.Node, text: String): Unit = { 17 | val parNode = document.createElement("p") 18 | val textNode = document.createTextNode(text) 19 | parNode.appendChild(textNode) 20 | targetNode.appendChild(parNode) 21 | } 22 | 23 | override def main() {} 24 | } 25 | -------------------------------------------------------------------------------- /examples/scalajs/src/main/scala/com/softwaremill/MainModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill 2 | 3 | import com.softwaremill.macwire._ 4 | 5 | trait MainModule { 6 | lazy val moneyEarningBusinessLogic = wire[MoneyEarningBusinessLogic] 7 | lazy val earnLotsOfMoney = wire[EarnLotsOfMoney] 8 | } 9 | -------------------------------------------------------------------------------- /examples/scalajs/src/main/scala/com/softwaremill/MoneyEarningBusinessLogic.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill 2 | 3 | case class MoneyEarningBusinessLogic() { 4 | def earnMoney(howMuch: Int): String = { 5 | s"Just earned another $$$howMuch!" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/resources/WEB-INF/layouts/default.ssp: -------------------------------------------------------------------------------- 1 | <%@ val body: String %> 2 | 3 | 4 | MacWire+Scalatra example 5 | 6 | 7 | Fork me on GitHub 8 | 9 |

MacWire+Scalatra example

10 | 11 | <%= unescape(body) %> 12 | 13 |

14 | Refresh | 15 | Login | 16 | Logout | 17 | Home 18 |

19 | 20 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/resources/WEB-INF/views/index.ssp: -------------------------------------------------------------------------------- 1 | <%@ val service1status: String %> 2 | <%@ val service2status: String %> 3 | 4 |

5 | Service 1 status: <%= service1status %> 6 |
7 | Service 2 status: <%= service2status %> 8 |

9 | 10 |

11 |

12 | Data: 13 |
14 | 15 |
16 |

-------------------------------------------------------------------------------- /examples/scalatra/src/main/resources/WEB-INF/views/loginForm.ssp: -------------------------------------------------------------------------------- 1 |
2 | Username: 3 |
4 | 5 |
-------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/logic/LoggedInUser.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.logic 2 | 3 | class LoggedInUser { 4 | private var loggedInUsername: Option[String] = None 5 | 6 | def login(username: String) { 7 | loggedInUsername = Some(username) 8 | } 9 | 10 | def username: Option[String] = loggedInUsername 11 | } 12 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/logic/LogicModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.logic 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.macwire.scopes.Scope 5 | import com.softwaremill.macwire.aop.Interceptor 6 | 7 | trait LogicModule { 8 | lazy val loggedInUser: LoggedInUser = session(wire[LoggedInUser]) 9 | lazy val submittedData: SubmittedData = request(wire[SubmittedData]) 10 | lazy val service1: Service1 = wire[Service1] 11 | lazy val service2: Service2 = timed(wire[Service2]) 12 | lazy val service3: Service3 = wire[Service3] 13 | 14 | def session: Scope 15 | def request: Scope 16 | 17 | def timed: Interceptor 18 | } 19 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/logic/Service1.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.logic 2 | 3 | class Service1(loggedInUser: LoggedInUser, submittedData: SubmittedData) { 4 | def fetchStatus = { 5 | s"This is Service1. " + 6 | s"Logged in user: ${loggedInUser.username}, " + 7 | s"submitted data: ${submittedData.data}, " + 8 | s"hash code: ${System.identityHashCode(this)}" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/logic/Service2.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.logic 2 | 3 | class Service2(submittedData: SubmittedData, service3: Service3, loggedInUser: LoggedInUser) { 4 | def fetchStatus = { 5 | Thread.sleep(20L) 6 | s"This is Service2. " + 7 | s"Logged in user: ${loggedInUser.username}, " + 8 | s"submitted data: ${submittedData.data}, " + 9 | s"service 3: ${service3.fetchStatus}" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/logic/Service3.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.logic 2 | 3 | class Service3 { 4 | def fetchStatus = "Hello world from Service3!" 5 | } 6 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/logic/SubmittedData.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.logic 2 | 3 | class SubmittedData { 4 | var data: String = _ 5 | } 6 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/servlet/AuthServlet.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.servlet 2 | 3 | import org.scalatra.ScalatraServlet 4 | import org.scalatra.scalate.ScalateSupport 5 | import com.softwaremill.macwire.examples.scalatra.logic.LoggedInUser 6 | 7 | class AuthServlet(loggedInUser: LoggedInUser) extends ScalatraServlet with ScalateSupport { 8 | get("/loginForm") { 9 | contentType = "text/html" 10 | ssp("loginForm") 11 | } 12 | 13 | post("/login") { 14 | loggedInUser.login(params("username")) 15 | redirect(url("")) 16 | } 17 | 18 | get("/logout") { 19 | session.invalidate() 20 | redirect(url("")) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/servlet/Servlet1.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.servlet 2 | 3 | import org.scalatra.ScalatraServlet 4 | import org.scalatra.scalate.ScalateSupport 5 | import com.softwaremill.macwire.examples.scalatra.logic.{SubmittedData, Service2, Service1} 6 | 7 | class Servlet1(service1: Service1, service2: Service2, submittedData: SubmittedData) 8 | extends ScalatraServlet 9 | with ScalateSupport { 10 | get("/") { 11 | submittedData.data = params.getOrElse("data", null) 12 | contentType = "text/html" 13 | ssp("index", "service1status" -> service1.fetchStatus, "service2status" -> service2.fetchStatus) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/servlet/ServletModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.servlet 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.macwire.examples.scalatra.logic.LogicModule 5 | import com.softwaremill.macwire.scopes.ThreadLocalScope 6 | import com.softwaremill.macwire.examples.scalatra.util.TimingInterceptor 7 | 8 | trait ServletModule extends LogicModule { 9 | lazy val servlet1: Servlet1 = wire[Servlet1] 10 | lazy val authServlet: AuthServlet = wire[AuthServlet] 11 | 12 | lazy val scopeFilter = new ScopeFilter(request, session) 13 | 14 | lazy val request = new ThreadLocalScope 15 | lazy val session = new ThreadLocalScope 16 | 17 | lazy val timed = TimingInterceptor 18 | } 19 | -------------------------------------------------------------------------------- /examples/scalatra/src/main/scala/com/softwaremill/macwire/examples/scalatra/util/TimingInterceptor.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.examples.scalatra.util 2 | 3 | import com.softwaremill.macwire.aop.{InvocationContext, ProxyingInterceptor} 4 | 5 | object TimingInterceptor extends ProxyingInterceptor { 6 | def handle(ctx: InvocationContext) = { 7 | val classWithMethodName = s"${ctx.target.getClass.getSimpleName}.${ctx.method.getName}" 8 | val start = System.currentTimeMillis() 9 | println(s"Invoking $classWithMethodName...") 10 | try { 11 | ctx.proceed() 12 | } finally { 13 | val end = System.currentTimeMillis() 14 | println(s"Invocation of $classWithMethodName took: ${end - start}ms") 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /macros/src/main/scala-3/com/softwaremill/macwire/internals/autowire/ReportError.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.internals.autowire 2 | 3 | import scala.quoted.Quotes 4 | import com.softwaremill.macwire.internals.showTypeName 5 | 6 | class ReportError[Q <: Quotes](using val q: Q): 7 | import q.reflect.* 8 | 9 | private var path: Vector[TypeRepr] = Vector.empty 10 | 11 | def withType[T](t: TypeRepr)(thunk: => T): T = 12 | path = path :+ t 13 | try thunk 14 | finally path = path.init 15 | 16 | def apply(msg: String): Nothing = 17 | val suffix = if path.nonEmpty then s";\nwiring path: $showPath" else "" 18 | report.errorAndAbort(s"$msg$suffix") 19 | 20 | private def showPath: String = path.map(showTypeName).mkString(" -> ") 21 | -------------------------------------------------------------------------------- /macros/src/main/scala-3/com/softwaremill/macwire/internals/autowire/UniqueNames.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.internals.autowire 2 | 3 | class UniqueNames: 4 | private var usedNames = Set.empty[String] 5 | def next(base: String): String = 6 | var i = 0 7 | var name = base 8 | while usedNames.contains(name) do 9 | i += 1 10 | name = s"$base$i" 11 | usedNames += name 12 | name 13 | -------------------------------------------------------------------------------- /macros/src/main/scala-3/com/softwaremill/macwire/internals/utils.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.internals 2 | 3 | import scala.quoted.* 4 | 5 | def showTypeName[T: Type](using q: Quotes): String = showTypeName(using q)(q.reflect.TypeRepr.of[T]) 6 | def showTypeName(using q: Quotes)(t: q.reflect.TypeRepr): String = t.typeSymbol.name 7 | def showExprShort(using q: Quotes)(e: Expr[_]): String = 8 | import q.reflect.* 9 | e.asTerm.show(using Printer.TreeShortCode) 10 | -------------------------------------------------------------------------------- /macros/src/test/scala-2/com/softwaremill/macwire/WireWithCodeGen.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | object WireWithCodeGen { 4 | 5 | def main(args: Array[String]) = { 6 | for (idx <- 0 until 22) { 7 | val tpes = (0 to idx).map(i => ('A' + i).toChar).mkString(",") 8 | println(s"def wireWith[$tpes,RES](factory: ($tpes) => RES): RES = macro MacwireMacros.wireWith_impl[RES]") 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /macros/src/test/scala-3/com/softwaremill/macwire/WireWithCodeGen.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | object WireWithCodeGen { 4 | 5 | def main(args: Array[String]) = { 6 | for (idx <- 0 until 22) { 7 | val tpes = (0 to idx).map(i => ('A' + i).toChar).mkString(",") 8 | println( 9 | s"inline def wireWith[$tpes,RES](inline factory: ($tpes) => RES): RES = $${ MacwireMacros.wireWith_impl[RES]('factory) }" 10 | ) 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-1-simple.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | val a = new A {} 17 | 18 | val system = ActorSystem("wireActor-1-simple") 19 | AfterAllTerminate(system) 20 | 21 | val someActor = wireActor[SomeActor]("bob") 22 | 23 | someActor ! "Hey someActor" 24 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-13-missingImplicitDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireActor-13-missingImplicitDependency") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActor[SomeActor]("bob") 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | implicit val d = new D {} 23 | 24 | val system = ActorSystem("wireActor-14-implicitParameters") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActor[SomeActor]("bob") 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-2-manyParameterLists.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireActor-2-manyParameterLists") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActor[SomeActor]("bob") 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | //no dependency of type A in scope 18 | 19 | val system: ActorSystem = ActorSystem("wireActor-3-missingDependency") 20 | AfterAllTerminate(system) 21 | 22 | //no dependency of type A in scope 23 | wireActor[SomeActor]("bob") 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-3.1-missingActorRefFactoryDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.Actor 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | val a = new A{} 18 | 19 | //no dependency of type ActorRefFactory in scope 20 | wireActor[SomeActor]("bob") 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | class SomeActor extends Actor { 9 | override def receive: Receive = { 10 | case m => //println(m) 11 | } 12 | } 13 | 14 | val system = ActorSystem("wireActor-4-noDependenciesAtAll") 15 | AfterAllTerminate(system) 16 | 17 | val someActor = wireActor[SomeActor]("Bob") 18 | 19 | someActor ! "Hey someActor" 20 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-7-notActor.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.akkasupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of Actor class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotActor {} 9 | wireActor[NotActor] -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActor-9-subtypeDependencyInScope.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | * There is AA object which is subtype of A in scope. 7 | */ 8 | 9 | trait A 10 | trait AA extends A 11 | 12 | //TODO include cases for classes, extends A with B, objects extends trait etc 13 | 14 | class SomeActor(a: A) extends Actor { 15 | override def receive: Receive = { 16 | case m => //println(m) 17 | } 18 | } 19 | 20 | val a: AA = new AA {} 21 | 22 | val system = ActorSystem("wireActor-9-subtypeDependencyInScope") 23 | AfterAllTerminate(system) 24 | val someActor = wireActor[SomeActor]("bob") 25 | 26 | someActor ! "Hey someActor" 27 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-1-simple.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 2 dependencies. 6 | */ 7 | 8 | trait A 9 | trait B 10 | 11 | class SomeActor(a: A, b: B) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | def get(a: A) = new SomeActor(a, new B{}) 19 | } 20 | 21 | val a = new A {} 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | 24 | val system = ActorSystem("wireActorWithFactory-1-simple") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActorWith(SomeActor.get _)("bob") 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-12-privateMethod.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example SomeActor factory is a private method. 6 | * Thus wireProps will not find it suitable and fail compilation. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | private def get(a: A) = new SomeActor(a) 19 | } 20 | 21 | val a = new A{} 22 | 23 | val system = ActorSystem("wireActorWithFactory-12-privateMethod") 24 | AfterAllTerminate(system) 25 | 26 | val someActor = wireActorWith(SomeActor.get _)("bob") 27 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A, b: B)(implicit c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(implicit c: C) = new SomeActor(a, new B{}) 20 | } 21 | 22 | val a = new A {} 23 | implicit val c = new C {} 24 | 25 | val system = ActorSystem("wireActorWithFactory-14-implicitParameters") 26 | AfterAllTerminate(system) 27 | 28 | val someActor = wireActorWith(SomeActor.get _)("bob") 29 | 30 | someActor ! "Hey someActor" 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-2-manyParameterLists.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A)(b: B, c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(c: C) = new SomeActor(a)(new B{}, c) 20 | } 21 | 22 | val a = new A {} 23 | lazy val b: B = throw new UnsupportedOperationException() 24 | val c = new C {} 25 | 26 | val system = ActorSystem("wireActorWithFactory-2-manyParameterLists") 27 | AfterAllTerminate(system) 28 | 29 | val someActor = wireActorWith(SomeActor.get _)("bob") 30 | 31 | someActor ! "Hey someActor" 32 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireActorWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A) = new SomeActor(a, new B{}) 20 | } 21 | 22 | //no dependency of type A in scope 23 | 24 | val system = ActorSystem("wireActorWithFactory-3-missingDependency") 25 | AfterAllTerminate(system) 26 | 27 | wireActorWith(SomeActor.get _)("bob") 28 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | object SomeActor { 17 | def get() = new SomeActor(new A{}) 18 | } 19 | 20 | lazy val a: A = throw new UnsupportedOperationException() 21 | 22 | val system = ActorSystem("wireActorWithFunction-4-noDependenciesAtAll") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = wireActorWith(SomeActor.get _)("bob") 26 | 27 | someActor ! "Hey someActor" 28 | 29 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithFactory-7-notActorFactory.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am trying to make props with a factory returning T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | 11 | object NotActor { 12 | def get() = new NotActor 13 | } 14 | 15 | val system = ActorSystem("wireActorWithFunction-7-notActorFactory") 16 | 17 | wireActorWith(NotActor.get _)("bob") 18 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireActorWithProducer-7-notActorProducer.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.akkasupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of IndirectActorProducer class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotProducer {} 9 | 10 | wireActorWith[NotProducer]("bob") 11 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-1-simple.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | val a = new A {} 17 | 18 | val system = ActorSystem("wireAnonymousActor-1-simple") 19 | AfterAllTerminate(system) 20 | 21 | val someActor = wireAnonymousActor[SomeActor] 22 | 23 | someActor ! "Hey someActor" 24 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-13-missingImplicitDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireAnonymousActor-13-missingImplicitDependency") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActor[SomeActor] 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | implicit val d = new D {} 23 | 24 | val system = ActorSystem("wireAnonymousActor-14-implicitParameters") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActor[SomeActor] 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-2-manyParameterLists.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireAnonymousActor-2-manyParameterLists") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActor[SomeActor] 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | val system: ActorSystem = ActorSystem("wireAnonymousActor-3-missingDependency") 18 | AfterAllTerminate(system) 19 | 20 | //no dependency of type A in scope 21 | wireAnonymousActor[SomeActor] 22 | 23 | 24 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-3.1-missingActorRefFactoryDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.Actor 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | val a = new A {} 18 | 19 | //no dependency of type ActorRefFactory in scope 20 | wireAnonymousActor[SomeActor] 21 | 22 | 23 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | class SomeActor extends Actor { 9 | override def receive: Receive = { 10 | case m => //println(m) 11 | } 12 | } 13 | 14 | val system = ActorSystem("wireAnonymousActor-4-noDependenciesAtAll") 15 | AfterAllTerminate(system) 16 | 17 | val someActor = wireAnonymousActor[SomeActor] 18 | 19 | someActor ! "Hey someActor" 20 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-7-notActor.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.akkasupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of Actor class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotActor {} 9 | wireAnonymousActor[NotActor] -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActor-9-subtypeDependencyInScope.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | * There is AA object which is subtype of A in scope. 7 | */ 8 | 9 | trait A 10 | trait AA extends A 11 | 12 | //TODO include cases for classes, extends A with B, objects extends trait etc 13 | 14 | class SomeActor(a: A) extends Actor { 15 | override def receive: Receive = { 16 | case m => //println(m) 17 | } 18 | } 19 | 20 | val a: AA = new AA {} 21 | 22 | val system = ActorSystem("wireActor-1-simple") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = wireAnonymousActor[SomeActor] 26 | 27 | someActor ! "Hey someActor" 28 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-1-simple.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 2 dependencies. 6 | */ 7 | 8 | trait A 9 | trait B 10 | 11 | class SomeActor(a: A, b: B) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | def get(a: A) = new SomeActor(a, new B{}) 19 | } 20 | 21 | val a = new A {} 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | 24 | val system = ActorSystem("wireAnonymousActorWithFactory-1-simple") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActorWith(SomeActor.get _) 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-12-privateMethod.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example SomeActor factory is a private method. 6 | * Thus wireProps will not find it suitable and fail compilation. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | private def get(a: A) = new SomeActor(a) 19 | } 20 | 21 | val a = new A{} 22 | 23 | val system = ActorSystem("wireAnonymousActorWithFactory-12-privateMethod") 24 | AfterAllTerminate(system) 25 | 26 | val someActor = wireAnonymousActorWith(SomeActor.get _) 27 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A, b: B)(implicit c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(implicit c: C) = new SomeActor(a, new B{}) 20 | } 21 | 22 | val a = new A {} 23 | implicit val c = new C {} 24 | 25 | val system = ActorSystem("wireAnonymousActorWithFactory-14-implicitParameters") 26 | AfterAllTerminate(system) 27 | 28 | val someActor = wireAnonymousActorWith(SomeActor.get _) 29 | 30 | someActor ! "Hey someActor" 31 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-2-manyParameterLists.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A)(b: B, c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(c: C) = new SomeActor(a)(new B{}, c) 20 | } 21 | 22 | val a = new A {} 23 | lazy val b: B = throw new UnsupportedOperationException() 24 | val c = new C {} 25 | 26 | val system = ActorSystem("wireAnonymousActorWithFactory-2-manyParameterLists") 27 | AfterAllTerminate(system) 28 | 29 | val someActor = wireAnonymousActorWith(SomeActor.get _) 30 | 31 | someActor ! "Hey someActor" 32 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireActorWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A) = new SomeActor(a, new B{}) 20 | } 21 | 22 | //no dependency of type A in scope 23 | 24 | val system = ActorSystem("wireAnonymousActorWithFactory-3-missingDependency") 25 | AfterAllTerminate(system) 26 | 27 | wireAnonymousActorWith(SomeActor.get _) 28 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | object SomeActor { 17 | def get() = new SomeActor(new A{}) 18 | } 19 | 20 | lazy val a: A = throw new UnsupportedOperationException() 21 | 22 | val system = ActorSystem("wireAnonymousActorWithFactory-4-noDependenciesAtAll") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = wireAnonymousActorWith(SomeActor.get _) 26 | 27 | someActor ! "Hey someActor" 28 | 29 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-7-notActorFactory.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am trying to make props with a factory returning T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | 11 | object NotActor { 12 | def get() = new NotActor 13 | } 14 | 15 | val system = ActorSystem("wireAnonymousActorWithFactory-7-notActorFactory") 16 | 17 | wireAnonymousActorWith(NotActor.get _) 18 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireAnonymousActorWithProducer-7-notActorProducer.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.akkasupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of IndirectActorProducer class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotProducer {} 9 | 10 | wireAnonymousActorWith[NotProducer] 11 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-1-simple.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | val a = new A {} 17 | 18 | val system = ActorSystem("wireProps-1-simple") 19 | AfterAllTerminate(system) 20 | 21 | val props: Props = wireProps[SomeActor] 22 | 23 | val someActor = system.actorOf(props, "someActor") 24 | 25 | someActor ! "Hey someActor" 26 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-13-missingImplicitDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireProps-13-missingImplicitDependency") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wireProps[SomeActor] 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | 33 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | implicit val d = new D {} 23 | 24 | val system = ActorSystem("wireProps-14-implicitParameters") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wireProps[SomeActor] 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | 33 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-2-manyParameterLists.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireProps-2-manyParameterLists") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wireProps[SomeActor] 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | 33 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.Actor 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireProps` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | //no dependency of type A in scope 18 | 19 | wireProps[SomeActor] 20 | 21 | 22 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | class SomeActor extends Actor { 9 | override def receive: Receive = { 10 | case m => //println(m) 11 | } 12 | } 13 | 14 | val system = ActorSystem("wireProps-4-noDependenciesAtAll") 15 | AfterAllTerminate(system) 16 | 17 | val props: Props = wireProps[SomeActor] 18 | 19 | val someActor = system.actorOf(props, "someActor") 20 | 21 | someActor ! "Hey someActor" 22 | 23 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-7-notActor.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.Props 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am trying to make props of T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | val props: Props = wireProps[NotActor] -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wireProps-9-subtypeDependencyInScope.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | * There is AA object which is subtype of A in scope. 7 | */ 8 | 9 | trait A 10 | trait AA extends A 11 | 12 | //TODO include cases for classes, extends A with B, objects extends trait etc 13 | 14 | class SomeActor(a: A) extends Actor { 15 | override def receive: Receive = { 16 | case m => //println(m) 17 | } 18 | } 19 | 20 | val a: AA = new AA {} 21 | 22 | val system = ActorSystem("wireProps-9-subtypeDependencyInScope") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = system.actorOf(wireProps[SomeActor], "someActor") 26 | 27 | someActor ! "Hey someActor" 28 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithFactory-1-simple.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 2 dependencies. 6 | */ 7 | 8 | trait A 9 | trait B 10 | 11 | class SomeActor(a: A, b: B) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | def get(a: A) = new SomeActor(a, new B{}) 19 | } 20 | 21 | val a = new A {} 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | 24 | val system = ActorSystem("wirePropsWithFactory-1-simple") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wirePropsWith(SomeActor.get _) 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithFactory-12-privateMethod.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example SomeActor factory is a private method. 6 | * Thus wireProps will not find it suitable and fail compilation. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | private def get(a: A) = new SomeActor(a) 19 | } 20 | 21 | val a = new A{} 22 | 23 | val system = ActorSystem("wirePropsWithFactory-12-privateMethod") 24 | AfterAllTerminate(system) 25 | 26 | val someActor = wirePropsWith(SomeActor.get _) 27 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithFactory-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireActorWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A) = new SomeActor(a, new B{}) 20 | } 21 | 22 | //no dependency of type A in scope 23 | 24 | val system = ActorSystem("wirePropsWithFactory-3-missingDependency") 25 | AfterAllTerminate(system) 26 | 27 | wirePropsWith(SomeActor.get _) 28 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithFactory-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | object SomeActor { 17 | def get() = new SomeActor(new A{}) 18 | } 19 | 20 | lazy val a: A = throw new UnsupportedOperationException() 21 | 22 | val system = ActorSystem("wirePropsWithFactory-4-noDependenciesAtAll") 23 | AfterAllTerminate(system) 24 | 25 | val props: Props = wirePropsWith(SomeActor.get _) 26 | 27 | val someActor = system.actorOf(props, "someActor") 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithFactory-7-notActorFactory.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am trying to make props with a factory returning T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | 11 | object NotActor { 12 | def get() = new NotActor 13 | } 14 | 15 | val system = ActorSystem("wirePropsWithFactory-7-notActorFactory") 16 | 17 | wirePropsWith(NotActor.get _) 18 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithProducer-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import akka.actor.{Actor, IndirectActorProducer} 2 | import com.softwaremill.macwire.akkasupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wirePropsWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | class SomeActorProducer(a: A) extends IndirectActorProducer { 19 | override def produce(): Actor = new SomeActor(a, new B{}) 20 | override def actorClass: Class[_ <: Actor] = classOf[SomeActor] 21 | } 22 | 23 | //no dependency of type A in scope 24 | 25 | wirePropsWith[SomeActorProducer] 26 | -------------------------------------------------------------------------------- /macrosAkkaTests/src/test/resources/test-cases/wirePropsWithProducer-7-notActorProducer.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.akkasupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of IndirectActorProducer class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotProducer {} 9 | 10 | wirePropsWith[NotProducer] 11 | -------------------------------------------------------------------------------- /macrosAutoCats/src/main/scala/com/softwaremill/macwire/autocats/package.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | import cats.effect._ 4 | 5 | package object autocats { 6 | def autowire[T](dependencies: Any*): Resource[IO, T] = macro MacwireAutoCatsMacros.autowire_impl[T] 7 | } 8 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/main/scala/com/softwaremill/macwire/CatsAutowireCompileTestsSupport.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | class CatsAutowireCompileTestsSupport extends CompileTestsSupport { 4 | override val GlobalImports = """ 5 | import com.softwaremill.macwire.autocats._ 6 | import cats.effect._ 7 | """ 8 | } 9 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/ambiguousInstances.failure: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(a: A) 3 | 4 | object Test { 5 | def makeA(): Resource[IO, A] = Resource.pure(new A()) 6 | val theB = autowire[B](new A(), makeA _) 7 | 8 | } 9 | 10 | val theC: B = { 11 | import cats.effect.unsafe.implicits.global 12 | Test.theB.allocated.unsafeRunSync()._1 13 | } 14 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/ambiguousTraitImplementations.failure: -------------------------------------------------------------------------------- 1 | trait T 2 | class A() extends T 3 | class B() extends T 4 | class C(t: T) 5 | 6 | object Test { 7 | val theC = autowire[C](new A(), new B()) 8 | } 9 | 10 | val theC: C = { 11 | import cats.effect.unsafe.implicits.global 12 | Test.theC.allocated.unsafeRunSync()._1 13 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/chainingFactoryMethods.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val created = scala.collection.mutable.ListBuffer[String]() 4 | 5 | object Test { 6 | def theA(): Resource[IO, A] = Resource.eval(IO { created.append("a"); A() }) 7 | def theB(b: A): Resource[IO, B] = Resource.eval(IO { created.append("b"); B() }) 8 | val theC: Resource[IO, C] = autowire[C](theA _, theB _) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(created.size == 2) 20 | require(created(0) == "a") 21 | require(created(1) == "b") 22 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/constructInputProvider.failure: -------------------------------------------------------------------------------- 1 | class A(s: String) 2 | class B(a: A) 3 | 4 | object Test { 5 | val theB = autowire[B](new B(new A("s"))) 6 | } 7 | 8 | val theA: A = { 9 | import cats.effect.unsafe.implicits.global 10 | Test.theA.allocated.unsafeRunSync()._1 11 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/constructInstanceWithFactoryMethod.success: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(val a: A) 3 | 4 | val created = scala.collection.mutable.ListBuffer[String]() 5 | 6 | def makeB(a: A) = {created.append("b"); new B(a)} 7 | 8 | object Test { 9 | val theB = autowire[B](makeB _) 10 | 11 | } 12 | 13 | val theB: B = { 14 | import cats.effect.unsafe.implicits.global 15 | Test.theB.allocated.unsafeRunSync()._1 16 | } 17 | 18 | require(theB.a != null) 19 | require(created.size == 1) 20 | require(created(0) == "b") 21 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/factoryMethodWithWiredParam.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | class B(i: Int) 3 | class C(a: A, b: B) 4 | case class D(c: C, s: String) 5 | case class E(c: C, d: D) 6 | 7 | val created = scala.collection.mutable.ListBuffer[String]() 8 | 9 | object Test { 10 | def makeB(a: A): Resource[IO, B] = Resource.eval(IO{ created.append("b"); new B(0)}) 11 | def makeD(c: C): Resource[IO, D] = Resource.eval(IO{ created.append("d"); new D(c, "d")}) 12 | 13 | val theE = autowire[E](makeD _, makeB _) 14 | 15 | } 16 | 17 | val theE: E = { 18 | import cats.effect.unsafe.implicits.global 19 | Test.theE.allocated.unsafeRunSync()._1 20 | } 21 | 22 | require(theE.c != null) 23 | require(theE.d != null) 24 | require(created.size == 2) 25 | require(created(0) == "b") 26 | require(created(1) == "d") -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/factoryNoParameters.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val created = scala.collection.mutable.Set[String]() 4 | 5 | object Test { 6 | def theA: A = { created.add("A"); A() } 7 | val theC: Resource[IO, C] = autowire[C](theA) 8 | } 9 | 10 | val theC: C = { 11 | import cats.effect.unsafe.implicits.global 12 | Test.theC.allocated.unsafeRunSync()._1 13 | } 14 | 15 | require(theC.a != null) 16 | require(theC.b != null) 17 | 18 | require(created.contains("A")) 19 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/factoryWithAutoCreatedParameter.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val created = scala.collection.mutable.Set[String]() 4 | 5 | object Test { 6 | def theA(b: B): A = { created.add(s"A using $b"); A() } 7 | val theC: Resource[IO, C] = autowire[C](theA _) 8 | } 9 | 10 | val theC: C = { 11 | import cats.effect.unsafe.implicits.global 12 | Test.theC.allocated.unsafeRunSync()._1 13 | } 14 | 15 | require(theC.a != null) 16 | require(theC.b != null) 17 | 18 | require(created.contains("A using B()")) 19 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/factoryWithParameter.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val created = scala.collection.mutable.Set[String]() 4 | 5 | object Test { 6 | val theB: B = B() 7 | def theA(b: B): A = { created.add(s"A using $b"); A() } 8 | val theC: Resource[IO, C] = autowire[C](theB, theA _) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(created.contains("A using B()")) 20 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/factoryWithParameterFromIO.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val factoryParams = scala.collection.mutable.ListBuffer[B]() 4 | 5 | object Test { 6 | def theA(b: B): IO[A] = { factoryParams.append(b); IO.pure(A()) } 7 | val theB: Resource[IO, B] = Resource.pure(B()) 8 | val theC: Resource[IO, C] = autowire[C](theA _, theB) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(factoryParams.length == 1) 20 | require(factoryParams.head eq theC.b) 21 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/factoryWithParameterFromResource.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val factoryParams = scala.collection.mutable.ListBuffer[B]() 4 | 5 | object Test { 6 | def theA(b: B): Resource[IO, A] = { factoryParams.append(b); Resource.pure(A()) } 7 | val theB: Resource[IO, B] = Resource.pure(B()) 8 | val theC: Resource[IO, C] = autowire[C](theA _, theB) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(factoryParams.length == 1) 20 | require(factoryParams.head eq theC.b) 21 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/ioProvidedParameter.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val allocated = scala.collection.mutable.ListBuffer[String]() 4 | 5 | object Test { 6 | val theA: IO[A] = IO { allocated.append("A"); A() } 7 | val theB: IO[B] = IO { allocated.append("B"); B() } 8 | val theC: Resource[IO, C] = autowire[C](theA, theB) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(allocated(0) == "A") 20 | require(allocated(1) == "B") -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/missingApplyDependencies.failure: -------------------------------------------------------------------------------- 1 | object Test { 2 | class A() 3 | class B private (a: A) 4 | object B { 5 | def apply(a:A, i: Int) = new B(a) 6 | } 7 | class C(b: B) 8 | 9 | val theC: Resource[IO, C] = autowire[C]() 10 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/missingConstructorDependencies.failure: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(a: A, i: Int) 3 | class C(b: B) 4 | 5 | object Test { 6 | val theC: Resource[IO, C] = autowire[C]() 7 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/missingFactoryMethodDependencies.failure: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(a: A) 3 | class C(b: B) 4 | 5 | object Test { 6 | def makeB(a: A, i: Int) = new B(a) 7 | 8 | val theC: Resource[IO, C] = autowire[C](makeB _) 9 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/missingMultipleConstructorDependencies.failure: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(a: A, i: Int) 3 | class C(b: B, s: String) 4 | 5 | object Test { 6 | val theC: Resource[IO, C] = autowire[C]() 7 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/mixedFactoryMethodParams.success: -------------------------------------------------------------------------------- 1 | class A() 2 | class B() 3 | class C(a: A, b: B) 4 | case class D(c: C) 5 | 6 | val created = scala.collection.mutable.ListBuffer[String]() 7 | 8 | object Test { 9 | 10 | val ioA: IO[A] = IO {created.append("a"); new A()} 11 | val resourceB: Resource[IO, B] = Resource.eval(IO {created.append("b"); new B()}) 12 | def makeC(a: A, b: B): Resource[IO, C] = Resource.eval(IO{ created.append("c"); new C(a, b)}) 13 | 14 | val theD = autowire[D](ioA, resourceB, makeC _) 15 | 16 | } 17 | 18 | val theD: D = { 19 | import cats.effect.unsafe.implicits.global 20 | Test.theD.allocated.unsafeRunSync()._1 21 | } 22 | 23 | require(theD.c != null) 24 | require(created.size == 3) 25 | require(created(0) == "a") 26 | require(created(1) == "b") 27 | require(created(2) == "c") 28 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/notUsedProvider.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val ioD: IO[D] = IO.raiseError(new RuntimeException("Should not be used")) 5 | 6 | def theC: Resource[IO, C] = autowire[C]( 7 | ioD 8 | ) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/resourceFactoryWithParameters.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val factoryParams = scala.collection.mutable.ListBuffer[B]() 4 | 5 | object Test { 6 | def theA(b: B): A = { factoryParams.append(b); A() } 7 | val theB: Resource[IO, B] = Resource.pure(B()) 8 | val theC: Resource[IO, C] = autowire[C](theA _, theB) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(factoryParams.length == 1) 20 | require(factoryParams.head eq theC.b) 21 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/resourceMultiLevelProvidedParameter.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val allocated = scala.collection.mutable.ListBuffer[String]() 4 | 5 | object Test { 6 | val theA: Resource[IO, A] = Resource.make(IO { allocated.append("A"); A() })(_ => IO.unit) 7 | val theE: Resource[IO, E] = autowire[E](theA) 8 | } 9 | 10 | val theE: E = { 11 | import cats.effect.unsafe.implicits.global 12 | Test.theE.allocated.unsafeRunSync()._1 13 | } 14 | 15 | require(theE.a != null) 16 | require(theE.c != null) 17 | require(theE.c.a != null) 18 | require(theE.c.b != null) 19 | 20 | require(allocated.contains("A")) 21 | require(allocated.length == 1) // should be allocated once 22 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/resourceProvidedParameters.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | val allocated = scala.collection.mutable.ListBuffer[String]() 4 | 5 | object Test { 6 | val theA: Resource[IO, A] = Resource.make(IO { allocated.append("A"); A() })(_ => IO.unit) 7 | val theB: Resource[IO, B] = Resource.make(IO { allocated.append("B"); B() })(_ => IO.unit) 8 | val theC: Resource[IO, C] = autowire[C](theA, theB) 9 | } 10 | 11 | val theC: C = { 12 | import cats.effect.unsafe.implicits.global 13 | Test.theC.allocated.unsafeRunSync()._1 14 | } 15 | 16 | require(theC.a != null) 17 | require(theC.b != null) 18 | 19 | require(allocated(0) == "A") 20 | require(allocated(1) == "B") -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/reuseCreatedInstances.success: -------------------------------------------------------------------------------- 1 | import scala.collection.mutable.ListBuffer 2 | val created = ListBuffer[String]() 3 | 4 | class A() { 5 | created.append("a") 6 | } 7 | 8 | class B() { 9 | created.append("b") 10 | } 11 | 12 | class C(val a: A, val b: B) 13 | 14 | class D(val c: C, val a: A, val b: B) 15 | 16 | 17 | object Test { 18 | val theD = autowire[D]() 19 | 20 | } 21 | 22 | val theD: D = { 23 | import cats.effect.unsafe.implicits.global 24 | Test.theD.allocated.unsafeRunSync()._1 25 | } 26 | 27 | require(theD.c != null) 28 | require(theD.c.a == theD.a) 29 | require(theD.c.b == theD.b) 30 | 31 | require(created.size == 2) 32 | require(created.contains("a")) 33 | require(created.contains("b")) 34 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/reusingResourcesInFactoryMethods.success: -------------------------------------------------------------------------------- 1 | 2 | import scala.collection.mutable.ListBuffer 3 | 4 | case class A() 5 | class B() 6 | case class C(b: B) 7 | case class D(b: B) 8 | case class E(c: C, d: D) 9 | 10 | val created = scala.collection.mutable.Set[String]() 11 | 12 | object Test { 13 | def makeB(a: A): Resource[IO, B] = Resource.eval(IO{ created.add("b"); new B()}) 14 | 15 | val theE = autowire[E](makeB _) 16 | 17 | } 18 | 19 | val theE: E = { 20 | import cats.effect.unsafe.implicits.global 21 | Test.theE.allocated.unsafeRunSync()._1 22 | } 23 | 24 | require(theE.c != null) 25 | require(theE.d != null) 26 | require(created.size == 1) 27 | require(created.contains("b")) 28 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleAutoParameters.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | def theC: Resource[IO, C] = autowire[C]() 5 | } 6 | 7 | val t = new Test {} 8 | 9 | val theC: C = { 10 | import cats.effect.unsafe.implicits.global 11 | t.theC.allocated.unsafeRunSync()._1 12 | } 13 | 14 | require(theC.a != null) 15 | require(theC.b != null) 16 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleMissingDeps.failure: -------------------------------------------------------------------------------- 1 | class A(s: String) 2 | class B(a: A) 3 | 4 | object Test { 5 | val theB: Resource[IO, B] = autowire[B]() 6 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleMissingMultiLevelDeps.failure: -------------------------------------------------------------------------------- 1 | class A(s: String) 2 | class B(a: A) 3 | class C(b: B) 4 | 5 | object Test { 6 | val theC: Resource[IO, C] = autowire[C]() 7 | } -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleMultiLevelNoParameters.success: -------------------------------------------------------------------------------- 1 | class A() 2 | class B() 3 | class C(val a: A, val b: B) 4 | 5 | class E(val a: A, val c: C) 6 | 7 | trait Test { 8 | def theE: Resource[IO, E] = autowire[E]() 9 | } 10 | 11 | val t = new Test {} 12 | 13 | val theE: E = { 14 | import cats.effect.unsafe.implicits.global 15 | t.theE.allocated.unsafeRunSync()._1 16 | } 17 | 18 | require(theE.a != null) 19 | require(theE.c != null) 20 | require(theE.c.a != null) 21 | require(theE.c.b != null) 22 | 23 | require(theE.a == theE.c.a) -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleMultiLevelProvidedParameter.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | val theA: A = A() 5 | def theE: Resource[IO, E] = autowire[E](theA) 6 | } 7 | 8 | val t = new Test {} 9 | 10 | val theE: E = { 11 | import cats.effect.unsafe.implicits.global 12 | t.theE.allocated.unsafeRunSync()._1 13 | } 14 | 15 | require(theE.a eq t.theA) 16 | require(theE.c != null) 17 | require(theE.c.a eq t.theA) 18 | require(theE.c.b != null) 19 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleNoParameters.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | def theA: Resource[IO, A] = autowire[A]() 5 | } 6 | 7 | val t = new Test {} 8 | 9 | val theA: A = { 10 | import cats.effect.unsafe.implicits.global 11 | t.theA.allocated.unsafeRunSync()._1 12 | } 13 | 14 | require(theA != null) 15 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleProvidedParameter.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | val theA = A() 5 | def theC: Resource[IO, C] = autowire[C](theA) 6 | } 7 | 8 | val t = new Test {} 9 | 10 | val theC: C = { 11 | import cats.effect.unsafe.implicits.global 12 | t.theC.allocated.unsafeRunSync()._1 13 | } 14 | 15 | require(theC.a eq t.theA) 16 | require(theC.b != null) 17 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/simpleUsingCompanion.success: -------------------------------------------------------------------------------- 1 | object Test { 2 | class A() 3 | class B private (a: A) 4 | object B { 5 | def apply(a: A): B = new B(a) 6 | } 7 | 8 | val theB: Resource[IO, B] = autowire[B]() 9 | } 10 | 11 | require(Test.theB != null) -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/sortFactoryMethods.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | class B(i: Int) 3 | class C(b: B, s: String) 4 | case class D(c: C) 5 | case class E(c: C, d: D) 6 | 7 | val created = scala.collection.mutable.ListBuffer[String]() 8 | 9 | object Test { 10 | def makeB(a: A): Resource[IO, B] = Resource.eval(IO{ created.append("b"); new B(0)}) 11 | def makeC(b: B): Resource[IO, C] = Resource.eval(IO{ created.append("c"); new C(b, "c")}) 12 | 13 | val theE = autowire[E](makeC _, makeB _) 14 | 15 | } 16 | 17 | val theE: E = { 18 | import cats.effect.unsafe.implicits.global 19 | Test.theE.allocated.unsafeRunSync()._1 20 | } 21 | 22 | require(theE.c != null) 23 | require(theE.d != null) 24 | require(created.size == 2) 25 | require(created(0) == "b") 26 | require(created(1) == "c") 27 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/subtypeParameter.success: -------------------------------------------------------------------------------- 1 | trait A 2 | class AA(i: Int) extends A 3 | 4 | class B(val a: A) 5 | 6 | object Test { 7 | 8 | val theAA: AA = new AA(1) 9 | val theB: B = { 10 | import cats.effect.unsafe.implicits.global 11 | 12 | val resource = autowire[B](theAA) 13 | resource.allocated.unsafeRunSync()._1 14 | } 15 | 16 | } 17 | 18 | require(Test.theB.a == Test.theAA) 19 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/subtypeResourceParameter.success: -------------------------------------------------------------------------------- 1 | trait A 2 | class AA(i: Int) extends A 3 | 4 | class B(val a: A) 5 | 6 | object Test { 7 | 8 | val theAA: Resource[IO, AA] = Resource.pure(new AA(1)) 9 | val theB: B = { 10 | import cats.effect.unsafe.implicits.global 11 | 12 | val resource = autowire[B](theAA) 13 | resource.allocated.unsafeRunSync()._1 14 | } 15 | 16 | } 17 | 18 | val theAaValue = { 19 | import cats.effect.unsafe.implicits.global 20 | 21 | Test.theAA.allocated.unsafeRunSync()._1 22 | } 23 | require(Test.theB.a == theAaValue) 24 | -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/todo/autowireTuples.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val tuple = autowire[(A, B)]() 5 | } 6 | 7 | val tuple: (A, B) = { 8 | import cats.effect.unsafe.implicits.global 9 | Test.tuple.allocated.unsafeRunSync()._1 10 | } 11 | 12 | require(tuple._1 == A()) 13 | require(tuple._2 == B()) -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/todo/creatorBacktracking.success: -------------------------------------------------------------------------------- 1 | val created = scala.collection.mutable.ListBuffer[Int]() 2 | 3 | class A() 4 | 5 | class B private (a: A) 6 | object B { 7 | def apply(a:A, i: Int) = new B(a) 8 | } 9 | 10 | class C(b: B) 11 | object C { 12 | def apply(a: A) = { 13 | created.append(1) 14 | B(a, 1) 15 | } 16 | } 17 | 18 | class D(c: C) 19 | 20 | object Test { 21 | val theD: Resource[IO, D] = autowire[D]() 22 | } 23 | 24 | require(created.size == 1) 25 | require(created(0) == 1) -------------------------------------------------------------------------------- /macrosAutoCatsTests/src/test/resources/test-cases/todo/passSomeParameters.success: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(val a: A) 3 | 4 | val created = scala.collection.mutable.ListBuffer[String]() 5 | 6 | def makeB(s: String, a: A) = { created.append("b"); created.append(s); new B(a)} 7 | 8 | object Test { 9 | val theB = autowire[B](makeB("s", _)) 10 | 11 | } 12 | 13 | val theB: B = { 14 | import cats.effect.unsafe.implicits.global 15 | Test.theB.allocated.unsafeRunSync()._1 16 | } 17 | 18 | require(theB.a != null) 19 | require(created.size == 2) 20 | require(created(0) == "b") 21 | require(created(0) == "s") 22 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-1-simple.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | val a = new A {} 17 | 18 | val system = ActorSystem("wireActor-1-simple") 19 | AfterAllTerminate(system) 20 | 21 | val someActor = wireActor[SomeActor]("bob") 22 | 23 | someActor ! "Hey someActor" 24 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-13-missingImplicitDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireActor-13-missingImplicitDependency") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActor[SomeActor]("bob") 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | implicit val d = new D {} 23 | 24 | val system = ActorSystem("wireActor-14-implicitParameters") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActor[SomeActor]("bob") 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-2-manyParameterLists.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireActor-2-manyParameterLists") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActor[SomeActor]("bob") 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | //no dependency of type A in scope 18 | 19 | val system: ActorSystem = ActorSystem("wireActor-3-missingDependency") 20 | AfterAllTerminate(system) 21 | 22 | //no dependency of type A in scope 23 | wireActor[SomeActor]("bob") 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-3.1-missingActorRefFactoryDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.Actor 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | val a = new A{} 18 | 19 | //no dependency of type ActorRefFactory in scope 20 | wireActor[SomeActor]("bob") 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | class SomeActor extends Actor { 9 | override def receive: Receive = { 10 | case m => //println(m) 11 | } 12 | } 13 | 14 | val system = ActorSystem("wireActor-4-noDependenciesAtAll") 15 | AfterAllTerminate(system) 16 | 17 | val someActor = wireActor[SomeActor]("Bob") 18 | 19 | someActor ! "Hey someActor" 20 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-7-notActor.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.pekkosupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of Actor class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotActor {} 9 | wireActor[NotActor] -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActor-9-subtypeDependencyInScope.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | * There is AA object which is subtype of A in scope. 7 | */ 8 | 9 | trait A 10 | trait AA extends A 11 | 12 | //TODO include cases for classes, extends A with B, objects extends trait etc 13 | 14 | class SomeActor(a: A) extends Actor { 15 | override def receive: Receive = { 16 | case m => //println(m) 17 | } 18 | } 19 | 20 | val a: AA = new AA {} 21 | 22 | val system = ActorSystem("wireActor-9-subtypeDependencyInScope") 23 | AfterAllTerminate(system) 24 | val someActor = wireActor[SomeActor]("bob") 25 | 26 | someActor ! "Hey someActor" 27 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-1-simple.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 2 dependencies. 6 | */ 7 | 8 | trait A 9 | trait B 10 | 11 | class SomeActor(a: A, b: B) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | def get(a: A) = new SomeActor(a, new B{}) 19 | } 20 | 21 | val a = new A {} 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | 24 | val system = ActorSystem("wireActorWithFactory-1-simple") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireActorWith(SomeActor.get _)("bob") 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-12-privateMethod.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example SomeActor factory is a private method. 6 | * Thus wireProps will not find it suitable and fail compilation. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | private def get(a: A) = new SomeActor(a) 19 | } 20 | 21 | val a = new A{} 22 | 23 | val system = ActorSystem("wireActorWithFactory-12-privateMethod") 24 | AfterAllTerminate(system) 25 | 26 | val someActor = wireActorWith(SomeActor.get _)("bob") 27 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A, b: B)(implicit c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(implicit c: C) = new SomeActor(a, new B{}) 20 | } 21 | 22 | val a = new A {} 23 | implicit val c = new C {} 24 | 25 | val system = ActorSystem("wireActorWithFactory-14-implicitParameters") 26 | AfterAllTerminate(system) 27 | 28 | val someActor = wireActorWith(SomeActor.get _)("bob") 29 | 30 | someActor ! "Hey someActor" 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-2-manyParameterLists.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A)(b: B, c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(c: C) = new SomeActor(a)(new B{}, c) 20 | } 21 | 22 | val a = new A {} 23 | lazy val b: B = throw new UnsupportedOperationException() 24 | val c = new C {} 25 | 26 | val system = ActorSystem("wireActorWithFactory-2-manyParameterLists") 27 | AfterAllTerminate(system) 28 | 29 | val someActor = wireActorWith(SomeActor.get _)("bob") 30 | 31 | someActor ! "Hey someActor" 32 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireActorWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A) = new SomeActor(a, new B{}) 20 | } 21 | 22 | //no dependency of type A in scope 23 | 24 | val system = ActorSystem("wireActorWithFactory-3-missingDependency") 25 | AfterAllTerminate(system) 26 | 27 | wireActorWith(SomeActor.get _)("bob") 28 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | object SomeActor { 17 | def get() = new SomeActor(new A{}) 18 | } 19 | 20 | lazy val a: A = throw new UnsupportedOperationException() 21 | 22 | val system = ActorSystem("wireActorWithFunction-4-noDependenciesAtAll") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = wireActorWith(SomeActor.get _)("bob") 26 | 27 | someActor ! "Hey someActor" 28 | 29 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithFactory-7-notActorFactory.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am trying to make props with a factory returning T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | 11 | object NotActor { 12 | def get() = new NotActor 13 | } 14 | 15 | val system = ActorSystem("wireActorWithFunction-7-notActorFactory") 16 | 17 | wireActorWith(NotActor.get _)("bob") 18 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireActorWithProducer-7-notActorProducer.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.pekkosupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of IndirectActorProducer class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotProducer {} 9 | 10 | wireActorWith[NotProducer]("bob") 11 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-1-simple.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | val a = new A {} 17 | 18 | val system = ActorSystem("wireAnonymousActor-1-simple") 19 | AfterAllTerminate(system) 20 | 21 | val someActor = wireAnonymousActor[SomeActor] 22 | 23 | someActor ! "Hey someActor" 24 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-13-missingImplicitDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireAnonymousActor-13-missingImplicitDependency") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActor[SomeActor] 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | implicit val d = new D {} 23 | 24 | val system = ActorSystem("wireAnonymousActor-14-implicitParameters") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActor[SomeActor] 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-2-manyParameterLists.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireAnonymousActor-2-manyParameterLists") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActor[SomeActor] 28 | 29 | someActor ! "Hey someActor" 30 | 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | val system: ActorSystem = ActorSystem("wireAnonymousActor-3-missingDependency") 18 | AfterAllTerminate(system) 19 | 20 | //no dependency of type A in scope 21 | wireAnonymousActor[SomeActor] 22 | 23 | 24 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-3.1-missingActorRefFactoryDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.Actor 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wire*` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | val a = new A {} 18 | 19 | //no dependency of type ActorRefFactory in scope 20 | wireAnonymousActor[SomeActor] 21 | 22 | 23 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | class SomeActor extends Actor { 9 | override def receive: Receive = { 10 | case m => //println(m) 11 | } 12 | } 13 | 14 | val system = ActorSystem("wireAnonymousActor-4-noDependenciesAtAll") 15 | AfterAllTerminate(system) 16 | 17 | val someActor = wireAnonymousActor[SomeActor] 18 | 19 | someActor ! "Hey someActor" 20 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-7-notActor.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.pekkosupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of Actor class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotActor {} 9 | wireAnonymousActor[NotActor] -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActor-9-subtypeDependencyInScope.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | * There is AA object which is subtype of A in scope. 7 | */ 8 | 9 | trait A 10 | trait AA extends A 11 | 12 | //TODO include cases for classes, extends A with B, objects extends trait etc 13 | 14 | class SomeActor(a: A) extends Actor { 15 | override def receive: Receive = { 16 | case m => //println(m) 17 | } 18 | } 19 | 20 | val a: AA = new AA {} 21 | 22 | val system = ActorSystem("wireActor-1-simple") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = wireAnonymousActor[SomeActor] 26 | 27 | someActor ! "Hey someActor" 28 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-1-simple.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 2 dependencies. 6 | */ 7 | 8 | trait A 9 | trait B 10 | 11 | class SomeActor(a: A, b: B) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | def get(a: A) = new SomeActor(a, new B{}) 19 | } 20 | 21 | val a = new A {} 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | 24 | val system = ActorSystem("wireAnonymousActorWithFactory-1-simple") 25 | AfterAllTerminate(system) 26 | 27 | val someActor = wireAnonymousActorWith(SomeActor.get _) 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-12-privateMethod.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example SomeActor factory is a private method. 6 | * Thus wireProps will not find it suitable and fail compilation. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | private def get(a: A) = new SomeActor(a) 19 | } 20 | 21 | val a = new A{} 22 | 23 | val system = ActorSystem("wireAnonymousActorWithFactory-12-privateMethod") 24 | AfterAllTerminate(system) 25 | 26 | val someActor = wireAnonymousActorWith(SomeActor.get _) 27 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | 12 | class SomeActor(a: A, b: B)(implicit c: C) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A)(implicit c: C) = new SomeActor(a, new B{}) 20 | } 21 | 22 | val a = new A {} 23 | implicit val c = new C {} 24 | 25 | val system = ActorSystem("wireAnonymousActorWithFactory-14-implicitParameters") 26 | AfterAllTerminate(system) 27 | 28 | val someActor = wireAnonymousActorWith(SomeActor.get _) 29 | 30 | someActor ! "Hey someActor" 31 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireActorWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A) = new SomeActor(a, new B{}) 20 | } 21 | 22 | //no dependency of type A in scope 23 | 24 | val system = ActorSystem("wireAnonymousActorWithFactory-3-missingDependency") 25 | AfterAllTerminate(system) 26 | 27 | wireAnonymousActorWith(SomeActor.get _) 28 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | object SomeActor { 17 | def get() = new SomeActor(new A{}) 18 | } 19 | 20 | lazy val a: A = throw new UnsupportedOperationException() 21 | 22 | val system = ActorSystem("wireAnonymousActorWithFactory-4-noDependenciesAtAll") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = wireAnonymousActorWith(SomeActor.get _) 26 | 27 | someActor ! "Hey someActor" 28 | 29 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithFactory-7-notActorFactory.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am trying to make props with a factory returning T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | 11 | object NotActor { 12 | def get() = new NotActor 13 | } 14 | 15 | val system = ActorSystem("wireAnonymousActorWithFactory-7-notActorFactory") 16 | 17 | wireAnonymousActorWith(NotActor.get _) 18 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireAnonymousActorWithProducer-7-notActorProducer.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.pekkosupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of IndirectActorProducer class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotProducer {} 9 | 10 | wireAnonymousActorWith[NotProducer] 11 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-1-simple.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | val a = new A {} 17 | 18 | val system = ActorSystem("wireProps-1-simple") 19 | AfterAllTerminate(system) 20 | 21 | val props: Props = wireProps[SomeActor] 22 | 23 | val someActor = system.actorOf(props, "someActor") 24 | 25 | someActor ! "Hey someActor" 26 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-13-missingImplicitDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireProps-13-missingImplicitDependency") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wireProps[SomeActor] 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | 33 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-14-implicitParameters.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists and an implicit parameter list. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(implicit d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | implicit val d = new D {} 23 | 24 | val system = ActorSystem("wireProps-14-implicitParameters") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wireProps[SomeActor] 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | 33 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-2-manyParameterLists.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with many parameter lists. 6 | */ 7 | 8 | trait A 9 | trait B 10 | trait C 11 | trait D 12 | 13 | class SomeActor(a: A)(b: B, c: C)(d: D) extends Actor { 14 | override def receive: Receive = { 15 | case m => //println(m) 16 | } 17 | } 18 | 19 | val a = new A {} 20 | val b = new B {} 21 | val c = new C {} 22 | val d = new D {} 23 | 24 | val system = ActorSystem("wireProps-2-manyParameterLists") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wireProps[SomeActor] 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | 33 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.Actor 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireProps` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | //no dependency of type A in scope 18 | 19 | wireProps[SomeActor] 20 | 21 | 22 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | class SomeActor extends Actor { 9 | override def receive: Receive = { 10 | case m => //println(m) 11 | } 12 | } 13 | 14 | val system = ActorSystem("wireProps-4-noDependenciesAtAll") 15 | AfterAllTerminate(system) 16 | 17 | val props: Props = wireProps[SomeActor] 18 | 19 | val someActor = system.actorOf(props, "someActor") 20 | 21 | someActor ! "Hey someActor" 22 | 23 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-7-notActor.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.Props 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am trying to make props of T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | val props: Props = wireProps[NotActor] -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wireProps-9-subtypeDependencyInScope.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 1 dependency. 6 | * There is AA object which is subtype of A in scope. 7 | */ 8 | 9 | trait A 10 | trait AA extends A 11 | 12 | //TODO include cases for classes, extends A with B, objects extends trait etc 13 | 14 | class SomeActor(a: A) extends Actor { 15 | override def receive: Receive = { 16 | case m => //println(m) 17 | } 18 | } 19 | 20 | val a: AA = new AA {} 21 | 22 | val system = ActorSystem("wireProps-9-subtypeDependencyInScope") 23 | AfterAllTerminate(system) 24 | 25 | val someActor = system.actorOf(wireProps[SomeActor], "someActor") 26 | 27 | someActor ! "Hey someActor" 28 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithFactory-1-simple.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor with 2 dependencies. 6 | */ 7 | 8 | trait A 9 | trait B 10 | 11 | class SomeActor(a: A, b: B) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | def get(a: A) = new SomeActor(a, new B{}) 19 | } 20 | 21 | val a = new A {} 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | 24 | val system = ActorSystem("wirePropsWithFactory-1-simple") 25 | AfterAllTerminate(system) 26 | 27 | val props: Props = wirePropsWith(SomeActor.get _) 28 | 29 | val someActor = system.actorOf(props, "someActor") 30 | 31 | someActor ! "Hey someActor" 32 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithFactory-12-privateMethod.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example SomeActor factory is a private method. 6 | * Thus wireProps will not find it suitable and fail compilation. 7 | */ 8 | 9 | trait A 10 | 11 | class SomeActor(a: A) extends Actor { 12 | override def receive: Receive = { 13 | case m => //println(m) 14 | } 15 | } 16 | 17 | object SomeActor { 18 | private def get(a: A) = new SomeActor(a) 19 | } 20 | 21 | val a = new A{} 22 | 23 | val system = ActorSystem("wirePropsWithFactory-12-privateMethod") 24 | AfterAllTerminate(system) 25 | 26 | val someActor = wirePropsWith(SomeActor.get _) 27 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithFactory-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wireActorWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | object SomeActor { 19 | def get(a: A) = new SomeActor(a, new B{}) 20 | } 21 | 22 | //no dependency of type A in scope 23 | 24 | val system = ActorSystem("wirePropsWithFactory-3-missingDependency") 25 | AfterAllTerminate(system) 26 | 27 | wirePropsWith(SomeActor.get _) 28 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithFactory-4-noDependenciesAtAll.success: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor without dependencies. 6 | */ 7 | 8 | trait A 9 | 10 | class SomeActor(a: A) extends Actor { 11 | override def receive: Receive = { 12 | case m => //println(m) 13 | } 14 | } 15 | 16 | object SomeActor { 17 | def get() = new SomeActor(new A{}) 18 | } 19 | 20 | lazy val a: A = throw new UnsupportedOperationException() 21 | 22 | val system = ActorSystem("wirePropsWithFactory-4-noDependenciesAtAll") 23 | AfterAllTerminate(system) 24 | 25 | val props: Props = wirePropsWith(SomeActor.get _) 26 | 27 | val someActor = system.actorOf(props, "someActor") 28 | 29 | someActor ! "Hey someActor" 30 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithFactory-7-notActorFactory.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, ActorSystem, Props} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am trying to make props with a factory returning T which is not subtype of Actor class. 6 | * This will not compile. 7 | */ 8 | 9 | class NotActor {} 10 | 11 | object NotActor { 12 | def get() = new NotActor 13 | } 14 | 15 | val system = ActorSystem("wirePropsWithFactory-7-notActorFactory") 16 | 17 | wirePropsWith(NotActor.get _) 18 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithProducer-3-missingDependency.failure: -------------------------------------------------------------------------------- 1 | import org.apache.pekko.actor.{Actor, IndirectActorProducer} 2 | import com.softwaremill.macwire.pekkosupport._ 3 | 4 | /** 5 | * In this example I am constructing simple actor but I don't provide dependency for it. 6 | * `wirePropsWithProducer` will not find it and then not compile. 7 | */ 8 | 9 | trait A 10 | trait B 11 | 12 | class SomeActor(a: A, b: B) extends Actor { 13 | override def receive: Receive = { 14 | case m => //println(m) 15 | } 16 | } 17 | 18 | class SomeActorProducer(a: A) extends IndirectActorProducer { 19 | override def produce(): Actor = new SomeActor(a, new B{}) 20 | override def actorClass: Class[_ <: Actor] = classOf[SomeActor] 21 | } 22 | 23 | //no dependency of type A in scope 24 | 25 | wirePropsWith[SomeActorProducer] 26 | -------------------------------------------------------------------------------- /macrosPekkoTests/src/test/resources/test-cases/wirePropsWithProducer-7-notActorProducer.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.pekkosupport._ 2 | 3 | /** 4 | * In this example I am trying to make props of T which is not subtype of IndirectActorProducer class. 5 | * This will not compile. 6 | */ 7 | 8 | class NotProducer {} 9 | 10 | wirePropsWith[NotProducer] 11 | -------------------------------------------------------------------------------- /project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.1 2 | -------------------------------------------------------------------------------- /project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.11.0") 2 | 3 | val sbtSoftwareMillVersion = "2.0.26" 4 | addSbtPlugin("com.softwaremill.sbt-softwaremill" % "sbt-softwaremill-common" % sbtSoftwareMillVersion) 5 | addSbtPlugin("com.softwaremill.sbt-softwaremill" % "sbt-softwaremill-publish" % sbtSoftwareMillVersion) 6 | 7 | addSbtPlugin("org.jetbrains.scala" % "sbt-ide-settings" % "1.1.2") 8 | 9 | addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.19.0") 10 | 11 | addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.8") 12 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/aop/Interceptor.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.aop 2 | 3 | import scala.reflect.ClassTag 4 | 5 | trait Interceptor { 6 | 7 | /** Intercept calls to methods of the `intercepted` instance using this interceptor. 8 | */ 9 | def apply[T <: AnyRef](intercepted: T)(implicit tag: ClassTag[T]): T 10 | } 11 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/aop/InvocationContext.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.aop 2 | 3 | import java.lang.reflect.Method 4 | 5 | trait InvocationContext { 6 | def method: Method 7 | def parameters: Array[AnyRef] 8 | def target: AnyRef 9 | 10 | def proceed(): AnyRef = proceedWithParameters(parameters) 11 | def proceedWithParameters(parameters: Array[AnyRef]): AnyRef 12 | } 13 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/aop/NoOpInterceptor.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.aop 2 | 3 | import scala.reflect.ClassTag 4 | 5 | object NoOpInterceptor extends Interceptor { 6 | def apply[T](intercepted: T)(implicit tag: ClassTag[T]) = intercepted 7 | } 8 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/scopes/NoOpScope.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.scopes 2 | 3 | import scala.reflect.ClassTag 4 | 5 | object NoOpScope extends Scope { 6 | def apply[T](createT: => T)(implicit tag: ClassTag[T]) = createT 7 | def get[T](key: String, createT: => T) = throw new RuntimeException("Should never be called!") 8 | } 9 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/scopes/ProxyingScope.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.scopes 2 | 3 | import java.util.UUID 4 | import javassist.util.proxy.MethodHandler 5 | import java.lang.reflect.Method 6 | import scala.reflect.ClassTag 7 | import com.softwaremill.macwire.proxy.ProxyCreator 8 | 9 | trait ProxyingScope extends Scope { 10 | 11 | def apply[T](createT: => T)(implicit tag: ClassTag[T]): T = { 12 | val key = UUID.randomUUID().toString 13 | val methodHandler = new MethodHandler() { 14 | def invoke(self: Any, thisMethod: Method, proceed: Method, args: Array[AnyRef]) = { 15 | val instance = get(key, createT) 16 | thisMethod.invoke(instance, args: _*) 17 | } 18 | } 19 | 20 | ProxyCreator.create(tag, methodHandler) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/scopes/Scope.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.scopes 2 | 3 | import scala.reflect.ClassTag 4 | 5 | trait Scope { 6 | 7 | /** Create a scoped value with the given factory class. 8 | */ 9 | def apply[T](createT: => T)(implicit tag: ClassTag[T]): T 10 | 11 | /** Get an instance from the current scope, for the specified key, using the given factory class to create an instance 12 | * if not yet created. 13 | */ 14 | def get[T](key: String, createT: => T): T 15 | } 16 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/scopes/ScopeStorage.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.scopes 2 | 3 | trait ScopeStorage { 4 | def get(key: String): Option[Any] 5 | def set(key: String, value: Any): Unit 6 | } 7 | 8 | class MapScopeStorage(map: collection.mutable.Map[String, Any]) extends ScopeStorage { 9 | def get(key: String) = map.get(key) 10 | def set(key: String, value: Any): Unit = { map(key) = value } 11 | } 12 | -------------------------------------------------------------------------------- /proxy/src/main/scala/com/softwaremill/macwire/scopes/ThreadLocalScope.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.scopes 2 | 3 | class ThreadLocalScope extends ProxyingScope with ThreadLocalScopeStorage 4 | -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonClassesWithImplicitDependencies: -------------------------------------------------------------------------------- 1 | case class Dependency() 2 | case class Service()(implicit val dependency: Dependency) 3 | -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonClassesWithTraits: -------------------------------------------------------------------------------- 1 | trait A 2 | class AImpl extends A 3 | 4 | trait B 5 | class BImpl extends B 6 | 7 | trait C 8 | class CImpl(val a: A, val b: B) extends C 9 | 10 | class DImpl(val c: C) 11 | -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonClassesWithTraitsNotNullCheck: -------------------------------------------------------------------------------- 1 | val t = new Test {} 2 | 3 | require(t.theC.a != null) 4 | require(t.theC.b != null) 5 | 6 | require(t.theC.a eq t.theA) 7 | require(t.theC.b eq t.theB) 8 | 9 | require(t.theD.c != null) 10 | 11 | require(t.theD.c eq t.theC) 12 | -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonHKTClasses: -------------------------------------------------------------------------------- 1 | import scala.language.higherKinds 2 | 3 | case class A[FA[_]]() 4 | case class B[FB[_]]( a:A[FB] ) 5 | case class C[FC[_]]( a:A[FC], b:B[FC] ) 6 | 7 | trait IO[T] 8 | trait OptionT[F[_], T] 9 | -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonSimpleClasses: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | case class C(a: A, b: B) 4 | 5 | // not always used 6 | case class D(c: C) 7 | case class E(a: A, c: C) -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonSimpleNotNullCheck: -------------------------------------------------------------------------------- 1 | val t = new Test {} 2 | 3 | require(t.theC.a != null) 4 | require(t.theC.b != null) 5 | 6 | require(t.theC.a eq t.theA) 7 | require(t.theC.b eq t.theB) -------------------------------------------------------------------------------- /test-util/src/main/resources/include/commonTaggedClasses: -------------------------------------------------------------------------------- 1 | import com.softwaremill.tagging._ 2 | 3 | class Berry() 4 | trait Black 5 | trait Blue 6 | trait Red 7 | 8 | case class BlueberryBasket(blueberry: Berry @@ Blue) -------------------------------------------------------------------------------- /test-util/src/main/scala-3/com/softwaremill/macwire/Properties.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | import java.io.File 4 | 5 | object Properties { 6 | def currentClasspath = sys.props("java.class.path") 7 | } 8 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/anonFuncAndMethodsArgsWiredOk.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | val a = (a: A) => { 5 | def b(b: B) = { 6 | wire[C] 7 | } 8 | b _ 9 | } 10 | } 11 | 12 | val aDep = new A() 13 | val bDep = new B() 14 | val c = Module.a(aDep)(bDep) 15 | 16 | require(c.a eq aDep) 17 | require(c.b eq bDep) 18 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/anonFuncArgsWiredOk.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | val a = new A() 5 | val c1 = (b: B) => wire[C] 6 | val c2 = (b: B) => { 7 | val c: C = { 8 | System.getProperty("mary") 9 | wire[C] 10 | } 11 | // do sthg 12 | System.getProperty("john") 13 | c 14 | } 15 | } 16 | 17 | val b = new B() 18 | val c1 = Module.c1(b) 19 | val c2 = Module.c2(b) 20 | 21 | require(c1.a eq Module.a) 22 | require(c1.b eq b) 23 | 24 | require(c2.a eq Module.a) 25 | require(c2.b eq b) 26 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/autowireMembersOf.success: -------------------------------------------------------------------------------- 1 | trait A 2 | trait B 3 | class Deps(val a: A, b: B): 4 | def bb: B = b 5 | def cc(z: Int): A = a 6 | case class C(a: A, b: B) 7 | 8 | val d = new Deps(new A {}, new B {}) 9 | val c = autowire[C](autowireMembersOf(d)) 10 | 11 | assert(c.a eq d.a) 12 | assert(c.b eq d.bb) 13 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/autowireMembersOfDuplicate.failure: -------------------------------------------------------------------------------- 1 | class A 2 | class B 3 | class Deps(val a: A, b: B): 4 | def bb: B = b 5 | def cc(z: Int): A = a 6 | case class C(a: A, b: B) 7 | 8 | val d = new Deps(new A, new B) 9 | autowire[C](autowireMembersOf(d), new A) 10 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/classOf.success: -------------------------------------------------------------------------------- 1 | trait A 2 | case class AImpl() extends A 3 | case class B(a: A) 4 | 5 | val b = autowire[B](classOf[AImpl]) 6 | assert(b.a.isInstanceOf[AImpl]) 7 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/cyclicDependency.failure: -------------------------------------------------------------------------------- 1 | case class A(b: B) 2 | case class B(a: A) 3 | 4 | autowire[A]() 5 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/duplicate.failure: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | val a = A() 5 | autowire[B](a, a) 6 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/function1fromMethod.success: -------------------------------------------------------------------------------- 1 | case class C() 2 | trait A 3 | case class AImpl(c: C) extends A 4 | case class B(a: A) 5 | 6 | def createA(c: C): A = AImpl(c) 7 | 8 | val b = autowire[B](createA) 9 | assert(b.a.isInstanceOf[AImpl]) 10 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/function2.success: -------------------------------------------------------------------------------- 1 | case class C() 2 | case class D() 3 | trait A 4 | case class AImpl(c: C, d: D) extends A 5 | case class B(a: A) 6 | 7 | val createA = (c: C, d: D) => AImpl(c, d) 8 | 9 | val b = autowire[B](createA) 10 | assert(b.a.isInstanceOf[AImpl]) 11 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/function2constructorAsFunction.success: -------------------------------------------------------------------------------- 1 | case class C() 2 | case class D() 3 | trait A 4 | case class AImpl(c: C, d: D) extends A 5 | case class B(a: A) 6 | 7 | val b = autowire[B](AImpl(_, _)) 8 | assert(b.a.isInstanceOf[AImpl]) 9 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/function2fromMethod.success: -------------------------------------------------------------------------------- 1 | case class C() 2 | case class D() 3 | trait A 4 | case class AImpl(c: C, d: D) extends A 5 | case class B(a: A) 6 | 7 | def createA(c: C, d: D): A = AImpl(c, d) 8 | 9 | val b = autowire[B](createA) 10 | assert(b.a.isInstanceOf[AImpl]) 11 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/plainTrait.failure: -------------------------------------------------------------------------------- 1 | trait A 2 | case class B(a: A) 3 | 4 | autowire[B]() 5 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/primitives.failure: -------------------------------------------------------------------------------- 1 | class A(s: String) 2 | 3 | autowire[A]("xyz") -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/privateConstructor.failure: -------------------------------------------------------------------------------- 1 | case class A private () 2 | 3 | autowire[A]() 4 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/simpleApply.success: -------------------------------------------------------------------------------- 1 | case class B() 2 | case class A private (b: B) 3 | object A: 4 | def apply(b: B): A = new A(b) 5 | 6 | autowire[A]() -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/simpleNoDependencies.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | case class C(a: A, b: B) 4 | case class D(c: C) 5 | 6 | val d = autowire[D]() 7 | 8 | require(d != null) 9 | require(d.c != null) 10 | require(d.c.a != null) 11 | require(d.c.b != null) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/simpleOneDependency.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | case class C(a: A, b: B) 4 | case class D(c: C) 5 | 6 | val a = A() 7 | val d = autowire[D](a) 8 | 9 | require(d.c.a eq a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/simpleReuseDependency.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | case class C(a: A) 4 | case class D(b: B, c: C) 5 | 6 | val a = A() 7 | val d = autowire[D](a) 8 | 9 | require(d.b.a eq a) 10 | require(d.c.a eq a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/simpleReuseWired.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | case class C(a: A) 4 | case class D(b: B, c: C) 5 | 6 | val d = autowire[D]() 7 | 8 | require(d.b.a eq d.c.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/simpleTwoDependencies.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | case class C(a: A, b: B) 4 | case class D(c: C) 5 | 6 | val a = A() 7 | val b = B() 8 | val d = autowire[D](a, b) 9 | 10 | require (d.c.a eq a) 11 | require (d.c.b eq b) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/unusedDependency.failure: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | case class C() 4 | 5 | autowire[B](C()) 6 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/autowire/useGivens.success: -------------------------------------------------------------------------------- 1 | case class A1() 2 | case class A2() 3 | case class B1() 4 | case class B2() 5 | case class C(b1: B1, b2: B2)(using A1, A2): 6 | def a1 = summon[A1] 7 | 8 | { 9 | given A1 = A1() 10 | given A2 = A2() 11 | val c = autowire[C]() 12 | assert(c.a1 eq summon[A1]) 13 | } 14 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/callByNameCompanionObject.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | import scala.collection.mutable.ListBuffer 4 | 5 | object Test { 6 | val created = ListBuffer.empty[String] 7 | 8 | class Component private (val a: A) 9 | 10 | object Component { 11 | def apply(dependency: => A) = { created.append("a"); new Component(dependency) } 12 | } 13 | 14 | val dependency = new A() 15 | val component = wire[Component] 16 | } 17 | 18 | require(Test.component.a != null) 19 | require(Test.created.size == 1) 20 | require(Test.created.head == "a") -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/callByNameConstructorParameter.success: -------------------------------------------------------------------------------- 1 | class A() 2 | 3 | class B(aProvider: => A) { 4 | def a = aProvider 5 | } 6 | 7 | class C[T]() 8 | 9 | class D(cProvider: => C[String]) { 10 | def c = cProvider 11 | } 12 | 13 | object Test { 14 | val a = new A() 15 | val b = wire[B] 16 | val cString = new C[String]() 17 | val cInt = new C[Int]() 18 | val d = wire[D] 19 | } 20 | 21 | require(Test.b.a eq Test.a) 22 | require(Test.d.c eq Test.cString) 23 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/callByNameWireWith.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | import scala.collection.mutable.ListBuffer 4 | 5 | object Test { 6 | val created = ListBuffer.empty[String] 7 | 8 | class Component private (val a: A) 9 | 10 | 11 | object Component { 12 | def create(dependency: => A) = { created.append("a"); new Component(dependency) } 13 | } 14 | 15 | val dependency = wire[A] 16 | val component = wireWith(Component.create _) 17 | } 18 | 19 | require(Test.component.a != null) 20 | require(Test.created.size == 1) 21 | require(Test.created.head == "a") -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/classesWithTraitsLazyValsOkInTrait.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithTraits 2 | 3 | trait Test { 4 | lazy val theA = wire[AImpl] 5 | lazy val theB = wire[BImpl] 6 | lazy val theC = wire[CImpl] 7 | lazy val theD = wire[DImpl] 8 | } 9 | 10 | #include commonClassesWithTraitsNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/companionFactory.success: -------------------------------------------------------------------------------- 1 | case class A(i: Int) 2 | 3 | object Test { 4 | 5 | class PrivConstructor private(val a : A) {} 6 | object PrivConstructor { 7 | def apply(a: A) : PrivConstructor = new PrivConstructor(A(a.i + 1)) 8 | } 9 | 10 | val a = A(3) 11 | val pc = wire[PrivConstructor] 12 | } 13 | 14 | require(Test.pc.a == A(4)) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/companionFactoryAmbiguous.failure: -------------------------------------------------------------------------------- 1 | case class A(i: Int) 2 | 3 | object Test { 4 | 5 | class PrivConstructor private(val a : A) {} 6 | object PrivConstructor { 7 | def apply(a: A) : PrivConstructor = new PrivConstructor(A(a.i + 1)) 8 | def apply(a: A, i: Int) : PrivConstructor = new PrivConstructor(A(a.i + i)) 9 | } 10 | 11 | val a = A(3) 12 | val pc = wire[PrivConstructor] 13 | } 14 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/companionObjectHasFakeApplyMethods.failure: -------------------------------------------------------------------------------- 1 | trait A 2 | 3 | object Test { 4 | 5 | class Target private(val a : A) {} 6 | object Target { 7 | def apply(a: A): String = "This is not the construction method" 8 | } 9 | 10 | val a: A = new A{} 11 | wire[Target] 12 | } 13 | 14 | Test -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/companionObjectHasNoMethods.failure: -------------------------------------------------------------------------------- 1 | trait A 2 | 3 | object Test { 4 | 5 | class Target private(val a : A) {} 6 | object Target 7 | 8 | val a: A = new A{} 9 | wire[Target] 10 | } 11 | 12 | Test -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/defWithParameterAreIneligible.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | object Test { 5 | 6 | lazy val a: A = wire[A] 7 | 8 | def buildSomeA(i: Int): A = A() 9 | 10 | lazy val b: B = wire[B] 11 | } 12 | 13 | require(Test.b.a eq Test.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/defWithoutParameter.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | object Test { 5 | 6 | var countA: Int = 0 7 | 8 | def a: A = { 9 | countA += 1 10 | A() 11 | } 12 | 13 | lazy val b1: B = wire[B] 14 | lazy val b2: B = wire[B] 15 | } 16 | 17 | require(!(Test.b1.a eq Test.b2.a)) 18 | require(Test.countA == 2) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/diamondInheritance.success: -------------------------------------------------------------------------------- 1 | class Dependency 2 | class Service(val dependency: Dependency) 3 | class AnotherService(val dependency: Dependency) 4 | 5 | trait A { 6 | val dependency = wire[Dependency] 7 | } 8 | 9 | trait B extends A { 10 | val service = wire[Service] 11 | } 12 | 13 | object C extends A with B { 14 | val anotherService = wire[AnotherService] 15 | } 16 | 17 | require(C.dependency != null) 18 | require(C.service.dependency eq C.dependency) 19 | require(C.anotherService.dependency eq C.dependency) 20 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/explicitDepsNotWiredWithImplicitVals.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | implicit val a: A = new A() 4 | implicit val b: B = new B() 5 | 6 | object Test { 7 | val c = wire[C] 8 | } 9 | 10 | require(false) // oops! macro didn't fail as expected.. 11 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/explicitDepsWiredWithImplicitValsFromEnclosingModuleScope.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object ModuleScope { 4 | implicit val a: A = new A() 5 | implicit val b: B = new B() 6 | val c = wire[C] 7 | } 8 | require(ModuleScope.c.a eq ModuleScope.a) 9 | require(ModuleScope.c.b eq ModuleScope.b) 10 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/explicitDepsWiredWithImplicitValsFromMethodScope.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object MethodScope { 4 | def someMethod(dependency: A)(implicit implicitDependencyA: A, implicitDependencyB: B) = { 5 | val c = wire[C] 6 | require(c.a eq implicitDependencyA) 7 | require(c.b eq implicitDependencyB) 8 | } 9 | } 10 | 11 | implicit val implicitA: A = new A() 12 | implicit val implicitB: B = new B() 13 | 14 | MethodScope.someMethod(new A()) 15 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/explicitDepsWiredWithImplicitValsFromParentsScope.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait DependencyProvider { 4 | implicit val a: A = new A() 5 | implicit val b: B = new B() 6 | } 7 | 8 | object ParentsScope extends DependencyProvider { 9 | val c = wire[C] 10 | } 11 | 12 | require(ParentsScope.c.a eq ParentsScope.a) 13 | require(ParentsScope.c.b eq ParentsScope.b) 14 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/forwardReferenceInBlock.scala2.warning: -------------------------------------------------------------------------------- 1 | 2 | case class A() 3 | case class B(a: A) 4 | 5 | trait Parent { 6 | lazy val a = wire[A] 7 | } 8 | 9 | object Test extends Parent { 10 | 11 | def build: B = { 12 | val b = wire[B] 13 | 14 | // there used to be a bug where forwardA would be found eligible 15 | // and preferred over Parent.a 16 | val forwardA = A() 17 | b 18 | } 19 | 20 | def buildWithLazyDep: B = { 21 | val b = wire[B] 22 | 23 | // even though forwardA is lazy it is still not enough for it to 24 | // be eligible - if it was (eligible), that would fail too in a forward reference error 25 | lazy val forwardA = A() 26 | b 27 | } 28 | } 29 | 30 | require(Test.build.a eq Test.a) 31 | require(Test.buildWithLazyDep.a eq Test.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/forwardReferenceInClass.success: -------------------------------------------------------------------------------- 1 | 2 | case class A() 3 | case class B(a: A) 4 | 5 | object Test { 6 | lazy val b: B = wire[B] 7 | lazy val a: A = wire[A] 8 | } 9 | 10 | require(Test.b.a eq Test.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/functionApplication.scala3.success: -------------------------------------------------------------------------------- 1 | 2 | case class A() 3 | case class B(a: A) 4 | 5 | object Test { 6 | 7 | val someA = Some(A()) 8 | 9 | def build(opt: Option[A]): Option[B] = { 10 | opt.map { a => wire[B] } 11 | } 12 | 13 | // equivalent with a for 14 | def forBuild(opt: Option[A]): Option[B] = { 15 | for (a <- opt) yield { 16 | wire[B] 17 | } 18 | } 19 | 20 | lazy val ab: Option[(A,B)] = Some(A(),B(A())) 21 | } 22 | 23 | require(Test.build(Test.someA).get.a eq Test.someA.get) 24 | require(Test.forBuild(Test.someA).get.a eq Test.someA.get) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplementedImplicitVals.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | trait Abstract { 4 | implicit val dependency: Dependency 5 | } 6 | 7 | object Test extends Abstract { 8 | override implicit val dependency: Dependency = new Dependency 9 | val service = wire[Service] 10 | } 11 | 12 | require(Test.service.dependency eq Test.dependency) 13 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplicitDefs.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | implicit def dependency: Dependency = new Dependency 4 | 5 | object Test { 6 | val service = wire[Service] 7 | } 8 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplicitVals.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | implicit val dependency: Dependency = new Dependency 4 | 5 | object Test { 6 | val service = wire[Service] 7 | } 8 | 9 | require(Test.service.dependency eq dependency) 10 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplicitValsFromEnclosingModuleScope.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | object ModuleScope { 4 | implicit val moduleImplicitDependency: Dependency = new Dependency() 5 | val service = wire[Service] 6 | } 7 | require(ModuleScope.service.dependency eq ModuleScope.moduleImplicitDependency) 8 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplicitValsFromMethodScope.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | object MethodScope { 4 | def someMethod(dependency: Dependency)(implicit implicitDependency: Dependency) = { 5 | val service = wire[Service] 6 | require(service.dependency eq implicitDependency) 7 | } 8 | } 9 | 10 | implicit val someImplicit = new Dependency 11 | 12 | MethodScope.someMethod(new Dependency) 13 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplicitValsFromMethodScope.scala3.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | object MethodScope { 4 | def someMethod(dependency: Dependency)(implicit implicitDependency: Dependency) = { 5 | val service = wire[Service] 6 | require(service.dependency eq implicitDependency) 7 | } 8 | } 9 | 10 | implicit val someImplicit: Dependency = new Dependency 11 | 12 | MethodScope.someMethod(new Dependency) 13 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/implicitDepsWiredWithImplicitValsFromParentsScope.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | trait DependencyProvider { 4 | implicit val implicitDependency: Dependency = new Dependency 5 | } 6 | 7 | object ParentsScope extends DependencyProvider { 8 | val service = wire[Service] 9 | } 10 | 11 | require(ParentsScope.service.dependency eq ParentsScope.implicitDependency) 12 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/import.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | class Main(val base: Base) { 9 | import base.{theA} 10 | 11 | // not ambiguous as `base.theB` hasn't been imported 12 | lazy val myB = wire[B] 13 | 14 | lazy val theC = wire[C] 15 | } 16 | 17 | val main = new Main(new Base) 18 | 19 | require(main.theC.a eq main.base.theA) 20 | require(main.theC.b eq main.myB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importAmbiguous.scala2.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | class Main(val base: Base) { 9 | import base._ 10 | 11 | lazy val myA = wire[A] 12 | 13 | // error: both `myA` and `theA` are matching 14 | lazy val theC = wire[C] 15 | } 16 | 17 | val main = new Main(new Base) 18 | 19 | require(main.theC.a eq main.base.theA) 20 | require(main.theC.b eq main.base.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importImplicit.scala2.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | object Import { 5 | implicit val a: A = A() 6 | } 7 | 8 | object Test { 9 | import Import.a 10 | 11 | lazy val b: B = wire[B] 12 | } 13 | 14 | require(Test.b.a eq Import.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importPackage.scala2.success: -------------------------------------------------------------------------------- 1 | class A 2 | class B(val a: A) 3 | 4 | object Test { 5 | // import package or package object should be ignored 6 | import com.softwaremill.macwire._ 7 | 8 | import scala.collection.mutable._ 9 | 10 | lazy val a = wire[A] 11 | lazy val b = wire[B] 12 | } 13 | 14 | require(Test.b.a eq Test.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importRename.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | class Main(val base: Base) { 9 | import base.{theA => blabla, theB => blibli} 10 | 11 | lazy val theC = wire[C] 12 | } 13 | 14 | val main = new Main(new Base) 15 | 16 | require(main.theC.a eq main.base.theA) 17 | require(main.theC.b eq main.base.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importWildcard.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | class Main(val base: Base) { 9 | import base._ 10 | 11 | lazy val theC = wire[C] 12 | } 13 | 14 | val main = new Main(new Base) 15 | 16 | require(main.theC.a eq main.base.theA) 17 | require(main.theC.b eq main.base.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importWildcardDoNotImportObjectMethods.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base { 4 | lazy val theA = wire[A] 5 | } 6 | 7 | case class Stuff(a: A, i: Int, str: String) 8 | 9 | class Main(val base: Base) { 10 | // this test makes sure that we don't consider 11 | // object methods such as hashCode or toString 12 | import base._ 13 | 14 | lazy val someInt = 42 15 | lazy val someString = "toto" 16 | 17 | lazy val stuff = wire[Stuff] 18 | } 19 | 20 | val main = new Main(new Base) 21 | 22 | require(main.stuff.a eq main.base.theA) 23 | require(main.stuff.i == main.someInt) 24 | require(main.stuff.str == main.someString) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/importWildcardVisibility.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base { 4 | private lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | class Main(val base: Base) { 9 | import base._ 10 | 11 | lazy val myA = wire[A] 12 | 13 | // if visibility isn't taken into account we'll end up with an ambiguous error: 14 | // macwire we'll find both `base.theA` and `this.myA` to be eligible 15 | lazy val theC = wire[C] 16 | } 17 | 18 | val main = new Main(new Base) 19 | 20 | require(main.theC.a eq main.myA) 21 | require(main.theC.b eq main.base.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceAbstractAndConcrete.success: -------------------------------------------------------------------------------- 1 | // See https://github.com/adamw/macwire/issues/82 2 | // *sometimes* (not on every compiler run) the trees for the identifiers X.a and Y.a were different hash codes, but 3 | // equal structurally. This only occurred when Y.a was also used in another wired class. 4 | 5 | class A() 6 | class B(val a: A) 7 | class C(val a: A) 8 | 9 | trait X { 10 | def a: A 11 | } 12 | 13 | trait Y { 14 | lazy val a = wire[A] 15 | lazy val c = wire[C] 16 | } 17 | 18 | object Z extends Y with X { 19 | val b = wire[B] 20 | } 21 | 22 | require(Z.b.a eq Z.a) 23 | require(Z.c.a eq Z.a) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceClassesWithTraitsLazyValsOkInTraits.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithTraits 2 | 3 | trait Base { 4 | lazy val theA = wire[AImpl] 5 | lazy val theB = wire[BImpl] 6 | } 7 | 8 | trait Test extends Base { 9 | lazy val theC = wire[CImpl] 10 | lazy val theD = wire[DImpl] 11 | } 12 | 13 | #include commonClassesWithTraitsNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceDoubleSimpleLazyValsOkInTraits.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base1 { 4 | lazy val theA = wire[A] 5 | } 6 | 7 | trait Base2 { 8 | lazy val theB = wire[B] 9 | } 10 | 11 | trait Test extends Base1 with Base2 { 12 | lazy val theC = wire[C] 13 | } 14 | 15 | #include commonSimpleNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceHKT.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonHKTClasses 2 | 3 | trait Base1[F[_]] { 4 | lazy val a = wire[A[F]] 5 | } 6 | 7 | trait Child1[F[_]] extends Base1[F] { 8 | lazy val b = wire[B[F]] 9 | } 10 | 11 | trait Child2[F[_]] extends Base1[F] with Child1[F] { 12 | lazy val c = wire[C[F]] 13 | } 14 | 15 | object ChildIO extends Child2[IO] 16 | 17 | require(ChildIO.b.a == ChildIO.a) 18 | require(ChildIO.c.a == ChildIO.a) 19 | require(ChildIO.c.b == ChildIO.b) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceParametrized.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Base(name: String) { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | object t extends Base("toto") { 9 | lazy val theC = wire[C] 10 | } 11 | 12 | require(t.theC.a eq t.theA) 13 | require(t.theC.b eq t.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritancePrivateMembersInParent.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base { 4 | private lazy val privateA: A = A() 5 | lazy val publicA: A = A() 6 | } 7 | 8 | object Module extends Base { 9 | lazy val b: B = wire[B] 10 | lazy val c: C = wire[C] 11 | } 12 | 13 | require(Module.c.a eq Module.publicA) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceProtectedMembersInParent.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base { 4 | protected lazy val protectedA: A = A() 5 | lazy val publicA: A = A() 6 | } 7 | 8 | object Module extends Base { 9 | lazy val b: B = wire[B] 10 | lazy val c: C = wire[C] 11 | } 12 | 13 | require(Module.c.a eq Module.publicA) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritancePublicMembersInParent.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base { 4 | val aA: A = A() 5 | } 6 | 7 | object Module extends Base { 8 | val theA: A = A() 9 | lazy val b: B = wire[B] 10 | lazy val c: C = wire[C] 11 | } 12 | 13 | require(Module.c.a eq Module.theA) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceSimpleDefsOkInTraits.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base { 4 | def theA = wire[A] 5 | def theB = wire[B] 6 | } 7 | 8 | trait Test extends Base { 9 | def theC = wire[C] 10 | } 11 | 12 | val t = new Test {} 13 | 14 | require(t.theC.a != null) 15 | require(t.theC.b != null) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceSimpleLazyValsOkInTraits.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | trait Test extends Base { 9 | lazy val theC = wire[C] 10 | } 11 | 12 | #include commonSimpleNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceTwoLevelSimpleLazyValsOkInTraits.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Base1 { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | } 7 | 8 | trait Base2 extends Base1 { 9 | lazy val theC = wire[C] 10 | } 11 | 12 | trait Test extends Base2 { 13 | lazy val theD = wire[D] 14 | lazy val theE = wire[E] 15 | } 16 | 17 | #include commonSimpleNotNullCheck 18 | 19 | require(t.theD.c != null) 20 | require(t.theD.c eq t.theC) 21 | 22 | require(t.theE.a != null) 23 | require(t.theE.c != null) 24 | require(t.theE.a eq t.theA) 25 | require(t.theE.c eq t.theC) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/inheritanceWireWith.scala2.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | 4 | trait BProvider { 5 | lazy val b: B = wire[B] 6 | } 7 | 8 | object Test extends BProvider { 9 | 10 | case class C(a: A, b: B, s: String) 11 | 12 | object C { 13 | def factory(a: A, b: B): C = { 14 | val s = "hey!" 15 | wire[C] 16 | } 17 | } 18 | 19 | lazy val a: A = wire[A] 20 | lazy val c: C = wireWith(C.factory _) 21 | } 22 | 23 | require(Test.c.s == "hey!") 24 | require(Test.c.a eq Test.a) 25 | require(Test.c.b eq Test.b) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodContainingValDef.scala2.success: -------------------------------------------------------------------------------- 1 | trait A 2 | case class A1() extends A 3 | case class A2() extends A 4 | case class A3() extends A 5 | case class B(a: A) 6 | 7 | object Test { 8 | def apply(i: Int) : B = { 9 | if( i > 1 ) { 10 | if( i > 2 ) { 11 | val a = A3() 12 | wire[B] 13 | } else { 14 | val a = A2() 15 | wire[B] 16 | } 17 | } else { 18 | val a = A1() 19 | wire[B] 20 | } 21 | } 22 | } 23 | 24 | require(Test(1).a == A1()) 25 | require(Test(2).a == A2()) 26 | require(Test(3).a == A3()) 27 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodMixedOk.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | lazy val theA = wire[A] 5 | def theC(someB: B) = wire[C] 6 | } 7 | 8 | val t = new Test 9 | val b = new B 10 | val c = t.theC(b) 11 | 12 | require(c != null) 13 | require(c.a != null) 14 | require(c.b != null) 15 | 16 | require(c.a eq t.theA) 17 | require(c.b eq b) 18 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodParamsInApplyOk.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | object Props { 5 | def apply[T](creator: => T): T = creator 6 | } 7 | 8 | def theC(a: A, b: B) = Props(wire[C]) 9 | } 10 | 11 | val t = new Test 12 | val a = new A 13 | val b = new B 14 | val c = t.theC(a, b) 15 | 16 | require(c != null) 17 | require(c.a != null) 18 | require(c.b != null) 19 | 20 | require(c.a eq a) 21 | require(c.b eq b) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodParamsOk.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | def theC(someB: B, someA: A) = wire[C] 5 | } 6 | 7 | val t = new Test 8 | val a = new A 9 | val b = new B 10 | val c = t.theC(b, a) 11 | 12 | require(c != null) 13 | require(c.a != null) 14 | require(c.b != null) 15 | 16 | require(c.a eq a) 17 | require(c.b eq b) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodSingleParamOk.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | class Test { 5 | def theB(someA: A) = wire[B] 6 | } 7 | 8 | val t = new Test 9 | val a = new A 10 | val b = t.theB(a) 11 | 12 | require(b != null) 13 | require(b.a != null) 14 | 15 | require(b.a eq a) 16 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodWithSingleImplicitParamOk.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | object Module { 4 | def someMethod(implicit implicitDependency: Dependency) = wire[Service] 5 | } 6 | 7 | implicit val dependency = new Dependency() 8 | 9 | val service = Module.someMethod 10 | 11 | require(service.dependency eq dependency) 12 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodWithSingleImplicitParamOk.scala3.success: -------------------------------------------------------------------------------- 1 | #include commonClassesWithImplicitDependencies 2 | 3 | object Module { 4 | def someMethod(implicit implicitDependency: Dependency) = wire[Service] 5 | } 6 | implicit val dependency: Dependency = new Dependency() 7 | 8 | val service = Module.someMethod 9 | 10 | require(service.dependency eq dependency) 11 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodWithWiredWithinIfThenElse.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | // method's parameter 'a' will shadow def 'a'. 5 | def a(a: A) = { 6 | def b(b: B)(useWire: Boolean): C = { 7 | if (useWire) wire[C] 8 | else new C(new A, new B) 9 | } 10 | b _ 11 | } 12 | } 13 | 14 | val aDep = new A() 15 | val bDep = new B() 16 | val c = Module.a(aDep)(bDep)(true) 17 | 18 | require(c.a eq aDep) 19 | require(c.b eq bDep) 20 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/methodWithWiredWithinPatternMatch.scala2.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | // method's parameter 'a' will shadow def 'a'. 5 | def a(a: A): B => C = { 6 | 3 match { 7 | case 3 => (b: B) => wire[C] 8 | case _ => (b: B) => null 9 | } 10 | } 11 | } 12 | 13 | val aDep = new A() 14 | val bDep = new B() 15 | val c = Module.a(aDep)(bDep) 16 | 17 | require(c.a eq aDep) 18 | require(c.b eq bDep) 19 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/multipleMethodParameters.failure: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a1: A, a2: A) 3 | 4 | class Test { 5 | def theB(a2: A, a1: A) = wire[B] 6 | } 7 | 8 | val t = new Test 9 | val a1 = new A() 10 | val a2 = new A() 11 | 12 | t.theB(a2, a1) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/nestedAnonFuncsWired.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | // anonymous function's parameter 'a' will shadow val 'a'. 5 | val a = (a: A) => 6 | (b: B) => wire[C] 7 | } 8 | 9 | val aDep = new A() 10 | val bDep = new B() 11 | val c = Module.a(aDep)(bDep) 12 | 13 | require(c.a eq aDep) 14 | require(c.b eq bDep) 15 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/nestedMethodsWired.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | 5 | val b = new B() 6 | 7 | // method's parameter 'a' will shadow def 'a'. 8 | def a(outerA: A) = { 9 | def innerA(innerA: A): C = wire[C] 10 | (aa: A) => b 11 | } 12 | } 13 | 14 | val aDep = new A() 15 | Module.a(aDep)(aDep) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/nestedMethodsWired.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | // method's parameter 'a' will shadow def 'a'. 5 | def a(a: A) = { 6 | def b(b: B): C = wire[C] 7 | b _ 8 | } 9 | } 10 | 11 | val aDep = new A() 12 | val bDep = new B() 13 | val c = Module.a(aDep)(bDep) 14 | 15 | require(c.a eq aDep) 16 | require(c.b eq bDep) 17 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/nestedWithManyMatchingParamsWired.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Module { 4 | // anonymous function's parameter 'a' will shadow val 'a'. 5 | val a = (a1: A) => 6 | (b: B) => 7 | (a2: A) => 8 | (a3: A) => wire[C] 9 | } 10 | 11 | val a1Dep = new A() 12 | val a2Dep = new A() 13 | val a3Dep = new A() 14 | val bDep = new B() 15 | 16 | // we're expecting compilation abort due to ambiguous dependencies' resolution. 17 | val c = Module.a(a1Dep)(bDep)(a2Dep)(a3Dep) 18 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/nullaryMethodUsedAsCandidate.scala2.failure: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(val a: A) 3 | 4 | object Module { 5 | def foo(): A = new A() 6 | } 7 | 8 | object Test { 9 | import Module._ 10 | 11 | val a: A = new A() 12 | val b: B = wire[B] 13 | } 14 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/parametrizedMethodNotUsedAsCandidate.success: -------------------------------------------------------------------------------- 1 | class A() 2 | class B(val a: A) 3 | class C() 4 | 5 | object Module { 6 | def foo(c: C): A = new A() 7 | } 8 | 9 | object Test { 10 | import Module._ 11 | 12 | val a: A = new A() 13 | val b: B = wire[B] 14 | } 15 | 16 | require(Test.b.a eq Test.a) 17 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/secondaryConstructorAnnotated.success: -------------------------------------------------------------------------------- 1 | class A() 2 | 3 | class B(val s: String, val a: A) { 4 | @javax.inject.Inject 5 | def this(a: A) = this("?", a) 6 | } 7 | 8 | object Test { 9 | val a = wire[A] 10 | val b = wire[B] 11 | } 12 | 13 | require(Test.b.s == "?") 14 | require(Test.b.a == Test.a) 15 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/secondaryConstructorNotAnnotated.failure: -------------------------------------------------------------------------------- 1 | class A() 2 | 3 | class B(val s: String, val a: A) { 4 | def this(a: A) = this("?", a) 5 | } 6 | 7 | object Test { 8 | val a = wire[A] 9 | val b = wire[B] 10 | } -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleDefsInTrait.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | def theA = wire[A] 5 | def theB = wire[B] 6 | def theC = wire[C] 7 | } 8 | 9 | val t = new Test {} 10 | 11 | require(t.theC.a != null) 12 | require(t.theC.b != null) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleGenericClass.success: -------------------------------------------------------------------------------- 1 | #include commonHKTClasses 2 | 3 | case class LocalA[X]() 4 | case class LocalB[X](la: LocalA[X]) 5 | 6 | object Test { 7 | val la = wire[LocalA[Int]] 8 | val lb = wire[LocalB[Int]] 9 | val a = wire[A[IO]] 10 | val b = wire[B[IO]] 11 | } 12 | 13 | require(Test.lb.la eq Test.la) 14 | require(Test.b.a eq Test.a) 15 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleLazyValsInTrait.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | lazy val theA = wire[A] 5 | lazy val theB = wire[B] 6 | lazy val theC = wire[C] 7 | } 8 | 9 | #include commonSimpleNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleLazyValsNotInOrder.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | lazy val theD = wire[D] 5 | lazy val theC = wire[C] 6 | lazy val theB = wire[B] 7 | lazy val theA = wire[A] 8 | } 9 | 10 | #include commonSimpleNotNullCheck 11 | 12 | require(t.theD.c != null) 13 | require(t.theD.c eq t.theC) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsDuplicateValue.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | val theA = wire[A] 5 | val theB1 = wire[B] 6 | val theB2 = wire[B] 7 | val theC = wire[C] 8 | } -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsImplicitParameterLists.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | case class F(a: A)(implicit val b: B) 4 | 5 | object Implicits { 6 | implicit val theB: B = wire[B] 7 | } 8 | 9 | trait Test { 10 | import Implicits._ 11 | 12 | val theA = wire[A] 13 | val theF = wire[F] 14 | } 15 | 16 | val t = new Test {} 17 | 18 | require(t.theF.a != null) 19 | require(t.theF.b != null) 20 | 21 | require(t.theF.a eq t.theA) 22 | require(t.theF.b eq Implicits.theB) 23 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsInClass.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | val theA = wire[A] 5 | val theB = wire[B] 6 | val theC = wire[C] 7 | } 8 | 9 | #include commonSimpleNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsInClassParameters.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test(theA: A, 4 | val theB :B) { 5 | 6 | val theC = wire[C] 7 | } 8 | 9 | val a = A() 10 | val test = new Test(a, B()) 11 | 12 | require(test.theC.a eq a) 13 | require(test.theC.b eq test.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsInObject.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val theA = wire[A] 5 | val theB = wire[B] 6 | val theC = wire[C] 7 | 8 | require(theC.a != null) 9 | require(theC.b != null) 10 | } 11 | 12 | require(Test.theC.a != null) 13 | require(Test.theC.b != null) 14 | 15 | require(Test.theC.a eq Test.theA) 16 | require(Test.theC.b eq Test.theB) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsInTrait.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | val theA = wire[A] 5 | val theB = wire[B] 6 | val theC = wire[C] 7 | } 8 | 9 | #include commonSimpleNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsMissingValue.failure: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | val theA = wire[A] 5 | val theC = wire[C] 6 | } -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsMultipleParameterLists.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | case class F(a: A, b: B)(val c: C)(val d: D) 4 | 5 | trait Test { 6 | val theA = wire[A] 7 | val theB = wire[B] 8 | val theC = wire[C] 9 | val theD = wire[D] 10 | val theF = wire[F] 11 | } 12 | 13 | #include commonSimpleNotNullCheck 14 | 15 | require(t.theF.a != null) 16 | require(t.theF.b != null) 17 | require(t.theF.c != null) 18 | require(t.theF.d != null) 19 | 20 | require(t.theF.a eq t.theA) 21 | require(t.theF.b eq t.theB) 22 | require(t.theF.c eq t.theC) 23 | require(t.theF.d eq t.theD) 24 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleValsReferenceWithAscription.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | val theA = wire[A] 5 | val theB = wire[B] 6 | val theC: C = wire[C] 7 | val theD = new D(theC) // reference 8 | } 9 | 10 | #include commonSimpleNotNullCheck -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleWithAbstract.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test { 4 | def theA: A 5 | def theB: B 6 | lazy val theC = wire[C] 7 | } 8 | 9 | 10 | val t = new Test { 11 | lazy val theA = new A 12 | lazy val theB = new B 13 | } 14 | 15 | require(t.theC.a != null) 16 | require(t.theC.b != null) 17 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/simpleWithAbstractScope.success: -------------------------------------------------------------------------------- 1 | import com.softwaremill.macwire.scopes.Scope 2 | 3 | class A(s: Scope) 4 | 5 | trait Test { 6 | val a: A = wire[A] 7 | def s: Scope 8 | } 9 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/t103.success: -------------------------------------------------------------------------------- 1 | class Test1(val s: Set[String]) 2 | 3 | val set1: Set[String] = Set() 4 | val t1 = wire[Test1] 5 | 6 | require(t1.s eq Set[String]()) 7 | 8 | class Test2(val list: List[String]) 9 | val list2 = List[String]() 10 | val t2 = wire[Test2] 11 | 12 | require(t2.list eq List[String]()) 13 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/toManyInjectAnnotations.failure: -------------------------------------------------------------------------------- 1 | 2 | trait A 3 | trait B 4 | trait C 5 | trait D 6 | 7 | class Target(a: A) { 8 | 9 | def this(b: B) = { 10 | this(new A{}) 11 | throw new UnsupportedOperationException() 12 | } 13 | 14 | @javax.inject.Inject 15 | def this(c: C) = this(new A{}) 16 | 17 | @javax.inject.Inject 18 | def this(d: D) = this(new A{}) 19 | } 20 | 21 | lazy val a: A = throw new UnsupportedOperationException() 22 | lazy val b: B = throw new UnsupportedOperationException() 23 | lazy val c: C = throw new UnsupportedOperationException() 24 | lazy val d: D = throw new UnsupportedOperationException() 25 | 26 | wire[Target] 27 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/todo/forwardReferenceLazyEligible.success: -------------------------------------------------------------------------------- 1 | 2 | case class A(i: Int) 3 | case class B(a: A) 4 | 5 | object Test { 6 | def build: B = { 7 | // Ideally this should work, but that would require 8 | // to make sure that the wire call isn't affected to a non-lazy val 9 | // which is a little tedious. 10 | // 11 | // Anyway, this is probably a bad idea to wire forward references in a block, 12 | // as wiring in a block is supposed to be relatively simple (we shouldn't wire too many 13 | // things in a block) 14 | lazy val b = wire[B] 15 | lazy val forwardA = A(42) 16 | b 17 | } 18 | } 19 | 20 | require(Test.build.a == A(42)) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/todo/simpleValsTypeAlias.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Aliases { 4 | type AA = A 5 | type BB = B 6 | type CC = C 7 | } 8 | 9 | case class DD(c: Aliases.CC) 10 | 11 | trait Test { 12 | import Aliases._ 13 | 14 | val theA = wire[AA] 15 | val theB = wire[BB] 16 | val theC = wire[CC] 17 | val theD = wire[DD] 18 | } 19 | 20 | #include commonSimpleNotNullCheck 21 | 22 | require(t.theD.c != null) 23 | 24 | require(t.theD.c eq t.theC) 25 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/valsFlaggedImplicit.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | // b isn't an implicit parameter it is an implicit member 4 | // this is (to me at least) a shadowy part of the specification 5 | class Service(val a: A, implicit val b: B) 6 | 7 | object Test { 8 | lazy val a = wire[A] 9 | lazy val b = wire[B] 10 | 11 | // if macwire let the compiler wire the dependencies it will fail 12 | // as `a` isn't implicit 13 | lazy val service = wire[Service] 14 | } 15 | 16 | require(Test.service.a eq Test.a) 17 | require(Test.service.b eq Test.b) -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireLocalVal.scala2.success: -------------------------------------------------------------------------------- 1 | case class A(s: String) 2 | 3 | object A { 4 | def create() = { 5 | val s = "foo" 6 | wire[A] 7 | } 8 | } 9 | require(A.create().s == "foo") -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireRec.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | case class C(a: A, b: B) 4 | case class D(a: A, c: C) 5 | 6 | object Test { 7 | lazy val b: B = wire[B] 8 | lazy val a: A = wire[A] 9 | 10 | lazy val d: D = wireRec[D] 11 | 12 | require(d.a == a) 13 | require(d.c.a == a) 14 | require(d.c.b == b) 15 | } 16 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireRecEmptyString.failure: -------------------------------------------------------------------------------- 1 | case class E(s: String) 2 | 3 | object Test { 4 | lazy val d = wireRec[E] 5 | } -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireRecMultiStage.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | case class C(a: A, b: B) 4 | case class D(a: A, c: C) 5 | case class E(c: C, d: D) 6 | 7 | object Test { 8 | lazy val e: E = wireRec[E] 9 | 10 | require(e.c.a == A()) 11 | require(e.c == e.d.c) 12 | } 13 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireWith.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | 4 | object Test { 5 | case class C(a: A, b: B) 6 | 7 | object C { 8 | def factory(a: A, b: B): C = { 9 | wire[C] 10 | } 11 | } 12 | 13 | lazy val a: A = wire[A] 14 | lazy val b: B = wire[B] 15 | 16 | lazy val c: C = wireWith(C.factory _) 17 | } 18 | 19 | require(Test.c.a eq Test.a) 20 | require(Test.c.b eq Test.b) 21 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireWithEmptyParams.scala2.success: -------------------------------------------------------------------------------- 1 | object Test { 2 | 3 | case class C(s: String) 4 | 5 | object C { 6 | def factory(): C = { 7 | val s = "hey!" 8 | wire[C] 9 | } 10 | } 11 | 12 | lazy val c: C = wireWith(C.factory _) 13 | } 14 | 15 | require(Test.c.s == "hey!") 16 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireWithImplicits.success: -------------------------------------------------------------------------------- 1 | case class A(n: Int, s: String) 2 | object A { 3 | def make(n: Int)(implicit s: String): A = 4 | A(n, s) 5 | } 6 | 7 | lazy val n = 0 8 | implicit lazy val s: String = "s" 9 | 10 | wireWith(A.make _) 11 | -------------------------------------------------------------------------------- /tests/src/test/resources/test-cases/wireWithTwoParamsLists.failure: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B() 3 | 4 | trait BProvider { 5 | lazy val b: B = wire[B] 6 | } 7 | 8 | object Test extends BProvider { 9 | 10 | case class C(a: A, b: B, s: String) 11 | 12 | object C { 13 | def factory(a: A)(b: B): C = { 14 | val s = "hey!" 15 | wire[C] 16 | } 17 | } 18 | 19 | lazy val a: A = wire[A] 20 | lazy val c: C = wireWith(C.factory _) 21 | } 22 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/packages/A.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.packages 2 | 3 | class A 4 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/packages/B.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.packages 2 | 3 | class B(a: A) 4 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/packages/ServletModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.packages 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.macwire.packages.child.ChildModule 5 | 6 | trait SubModule extends ChildModule { 7 | def b = wire[B] 8 | } 9 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/packages/child/ChildModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.packages.child 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.macwire.packages.A 5 | 6 | trait ChildModule { 7 | val a = wire[A] 8 | } 9 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/two_modules_and_scope/A.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.two_modules_and_scope 2 | 3 | class A 4 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/two_modules_and_scope/B.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.two_modules_and_scope 2 | 3 | class B(a: A) 4 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/two_modules_and_scope/OtherModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.two_modules_and_scope 2 | 3 | import com.softwaremill.macwire._ 4 | 5 | trait OtherModule extends SomeModule { 6 | val c = wire[B] 7 | } 8 | -------------------------------------------------------------------------------- /tests2/src/test/scala-2/com/softwaremill/macwire/two_modules_and_scope/SomeModule.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.two_modules_and_scope 2 | 3 | import com.softwaremill.macwire._ 4 | import com.softwaremill.macwire.scopes.Scope 5 | 6 | trait SomeModule { 7 | val a: A = x(wire[A]) 8 | val b: B = wire[B] 9 | 10 | def x: Scope 11 | } 12 | -------------------------------------------------------------------------------- /tests2/src/test/scala/com/softwaremill/macwire/implicits/ImplicitAndUsageInObject.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.implicits 2 | 3 | import com.softwaremill.macwire._ 4 | 5 | // For some reason this compiles when run as a compile-test, hence putting it in tests2. 6 | object ImplicitAndUsageInObject { 7 | case class B() 8 | case class A()(implicit val b: B) 9 | 10 | implicit val b: B = new B 11 | val a = wire[A] 12 | } 13 | -------------------------------------------------------------------------------- /tests2/src/test/scala/com/softwaremill/macwire/implicits/ImplicitFromParentUsageInObject.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire.implicits 2 | 3 | import com.softwaremill.macwire._ 4 | 5 | // For some reason this compiles when run as a compile-test, hence putting it in tests2. 6 | object ImplicitFromParentUsageInObject { 7 | case class B() 8 | case class A()(implicit val b: B) 9 | 10 | trait Parent { 11 | implicit val b: B = new B 12 | } 13 | 14 | trait Child extends Parent { 15 | val a = wire[A] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/methodWithTaggedParams.success: -------------------------------------------------------------------------------- 1 | #include commonTaggedClasses 2 | 3 | object Module { 4 | def create(blueberryArg: Berry @@ Blue) = { 5 | def inner(blackberryArg: Berry @@ Black): BlueberryBasket = wire[BlueberryBasket] 6 | inner _ 7 | } 8 | } 9 | 10 | val blueberry = wire[Berry].taggedWith[Blue] 11 | val blackberry = wire[Berry].taggedWith[Black] 12 | val blueberryBasket = Module.create(blueberry)(blackberry) 13 | 14 | // the compiler emits false warnings without the typecasts 15 | require((blueberryBasket.blueberry: Berry) == (blueberry: Berry)) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/methodWithTaggedParamsAmbiguous.failure: -------------------------------------------------------------------------------- 1 | #include commonTaggedClasses 2 | 3 | object Module { 4 | def create(blueberryArg1: Berry @@ Blue) = { 5 | def inner(blueberryArg2: Berry @@ Blue): BlueberryBasket = wire[BlueberryBasket] 6 | inner _ 7 | } 8 | } 9 | 10 | val blueberry1 = wire[Berry].taggedWith[Blue] 11 | val blueberry2 = wire[Berry].taggedWith[Blue] 12 | Module.create(blueberry1)(blueberry2) 13 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/methodWithTaggedParamsNotFound.failure: -------------------------------------------------------------------------------- 1 | #include commonTaggedClasses 2 | 3 | object Module { 4 | def create(blackberryArg: Berry @@ Black) = { 5 | def inner(raspberryArg: Berry @@ Red): BlueberryBasket = wire[BlueberryBasket] 6 | inner _ 7 | } 8 | } 9 | 10 | val blackberry = wire[Berry].taggedWith[Black] 11 | val raspberry = wire[Berry].taggedWith[Red] 12 | Module.create(blackberry)(raspberry) 13 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleAmbiguousWithParent.scala2.failure: -------------------------------------------------------------------------------- 1 | 2 | case class A() 3 | case class B(a: A) 4 | 5 | @Module 6 | class MyModule { 7 | lazy val a: A = A() 8 | } 9 | 10 | trait Base { 11 | lazy val parentA: A = A() 12 | } 13 | 14 | class Test(module: MyModule) extends Base { 15 | 16 | lazy val b: B = wire[B] 17 | } -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleAnnotationOnParent.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | @Module 4 | trait AModule { 5 | lazy val a = wire[A] 6 | } 7 | 8 | // BModule inherits the 'module' feature from its parent 9 | trait BModule extends AModule { 10 | lazy val b = wire[B] 11 | } 12 | 13 | class ABModule extends BModule 14 | 15 | class App(abModule: ABModule) { 16 | lazy val c = wire[C] 17 | } 18 | 19 | object Test { 20 | lazy val abModule = wire[ABModule] 21 | lazy val app = wire[App] 22 | } 23 | 24 | require(Test.app.c.a eq Test.abModule.a) 25 | require(Test.app.c.b eq Test.abModule.b) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleImportWithEmptyArgsList.scala2.success: -------------------------------------------------------------------------------- 1 | class ClassA() 2 | class ClassB(val a: ClassA) 3 | 4 | class Module1 { 5 | def doSomething(): Unit = () 6 | lazy val a: ClassA = wire[ClassA] 7 | } 8 | 9 | class Module2(m1: Module1) { 10 | import m1._ 11 | lazy val b: ClassB = wire[ClassB] 12 | } 13 | val mod1 = wire[Module1] 14 | val mod2 = wire[Module2] 15 | 16 | require(mod1.a eq mod2.b.a) 17 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInCaseClass.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | @Module 4 | class AModule { 5 | lazy val a = wire[A] 6 | } 7 | case class X(aModule: AModule) { 8 | lazy val b = wire[B] 9 | lazy val c = wire[C] 10 | } 11 | object CaseTest { 12 | lazy val aModule = wire[AModule] 13 | lazy val X = wire[X] 14 | } 15 | 16 | require(CaseTest.X.c.a eq CaseTest.aModule.a) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInClass.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | @Module 4 | class ABModule { 5 | lazy val a = wire[A] 6 | lazy val b = wire[B] 7 | } 8 | 9 | class App(abModule: ABModule) { 10 | lazy val c = wire[C] 11 | } 12 | 13 | object Test { 14 | lazy val abModule = wire[ABModule] 15 | lazy val app = wire[App] 16 | } 17 | 18 | require(Test.app.c.a eq Test.abModule.a) 19 | require(Test.app.c.b eq Test.abModule.b) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInClassDoNotImportObjectMethods.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | @Module 4 | class Base { 5 | lazy val theA = wire[A] 6 | } 7 | 8 | case class Stuff(a: A, i: Int, str: String) 9 | 10 | // this test makes sure that we don't consider 11 | // object methods such as hashCode or toString 12 | // of module base 13 | class Main(val base: Base) { 14 | 15 | lazy val someInt = 42 16 | lazy val someString = "toto" 17 | 18 | lazy val stuff = wire[Stuff] 19 | } 20 | 21 | val main = new Main(new Base) 22 | 23 | require(main.stuff.a eq main.base.theA) 24 | require(main.stuff.i == main.someInt) 25 | require(main.stuff.str == main.someString) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInClassOverlappedByImport.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | @Module 4 | class ABModule { 5 | lazy val a = wire[A] 6 | lazy val b = wire[B] 7 | } 8 | 9 | class App(abModule: ABModule) { 10 | // Make sure no ambiguity is found as `a` is equivalent to `abModule.a` 11 | import abModule.a 12 | 13 | lazy val c = wire[C] 14 | } 15 | 16 | object Test { 17 | lazy val abModule = wire[ABModule] 18 | lazy val app = wire[App] 19 | } 20 | 21 | require(Test.app.c.a eq Test.abModule.a) 22 | require(Test.app.c.b eq Test.abModule.b) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInImport.scala2.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | @Module 5 | class MyModule { 6 | lazy val a: A = A() 7 | } 8 | 9 | object Global { 10 | val module = new MyModule 11 | } 12 | 13 | object Test { 14 | // this is a bit twisted but we ought to be 15 | // coherent with our features 16 | import Global.module 17 | 18 | lazy val b = wire[B] 19 | } 20 | 21 | require(Test.b.a eq Global.module.a) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInParentMemberHaveLowerPriority.success: -------------------------------------------------------------------------------- 1 | case class A() 2 | case class B(a: A) 3 | 4 | @Module 5 | class MyModule { 6 | lazy val a: A = wire[A] 7 | } 8 | 9 | trait Base { 10 | lazy val a: A = wire[A] 11 | lazy val module: MyModule = wire[MyModule] 12 | } 13 | 14 | object Test extends Base { 15 | 16 | // `a` is in scope `Parent` whereas `module.a` is in scope `ModuleInParent` 17 | // so there are no ambiguity and `a` gets picked 18 | lazy val b: B = wire[B] 19 | } 20 | 21 | require(Test.b.a eq Test.a) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleInherited.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Parent { 4 | protected def bb = wire[B] 5 | lazy val b = wire[B] 6 | } 7 | @Module 8 | class AModule extends Parent { 9 | protected def x(i:Int) = wire[B] 10 | protected def d: D = ??? 11 | protected lazy val dd: D = ??? 12 | lazy val a = wire[A] 13 | } 14 | object ParentTest { 15 | lazy val aModule = wire[AModule] 16 | lazy val c = wire[C] 17 | } 18 | 19 | require(ParentTest.c.a eq ParentTest.aModule.a) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleWithAscription.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | @Module 4 | class App() { 5 | lazy val a = wire[A] 6 | lazy val b = wire[B] 7 | 8 | // there used to be a bug where the ascription would make 9 | // the macro find to be eligible as a module, and therefore 10 | // would find duplicated values 11 | lazy val c: C = wire[C] 12 | } 13 | 14 | val app = wire[App] 15 | 16 | require(app.c.a eq app.a) 17 | require(app.c.b eq app.b) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/moduleWithEmptyArgsList.success: -------------------------------------------------------------------------------- 1 | class ClassA() 2 | class ClassB(val a: ClassA) 3 | 4 | @Module 5 | class Module1 { 6 | def doSomething(): Unit = () 7 | lazy val a: ClassA = wire[ClassA] 8 | } 9 | 10 | class Module2(m1: Module1) { 11 | lazy val b: ClassB = wire[ClassB] 12 | } 13 | 14 | val mod1 = wire[Module1] 15 | val mod2 = wire[Module2] 16 | 17 | require(mod1.a eq mod2.b.a) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/multipleValuesAnnotated.success: -------------------------------------------------------------------------------- 1 | trait A 2 | trait B 3 | case class C(a:A) 4 | 5 | object Test{ 6 | val a:A = new A with B 7 | val b:B = new A with B 8 | val res = wire[C] 9 | } 10 | 11 | val wired = wiredInModule(Test) 12 | 13 | // no exceptions 14 | wired.lookupSingleOrThrow(classOf[A]) 15 | wired.lookupSingleOrThrow(classOf[B]) 16 | wired.lookupSingleOrThrow(classOf[C]) 17 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/taggedAnd.success: -------------------------------------------------------------------------------- 1 | import com.softwaremill.tagging._ 2 | 3 | class Berry() 4 | trait Black 5 | trait Blue 6 | 7 | case class Basket(blueberry: Berry @@ Blue, blackberry: Berry @@ Black) { 8 | def consume(b: Berry) = {} 9 | consume(blueberry) // can be used as "just" berry 10 | consume(blackberry) 11 | } 12 | 13 | trait Test { 14 | lazy val blueblackberry = wire[Berry].taggedWith[Blue].andTaggedWith[Black] 15 | lazy val basket = wire[Basket] 16 | } 17 | 18 | val t = new Test {} 19 | 20 | require(t.basket.blueberry != null) 21 | require(t.basket.blackberry != null) 22 | 23 | // the compiler emits false warnings without the typecasts 24 | require((t.basket.blueberry: Berry) == (t.blueblackberry: Berry)) 25 | require((t.basket.blackberry: Berry) == (t.blueblackberry: Berry)) 26 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/taggedNoValueWithTag.failure: -------------------------------------------------------------------------------- 1 | import com.softwaremill.tagging._ 2 | 3 | class Berry() 4 | trait Black 5 | trait Blue 6 | 7 | class Basket(blueberry: Berry @@ Blue) 8 | 9 | trait Test { 10 | lazy val blackberry = wire[Berry].taggedWith[Black] 11 | lazy val basket = wire[Basket] 12 | } 13 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/taggedPrimitive.success: -------------------------------------------------------------------------------- 1 | import com.softwaremill.tagging._ 2 | 3 | trait Usd 4 | trait Pln 5 | 6 | case class Money(usd: Int @@ Usd, pln: Int @@ Pln) { 7 | def consume(a : Int) = {} 8 | consume(usd) 9 | consume(pln) 10 | } 11 | 12 | trait Test { 13 | lazy val usd = 10.taggedWith[Usd] 14 | lazy val pln = 11.taggedWith[Pln] 15 | lazy val money = wire[Money] 16 | } 17 | 18 | val t = new Test {} 19 | require(t.money.usd == 10) 20 | require(t.money.pln == 11) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredClassWithTypeParameters.scala2.success: -------------------------------------------------------------------------------- 1 | case class Foo[T](x: Option[T]) 2 | 3 | case class Bar[T](val x: List[Option[T]]) 4 | 5 | case class Baz[T, U](x: Option[T], y: List[U]) 6 | 7 | object Test { 8 | val x = Option("Foo") 9 | val y = List(Some(1), Some(2), None) 10 | val z1 = Some(3) 11 | val z2 = List("abc", "def") 12 | 13 | val foo = wire[Foo[String]] 14 | val bar = wire[Bar[Int]] 15 | val baz = wire[Baz[Int, String]] 16 | } 17 | 18 | val wired = wiredInModule(Test) 19 | 20 | // no exceptions 21 | wired.lookupSingleOrThrow(classOf[Foo[String]]) 22 | wired.lookupSingleOrThrow(classOf[Bar[Int]]) 23 | wired.lookupSingleOrThrow(classOf[Baz[Int, String]]) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredDefs.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | def theA = new A 5 | val theB = new B 6 | def theC = wire[C] 7 | 8 | def another(param: Int) = param 9 | } 10 | 11 | val wired = wiredInModule(new Test) 12 | 13 | // no exceptions 14 | wired.lookupSingleOrThrow(classOf[A]) 15 | wired.lookupSingleOrThrow(classOf[B]) 16 | wired.lookupSingleOrThrow(classOf[C]) 17 | 18 | require(!(wired.lookupSingleOrThrow(classOf[A]) eq wired.lookupSingleOrThrow(classOf[A]))) 19 | require(wired.lookupSingleOrThrow(classOf[B]) eq wired.lookupSingleOrThrow(classOf[B])) 20 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredFromClass.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | val theA = new A 5 | } 6 | 7 | // no exceptions 8 | val wired = wiredInModule(new Test) 9 | 10 | wired.lookupSingleOrThrow(classOf[A]) 11 | require(wired.lookupSingleOrThrow(classOf[A]) eq wired.lookupSingleOrThrow(classOf[A])) 12 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredInherited.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | trait Test1 { 4 | val theA = wire[A] 5 | } 6 | 7 | trait Test2 { 8 | val theB = wire[B] 9 | } 10 | 11 | trait Test3 extends Test1 with Test2 { 12 | val theC = wire[C] 13 | } 14 | 15 | val wired = wiredInModule(new Test3 {}) 16 | 17 | // no exceptions 18 | wired.lookupSingleOrThrow(classOf[A]) 19 | wired.lookupSingleOrThrow(classOf[B]) 20 | wired.lookupSingleOrThrow(classOf[C]) 21 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredLazy.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | class Test { 4 | lazy val theA = new A 5 | lazy val theB = new B 6 | lazy val theS = "ss" 7 | } 8 | 9 | val wired = wiredInModule(new Test) 10 | 11 | // no exceptions 12 | wired.lookupSingleOrThrow(classOf[A]) 13 | wired.lookupSingleOrThrow(classOf[B]) 14 | 15 | require(wired.lookupSingleOrThrow(classOf[String]) == "ss") -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredPrimitive.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val theA = new A 5 | val theB = new B 6 | val theS = "ss" 7 | val theI = 1 // primitives should be skipped 8 | } 9 | 10 | val wired = wiredInModule(Test) 11 | 12 | // no exceptions 13 | wired.lookupSingleOrThrow(classOf[A]) 14 | wired.lookupSingleOrThrow(classOf[B]) 15 | wired.lookupSingleOrThrow(classOf[String]) 16 | 17 | require(wired.lookupSingleOrThrow(classOf[String]) == "ss") 18 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredSimple.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val theA = new A 5 | val theB = new B 6 | val theS = "ss" 7 | } 8 | 9 | val wired = wiredInModule(Test) 10 | 11 | // no exceptions 12 | wired.lookupSingleOrThrow(classOf[A]) 13 | wired.lookupSingleOrThrow(classOf[B]) 14 | wired.lookupSingleOrThrow(classOf[String]) 15 | 16 | require(wired.lookupSingleOrThrow(classOf[String]) == "ss") 17 | -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredVisibility.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val theA = new A 5 | private val theB = new B 6 | protected val theC = wire[C] 7 | } 8 | 9 | val wired = wiredInModule(Test) 10 | 11 | // visible 12 | wired.lookupSingleOrThrow(classOf[A]) 13 | 14 | // not visible 15 | require(wired.lookup(classOf[B]) == Nil) 16 | require(wired.lookup(classOf[C]) == Nil) -------------------------------------------------------------------------------- /util-tests/src/test/resources/test-cases/wiredWithWire.success: -------------------------------------------------------------------------------- 1 | #include commonSimpleClasses 2 | 3 | object Test { 4 | val theA = wire[A] 5 | val theB = wire[B] 6 | val theC = wire[C] 7 | } 8 | 9 | val wired = wiredInModule(Test) 10 | 11 | // no exceptions 12 | wired.lookupSingleOrThrow(classOf[A]) 13 | wired.lookupSingleOrThrow(classOf[B]) 14 | wired.lookupSingleOrThrow(classOf[C]) -------------------------------------------------------------------------------- /util-tests/src/test/scala-2/com/softwaremill/macwire/CompileTests.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | class CompileTests extends CompileTestsSupport { 4 | 5 | runTestsWith( 6 | expectedFailures = List( 7 | "methodWithTaggedParamsNotFound" -> List(valueNotFound("Berry @@ Blue")), 8 | "methodWithTaggedParamsAmbiguous" -> List(ambiguousResMsg("Berry @@ Blue"), "blueberryArg1", "blueberryArg2"), 9 | "moduleAmbiguousWithParent" -> List(ambiguousResMsg("A"), "module.a", "parentA"), 10 | "taggedNoValueWithTag" -> List(valueNotFound("Berry @@ Blue")) 11 | ) 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /util-tests/src/test/scala-3/com/softwaremill/macwire/CompileTests.scala: -------------------------------------------------------------------------------- 1 | package com.softwaremill.macwire 2 | 3 | class CompileTests extends CompileTestsSupport { 4 | // FIXME we currently print only `@@` instead of full type name 5 | runTestsWith( 6 | expectedFailures = List( 7 | "methodWithTaggedParamsNotFound" -> List(valueNotFound("@@")), 8 | "methodWithTaggedParamsAmbiguous" -> List(ambiguousResMsg("@@"), "blueberryArg1", "blueberryArg2"), 9 | "taggedNoValueWithTag" -> List(valueNotFound("@@")) 10 | ) 11 | ) 12 | } 13 | --------------------------------------------------------------------------------