Skip to content

Commit ccae413

Browse files
authored
fix: resolve member access expr only in the context of operand type (#761)
1 parent 8ac0915 commit ccae413

File tree

3 files changed

+42
-9
lines changed

3 files changed

+42
-9
lines changed

packages/schema/src/language-server/zmodel-linker.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,10 @@ export class ZModelLinker extends DefaultLinker {
9292
container: AstNode,
9393
property: string,
9494
document: LangiumDocument,
95-
extraScopes: ScopeProvider[]
95+
extraScopes: ScopeProvider[],
96+
onlyFromExtraScopes = false
9697
) {
97-
if (!this.resolveFromScopeProviders(container, property, document, extraScopes)) {
98+
if (!this.resolveFromScopeProviders(container, property, document, extraScopes) && !onlyFromExtraScopes) {
9899
// eslint-disable-next-line @typescript-eslint/no-explicit-any
99100
const reference: Reference<AstNode> = (container as any)[property];
100101
this.doLink({ reference, container, property }, document);
@@ -327,12 +328,11 @@ export class ZModelLinker extends DefaultLinker {
327328
if (operandResolved && !operandResolved.array && isDataModel(operandResolved.decl)) {
328329
const modelDecl = operandResolved.decl as DataModel;
329330
const provider = (name: string) => modelDecl.$resolvedFields.find((f) => f.name === name);
330-
extraScopes = [provider, ...extraScopes];
331-
}
332-
333-
this.linkReference(node, 'member', document, extraScopes);
334-
if (node.member.ref) {
335-
this.resolveToDeclaredType(node, node.member.ref.type);
331+
// member access is resolved only in the context of the operand type
332+
this.linkReference(node, 'member', document, [provider], true);
333+
if (node.member.ref) {
334+
this.resolveToDeclaredType(node, node.member.ref.type);
335+
}
336336
}
337337
}
338338

packages/schema/tests/schema/validation/attribute-validation.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ describe('Attribute tests', () => {
10171017
@@allow('all', auth().email != null)
10181018
}
10191019
`)
1020-
).toContain(`Could not resolve reference to DataModelField named 'email'.`);
1020+
).toContain(`expression cannot be resolved`);
10211021
});
10221022

10231023
it('collection predicate expression check', async () => {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { loadModel, loadModelWithError } from '@zenstackhq/testtools';
2+
3+
describe('Regression: issue 756', () => {
4+
it('regression', async () => {
5+
expect(
6+
await loadModelWithError(
7+
`
8+
generator client {
9+
provider = "prisma-client-js"
10+
}
11+
12+
datasource db {
13+
provider = "postgresql"
14+
url = env("DATABASE_URL")
15+
}
16+
17+
model User {
18+
id Int @id @default(autoincrement())
19+
email Int
20+
posts Post[]
21+
}
22+
23+
model Post {
24+
id Int @id @default(autoincrement())
25+
author User? @relation(fields: [authorId], references: [id])
26+
authorId Int
27+
@@allow('all', auth().posts.authorId == authorId)
28+
}
29+
`
30+
)
31+
).toContain('expression cannot be resolved');
32+
});
33+
});

0 commit comments

Comments
 (0)