Skip to content

Commit e580aaa

Browse files
committed
Correctly shuffle annotations to where they should go
1 parent fa6326a commit e580aaa

File tree

12 files changed

+146
-82
lines changed

12 files changed

+146
-82
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,8 @@ class Definitions {
10411041
// A list of meta-annotations that are relevant for fields and accessors
10421042
@tu lazy val FieldAccessorMetaAnnots: Set[Symbol] =
10431043
Set(FieldMetaAnnot, GetterMetaAnnot, ParamMetaAnnot, SetterMetaAnnot)
1044+
@tu lazy val ExtFieldAccessorMetaAnnots: Set[Symbol] =
1045+
FieldAccessorMetaAnnots + BeanGetterMetaAnnot + BeanSetterMetaAnnot
10441046

10451047
// A list of annotations that are commonly used to indicate that a field/method argument or return
10461048
// type is not null. These annotations are used by the nullification logic in JavaNullInterop to

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class BeanProperties(thisPhase: DenotTransformer):
3434
info = MethodType(Nil, valDef.denot.info),
3535
coord = annot.tree.span
3636
).enteredAfter(thisPhase).asTerm
37-
val annots = valDef.symbol.annotations.filter { a =>
38-
a.hasOneOfMetaAnnotation(defn.BeanGetterMetaAnnot) || !a.hasOneOfMetaAnnotation(defn.BeanSetterMetaAnnot)
37+
val annots = valDef.symbol.annotations.filterConserve { a =>
38+
a.hasOneOfMetaAnnotation(defn.BeanGetterMetaAnnot)
3939
}
4040
meth.addAnnotations(annots)
4141
val body: Tree = ref(valDef.symbol)
@@ -51,8 +51,8 @@ class BeanProperties(thisPhase: DenotTransformer):
5151
info = MethodType(valDef.name :: Nil, valDef.denot.info :: Nil, defn.UnitType),
5252
coord = annot.tree.span
5353
).enteredAfter(thisPhase).asTerm
54-
val annots = valDef.symbol.annotations.filter { a =>
55-
a.hasOneOfMetaAnnotation(defn.BeanSetterMetaAnnot) || !a.hasOneOfMetaAnnotation(defn.BeanGetterMetaAnnot)
54+
val annots = valDef.symbol.annotations.filterConserve { a =>
55+
a.hasOneOfMetaAnnotation(defn.BeanSetterMetaAnnot)
5656
}
5757
meth.addAnnotations(annots)
5858
def body(params: List[List[Tree]]): Tree = Assign(ref(valDef.symbol), params.head.head)

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
122122
denot match {
123123
case fieldDenot: SymDenotation if sym.annotations.nonEmpty =>
124124
val cpy = fieldDenot.copySymDenotation()
125-
cpy.annotations = atPhase(typerPhase)(sym.annotationsCarrying(defn.FieldMetaAnnot))
125+
cpy.annotations = atPhase(typerPhase)(sym.annotations.filterConserve { annot =>
126+
annot.hasOneOfMetaAnnotation(defn.FieldMetaAnnot)
127+
|| !annot.hasOneOfMetaAnnotation(defn.ExtFieldAccessorMetaAnnots.toList*)
128+
})
126129
cpy.installAfter(thisPhase)
127130
case _ => ()
128131
}

tests/run/i12492.check

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,37 @@
1-
inspecting field fieldName1 @MyColumnBase
2-
inspecting field fieldName2 @MyColumnBase
3-
inspecting field getterName1
4-
inspecting field getterName2
5-
inspecting method fieldName1
6-
inspecting method fieldName2
7-
inspecting method getterName1 @MyColumnBase
8-
inspecting method getterName2 @MyColumnBase
91
inspecting constructor MyTable
10-
inspecting param fieldName1
11-
inspecting param fieldName2
12-
inspecting param getterName1
13-
inspecting param getterName2
2+
inspecting param aaaParam1 @MyColumnBase
3+
inspecting param fldParam1
4+
inspecting param getParam1
5+
inspecting param parParam1 @MyColumnBase
6+
inspecting field aaaField1 @MyColumnBase
7+
inspecting field aaaParam1
8+
inspecting field fldField1 @MyColumnBase
9+
inspecting field fldParam1 @MyColumnBase
10+
inspecting field getField1
11+
inspecting field getParam1
12+
inspecting field parField1
13+
inspecting field parParam1
14+
inspecting method aaaField1
15+
inspecting method aaaParam1
16+
inspecting method fldField1
17+
inspecting method fldParam1
18+
inspecting method getField1 @MyColumnBase
19+
inspecting method getParam1 @MyColumnBase
20+
inspecting method parField1
21+
inspecting method parParam1
22+
inspecting constructor MyTable2
23+
inspecting param fldParam2
24+
inspecting param getParam2
25+
inspecting param parParam2 @MyColumnBase
26+
inspecting field fldField2 @MyColumnBase
27+
inspecting field fldParam2 @MyColumnBase
28+
inspecting field getField2
29+
inspecting field getParam2
30+
inspecting field parField2
31+
inspecting field parParam2
32+
inspecting method fldField2
33+
inspecting method fldParam2
34+
inspecting method getField2 @MyColumnBase
35+
inspecting method getParam2 @MyColumnBase
36+
inspecting method parField2
37+
inspecting method parParam2

tests/run/i12492/MyColumnBase.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,4 @@
22
import java.lang.annotation.RetentionPolicy;
33

44
@Retention(RetentionPolicy.RUNTIME)
5-
public @interface MyColumnBase {
6-
String name() default "";
7-
}
5+
public @interface MyColumnBase {}

tests/run/i12492/MyTable.scala

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
1-
import scala.annotation.meta.*
1+
import scala.annotation.meta.{ field as fld, getter as get, param as par }
22

3-
type FieldColumn = MyColumnBase @field
4-
type GetterColumn = MyColumnBase @getter
3+
type FldColumn = MyColumnBase @fld
4+
type GetColumn = MyColumnBase @get
5+
type ParColumn = MyColumnBase @par
56

67
class MyTable(
7-
@(MyColumnBase @field)(name="FIELD_NAME1")
8-
val fieldName1: String,
9-
@FieldColumn(name="FIELD_NAME2")
10-
val fieldName2: String,
8+
@(MyColumnBase ) val aaaParam1: String,
9+
@(MyColumnBase @fld) val fldParam1: String,
10+
@(MyColumnBase @get) val getParam1: String,
11+
@(MyColumnBase @par) val parParam1: String,
12+
) {
13+
@(MyColumnBase ) val aaaField1: String = ""
14+
@(MyColumnBase @fld) val fldField1: String = ""
15+
@(MyColumnBase @get) val getField1: String = ""
16+
@(MyColumnBase @par) val parField1: String = ""
17+
}
1118

12-
@(MyColumnBase @getter)(name="GETTER_NAME1")
13-
val getterName1: String,
14-
@GetterColumn(name="GETTER_NAME2")
15-
val getterName2: String,
16-
)
19+
class MyTable2(
20+
@FldColumn val fldParam2: String,
21+
@GetColumn val getParam2: String,
22+
@ParColumn val parParam2: String,
23+
) {
24+
@FldColumn val fldField2: String = ""
25+
@GetColumn val getField2: String = ""
26+
@ParColumn val parField2: String = ""
27+
}

tests/run/i12492/Test.scala

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
// scalajs: --skip
22
object Test:
33
def main(args: Array[String]): Unit =
4-
val cls = classOf[MyTable]
4+
go(classOf[MyTable])
5+
go(classOf[MyTable2])
6+
7+
def go(cls: Class[?]): Unit =
8+
for c <- cls.getDeclaredConstructors.sortBy(_.getName) do
9+
c.setAccessible(true)
10+
println(s"inspecting constructor ${c.getName}")
11+
for p <- c.getParameters.sortBy(_.getName) do
12+
print(s"inspecting param ${p.getName}")
13+
for a <- p.getAnnotations.sortBy(_.annotationType.toString) do
14+
print(s" @${a.annotationType.getName}")
15+
println()
516

617
for (m <- cls.getDeclaredFields.sortBy(_.getName)) {
718
m.setAccessible(true)
@@ -18,12 +29,3 @@ object Test:
1829
print(s" @${a.annotationType.getName}")
1930
println()
2031
}
21-
22-
for c <- cls.getDeclaredConstructors.sortBy(_.getName) do
23-
c.setAccessible(true)
24-
println(s"inspecting constructor ${c.getName}")
25-
for p <- c.getParameters.sortBy(_.getName) do
26-
print(s"inspecting param ${p.getName}")
27-
for a <- p.getAnnotations.sortBy(_.annotationType.toString) do
28-
print(s" @${a.annotationType.getName}")
29-
println()

tests/run/i15318.check

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
1-
inspecting field value
2-
inspecting field value2
3-
inspecting method getValue @JsonProperty
4-
inspecting method getValue2 @JsonProperty
5-
inspecting method setValue
6-
inspecting method setValue2
7-
inspecting method value
8-
inspecting method value2
9-
inspecting method value2_$eq
10-
inspecting method value_$eq
11-
inspecting constructor TestBeanProperty
1+
inspecting constructor Bean
2+
inspecting field beanAaa @JsonProperty
3+
inspecting field beanGet
4+
inspecting field beanSet
5+
inspecting field normAaa @JsonProperty
6+
inspecting field normFld @JsonProperty
7+
inspecting field normGet
8+
inspecting field normSet
9+
inspecting method beanAaa
10+
inspecting method beanGet
11+
inspecting method beanSet
12+
inspecting method beanSet_$eq
13+
inspecting method getBeanAaa
14+
inspecting method getBeanGet @JsonProperty
15+
inspecting method getBeanSet
16+
inspecting method normAaa
17+
inspecting method normFld
18+
inspecting method normGet @JsonProperty
19+
inspecting method normSet
20+
inspecting method normSet_$eq @JsonProperty
21+
inspecting method setBeanSet @JsonProperty
22+
inspecting constructor Bean2
23+
inspecting field beanGet
24+
inspecting field beanSet
25+
inspecting method beanGet
26+
inspecting method beanSet
27+
inspecting method beanSet_$eq
28+
inspecting method getBeanGet @JsonProperty
29+
inspecting method getBeanSet
30+
inspecting method setBeanSet @JsonProperty

tests/run/i15318/Bean.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import scala.annotation.meta.{ field as fld, getter as get, setter as set, * }
2+
import scala.beans.BeanProperty
3+
4+
type BeanGetJsonProperty = JsonProperty @beanGetter
5+
type BeanSetJsonProperty = JsonProperty @beanSetter
6+
7+
class Bean {
8+
@(JsonProperty ) val normAaa: String = ""
9+
@(JsonProperty @fld) val normFld: String = ""
10+
@(JsonProperty @get) val normGet: String = ""
11+
@(JsonProperty @set) var normSet: String = ""
12+
13+
@(JsonProperty ) @BeanProperty val beanAaa: String = ""
14+
@(JsonProperty @beanGetter) @BeanProperty val beanGet: String = ""
15+
@(JsonProperty @beanSetter) @BeanProperty var beanSet: String = ""
16+
}
17+
18+
class Bean2 {
19+
@BeanGetJsonProperty @BeanProperty val beanGet: String = ""
20+
@BeanSetJsonProperty @BeanProperty var beanSet: String = ""
21+
}

tests/run/i15318/JsonProperty.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,4 @@
22
import java.lang.annotation.RetentionPolicy;
33

44
@Retention(RetentionPolicy.RUNTIME)
5-
public @interface JsonProperty {
6-
String value() default "";
7-
}
5+
public @interface JsonProperty {}

0 commit comments

Comments
 (0)