@@ -15,7 +15,13 @@ import {
15
15
isEnum ,
16
16
isReferenceExpr ,
17
17
} from '@zenstackhq/language/ast' ;
18
- import { isDataModelFieldReference , isFutureExpr , isRelationshipField , resolved } from '@zenstackhq/sdk' ;
18
+ import {
19
+ isDataModelFieldReference ,
20
+ isDelegateModel ,
21
+ isFutureExpr ,
22
+ isRelationshipField ,
23
+ resolved ,
24
+ } from '@zenstackhq/sdk' ;
19
25
import { ValidationAcceptor , streamAst } from 'langium' ;
20
26
import pluralize from 'pluralize' ;
21
27
import { AstValidator } from '../types' ;
@@ -164,6 +170,31 @@ export default class AttributeApplicationValidator implements AstValidator<Attri
164
170
}
165
171
}
166
172
173
+ @check ( '@@unique' )
174
+ private _checkUnique ( attr : AttributeApplication , accept : ValidationAcceptor ) {
175
+ const fields = attr . args [ 0 ] ?. value ;
176
+ if ( fields && isArrayExpr ( fields ) ) {
177
+ fields . items . forEach ( ( item ) => {
178
+ if ( ! isReferenceExpr ( item ) ) {
179
+ accept ( 'error' , `Expecting a field reference` , { node : item } ) ;
180
+ return ;
181
+ }
182
+ if ( ! isDataModelField ( item . target . ref ) ) {
183
+ accept ( 'error' , `Expecting a field reference` , { node : item } ) ;
184
+ return ;
185
+ }
186
+
187
+ if ( item . target . ref . $container !== attr . $container && isDelegateModel ( item . target . ref . $container ) ) {
188
+ accept ( 'error' , `Cannot use fields inherited from a polymorphic base model in \`@@unique\`` , {
189
+ node : item ,
190
+ } ) ;
191
+ }
192
+ } ) ;
193
+ } else {
194
+ accept ( 'error' , `Expected an array of field references` , { node : fields } ) ;
195
+ }
196
+ }
197
+
167
198
private validatePolicyKinds (
168
199
kind : string ,
169
200
candidates : string [ ] ,
0 commit comments