zenstack 0.6.0-pre.9 → 1.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/cli-error.d.ts +5 -0
- package/cli/cli-error.js +12 -0
- package/cli/cli-error.js.map +1 -0
- package/cli/cli-util.d.ts +18 -0
- package/cli/cli-util.js +122 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/index.d.ts +14 -0
- package/cli/index.js +72 -6529
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +14 -0
- package/cli/plugin-runner.js +138 -0
- package/cli/plugin-runner.js.map +1 -0
- package/global.d.js +1 -0
- package/global.d.js.map +1 -0
- package/language-server/constants.d.ts +12 -0
- package/language-server/constants.js +24 -0
- package/language-server/constants.js.map +1 -0
- package/language-server/main.d.ts +1 -0
- package/language-server/main.js +20 -6436
- package/language-server/main.js.map +1 -0
- package/language-server/types.d.ts +10 -0
- package/language-server/types.js +1 -0
- package/language-server/types.js.map +1 -0
- package/language-server/utils.d.ts +10 -0
- package/language-server/utils.js +28 -0
- package/language-server/utils.js.map +1 -0
- package/language-server/validator/attribute-validator.d.ts +9 -0
- package/language-server/validator/attribute-validator.js +15 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +16 -0
- package/language-server/validator/datamodel-validator.js +365 -0
- package/language-server/validator/datamodel-validator.js.map +1 -0
- package/language-server/validator/datasource-validator.d.ts +13 -0
- package/language-server/validator/datasource-validator.js +85 -0
- package/language-server/validator/datasource-validator.js.map +1 -0
- package/language-server/validator/enum-validator.d.ts +9 -0
- package/language-server/validator/enum-validator.js +18 -0
- package/language-server/validator/enum-validator.js.map +1 -0
- package/language-server/validator/expression-validator.d.ts +11 -0
- package/language-server/validator/expression-validator.js +40 -0
- package/language-server/validator/expression-validator.js.map +1 -0
- package/language-server/validator/schema-validator.d.ts +10 -0
- package/language-server/validator/schema-validator.js +35 -0
- package/language-server/validator/schema-validator.js.map +1 -0
- package/language-server/validator/utils.d.ts +24 -0
- package/language-server/validator/utils.js +116 -0
- package/language-server/validator/utils.js.map +1 -0
- package/language-server/validator/zmodel-validator.d.ts +21 -0
- package/language-server/validator/zmodel-validator.js +72 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-linker.d.ts +29 -0
- package/language-server/zmodel-linker.js +364 -0
- package/language-server/zmodel-linker.js.map +1 -0
- package/language-server/zmodel-module.d.ts +41 -0
- package/language-server/zmodel-module.js +83 -0
- package/language-server/zmodel-module.js.map +1 -0
- package/language-server/zmodel-scope.d.ts +10 -0
- package/language-server/zmodel-scope.js +34 -0
- package/language-server/zmodel-scope.js.map +1 -0
- package/language-server/zmodel-workspace-manager.d.ts +8 -0
- package/language-server/zmodel-workspace-manager.js +25 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +24 -18
- package/plugins/access-policy/expression-writer.d.ts +38 -0
- package/plugins/access-policy/expression-writer.js +323 -0
- package/plugins/access-policy/expression-writer.js.map +1 -0
- package/plugins/access-policy/index.d.ts +4 -0
- package/plugins/access-policy/index.js +15 -0
- package/plugins/access-policy/index.js.map +1 -0
- package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
- package/plugins/access-policy/policy-guard-generator.js +345 -0
- package/plugins/access-policy/policy-guard-generator.js.map +1 -0
- package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
- package/plugins/access-policy/typescript-expression-transformer.js +110 -0
- package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
- package/plugins/access-policy/utils.d.ts +5 -0
- package/plugins/access-policy/utils.js +16 -0
- package/plugins/access-policy/utils.js.map +1 -0
- package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
- package/plugins/access-policy/zod-schema-generator.js +174 -0
- package/plugins/access-policy/zod-schema-generator.js.map +1 -0
- package/plugins/model-meta/index.d.ts +4 -0
- package/plugins/model-meta/index.js +130 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +16 -0
- package/plugins/plugin-utils.js +58 -0
- package/plugins/plugin-utils.js.map +1 -0
- package/plugins/prisma/indent-string.d.ts +4 -0
- package/plugins/prisma/indent-string.js +16 -0
- package/plugins/prisma/indent-string.js.map +1 -0
- package/plugins/prisma/index.d.ts +4 -0
- package/plugins/prisma/index.js +15 -3740
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +130 -0
- package/plugins/prisma/prisma-builder.js +271 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +24 -0
- package/plugins/prisma/schema-generator.js +212 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/prisma/zmodel-code-generator.d.ts +27 -0
- package/plugins/prisma/zmodel-code-generator.js +110 -0
- package/plugins/prisma/zmodel-code-generator.js.map +1 -0
- package/res/prism-zmodel.js +2 -4
- package/res/starter.zmodel +47 -0
- package/res/stdlib.zmodel +12 -1
- package/telemetry.d.ts +21 -0
- package/telemetry.js +102 -0
- package/telemetry.js.map +1 -0
- package/types.d.ts +11 -0
- package/types.js +1 -0
- package/types.js.map +1 -0
- package/utils/ast-utils.d.ts +15 -0
- package/utils/ast-utils.js +79 -0
- package/utils/ast-utils.js.map +1 -0
- package/utils/exec-utils.d.ts +6 -0
- package/utils/exec-utils.js +22 -0
- package/utils/exec-utils.js.map +1 -0
- package/utils/pkg-utils.d.ts +3 -0
- package/utils/pkg-utils.js +43 -0
- package/utils/pkg-utils.js.map +1 -0
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +15 -0
- package/utils/version-utils.js.map +1 -0
- package/asset/logo-256-bg.png +0 -0
- package/asset/logo-dark-256.png +0 -0
- package/asset/logo-light-256.png +0 -0
- package/extension.js +0 -39
- package/plugins/policy-guard/index.js +0 -4289
- package/plugins/react-hooks/index.js +0 -4318
- package/plugins/trpc/index.js +0 -5386
- package/plugins/zod/index.js +0 -4808
- package/res/package.template.json +0 -9
- package/res/tsconfig.template.json +0 -17
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ZModelLinker = void 0;
|
|
7
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
8
|
+
var _langium = require("langium");
|
|
9
|
+
var _vscodeJsonrpc = require("vscode-jsonrpc");
|
|
10
|
+
var _utils = require("./utils");
|
|
11
|
+
var _utils2 = require("./validator/utils");
|
|
12
|
+
/**
|
|
13
|
+
* Langium linker implementation which links references and resolves expression types
|
|
14
|
+
*/
|
|
15
|
+
class ZModelLinker extends _langium.DefaultLinker {
|
|
16
|
+
constructor(services) {
|
|
17
|
+
super(services);
|
|
18
|
+
this.descriptions = services.workspace.AstNodeDescriptionProvider;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#region Reference linking
|
|
22
|
+
|
|
23
|
+
async link(document, cancelToken = _vscodeJsonrpc.CancellationToken.None) {
|
|
24
|
+
var _document$parseResult, _document$parseResult2;
|
|
25
|
+
if (((_document$parseResult = document.parseResult.lexerErrors) === null || _document$parseResult === void 0 ? void 0 : _document$parseResult.length) > 0 || ((_document$parseResult2 = document.parseResult.parserErrors) === null || _document$parseResult2 === void 0 ? void 0 : _document$parseResult2.length) > 0) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
for (const node of (0, _langium.streamContents)(document.parseResult.value)) {
|
|
29
|
+
await (0, _langium.interruptAndCheck)(cancelToken);
|
|
30
|
+
this.resolve(node, document);
|
|
31
|
+
}
|
|
32
|
+
document.state = _langium.DocumentState.Linked;
|
|
33
|
+
}
|
|
34
|
+
linkReference(container, property, document, extraScopes) {
|
|
35
|
+
if (!this.resolveFromScopeProviders(container, property, document, extraScopes)) {
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
const reference = container[property];
|
|
38
|
+
this.doLink({
|
|
39
|
+
reference,
|
|
40
|
+
container,
|
|
41
|
+
property
|
|
42
|
+
}, document);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
|
|
48
|
+
//#region Expression type resolving
|
|
49
|
+
|
|
50
|
+
resolveFromScopeProviders(node, property, document, providers) {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
const reference = node[property];
|
|
53
|
+
for (const provider of providers) {
|
|
54
|
+
const target = provider(reference.$refText);
|
|
55
|
+
if (target) {
|
|
56
|
+
reference._ref = target;
|
|
57
|
+
reference._nodeDescription = this.descriptions.createDescription(target, target.name, document);
|
|
58
|
+
return target;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
resolve(node, document, extraScopes = []) {
|
|
64
|
+
switch (node.$type) {
|
|
65
|
+
case _ast.LiteralExpr:
|
|
66
|
+
this.resolveLiteral(node);
|
|
67
|
+
break;
|
|
68
|
+
case _ast.InvocationExpr:
|
|
69
|
+
this.resolveInvocation(node, document, extraScopes);
|
|
70
|
+
break;
|
|
71
|
+
case _ast.ArrayExpr:
|
|
72
|
+
this.resolveArray(node, document, extraScopes);
|
|
73
|
+
break;
|
|
74
|
+
case _ast.ReferenceExpr:
|
|
75
|
+
this.resolveReference(node, document, extraScopes);
|
|
76
|
+
break;
|
|
77
|
+
case _ast.MemberAccessExpr:
|
|
78
|
+
this.resolveMemberAccess(node, document, extraScopes);
|
|
79
|
+
break;
|
|
80
|
+
case _ast.UnaryExpr:
|
|
81
|
+
this.resolveUnary(node, document, extraScopes);
|
|
82
|
+
break;
|
|
83
|
+
case _ast.BinaryExpr:
|
|
84
|
+
this.resolveBinary(node, document, extraScopes);
|
|
85
|
+
break;
|
|
86
|
+
case _ast.ThisExpr:
|
|
87
|
+
this.resolveThis(node, document, extraScopes);
|
|
88
|
+
break;
|
|
89
|
+
case _ast.NullExpr:
|
|
90
|
+
this.resolveNull(node, document, extraScopes);
|
|
91
|
+
break;
|
|
92
|
+
case _ast.AttributeArg:
|
|
93
|
+
this.resolveAttributeArg(node, document, extraScopes);
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
this.resolveDefault(node, document, extraScopes);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
resolveBinary(node, document, extraScopes) {
|
|
101
|
+
switch (node.operator) {
|
|
102
|
+
// TODO: support arithmetics?
|
|
103
|
+
// case '+':
|
|
104
|
+
// case '-':
|
|
105
|
+
// case '*':
|
|
106
|
+
// case '/':
|
|
107
|
+
// this.resolve(node.left, document, extraScopes);
|
|
108
|
+
// this.resolve(node.right, document, extraScopes);
|
|
109
|
+
// this.resolveToBuiltinTypeOrDecl(node, 'Int');
|
|
110
|
+
// break;
|
|
111
|
+
|
|
112
|
+
case '>':
|
|
113
|
+
case '>=':
|
|
114
|
+
case '<':
|
|
115
|
+
case '<=':
|
|
116
|
+
case '==':
|
|
117
|
+
case '!=':
|
|
118
|
+
case '&&':
|
|
119
|
+
case '||':
|
|
120
|
+
this.resolve(node.left, document, extraScopes);
|
|
121
|
+
this.resolve(node.right, document, extraScopes);
|
|
122
|
+
this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
|
|
123
|
+
break;
|
|
124
|
+
case '?':
|
|
125
|
+
case '!':
|
|
126
|
+
case '^':
|
|
127
|
+
this.resolveCollectionPredicate(node, document, extraScopes);
|
|
128
|
+
break;
|
|
129
|
+
default:
|
|
130
|
+
throw Error(`Unsupported binary operator: ${node.operator}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
resolveUnary(node, document, extraScopes) {
|
|
134
|
+
this.resolve(node.operand, document, extraScopes);
|
|
135
|
+
node.$resolvedType = node.operand.$resolvedType;
|
|
136
|
+
}
|
|
137
|
+
resolveReference(node, document, extraScopes) {
|
|
138
|
+
this.linkReference(node, 'target', document, extraScopes);
|
|
139
|
+
node.args.forEach(arg => this.resolve(arg, document, extraScopes));
|
|
140
|
+
if (node.target.ref) {
|
|
141
|
+
// resolve type
|
|
142
|
+
if (node.target.ref.$type === _ast.EnumField) {
|
|
143
|
+
this.resolveToBuiltinTypeOrDecl(node, node.target.ref.$container);
|
|
144
|
+
} else {
|
|
145
|
+
this.resolveToDeclaredType(node, node.target.ref.type);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
resolveArray(node, document, extraScopes) {
|
|
150
|
+
node.items.forEach(item => this.resolve(item, document, extraScopes));
|
|
151
|
+
const itemType = node.items[0].$resolvedType;
|
|
152
|
+
if (itemType !== null && itemType !== void 0 && itemType.decl) {
|
|
153
|
+
this.resolveToBuiltinTypeOrDecl(node, itemType.decl, true);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
resolveInvocation(node, document, extraScopes) {
|
|
157
|
+
this.linkReference(node, 'function', document, extraScopes);
|
|
158
|
+
node.args.forEach(arg => this.resolve(arg, document, extraScopes));
|
|
159
|
+
if (node.function.ref) {
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
161
|
+
const funcDecl = node.function.ref;
|
|
162
|
+
if (funcDecl.name === 'auth' && (0, _utils.isFromStdlib)(funcDecl)) {
|
|
163
|
+
// auth() function is resolved to User model in the current document
|
|
164
|
+
const model = (0, _utils.getContainingModel)(node);
|
|
165
|
+
const userModel = model === null || model === void 0 ? void 0 : model.declarations.find(d => (0, _ast.isDataModel)(d) && d.name === 'User');
|
|
166
|
+
if (userModel) {
|
|
167
|
+
node.$resolvedType = {
|
|
168
|
+
decl: userModel
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
} else if (funcDecl.name === 'future' && (0, _utils.isFromStdlib)(funcDecl)) {
|
|
172
|
+
// future() function is resolved to current model
|
|
173
|
+
node.$resolvedType = {
|
|
174
|
+
decl: this.getContainingDataModel(node)
|
|
175
|
+
};
|
|
176
|
+
} else {
|
|
177
|
+
this.resolveToDeclaredType(node, funcDecl.returnType);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
getContainingDataModel(node) {
|
|
182
|
+
let curr = node.$container;
|
|
183
|
+
while (curr) {
|
|
184
|
+
if ((0, _ast.isDataModel)(curr)) {
|
|
185
|
+
return curr;
|
|
186
|
+
}
|
|
187
|
+
curr = curr.$container;
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
resolveLiteral(node) {
|
|
192
|
+
const type = typeof node.value === 'string' ? 'String' : typeof node.value === 'boolean' ? 'Boolean' : typeof node.value === 'number' ? 'Int' : undefined;
|
|
193
|
+
if (type) {
|
|
194
|
+
this.resolveToBuiltinTypeOrDecl(node, type);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
resolveMemberAccess(node, document, extraScopes) {
|
|
198
|
+
this.resolve(node.operand, document, extraScopes);
|
|
199
|
+
const operandResolved = node.operand.$resolvedType;
|
|
200
|
+
if (operandResolved && !operandResolved.array && (0, _ast.isDataModel)(operandResolved.decl)) {
|
|
201
|
+
const modelDecl = operandResolved.decl;
|
|
202
|
+
const provider = name => modelDecl.fields.find(f => f.name === name);
|
|
203
|
+
extraScopes = [provider, ...extraScopes];
|
|
204
|
+
}
|
|
205
|
+
this.linkReference(node, 'member', document, extraScopes);
|
|
206
|
+
if (node.member.ref) {
|
|
207
|
+
this.resolveToDeclaredType(node, node.member.ref.type);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
resolveCollectionPredicate(node, document, extraScopes) {
|
|
211
|
+
this.resolve(node.left, document, extraScopes);
|
|
212
|
+
const resolvedType = node.left.$resolvedType;
|
|
213
|
+
if (resolvedType && (0, _ast.isDataModel)(resolvedType.decl) && resolvedType.array) {
|
|
214
|
+
const dataModelDecl = resolvedType.decl;
|
|
215
|
+
const provider = name => dataModelDecl.fields.find(f => f.name === name);
|
|
216
|
+
extraScopes = [provider, ...extraScopes];
|
|
217
|
+
this.resolve(node.right, document, extraScopes);
|
|
218
|
+
this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
|
|
219
|
+
} else {
|
|
220
|
+
// error is reported in validation pass
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
resolveThis(node,
|
|
224
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
225
|
+
document,
|
|
226
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
227
|
+
extraScopes) {
|
|
228
|
+
let decl = node.$container;
|
|
229
|
+
while (decl && !(0, _ast.isDataModel)(decl)) {
|
|
230
|
+
decl = decl.$container;
|
|
231
|
+
}
|
|
232
|
+
if (decl) {
|
|
233
|
+
this.resolveToBuiltinTypeOrDecl(node, decl);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
resolveNull(node,
|
|
237
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
238
|
+
document,
|
|
239
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
240
|
+
extraScopes) {
|
|
241
|
+
// TODO: how to really resolve null?
|
|
242
|
+
this.resolveToBuiltinTypeOrDecl(node, 'Null');
|
|
243
|
+
}
|
|
244
|
+
resolveAttributeArg(node, document, extraScopes) {
|
|
245
|
+
const attrParam = this.findAttrParamForArg(node);
|
|
246
|
+
const attrAppliedOn = node.$container.$container;
|
|
247
|
+
if ((attrParam === null || attrParam === void 0 ? void 0 : attrParam.type.type) === 'TransitiveFieldReference' && (0, _ast.isDataModelField)(attrAppliedOn)) {
|
|
248
|
+
var _attrAppliedOn$type$r;
|
|
249
|
+
// "TransitiveFieldReference" is resolved in the context of the containing model of the field
|
|
250
|
+
// where the attribute is applied
|
|
251
|
+
//
|
|
252
|
+
// E.g.:
|
|
253
|
+
//
|
|
254
|
+
// model A {
|
|
255
|
+
// myId @id String
|
|
256
|
+
// }
|
|
257
|
+
//
|
|
258
|
+
// model B {
|
|
259
|
+
// id @id String
|
|
260
|
+
// a A @relation(fields: [id], references: [myId])
|
|
261
|
+
// }
|
|
262
|
+
//
|
|
263
|
+
// In model B, the attribute argument "myId" is resolved to the field "myId" in model A
|
|
264
|
+
|
|
265
|
+
const transtiveDataModel = (_attrAppliedOn$type$r = attrAppliedOn.type.reference) === null || _attrAppliedOn$type$r === void 0 ? void 0 : _attrAppliedOn$type$r.ref;
|
|
266
|
+
if (transtiveDataModel) {
|
|
267
|
+
// resolve references in the context of the transitive data model
|
|
268
|
+
const scopeProvider = name => transtiveDataModel.fields.find(f => f.name === name);
|
|
269
|
+
if ((0, _ast.isArrayExpr)(node.value)) {
|
|
270
|
+
var _node$value$items$, _node$value$items$$$r;
|
|
271
|
+
node.value.items.forEach(item => {
|
|
272
|
+
if ((0, _ast.isReferenceExpr)(item)) {
|
|
273
|
+
const resolved = this.resolveFromScopeProviders(item, 'target', document, [scopeProvider]);
|
|
274
|
+
if (resolved) {
|
|
275
|
+
this.resolveToDeclaredType(item, resolved.type);
|
|
276
|
+
} else {
|
|
277
|
+
// need to clear linked reference, because it's resolved in default scope by default
|
|
278
|
+
const ref = item.target;
|
|
279
|
+
ref._ref = this.createLinkingError({
|
|
280
|
+
reference: ref,
|
|
281
|
+
container: item,
|
|
282
|
+
property: 'target'
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
if ((_node$value$items$ = node.value.items[0]) !== null && _node$value$items$ !== void 0 && (_node$value$items$$$r = _node$value$items$.$resolvedType) !== null && _node$value$items$$$r !== void 0 && _node$value$items$$$r.decl) {
|
|
288
|
+
this.resolveToBuiltinTypeOrDecl(node.value, node.value.items[0].$resolvedType.decl, true);
|
|
289
|
+
}
|
|
290
|
+
} else if ((0, _ast.isReferenceExpr)(node.value)) {
|
|
291
|
+
const resolved = this.resolveFromScopeProviders(node.value, 'target', document, [scopeProvider]);
|
|
292
|
+
if (resolved) {
|
|
293
|
+
this.resolveToDeclaredType(node.value, resolved.type);
|
|
294
|
+
} else {
|
|
295
|
+
// need to clear linked reference, because it's resolved in default scope by default
|
|
296
|
+
const ref = node.value.target;
|
|
297
|
+
ref._ref = this.createLinkingError({
|
|
298
|
+
reference: ref,
|
|
299
|
+
container: node.value,
|
|
300
|
+
property: 'target'
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
this.resolve(node.value, document, extraScopes);
|
|
307
|
+
}
|
|
308
|
+
node.$resolvedType = node.value.$resolvedType;
|
|
309
|
+
}
|
|
310
|
+
findAttrParamForArg(arg) {
|
|
311
|
+
const attr = arg.$container.decl.ref;
|
|
312
|
+
if (!attr) {
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
if (arg.name) {
|
|
316
|
+
var _attr$params;
|
|
317
|
+
return (_attr$params = attr.params) === null || _attr$params === void 0 ? void 0 : _attr$params.find(p => p.name === arg.name);
|
|
318
|
+
} else {
|
|
319
|
+
const index = arg.$container.args.findIndex(a => a === arg);
|
|
320
|
+
return attr.params[index];
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
resolveDefault(node, document, extraScopes) {
|
|
324
|
+
for (const [property, value] of Object.entries(node)) {
|
|
325
|
+
if (!property.startsWith('$')) {
|
|
326
|
+
if ((0, _langium.isReference)(value)) {
|
|
327
|
+
this.linkReference(node, property, document, extraScopes);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
for (const child of (0, _langium.streamContents)(node)) {
|
|
332
|
+
this.resolve(child, document, extraScopes);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
//#endregion
|
|
337
|
+
|
|
338
|
+
//#region Utils
|
|
339
|
+
|
|
340
|
+
resolveToDeclaredType(node, type) {
|
|
341
|
+
if (type.type) {
|
|
342
|
+
const mappedType = (0, _utils2.mapBuiltinTypeToExpressionType)(type.type);
|
|
343
|
+
node.$resolvedType = {
|
|
344
|
+
decl: mappedType,
|
|
345
|
+
array: type.array
|
|
346
|
+
};
|
|
347
|
+
} else if (type.reference) {
|
|
348
|
+
node.$resolvedType = {
|
|
349
|
+
decl: type.reference.ref,
|
|
350
|
+
array: type.array
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
resolveToBuiltinTypeOrDecl(node, type, array = false) {
|
|
355
|
+
node.$resolvedType = {
|
|
356
|
+
decl: type,
|
|
357
|
+
array
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
//#endregion
|
|
362
|
+
}
|
|
363
|
+
exports.ZModelLinker = ZModelLinker;
|
|
364
|
+
//# sourceMappingURL=zmodel-linker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-linker.js","names":["ZModelLinker","DefaultLinker","constructor","services","descriptions","workspace","AstNodeDescriptionProvider","link","document","cancelToken","CancellationToken","None","parseResult","lexerErrors","length","parserErrors","node","streamContents","value","interruptAndCheck","resolve","state","DocumentState","Linked","linkReference","container","property","extraScopes","resolveFromScopeProviders","reference","doLink","providers","provider","target","$refText","_ref","_nodeDescription","createDescription","name","$type","LiteralExpr","resolveLiteral","InvocationExpr","resolveInvocation","ArrayExpr","resolveArray","ReferenceExpr","resolveReference","MemberAccessExpr","resolveMemberAccess","UnaryExpr","resolveUnary","BinaryExpr","resolveBinary","ThisExpr","resolveThis","NullExpr","resolveNull","AttributeArg","resolveAttributeArg","resolveDefault","operator","left","right","resolveToBuiltinTypeOrDecl","resolveCollectionPredicate","Error","operand","$resolvedType","args","forEach","arg","ref","EnumField","$container","resolveToDeclaredType","type","items","item","itemType","decl","function","funcDecl","isFromStdlib","model","getContainingModel","userModel","declarations","find","d","isDataModel","getContainingDataModel","returnType","curr","undefined","operandResolved","array","modelDecl","fields","f","member","resolvedType","dataModelDecl","attrParam","findAttrParamForArg","attrAppliedOn","isDataModelField","transtiveDataModel","scopeProvider","isArrayExpr","isReferenceExpr","resolved","createLinkingError","attr","params","p","index","findIndex","a","Object","entries","startsWith","isReference","child","mappedType","mapBuiltinTypeToExpressionType"],"sources":["../../src/language-server/zmodel-linker.ts"],"sourcesContent":["import {\n ArrayExpr,\n AttributeArg,\n AttributeParam,\n BinaryExpr,\n DataModel,\n DataModelField,\n DataModelFieldType,\n EnumField,\n Expression,\n FunctionDecl,\n FunctionParam,\n FunctionParamType,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceExpr,\n ReferenceTarget,\n ResolvedShape,\n ThisExpr,\n UnaryExpr,\n isArrayExpr,\n isDataModel,\n isDataModelField,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n AstNode,\n AstNodeDescription,\n AstNodeDescriptionProvider,\n DefaultLinker,\n DocumentState,\n LangiumDocument,\n LangiumServices,\n LinkingError,\n Reference,\n interruptAndCheck,\n isReference,\n streamContents,\n} from 'langium';\nimport { CancellationToken } from 'vscode-jsonrpc';\nimport { getContainingModel, isFromStdlib } from './utils';\nimport { mapBuiltinTypeToExpressionType } from './validator/utils';\n\ninterface DefaultReference extends Reference {\n _ref?: AstNode | LinkingError;\n _nodeDescription?: AstNodeDescription;\n}\n\ntype ScopeProvider = (name: string) => ReferenceTarget | undefined;\n\n/**\n * Langium linker implementation which links references and resolves expression types\n */\nexport class ZModelLinker extends DefaultLinker {\n private readonly descriptions: AstNodeDescriptionProvider;\n\n constructor(services: LangiumServices) {\n super(services);\n this.descriptions = services.workspace.AstNodeDescriptionProvider;\n }\n\n //#region Reference linking\n\n async link(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<void> {\n if (document.parseResult.lexerErrors?.length > 0 || document.parseResult.parserErrors?.length > 0) {\n return;\n }\n\n for (const node of streamContents(document.parseResult.value)) {\n await interruptAndCheck(cancelToken);\n this.resolve(node, document);\n }\n document.state = DocumentState.Linked;\n }\n\n private linkReference(\n container: AstNode,\n property: string,\n document: LangiumDocument,\n extraScopes: ScopeProvider[]\n ) {\n if (!this.resolveFromScopeProviders(container, property, document, extraScopes)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const reference: Reference<AstNode> = (container as any)[property];\n this.doLink({ reference, container, property }, document);\n }\n }\n\n //#endregion\n\n //#region Expression type resolving\n\n private resolveFromScopeProviders(\n node: AstNode,\n property: string,\n document: LangiumDocument,\n providers: ScopeProvider[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const reference: DefaultReference = (node as any)[property];\n for (const provider of providers) {\n const target = provider(reference.$refText);\n if (target) {\n reference._ref = target;\n reference._nodeDescription = this.descriptions.createDescription(target, target.name, document);\n return target;\n }\n }\n return null;\n }\n\n private resolve(node: AstNode, document: LangiumDocument, extraScopes: ScopeProvider[] = []) {\n switch (node.$type) {\n case LiteralExpr:\n this.resolveLiteral(node as LiteralExpr);\n break;\n\n case InvocationExpr:\n this.resolveInvocation(node as InvocationExpr, document, extraScopes);\n break;\n\n case ArrayExpr:\n this.resolveArray(node as ArrayExpr, document, extraScopes);\n break;\n\n case ReferenceExpr:\n this.resolveReference(node as ReferenceExpr, document, extraScopes);\n break;\n\n case MemberAccessExpr:\n this.resolveMemberAccess(node as MemberAccessExpr, document, extraScopes);\n break;\n\n case UnaryExpr:\n this.resolveUnary(node as UnaryExpr, document, extraScopes);\n break;\n\n case BinaryExpr:\n this.resolveBinary(node as BinaryExpr, document, extraScopes);\n break;\n\n case ThisExpr:\n this.resolveThis(node as ThisExpr, document, extraScopes);\n break;\n\n case NullExpr:\n this.resolveNull(node as NullExpr, document, extraScopes);\n break;\n\n case AttributeArg:\n this.resolveAttributeArg(node as AttributeArg, document, extraScopes);\n break;\n\n default:\n this.resolveDefault(node, document, extraScopes);\n break;\n }\n }\n\n private resolveBinary(node: BinaryExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n switch (node.operator) {\n // TODO: support arithmetics?\n // case '+':\n // case '-':\n // case '*':\n // case '/':\n // this.resolve(node.left, document, extraScopes);\n // this.resolve(node.right, document, extraScopes);\n // this.resolveToBuiltinTypeOrDecl(node, 'Int');\n // break;\n\n case '>':\n case '>=':\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '&&':\n case '||':\n this.resolve(node.left, document, extraScopes);\n this.resolve(node.right, document, extraScopes);\n this.resolveToBuiltinTypeOrDecl(node, 'Boolean');\n break;\n\n case '?':\n case '!':\n case '^':\n this.resolveCollectionPredicate(node, document, extraScopes);\n break;\n\n default:\n throw Error(`Unsupported binary operator: ${node.operator}`);\n }\n }\n\n private resolveUnary(node: UnaryExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n this.resolve(node.operand, document, extraScopes);\n node.$resolvedType = node.operand.$resolvedType;\n }\n\n private resolveReference(node: ReferenceExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n this.linkReference(node, 'target', document, extraScopes);\n node.args.forEach((arg) => this.resolve(arg, document, extraScopes));\n\n if (node.target.ref) {\n // resolve type\n if (node.target.ref.$type === EnumField) {\n this.resolveToBuiltinTypeOrDecl(node, node.target.ref.$container);\n } else {\n this.resolveToDeclaredType(node, (node.target.ref as DataModelField | FunctionParam).type);\n }\n }\n }\n\n private resolveArray(node: ArrayExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n node.items.forEach((item) => this.resolve(item, document, extraScopes));\n\n const itemType = node.items[0].$resolvedType;\n if (itemType?.decl) {\n this.resolveToBuiltinTypeOrDecl(node, itemType.decl, true);\n }\n }\n\n private resolveInvocation(node: InvocationExpr, document: LangiumDocument, extraScopes: ScopeProvider[]) {\n this.linkReference(node, 'function', document, extraScopes);\n node.args.forEach((arg) => this.resolve(arg, document, extraScopes));\n if (node.function.ref) {\n // eslint-disable-next-line @typescript-eslint/ban-types\n const funcDecl = node.function.ref as FunctionDecl;\n if (funcDecl.name === 'auth' && isFromStdlib(funcDecl)) {\n // auth() function is resolved to User model in the current document\n const model = getContainingModel(node);\n const userModel = model?.declarations.find((d) => isDataModel(d) && d.name === 'User');\n if (userModel) {\n node.$resolvedType = { decl: userModel };\n }\n } else if (funcDecl.name === 'future' && isFromStdlib(funcDecl)) {\n // future() function is resolved to current model\n node.$resolvedType = { decl: this.getContainingDataModel(node) };\n } else {\n this.resolveToDeclaredType(node, funcDecl.returnType);\n }\n }\n }\n\n private getContainingDataModel(node: Expression): DataModel | undefined {\n let curr: AstNode | undefined = node.$container;\n while (curr) {\n if (isDataModel(curr)) {\n return curr;\n }\n curr = curr.$container;\n }\n return undefined;\n }\n\n private resolveLiteral(node: LiteralExpr) {\n const type =\n typeof node.value === 'string'\n ? 'String'\n : typeof node.value === 'boolean'\n ? 'Boolean'\n : typeof node.value === 'number'\n ? 'Int'\n : undefined;\n\n if (type) {\n this.resolveToBuiltinTypeOrDecl(node, type);\n }\n }\n\n private resolveMemberAccess(\n node: MemberAccessExpr,\n document: LangiumDocument<AstNode>,\n extraScopes: ScopeProvider[]\n ) {\n this.resolve(node.operand, document, extraScopes);\n const operandResolved = node.operand.$resolvedType;\n\n if (operandResolved && !operandResolved.array && isDataModel(operandResolved.decl)) {\n const modelDecl = operandResolved.decl as DataModel;\n const provider = (name: string) => modelDecl.fields.find((f) => f.name === name);\n extraScopes = [provider, ...extraScopes];\n }\n\n this.linkReference(node, 'member', document, extraScopes);\n if (node.member.ref) {\n this.resolveToDeclaredType(node, node.member.ref.type);\n }\n }\n\n private resolveCollectionPredicate(node: BinaryExpr, document: LangiumDocument, extraScopes: ScopeProvider[]) {\n this.resolve(node.left, document, extraScopes);\n\n const resolvedType = node.left.$resolvedType;\n if (resolvedType && isDataModel(resolvedType.decl) && resolvedType.array) {\n const dataModelDecl = resolvedType.decl;\n const provider = (name: string) => dataModelDecl.fields.find((f) => f.name === name);\n extraScopes = [provider, ...extraScopes];\n this.resolve(node.right, document, extraScopes);\n this.resolveToBuiltinTypeOrDecl(node, 'Boolean');\n } else {\n // error is reported in validation pass\n }\n }\n\n private resolveThis(\n node: ThisExpr,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n document: LangiumDocument<AstNode>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n extraScopes: ScopeProvider[]\n ) {\n let decl: AstNode | undefined = node.$container;\n\n while (decl && !isDataModel(decl)) {\n decl = decl.$container;\n }\n\n if (decl) {\n this.resolveToBuiltinTypeOrDecl(node, decl);\n }\n }\n\n private resolveNull(\n node: NullExpr,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n document: LangiumDocument<AstNode>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n extraScopes: ScopeProvider[]\n ) {\n // TODO: how to really resolve null?\n this.resolveToBuiltinTypeOrDecl(node, 'Null');\n }\n\n private resolveAttributeArg(node: AttributeArg, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n const attrParam = this.findAttrParamForArg(node);\n const attrAppliedOn = node.$container.$container;\n\n if (attrParam?.type.type === 'TransitiveFieldReference' && isDataModelField(attrAppliedOn)) {\n // \"TransitiveFieldReference\" is resolved in the context of the containing model of the field\n // where the attribute is applied\n //\n // E.g.:\n //\n // model A {\n // myId @id String\n // }\n //\n // model B {\n // id @id String\n // a A @relation(fields: [id], references: [myId])\n // }\n //\n // In model B, the attribute argument \"myId\" is resolved to the field \"myId\" in model A\n\n const transtiveDataModel = attrAppliedOn.type.reference?.ref as DataModel;\n if (transtiveDataModel) {\n // resolve references in the context of the transitive data model\n const scopeProvider = (name: string) => transtiveDataModel.fields.find((f) => f.name === name);\n if (isArrayExpr(node.value)) {\n node.value.items.forEach((item) => {\n if (isReferenceExpr(item)) {\n const resolved = this.resolveFromScopeProviders(item, 'target', document, [scopeProvider]);\n if (resolved) {\n this.resolveToDeclaredType(item, (resolved as DataModelField).type);\n } else {\n // need to clear linked reference, because it's resolved in default scope by default\n const ref = item.target as DefaultReference;\n ref._ref = this.createLinkingError({\n reference: ref,\n container: item,\n property: 'target',\n });\n }\n }\n });\n if (node.value.items[0]?.$resolvedType?.decl) {\n this.resolveToBuiltinTypeOrDecl(node.value, node.value.items[0].$resolvedType.decl, true);\n }\n } else if (isReferenceExpr(node.value)) {\n const resolved = this.resolveFromScopeProviders(node.value, 'target', document, [scopeProvider]);\n if (resolved) {\n this.resolveToDeclaredType(node.value, (resolved as DataModelField).type);\n } else {\n // need to clear linked reference, because it's resolved in default scope by default\n const ref = node.value.target as DefaultReference;\n ref._ref = this.createLinkingError({\n reference: ref,\n container: node.value,\n property: 'target',\n });\n }\n }\n }\n } else {\n this.resolve(node.value, document, extraScopes);\n }\n node.$resolvedType = node.value.$resolvedType;\n }\n\n private findAttrParamForArg(arg: AttributeArg): AttributeParam | undefined {\n const attr = arg.$container.decl.ref;\n if (!attr) {\n return undefined;\n }\n if (arg.name) {\n return attr.params?.find((p) => p.name === arg.name);\n } else {\n const index = arg.$container.args.findIndex((a) => a === arg);\n return attr.params[index];\n }\n }\n\n private resolveDefault(node: AstNode, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n for (const [property, value] of Object.entries(node)) {\n if (!property.startsWith('$')) {\n if (isReference(value)) {\n this.linkReference(node, property, document, extraScopes);\n }\n }\n }\n for (const child of streamContents(node)) {\n this.resolve(child, document, extraScopes);\n }\n }\n\n //#endregion\n\n //#region Utils\n\n private resolveToDeclaredType(node: AstNode, type: FunctionParamType | DataModelFieldType) {\n if (type.type) {\n const mappedType = mapBuiltinTypeToExpressionType(type.type);\n node.$resolvedType = { decl: mappedType, array: type.array };\n } else if (type.reference) {\n node.$resolvedType = {\n decl: type.reference.ref,\n array: type.array,\n };\n }\n }\n\n private resolveToBuiltinTypeOrDecl(node: AstNode, type: ResolvedShape, array = false) {\n node.$resolvedType = { decl: type, array };\n }\n\n //#endregion\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DefaultSharedModuleContext, LangiumDefaultSharedServices, LangiumServices, LangiumSharedServices, Module, PartialLangiumServices } from 'langium';
|
|
2
|
+
import { ZModelValidator } from './validator/zmodel-validator';
|
|
3
|
+
/**
|
|
4
|
+
* Declaration of custom services - add your own service classes here.
|
|
5
|
+
*/
|
|
6
|
+
export declare type ZModelAddedServices = {
|
|
7
|
+
validation: {
|
|
8
|
+
ZModelValidator: ZModelValidator;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Union of Langium default services and your custom services - use this as constructor parameter
|
|
13
|
+
* of custom service classes.
|
|
14
|
+
*/
|
|
15
|
+
export declare type ZModelServices = LangiumServices & ZModelAddedServices;
|
|
16
|
+
/**
|
|
17
|
+
* Dependency injection module that overrides Langium default services and contributes the
|
|
18
|
+
* declared custom services. The Langium defaults can be partially specified to override only
|
|
19
|
+
* selected services, while the custom services must be fully specified.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices>;
|
|
22
|
+
export declare function createSharedModule(context: DefaultSharedModuleContext): Module<LangiumSharedServices, LangiumDefaultSharedServices>;
|
|
23
|
+
/**
|
|
24
|
+
* Create the full set of services required by Langium.
|
|
25
|
+
*
|
|
26
|
+
* First inject the shared services by merging two modules:
|
|
27
|
+
* - Langium default shared services
|
|
28
|
+
* - Services generated by langium-cli
|
|
29
|
+
*
|
|
30
|
+
* Then inject the language-specific services by merging three modules:
|
|
31
|
+
* - Langium default language-specific services
|
|
32
|
+
* - Services generated by langium-cli
|
|
33
|
+
* - Services specified in this file
|
|
34
|
+
*
|
|
35
|
+
* @param context Optional module context with the LSP connection
|
|
36
|
+
* @returns An object wrapping the shared services and the language-specific services
|
|
37
|
+
*/
|
|
38
|
+
export declare function createZModelServices(context: DefaultSharedModuleContext): {
|
|
39
|
+
shared: LangiumSharedServices;
|
|
40
|
+
ZModel: ZModelServices;
|
|
41
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ZModelModule = void 0;
|
|
7
|
+
exports.createSharedModule = createSharedModule;
|
|
8
|
+
exports.createZModelServices = createZModelServices;
|
|
9
|
+
var _module = require("@zenstackhq/language/module");
|
|
10
|
+
var _langium = require("langium");
|
|
11
|
+
var _vscodeLanguageserver = require("vscode-languageserver");
|
|
12
|
+
var _vscodeLanguageserverTextdocument = require("vscode-languageserver-textdocument");
|
|
13
|
+
var _zmodelValidator = require("./validator/zmodel-validator");
|
|
14
|
+
var _zmodelLinker = require("./zmodel-linker");
|
|
15
|
+
var _zmodelScope = require("./zmodel-scope");
|
|
16
|
+
var _zmodelWorkspaceManager = _interopRequireDefault(require("./zmodel-workspace-manager"));
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
/**
|
|
19
|
+
* Dependency injection module that overrides Langium default services and contributes the
|
|
20
|
+
* declared custom services. The Langium defaults can be partially specified to override only
|
|
21
|
+
* selected services, while the custom services must be fully specified.
|
|
22
|
+
*/
|
|
23
|
+
const ZModelModule = {
|
|
24
|
+
references: {
|
|
25
|
+
ScopeComputation: services => new _zmodelScope.ZModelScopeComputation(services),
|
|
26
|
+
Linker: services => new _zmodelLinker.ZModelLinker(services)
|
|
27
|
+
},
|
|
28
|
+
validation: {
|
|
29
|
+
ValidationRegistry: services => new _zmodelValidator.ZModelValidationRegistry(services),
|
|
30
|
+
ZModelValidator: () => new _zmodelValidator.ZModelValidator()
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used
|
|
35
|
+
exports.ZModelModule = ZModelModule;
|
|
36
|
+
function createSharedModule(context) {
|
|
37
|
+
return {
|
|
38
|
+
ServiceRegistry: () => new _langium.DefaultServiceRegistry(),
|
|
39
|
+
lsp: {
|
|
40
|
+
Connection: () => context.connection,
|
|
41
|
+
LanguageServer: services => new _langium.DefaultLanguageServer(services)
|
|
42
|
+
},
|
|
43
|
+
workspace: {
|
|
44
|
+
LangiumDocuments: services => new _langium.DefaultLangiumDocuments(services),
|
|
45
|
+
LangiumDocumentFactory: services => new _langium.DefaultLangiumDocumentFactory(services),
|
|
46
|
+
DocumentBuilder: services => new _langium.DefaultDocumentBuilder(services),
|
|
47
|
+
TextDocuments: () => new _vscodeLanguageserver.TextDocuments(_vscodeLanguageserverTextdocument.TextDocument),
|
|
48
|
+
IndexManager: services => new _langium.DefaultIndexManager(services),
|
|
49
|
+
WorkspaceManager: services => new _zmodelWorkspaceManager.default(services),
|
|
50
|
+
FileSystemProvider: services => context.fileSystemProvider(services),
|
|
51
|
+
MutexLock: () => new _langium.MutexLock(),
|
|
52
|
+
ConfigurationProvider: services => new _langium.DefaultConfigurationProvider(services)
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Create the full set of services required by Langium.
|
|
59
|
+
*
|
|
60
|
+
* First inject the shared services by merging two modules:
|
|
61
|
+
* - Langium default shared services
|
|
62
|
+
* - Services generated by langium-cli
|
|
63
|
+
*
|
|
64
|
+
* Then inject the language-specific services by merging three modules:
|
|
65
|
+
* - Langium default language-specific services
|
|
66
|
+
* - Services generated by langium-cli
|
|
67
|
+
* - Services specified in this file
|
|
68
|
+
*
|
|
69
|
+
* @param context Optional module context with the LSP connection
|
|
70
|
+
* @returns An object wrapping the shared services and the language-specific services
|
|
71
|
+
*/
|
|
72
|
+
function createZModelServices(context) {
|
|
73
|
+
const shared = (0, _langium.inject)(createSharedModule(context), _module.ZModelGeneratedSharedModule);
|
|
74
|
+
const ZModel = (0, _langium.inject)((0, _langium.createDefaultModule)({
|
|
75
|
+
shared
|
|
76
|
+
}), _module.ZModelGeneratedModule, ZModelModule);
|
|
77
|
+
shared.ServiceRegistry.register(ZModel);
|
|
78
|
+
return {
|
|
79
|
+
shared,
|
|
80
|
+
ZModel
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=zmodel-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-module.js","names":["ZModelModule","references","ScopeComputation","services","ZModelScopeComputation","Linker","ZModelLinker","validation","ValidationRegistry","ZModelValidationRegistry","ZModelValidator","createSharedModule","context","ServiceRegistry","DefaultServiceRegistry","lsp","Connection","connection","LanguageServer","DefaultLanguageServer","workspace","LangiumDocuments","DefaultLangiumDocuments","LangiumDocumentFactory","DefaultLangiumDocumentFactory","DocumentBuilder","DefaultDocumentBuilder","TextDocuments","TextDocument","IndexManager","DefaultIndexManager","WorkspaceManager","ZModelWorkspaceManager","FileSystemProvider","fileSystemProvider","MutexLock","ConfigurationProvider","DefaultConfigurationProvider","createZModelServices","shared","inject","ZModelGeneratedSharedModule","ZModel","createDefaultModule","ZModelGeneratedModule","register"],"sources":["../../src/language-server/zmodel-module.ts"],"sourcesContent":["import { ZModelGeneratedModule, ZModelGeneratedSharedModule } from '@zenstackhq/language/module';\nimport {\n createDefaultModule,\n DefaultConfigurationProvider,\n DefaultDocumentBuilder,\n DefaultIndexManager,\n DefaultLangiumDocumentFactory,\n DefaultLangiumDocuments,\n DefaultLanguageServer,\n DefaultServiceRegistry,\n DefaultSharedModuleContext,\n inject,\n LangiumDefaultSharedServices,\n LangiumServices,\n LangiumSharedServices,\n Module,\n MutexLock,\n PartialLangiumServices,\n} from 'langium';\nimport { TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { ZModelValidationRegistry, ZModelValidator } from './validator/zmodel-validator';\nimport { ZModelLinker } from './zmodel-linker';\nimport { ZModelScopeComputation } from './zmodel-scope';\nimport ZModelWorkspaceManager from './zmodel-workspace-manager';\n\n/**\n * Declaration of custom services - add your own service classes here.\n */\nexport type ZModelAddedServices = {\n validation: {\n ZModelValidator: ZModelValidator;\n };\n};\n\n/**\n * Union of Langium default services and your custom services - use this as constructor parameter\n * of custom service classes.\n */\nexport type ZModelServices = LangiumServices & ZModelAddedServices;\n\n/**\n * Dependency injection module that overrides Langium default services and contributes the\n * declared custom services. The Langium defaults can be partially specified to override only\n * selected services, while the custom services must be fully specified.\n */\nexport const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices> = {\n references: {\n ScopeComputation: (services) => new ZModelScopeComputation(services),\n Linker: (services) => new ZModelLinker(services),\n },\n validation: {\n ValidationRegistry: (services) => new ZModelValidationRegistry(services),\n ZModelValidator: () => new ZModelValidator(),\n },\n};\n\n// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used\nexport function createSharedModule(\n context: DefaultSharedModuleContext\n): Module<LangiumSharedServices, LangiumDefaultSharedServices> {\n return {\n ServiceRegistry: () => new DefaultServiceRegistry(),\n lsp: {\n Connection: () => context.connection,\n LanguageServer: (services) => new DefaultLanguageServer(services),\n },\n workspace: {\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\n TextDocuments: () => new TextDocuments(TextDocument),\n IndexManager: (services) => new DefaultIndexManager(services),\n WorkspaceManager: (services) => new ZModelWorkspaceManager(services),\n FileSystemProvider: (services) => context.fileSystemProvider(services),\n MutexLock: () => new MutexLock(),\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services),\n },\n };\n}\n\n/**\n * Create the full set of services required by Langium.\n *\n * First inject the shared services by merging two modules:\n * - Langium default shared services\n * - Services generated by langium-cli\n *\n * Then inject the language-specific services by merging three modules:\n * - Langium default language-specific services\n * - Services generated by langium-cli\n * - Services specified in this file\n *\n * @param context Optional module context with the LSP connection\n * @returns An object wrapping the shared services and the language-specific services\n */\nexport function createZModelServices(context: DefaultSharedModuleContext): {\n shared: LangiumSharedServices;\n ZModel: ZModelServices;\n} {\n const shared = inject(createSharedModule(context), ZModelGeneratedSharedModule);\n\n const ZModel = inject(createDefaultModule({ shared }), ZModelGeneratedModule, ZModelModule);\n shared.ServiceRegistry.register(ZModel);\n return { shared, ZModel };\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAkBA;AACA;AACA;AACA;AACA;AACA;AAAgE;AAiBhE;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAkF,GAAG;EAC9FC,UAAU,EAAE;IACRC,gBAAgB,EAAGC,QAAQ,IAAK,IAAIC,mCAAsB,CAACD,QAAQ,CAAC;IACpEE,MAAM,EAAGF,QAAQ,IAAK,IAAIG,0BAAY,CAACH,QAAQ;EACnD,CAAC;EACDI,UAAU,EAAE;IACRC,kBAAkB,EAAGL,QAAQ,IAAK,IAAIM,yCAAwB,CAACN,QAAQ,CAAC;IACxEO,eAAe,EAAE,MAAM,IAAIA,gCAAe;EAC9C;AACJ,CAAC;;AAED;AAAA;AACO,SAASC,kBAAkB,CAC9BC,OAAmC,EACwB;EAC3D,OAAO;IACHC,eAAe,EAAE,MAAM,IAAIC,+BAAsB,EAAE;IACnDC,GAAG,EAAE;MACDC,UAAU,EAAE,MAAMJ,OAAO,CAACK,UAAU;MACpCC,cAAc,EAAGf,QAAQ,IAAK,IAAIgB,8BAAqB,CAAChB,QAAQ;IACpE,CAAC;IACDiB,SAAS,EAAE;MACPC,gBAAgB,EAAGlB,QAAQ,IAAK,IAAImB,gCAAuB,CAACnB,QAAQ,CAAC;MACrEoB,sBAAsB,EAAGpB,QAAQ,IAAK,IAAIqB,sCAA6B,CAACrB,QAAQ,CAAC;MACjFsB,eAAe,EAAGtB,QAAQ,IAAK,IAAIuB,+BAAsB,CAACvB,QAAQ,CAAC;MACnEwB,aAAa,EAAE,MAAM,IAAIA,mCAAa,CAACC,8CAAY,CAAC;MACpDC,YAAY,EAAG1B,QAAQ,IAAK,IAAI2B,4BAAmB,CAAC3B,QAAQ,CAAC;MAC7D4B,gBAAgB,EAAG5B,QAAQ,IAAK,IAAI6B,+BAAsB,CAAC7B,QAAQ,CAAC;MACpE8B,kBAAkB,EAAG9B,QAAQ,IAAKS,OAAO,CAACsB,kBAAkB,CAAC/B,QAAQ,CAAC;MACtEgC,SAAS,EAAE,MAAM,IAAIA,kBAAS,EAAE;MAChCC,qBAAqB,EAAGjC,QAAQ,IAAK,IAAIkC,qCAA4B,CAAClC,QAAQ;IAClF;EACJ,CAAC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASmC,oBAAoB,CAAC1B,OAAmC,EAGtE;EACE,MAAM2B,MAAM,GAAG,IAAAC,eAAM,EAAC7B,kBAAkB,CAACC,OAAO,CAAC,EAAE6B,mCAA2B,CAAC;EAE/E,MAAMC,MAAM,GAAG,IAAAF,eAAM,EAAC,IAAAG,4BAAmB,EAAC;IAAEJ;EAAO,CAAC,CAAC,EAAEK,6BAAqB,EAAE5C,YAAY,CAAC;EAC3FuC,MAAM,CAAC1B,eAAe,CAACgC,QAAQ,CAACH,MAAM,CAAC;EACvC,OAAO;IAAEH,MAAM;IAAEG;EAAO,CAAC;AAC7B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AstNode, AstNodeDescription, DefaultScopeComputation, LangiumDocument, LangiumServices } from 'langium';
|
|
2
|
+
import { CancellationToken } from 'vscode-jsonrpc';
|
|
3
|
+
/**
|
|
4
|
+
* Custom Langium ScopeComputation implementation which adds enum fields into global scope
|
|
5
|
+
*/
|
|
6
|
+
export declare class ZModelScopeComputation extends DefaultScopeComputation {
|
|
7
|
+
private readonly services;
|
|
8
|
+
constructor(services: LangiumServices);
|
|
9
|
+
computeExports(document: LangiumDocument<AstNode>, cancelToken?: CancellationToken | undefined): Promise<AstNodeDescription[]>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ZModelScopeComputation = void 0;
|
|
7
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
8
|
+
var _langium = require("langium");
|
|
9
|
+
/**
|
|
10
|
+
* Custom Langium ScopeComputation implementation which adds enum fields into global scope
|
|
11
|
+
*/
|
|
12
|
+
class ZModelScopeComputation extends _langium.DefaultScopeComputation {
|
|
13
|
+
constructor(services) {
|
|
14
|
+
super(services);
|
|
15
|
+
this.services = services;
|
|
16
|
+
}
|
|
17
|
+
async computeExports(document, cancelToken) {
|
|
18
|
+
const result = await super.computeExports(document, cancelToken);
|
|
19
|
+
|
|
20
|
+
// add enum fields so they can be globally resolved across modules
|
|
21
|
+
for (const node of (0, _langium.streamAllContents)(document.parseResult.value)) {
|
|
22
|
+
if (cancelToken) {
|
|
23
|
+
await (0, _langium.interruptAndCheck)(cancelToken);
|
|
24
|
+
}
|
|
25
|
+
if ((0, _ast.isEnumField)(node)) {
|
|
26
|
+
const desc = this.services.workspace.AstNodeDescriptionProvider.createDescription(node, node.name, document);
|
|
27
|
+
result.push(desc);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.ZModelScopeComputation = ZModelScopeComputation;
|
|
34
|
+
//# sourceMappingURL=zmodel-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-scope.js","names":["ZModelScopeComputation","DefaultScopeComputation","constructor","services","computeExports","document","cancelToken","result","node","streamAllContents","parseResult","value","interruptAndCheck","isEnumField","desc","workspace","AstNodeDescriptionProvider","createDescription","name","push"],"sources":["../../src/language-server/zmodel-scope.ts"],"sourcesContent":["import { isEnumField } from '@zenstackhq/language/ast';\nimport {\n AstNode,\n AstNodeDescription,\n DefaultScopeComputation,\n interruptAndCheck,\n LangiumDocument,\n LangiumServices,\n streamAllContents,\n} from 'langium';\nimport { CancellationToken } from 'vscode-jsonrpc';\n\n/**\n * Custom Langium ScopeComputation implementation which adds enum fields into global scope\n */\nexport class ZModelScopeComputation extends DefaultScopeComputation {\n constructor(private readonly services: LangiumServices) {\n super(services);\n }\n\n async computeExports(\n document: LangiumDocument<AstNode>,\n cancelToken?: CancellationToken | undefined\n ): Promise<AstNodeDescription[]> {\n const result = await super.computeExports(document, cancelToken);\n\n // add enum fields so they can be globally resolved across modules\n for (const node of streamAllContents(document.parseResult.value)) {\n if (cancelToken) {\n await interruptAndCheck(cancelToken);\n }\n if (isEnumField(node)) {\n const desc = this.services.workspace.AstNodeDescriptionProvider.createDescription(\n node,\n node.name,\n document\n );\n result.push(desc);\n }\n }\n\n return result;\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AAWA;AACA;AACA;AACO,MAAMA,sBAAsB,SAASC,gCAAuB,CAAC;EAChEC,WAAW,CAAkBC,QAAyB,EAAE;IACpD,KAAK,CAACA,QAAQ,CAAC;IAAC,KADSA,QAAyB,GAAzBA,QAAyB;EAEtD;EAEA,MAAMC,cAAc,CAChBC,QAAkC,EAClCC,WAA2C,EACd;IAC7B,MAAMC,MAAM,GAAG,MAAM,KAAK,CAACH,cAAc,CAACC,QAAQ,EAAEC,WAAW,CAAC;;IAEhE;IACA,KAAK,MAAME,IAAI,IAAI,IAAAC,0BAAiB,EAACJ,QAAQ,CAACK,WAAW,CAACC,KAAK,CAAC,EAAE;MAC9D,IAAIL,WAAW,EAAE;QACb,MAAM,IAAAM,0BAAiB,EAACN,WAAW,CAAC;MACxC;MACA,IAAI,IAAAO,gBAAW,EAACL,IAAI,CAAC,EAAE;QACnB,MAAMM,IAAI,GAAG,IAAI,CAACX,QAAQ,CAACY,SAAS,CAACC,0BAA0B,CAACC,iBAAiB,CAC7ET,IAAI,EACJA,IAAI,CAACU,IAAI,EACTb,QAAQ,CACX;QACDE,MAAM,CAACY,IAAI,CAACL,IAAI,CAAC;MACrB;IACJ;IAEA,OAAOP,MAAM;EACjB;AACJ;AAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DefaultWorkspaceManager, LangiumDocument } from 'langium';
|
|
2
|
+
import { WorkspaceFolder } from 'vscode-languageserver';
|
|
3
|
+
/**
|
|
4
|
+
* Custom Langium WorkspaceManager implementation which automatically loads stdlib.zmodel
|
|
5
|
+
*/
|
|
6
|
+
export default class ZModelWorkspaceManager extends DefaultWorkspaceManager {
|
|
7
|
+
protected loadAdditionalDocuments(_folders: WorkspaceFolder[], _collector: (document: LangiumDocument) => void): Promise<void>;
|
|
8
|
+
}
|