Skip to content

Commit 6d5ccbb

Browse files
committed
Fix bean-meta annotation support
1 parent 6d3ee4a commit 6d5ccbb

File tree

6 files changed

+61
-4
lines changed

6 files changed

+61
-4
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,8 @@ class Definitions {
10211021
@tu lazy val UncheckedVarianceAnnot: ClassSymbol = requiredClass("scala.annotation.unchecked.uncheckedVariance")
10221022
@tu lazy val VolatileAnnot: ClassSymbol = requiredClass("scala.volatile")
10231023
@tu lazy val WithPureFunsAnnot: ClassSymbol = requiredClass("scala.annotation.internal.WithPureFuns")
1024+
@tu lazy val BeanGetterMetaAnnot: ClassSymbol = requiredClass("scala.annotation.meta.beanGetter")
1025+
@tu lazy val BeanSetterMetaAnnot: ClassSymbol = requiredClass("scala.annotation.meta.beanSetter")
10241026
@tu lazy val FieldMetaAnnot: ClassSymbol = requiredClass("scala.annotation.meta.field")
10251027
@tu lazy val GetterMetaAnnot: ClassSymbol = requiredClass("scala.annotation.meta.getter")
10261028
@tu lazy val ParamMetaAnnot: ClassSymbol = requiredClass("scala.annotation.meta.param")

compiler/src/dotty/tools/dotc/transform/BeanProperties.scala

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ class BeanProperties(thisPhase: DenotTransformer):
3434
info = MethodType(Nil, valDef.denot.info),
3535
coord = annot.tree.span
3636
).enteredAfter(thisPhase).asTerm
37-
meth.addAnnotations(valDef.symbol.annotations)
37+
val annots = valDef.symbol.annotations.filter { a =>
38+
a.hasOneOfMetaAnnotation(defn.BeanGetterMetaAnnot) | !a.hasOneOfMetaAnnotation(defn.BeanSetterMetaAnnot)
39+
}
40+
meth.addAnnotations(annots)
3841
val body: Tree = ref(valDef.symbol)
3942
DefDef(meth, body)
4043

@@ -48,9 +51,11 @@ class BeanProperties(thisPhase: DenotTransformer):
4851
info = MethodType(valDef.name :: Nil, valDef.denot.info :: Nil, defn.UnitType),
4952
coord = annot.tree.span
5053
).enteredAfter(thisPhase).asTerm
51-
meth.addAnnotations(valDef.symbol.annotations)
52-
def body(params: List[List[Tree]]): Tree = Assign(ref(valDef.symbol), params.head.head)
53-
DefDef(meth, body)
54+
val annots = valDef.symbol.annotations.filter { a =>
55+
a.hasOneOfMetaAnnotation(defn.BeanSetterMetaAnnot) | !a.hasOneOfMetaAnnotation(defn.BeanGetterMetaAnnot)
56+
}
57+
meth.addAnnotations(annots)
58+
DefDef(meth, (params: List[List[Tree]]) => Assign(ref(valDef.symbol), params.head.head))
5459
}
5560

5661
def prefixedName(prefix: String, valName: Name) =

tests/run/i15318.check

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
inspecting field value
2+
@JsonProperty(value="REAL_VALUE")
3+
inspecting method getValue
4+
@JsonProperty(value="REAL_VALUE")
5+
inspecting method setValue
6+
inspecting method value
7+
inspecting method value_$eq
8+
inspecting constructor TestBeanProperty

tests/run/i15318/JsonProperty.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import java.lang.annotation.Retention;
2+
import java.lang.annotation.RetentionPolicy;
3+
4+
@Retention(RetentionPolicy.RUNTIME)
5+
public @interface JsonProperty {
6+
String value() default "";
7+
}

tests/run/i15318/Test.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
object Test:
2+
def main(args: Array[String]): Unit =
3+
val clasz = classOf[TestBeanProperty]
4+
5+
for (m <- clasz.getDeclaredFields.sortBy(_.getName)) {
6+
m.setAccessible(true)
7+
println(s"inspecting field ${m.getName}")
8+
for a <- m.getAnnotations().sortBy(_.toString) do
9+
println(a)
10+
}
11+
12+
for (m <- clasz.getDeclaredMethods.sortBy(_.getName)) {
13+
m.setAccessible(true)
14+
println(s"inspecting method ${m.getName}")
15+
for a <- m.getAnnotations().sortBy(_.toString) do
16+
println(a)
17+
}
18+
19+
for c <- clasz.getDeclaredConstructors.sortBy(_.getName) do
20+
c.setAccessible(true)
21+
println(s"inspecting constructor ${c.getName}")
22+
for p <- c.getParameters.sortBy(_.getName) do
23+
println(s"inspecting param ${p.getName}")
24+
for a <- p.getAnnotations.sortBy(_.toString) do
25+
println(s"annotation $a")
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import scala.annotation.meta.beanGetter
2+
import scala.beans.BeanProperty
3+
4+
class TestBeanProperty {
5+
6+
@(JsonProperty @beanGetter)(value = "REAL_VALUE")
7+
@BeanProperty
8+
var value: String = _
9+
10+
}

0 commit comments

Comments
 (0)