@@ -81,18 +81,37 @@ class CrossVersionChecks extends MiniPhase:
81
81
report.deprecationWarning(em " inheritance from $psym is deprecated $since$msg" , parent.srcPos, origin= psym.showFullName)
82
82
}
83
83
84
+ private def unrollError (pos : SrcPos )(using Context ): Unit =
85
+ report.error(" @unroll is only allowed on a method parameter" , pos)
86
+
87
+ private def checkUnrollAnnot (annotSym : Symbol , pos : SrcPos )(using Context ): Unit =
88
+ if annotSym == defn.UnrollAnnot then
89
+ unrollError(pos)
90
+
91
+ private def checkUnrollMemberDef (memberDef : MemberDef )(using Context ): Unit =
92
+ val sym = memberDef.symbol
93
+ if
94
+ sym.hasAnnotation(defn.UnrollAnnot )
95
+ && ! (sym.isTerm && sym.is(Param ))
96
+ then
97
+ val normSym = if sym.is(ModuleVal ) then sym.moduleClass else sym
98
+ unrollError(normSym.srcPos)
99
+
84
100
override def transformValDef (tree : ValDef )(using Context ): ValDef =
101
+ checkUnrollMemberDef(tree)
85
102
checkDeprecatedOvers(tree)
86
103
checkExperimentalAnnots(tree.symbol)
87
104
tree
88
105
89
106
override def transformDefDef (tree : DefDef )(using Context ): DefDef =
107
+ checkUnrollMemberDef(tree)
90
108
checkDeprecatedOvers(tree)
91
109
checkExperimentalAnnots(tree.symbol)
92
110
tree
93
111
94
112
override def transformTypeDef (tree : TypeDef )(using Context ): TypeDef =
95
113
// TODO do we need to check checkDeprecatedOvers(tree)?
114
+ checkUnrollMemberDef(tree)
96
115
checkExperimentalAnnots(tree.symbol)
97
116
tree
98
117
@@ -126,6 +145,8 @@ class CrossVersionChecks extends MiniPhase:
126
145
if tree.span.isSourceDerived then
127
146
checkDeprecatedRef(sym, tree.srcPos)
128
147
checkExperimentalRef(sym, tree.srcPos)
148
+ case AnnotatedType (_, annot) =>
149
+ checkUnrollAnnot(annot.symbol, tree.srcPos)
129
150
case _ =>
130
151
}
131
152
tree
@@ -140,7 +161,11 @@ class CrossVersionChecks extends MiniPhase:
140
161
case tree : TypeTree => transformTypeTree(tree)
141
162
case _ =>
142
163
}
143
- tree
164
+ tree match
165
+ case Annotated (_, annot) =>
166
+ checkUnrollAnnot(annot.tpe.typeSymbol, tree.srcPos)
167
+ tree
168
+ case tree => tree
144
169
145
170
end CrossVersionChecks
146
171
0 commit comments