Skip to content

Commit 9eeed46

Browse files
committed
fix
1 parent ecc8fad commit 9eeed46

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

packages/schema/src/language-server/validator/attribute-application-validator.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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';
1925
import { ValidationAcceptor, streamAst } from 'langium';
2026
import pluralize from 'pluralize';
2127
import { 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

Comments
 (0)