@@ -15,7 +15,13 @@ import {
1515 isEnum ,
1616 isReferenceExpr ,
1717} 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' ;
1925import { ValidationAcceptor , streamAst } from 'langium' ;
2026import pluralize from 'pluralize' ;
2127import { AstValidator } from '../types' ;
@@ -164,6 +170,31 @@ export default class AttributeApplicationValidator implements AstValidator<Attri
164170 }
165171 }
166172
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+
167198 private validatePolicyKinds (
168199 kind : string ,
169200 candidates : string [ ] ,
0 commit comments