From ac55d9e4ed9070b1935094b3cccb2dfddd22b043 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sun, 26 Jan 2025 17:08:25 +0100 Subject: [PATCH 1/2] Also detect @jakarta.inject.Inject annotations --- .../macwire/internals/ConstructorCrimper.scala | 9 ++++++--- .../macwire/internals/ConstructorCrimper.scala | 11 ++++++++--- .../macwire/internals/autowire/creator.scala | 9 ++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/macros/src/main/scala-2/com/softwaremill/macwire/internals/ConstructorCrimper.scala b/macros/src/main/scala-2/com/softwaremill/macwire/internals/ConstructorCrimper.scala index c97614be..7b96264d 100644 --- a/macros/src/main/scala-2/com/softwaremill/macwire/internals/ConstructorCrimper.scala +++ b/macros/src/main/scala-2/com/softwaremill/macwire/internals/ConstructorCrimper.scala @@ -74,9 +74,12 @@ object ConstructorCrimper { lazy val primaryConstructor: Option[Symbol] = publicConstructors.find(_.asMethod.isPrimaryConstructor) lazy val injectConstructors: Iterable[Symbol] = { - val isInjectAnnotation = (a: Annotation) => a.toString == "javax.inject.Inject" + val isInjectAnnotation = (a: Annotation) => + a.toString == "javax.inject.Inject" || a.toString == "jakarta.inject.Inject" val ctors = publicConstructors.filter(_.annotations.exists(isInjectAnnotation)) - log.withBlock(s"There are ${ctors.size} constructors annotated with @javax.inject.Inject") { + log.withBlock( + s"There are ${ctors.size} constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject" + ) { ctors.foreach(s => log(showConstructor(c)(s))) } ctors @@ -86,7 +89,7 @@ object ConstructorCrimper { if (injectConstructors.size > 1) c.abort( c.enclosingPosition, - s"Ambiguous constructors annotated with @javax.inject.Inject for type [$targetType]" + s"Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [$targetType]" ) else injectConstructors.headOption diff --git a/macros/src/main/scala-3/com/softwaremill/macwire/internals/ConstructorCrimper.scala b/macros/src/main/scala-3/com/softwaremill/macwire/internals/ConstructorCrimper.scala index c05b2930..76f7f27e 100644 --- a/macros/src/main/scala-3/com/softwaremill/macwire/internals/ConstructorCrimper.scala +++ b/macros/src/main/scala-3/com/softwaremill/macwire/internals/ConstructorCrimper.scala @@ -34,9 +34,12 @@ private[macwire] class ConstructorCrimper[Q <: Quotes, T: Type](using val q: Q)( } lazy val injectConstructors: Iterable[Symbol] = { - val isInjectAnnotation = (a: Term) => a.tpe.typeSymbol.fullName == "javax.inject.Inject" + val isInjectAnnotation = (a: Term) => + a.tpe.typeSymbol.fullName == "javax.inject.Inject" || a.tpe.typeSymbol.fullName == "jakarta.inject.Inject" val ctors = publicConstructors.filter(_.annotations.exists(isInjectAnnotation)) - log.withBlock(s"There are ${ctors.size} constructors annotated with @javax.inject.Inject") { + log.withBlock( + s"There are ${ctors.size} constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject" + ) { ctors.foreach(c => log(showConstructor(c))) } ctors @@ -44,7 +47,9 @@ private[macwire] class ConstructorCrimper[Q <: Quotes, T: Type](using val q: Q)( lazy val injectConstructor: Option[Symbol] = if (injectConstructors.size > 1) - abort(s"Ambiguous constructors annotated with @javax.inject.Inject for type [${targetType.typeSymbol.name}]") + abort( + s"Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [${targetType.typeSymbol.name}]" + ) else injectConstructors.headOption lazy val constructor: Option[Symbol] = log.withBlock(s"Looking for constructor for $targetType") { diff --git a/macros/src/main/scala-3/com/softwaremill/macwire/internals/autowire/creator.scala b/macros/src/main/scala-3/com/softwaremill/macwire/internals/autowire/creator.scala index f2ce1b4c..36cd561b 100644 --- a/macros/src/main/scala-3/com/softwaremill/macwire/internals/autowire/creator.scala +++ b/macros/src/main/scala-3/com/softwaremill/macwire/internals/autowire/creator.scala @@ -87,9 +87,12 @@ object Constructor: case c => None val injectConstructors: Iterable[Symbol] = - val isInjectAnnotation = (a: Term) => a.tpe.typeSymbol.fullName == "javax.inject.Inject" + val isInjectAnnotation = (a: Term) => + a.tpe.typeSymbol.fullName == "javax.inject.Inject" || a.tpe.typeSymbol.fullName == "jakarta.inject.Inject" val ctors = publicConstructors.filter(_.annotations.exists(isInjectAnnotation)) - log.withBlock(s"there are ${ctors.size} constructors annotated with @javax.inject.Inject") { + log.withBlock( + s"there are ${ctors.size} constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject" + ) { ctors.foreach(c => log(c.toString)) } ctors @@ -97,7 +100,7 @@ object Constructor: val injectConstructor: Option[Symbol] = if injectConstructors.size > 1 then reportError( - s"multiple constructors annotated with @javax.inject.Inject for type: ${showTypeName(forType)}" + s"multiple constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type: ${showTypeName(forType)}" ) else injectConstructors.headOption From 4f887db0688806b24e9e41de768eb0f02c667930 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Mon, 27 Jan 2025 08:48:31 +0100 Subject: [PATCH 2/2] Tests are aware about @jakarta.inject.Inject output now --- .../macwire/akkasupport/CompileTests.scala | 12 ++++++------ .../macwire/pekkosupport/CompileTests.scala | 12 ++++++------ .../com/softwaremill/macwire/CompileTests.scala | 4 +++- .../com/softwaremill/macwire/CompileTests.scala | 4 +++- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/macrosAkkaTests/src/test/scala/com/softwaremill/macwire/akkasupport/CompileTests.scala b/macrosAkkaTests/src/test/scala/com/softwaremill/macwire/akkasupport/CompileTests.scala index 0428edc3..a92c28ae 100644 --- a/macrosAkkaTests/src/test/scala/com/softwaremill/macwire/akkasupport/CompileTests.scala +++ b/macrosAkkaTests/src/test/scala/com/softwaremill/macwire/akkasupport/CompileTests.scala @@ -28,13 +28,13 @@ class CompileTests extends CompileTestsSupport { "type arguments [NotActor] do not conform to macro method wireActor's type parameter bounds [T <: akka.actor.Actor]" ), "wireProps-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActor]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActor]" ), "wireAnonymousActor-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActor]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActor]" ), "wireActor-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActor]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActor]" ), "wireProps-12-noPublicConstructor" -> List("Cannot find a public constructor for [SomeActor]"), "wireAnonymousActor-12-noPublicConstructor" -> List("Cannot find a public constructor for [SomeActor]"), @@ -54,7 +54,7 @@ class CompileTests extends CompileTestsSupport { "wireActorWithProducer-6-injectAnnotationButNoDependencyInScope" -> List("Cannot find a value of type: [C]"), "wireActorWithProducer-7-notActorProducer" -> List("wireActorWith does not support the type: [NotProducer]"), "wireActorWithProducer-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActorProducer]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActorProducer]" ), "wireActorWithProducer-12-noPublicConstructor" -> List( "Cannot find a public constructor for [SomeActorProducer]" @@ -76,7 +76,7 @@ class CompileTests extends CompileTestsSupport { "wireAnonymousActorWith does not support the type: [NotProducer]" ), "wireAnonymousActorWithProducer-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActorProducer]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActorProducer]" ), "wireAnonymousActorWithProducer-12-noPublicConstructor" -> List( "Cannot find a public constructor for [SomeActorProducer]" @@ -96,7 +96,7 @@ class CompileTests extends CompileTestsSupport { "wirePropsWithProducer-6-injectAnnotationButNoDependencyInScope" -> List("Cannot find a value of type: [C]"), "wirePropsWithProducer-7-notActorProducer" -> List("wirePropsWith does not support the type: [NotProducer]"), "wirePropsWithProducer-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActorProducer]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActorProducer]" ), "wirePropsWithProducer-12-noPublicConstructor" -> List( "Cannot find a public constructor for [SomeActorProducer]" diff --git a/macrosPekkoTests/src/test/scala/com/softwaremill/macwire/pekkosupport/CompileTests.scala b/macrosPekkoTests/src/test/scala/com/softwaremill/macwire/pekkosupport/CompileTests.scala index d77c6807..2c3e9b6a 100644 --- a/macrosPekkoTests/src/test/scala/com/softwaremill/macwire/pekkosupport/CompileTests.scala +++ b/macrosPekkoTests/src/test/scala/com/softwaremill/macwire/pekkosupport/CompileTests.scala @@ -28,13 +28,13 @@ class CompileTests extends CompileTestsSupport { "type arguments [NotActor] do not conform to macro method wireActor's type parameter bounds [T <: org.apache.pekko.actor.Actor]" ), "wireProps-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActor]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActor]" ), "wireAnonymousActor-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActor]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActor]" ), "wireActor-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActor]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActor]" ), "wireProps-12-noPublicConstructor" -> List("Cannot find a public constructor for [SomeActor]"), "wireAnonymousActor-12-noPublicConstructor" -> List("Cannot find a public constructor for [SomeActor]"), @@ -54,7 +54,7 @@ class CompileTests extends CompileTestsSupport { "wireActorWithProducer-6-injectAnnotationButNoDependencyInScope" -> List("Cannot find a value of type: [C]"), "wireActorWithProducer-7-notActorProducer" -> List("wireActorWith does not support the type: [NotProducer]"), "wireActorWithProducer-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActorProducer]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActorProducer]" ), "wireActorWithProducer-12-noPublicConstructor" -> List( "Cannot find a public constructor for [SomeActorProducer]" @@ -76,7 +76,7 @@ class CompileTests extends CompileTestsSupport { "wireAnonymousActorWith does not support the type: [NotProducer]" ), "wireAnonymousActorWithProducer-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActorProducer]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActorProducer]" ), "wireAnonymousActorWithProducer-12-noPublicConstructor" -> List( "Cannot find a public constructor for [SomeActorProducer]" @@ -96,7 +96,7 @@ class CompileTests extends CompileTestsSupport { "wirePropsWithProducer-6-injectAnnotationButNoDependencyInScope" -> List("Cannot find a value of type: [C]"), "wirePropsWithProducer-7-notActorProducer" -> List("wirePropsWith does not support the type: [NotProducer]"), "wirePropsWithProducer-11-toManyInjectAnnotations" -> List( - "Ambiguous constructors annotated with @javax.inject.Inject for type [SomeActorProducer]" + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [SomeActorProducer]" ), "wirePropsWithProducer-12-noPublicConstructor" -> List( "Cannot find a public constructor for [SomeActorProducer]" diff --git a/tests/src/test/scala-2/com/softwaremill/macwire/CompileTests.scala b/tests/src/test/scala-2/com/softwaremill/macwire/CompileTests.scala index 183b1b78..10450a50 100644 --- a/tests/src/test/scala-2/com/softwaremill/macwire/CompileTests.scala +++ b/tests/src/test/scala-2/com/softwaremill/macwire/CompileTests.scala @@ -31,7 +31,9 @@ class CompileTests extends CompileTestsSupport { "Companion object for", "Target] has no apply methods constructing target type." ), - "toManyInjectAnnotations" -> List("Ambiguous constructors annotated with @javax.inject.Inject for type [Target]"), + "toManyInjectAnnotations" -> List( + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [Target]" + ), "nullaryMethodUsedAsCandidate" -> List("Found multiple values of type [A]: [List(Module.foo(), a)]"), "wireWithTwoParamsLists" -> List("found : A => (B => __wrapper$1", "required: ? => __wrapper$1"), "wireRecEmptyString" -> List(valueNotFound("String")) diff --git a/tests/src/test/scala-3/com/softwaremill/macwire/CompileTests.scala b/tests/src/test/scala-3/com/softwaremill/macwire/CompileTests.scala index aee4cfcf..c5ee6654 100644 --- a/tests/src/test/scala-3/com/softwaremill/macwire/CompileTests.scala +++ b/tests/src/test/scala-3/com/softwaremill/macwire/CompileTests.scala @@ -33,7 +33,9 @@ class CompileTests extends CompileTestsSupport { "has no apply methods constructing target type", "[Target]" ), - "toManyInjectAnnotations" -> List("Ambiguous constructors annotated with @javax.inject.Inject for type [Target]"), + "toManyInjectAnnotations" -> List( + "Ambiguous constructors annotated with @javax.inject.Inject or @jakarta.inject.Inject for type [Target]" + ), "wireWithTwoParamsLists" -> List("Found: Main.A => Main.B => Main.Test.C", "Required: Any => Main.Test.C"), "wireRecEmptyString" -> List(valueNotFound("String")) )