zenstack 0.6.0-pre.9 → 1.0.0-alpha.19
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 +133 -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 +23 -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 @@
|
|
|
1
|
+
{"version":3,"file":"datasource-validator.js","names":["supportedFields","DataSourceValidator","validate","ds","accept","validateDuplicatedDeclarations","fields","validateFields","validateProvider","validateUrl","validateRelationMode","forEach","f","includes","name","node","provider","find","value","getStringLiteral","SUPPORTED_PROVIDERS","map","p","join","url","fieldName","field","isInvocationExpr","function","ref","val"],"sources":["../../../src/language-server/validator/datasource-validator.ts"],"sourcesContent":["import { DataSource, isInvocationExpr } from '@zenstackhq/language/ast';\nimport { AstValidator } from '../types';\nimport { ValidationAcceptor } from 'langium';\nimport { getStringLiteral, validateDuplicatedDeclarations } from './utils';\nimport { SUPPORTED_PROVIDERS } from '../constants';\n\nconst supportedFields = ['provider', 'url', 'shadowDatabaseUrl', 'relationMode'];\n\n/**\n * Validates data source declarations.\n */\nexport default class DataSourceValidator implements AstValidator<DataSource> {\n validate(ds: DataSource, accept: ValidationAcceptor): void {\n validateDuplicatedDeclarations(ds.fields, accept);\n this.validateFields(ds, accept);\n this.validateProvider(ds, accept);\n this.validateUrl(ds, accept);\n this.validateRelationMode(ds, accept);\n }\n\n private validateFields(ds: DataSource, accept: ValidationAcceptor) {\n ds.fields.forEach((f) => {\n if (!supportedFields.includes(f.name)) {\n accept('error', `Unexpected field \"${f.name}\"`, { node: f });\n }\n });\n }\n\n private validateProvider(ds: DataSource, accept: ValidationAcceptor) {\n const provider = ds.fields.find((f) => f.name === 'provider');\n if (!provider) {\n accept('error', 'datasource must include a \"provider\" field', {\n node: ds,\n });\n return;\n }\n\n const value = getStringLiteral(provider.value);\n if (!value) {\n accept('error', '\"provider\" must be set to a string literal', {\n node: provider.value,\n });\n } else if (!SUPPORTED_PROVIDERS.includes(value)) {\n accept(\n 'error',\n `Provider \"${value}\" is not supported. Choose from ${SUPPORTED_PROVIDERS.map((p) => '\"' + p + '\"').join(\n ' | '\n )}.`,\n { node: provider.value }\n );\n }\n }\n\n private validateUrl(ds: DataSource, accept: ValidationAcceptor) {\n const url = ds.fields.find((f) => f.name === 'url');\n if (!url) {\n accept('error', 'datasource must include a \"url\" field', {\n node: ds,\n });\n }\n\n for (const fieldName of ['url', 'shadowDatabaseUrl']) {\n const field = ds.fields.find((f) => f.name === fieldName);\n if (!field) {\n continue;\n }\n const value = getStringLiteral(field.value);\n if (!value && !(isInvocationExpr(field.value) && field.value.function.ref?.name === 'env')) {\n accept('error', `\"${fieldName}\" must be set to a string literal or an invocation of \"env\" function`, {\n node: field.value,\n });\n }\n }\n }\n\n private validateRelationMode(ds: DataSource, accept: ValidationAcceptor) {\n const field = ds.fields.find((f) => f.name === 'relationMode');\n if (field) {\n const val = getStringLiteral(field.value);\n if (!val || !['foreignKeys', 'prisma'].includes(val)) {\n accept('error', '\"relationMode\" must be set to \"foreignKeys\" or \"prisma\"', { node: field.value });\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Enum } from '@zenstackhq/language/ast';
|
|
2
|
+
import { AstValidator } from '../types';
|
|
3
|
+
import { ValidationAcceptor } from 'langium';
|
|
4
|
+
/**
|
|
5
|
+
* Validates enum declarations.
|
|
6
|
+
*/
|
|
7
|
+
export default class EnumValidator implements AstValidator<Enum> {
|
|
8
|
+
validate(_enum: Enum, accept: ValidationAcceptor): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
/**
|
|
9
|
+
* Validates enum declarations.
|
|
10
|
+
*/
|
|
11
|
+
class EnumValidator {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
13
|
+
validate(_enum, accept) {
|
|
14
|
+
(0, _utils.validateDuplicatedDeclarations)(_enum.fields, accept);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.default = EnumValidator;
|
|
18
|
+
//# sourceMappingURL=enum-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-validator.js","names":["EnumValidator","validate","_enum","accept","validateDuplicatedDeclarations","fields"],"sources":["../../../src/language-server/validator/enum-validator.ts"],"sourcesContent":["import { Enum } from '@zenstackhq/language/ast';\nimport { AstValidator } from '../types';\nimport { ValidationAcceptor } from 'langium';\nimport { validateDuplicatedDeclarations } from './utils';\n\n/**\n * Validates enum declarations.\n */\nexport default class EnumValidator implements AstValidator<Enum> {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n validate(_enum: Enum, accept: ValidationAcceptor) {\n validateDuplicatedDeclarations(_enum.fields, accept);\n }\n}\n"],"mappings":";;;;;;AAGA;AAEA;AACA;AACA;AACe,MAAMA,aAAa,CAA+B;EAC7D;EACAC,QAAQ,CAACC,KAAW,EAAEC,MAA0B,EAAE;IAC9C,IAAAC,qCAA8B,EAACF,KAAK,CAACG,MAAM,EAAEF,MAAM,CAAC;EACxD;AACJ;AAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Expression } from '@zenstackhq/language/ast';
|
|
2
|
+
import { AstValidator } from '../types';
|
|
3
|
+
import { ValidationAcceptor } from 'langium';
|
|
4
|
+
/**
|
|
5
|
+
* Validates expressions.
|
|
6
|
+
*/
|
|
7
|
+
export default class ExpressionValidator implements AstValidator<Expression> {
|
|
8
|
+
validate(expr: Expression, accept: ValidationAcceptor): void;
|
|
9
|
+
private isCollectionPredicate;
|
|
10
|
+
private isAuthInvocation;
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
8
|
+
var _utils = require("../utils");
|
|
9
|
+
/**
|
|
10
|
+
* Validates expressions.
|
|
11
|
+
*/
|
|
12
|
+
class ExpressionValidator {
|
|
13
|
+
validate(expr, accept) {
|
|
14
|
+
if (!expr.$resolvedType) {
|
|
15
|
+
if (this.isAuthInvocation(expr)) {
|
|
16
|
+
// check was done at link time
|
|
17
|
+
accept('error', 'auth() cannot be resolved because no "User" model is defined', {
|
|
18
|
+
node: expr
|
|
19
|
+
});
|
|
20
|
+
} else if (this.isCollectionPredicate(expr)) {
|
|
21
|
+
accept('error', 'collection predicate can only be used on an array of model type', {
|
|
22
|
+
node: expr
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
accept('error', 'expression cannot be resolved', {
|
|
26
|
+
node: expr
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
isCollectionPredicate(expr) {
|
|
32
|
+
return (0, _ast.isBinaryExpr)(expr) && ['?', '!', '^'].includes(expr.operator);
|
|
33
|
+
}
|
|
34
|
+
isAuthInvocation(expr) {
|
|
35
|
+
var _expr$function$ref;
|
|
36
|
+
return (0, _ast.isInvocationExpr)(expr) && ((_expr$function$ref = expr.function.ref) === null || _expr$function$ref === void 0 ? void 0 : _expr$function$ref.name) === 'auth' && (0, _utils.isFromStdlib)(expr.function.ref);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.default = ExpressionValidator;
|
|
40
|
+
//# sourceMappingURL=expression-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-validator.js","names":["ExpressionValidator","validate","expr","accept","$resolvedType","isAuthInvocation","node","isCollectionPredicate","isBinaryExpr","includes","operator","isInvocationExpr","function","ref","name","isFromStdlib"],"sources":["../../../src/language-server/validator/expression-validator.ts"],"sourcesContent":["import { Expression, isBinaryExpr, isInvocationExpr } from '@zenstackhq/language/ast';\nimport { AstValidator } from '../types';\nimport { isFromStdlib } from '../utils';\nimport { ValidationAcceptor } from 'langium';\n\n/**\n * Validates expressions.\n */\nexport default class ExpressionValidator implements AstValidator<Expression> {\n validate(expr: Expression, accept: ValidationAcceptor): void {\n if (!expr.$resolvedType) {\n if (this.isAuthInvocation(expr)) {\n // check was done at link time\n accept('error', 'auth() cannot be resolved because no \"User\" model is defined', { node: expr });\n } else if (this.isCollectionPredicate(expr)) {\n accept('error', 'collection predicate can only be used on an array of model type', { node: expr });\n } else {\n accept('error', 'expression cannot be resolved', {\n node: expr,\n });\n }\n }\n }\n\n private isCollectionPredicate(expr: Expression) {\n return isBinaryExpr(expr) && ['?', '!', '^'].includes(expr.operator);\n }\n\n private isAuthInvocation(expr: Expression) {\n return isInvocationExpr(expr) && expr.function.ref?.name === 'auth' && isFromStdlib(expr.function.ref);\n }\n}\n"],"mappings":";;;;;;AAAA;AAEA;AAGA;AACA;AACA;AACe,MAAMA,mBAAmB,CAAqC;EACzEC,QAAQ,CAACC,IAAgB,EAAEC,MAA0B,EAAQ;IACzD,IAAI,CAACD,IAAI,CAACE,aAAa,EAAE;MACrB,IAAI,IAAI,CAACC,gBAAgB,CAACH,IAAI,CAAC,EAAE;QAC7B;QACAC,MAAM,CAAC,OAAO,EAAE,8DAA8D,EAAE;UAAEG,IAAI,EAAEJ;QAAK,CAAC,CAAC;MACnG,CAAC,MAAM,IAAI,IAAI,CAACK,qBAAqB,CAACL,IAAI,CAAC,EAAE;QACzCC,MAAM,CAAC,OAAO,EAAE,iEAAiE,EAAE;UAAEG,IAAI,EAAEJ;QAAK,CAAC,CAAC;MACtG,CAAC,MAAM;QACHC,MAAM,CAAC,OAAO,EAAE,+BAA+B,EAAE;UAC7CG,IAAI,EAAEJ;QACV,CAAC,CAAC;MACN;IACJ;EACJ;EAEQK,qBAAqB,CAACL,IAAgB,EAAE;IAC5C,OAAO,IAAAM,iBAAY,EAACN,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACO,QAAQ,CAACP,IAAI,CAACQ,QAAQ,CAAC;EACxE;EAEQL,gBAAgB,CAACH,IAAgB,EAAE;IAAA;IACvC,OAAO,IAAAS,qBAAgB,EAACT,IAAI,CAAC,IAAI,uBAAAA,IAAI,CAACU,QAAQ,CAACC,GAAG,uDAAjB,mBAAmBC,IAAI,MAAK,MAAM,IAAI,IAAAC,mBAAY,EAACb,IAAI,CAACU,QAAQ,CAACC,GAAG,CAAC;EAC1G;AACJ;AAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Model } from '@zenstackhq/language/ast';
|
|
2
|
+
import { AstValidator } from '../types';
|
|
3
|
+
import { ValidationAcceptor } from 'langium';
|
|
4
|
+
/**
|
|
5
|
+
* Validates toplevel schema.
|
|
6
|
+
*/
|
|
7
|
+
export default class SchemaValidator implements AstValidator<Model> {
|
|
8
|
+
validate(model: Model, accept: ValidationAcceptor): void;
|
|
9
|
+
private validateDataSources;
|
|
10
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _constants = require("../constants");
|
|
8
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
/**
|
|
11
|
+
* Validates toplevel schema.
|
|
12
|
+
*/
|
|
13
|
+
class SchemaValidator {
|
|
14
|
+
validate(model, accept) {
|
|
15
|
+
var _model$$document;
|
|
16
|
+
(0, _utils.validateDuplicatedDeclarations)(model.declarations, accept);
|
|
17
|
+
if (!((_model$$document = model.$document) !== null && _model$$document !== void 0 && _model$$document.uri.path.endsWith(_constants.STD_LIB_MODULE_NAME))) {
|
|
18
|
+
this.validateDataSources(model, accept);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
validateDataSources(model, accept) {
|
|
22
|
+
const dataSources = model.declarations.filter(d => (0, _ast.isDataSource)(d));
|
|
23
|
+
if (dataSources.length === 0) {
|
|
24
|
+
accept('error', 'Model must define a datasource', {
|
|
25
|
+
node: model
|
|
26
|
+
});
|
|
27
|
+
} else if (dataSources.length > 1) {
|
|
28
|
+
accept('error', 'Multiple datasource declarations are not allowed', {
|
|
29
|
+
node: dataSources[1]
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.default = SchemaValidator;
|
|
35
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","names":["SchemaValidator","validate","model","accept","validateDuplicatedDeclarations","declarations","$document","uri","path","endsWith","STD_LIB_MODULE_NAME","validateDataSources","dataSources","filter","d","isDataSource","length","node"],"sources":["../../../src/language-server/validator/schema-validator.ts"],"sourcesContent":["import { STD_LIB_MODULE_NAME } from '../constants';\nimport { isDataSource, Model } from '@zenstackhq/language/ast';\nimport { AstValidator } from '../types';\nimport { ValidationAcceptor } from 'langium';\nimport { validateDuplicatedDeclarations } from './utils';\n\n/**\n * Validates toplevel schema.\n */\nexport default class SchemaValidator implements AstValidator<Model> {\n validate(model: Model, accept: ValidationAcceptor): void {\n validateDuplicatedDeclarations(model.declarations, accept);\n\n if (!model.$document?.uri.path.endsWith(STD_LIB_MODULE_NAME)) {\n this.validateDataSources(model, accept);\n }\n }\n\n private validateDataSources(model: Model, accept: ValidationAcceptor) {\n const dataSources = model.declarations.filter((d) => isDataSource(d));\n if (dataSources.length === 0) {\n accept('error', 'Model must define a datasource', { node: model });\n } else if (dataSources.length > 1) {\n accept('error', 'Multiple datasource declarations are not allowed', { node: dataSources[1] });\n }\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AAGA;AAEA;AACA;AACA;AACe,MAAMA,eAAe,CAAgC;EAChEC,QAAQ,CAACC,KAAY,EAAEC,MAA0B,EAAQ;IAAA;IACrD,IAAAC,qCAA8B,EAACF,KAAK,CAACG,YAAY,EAAEF,MAAM,CAAC;IAE1D,IAAI,sBAACD,KAAK,CAACI,SAAS,6CAAf,iBAAiBC,GAAG,CAACC,IAAI,CAACC,QAAQ,CAACC,8BAAmB,CAAC,GAAE;MAC1D,IAAI,CAACC,mBAAmB,CAACT,KAAK,EAAEC,MAAM,CAAC;IAC3C;EACJ;EAEQQ,mBAAmB,CAACT,KAAY,EAAEC,MAA0B,EAAE;IAClE,MAAMS,WAAW,GAAGV,KAAK,CAACG,YAAY,CAACQ,MAAM,CAAEC,CAAC,IAAK,IAAAC,iBAAY,EAACD,CAAC,CAAC,CAAC;IACrE,IAAIF,WAAW,CAACI,MAAM,KAAK,CAAC,EAAE;MAC1Bb,MAAM,CAAC,OAAO,EAAE,gCAAgC,EAAE;QAAEc,IAAI,EAAEf;MAAM,CAAC,CAAC;IACtE,CAAC,MAAM,IAAIU,WAAW,CAACI,MAAM,GAAG,CAAC,EAAE;MAC/Bb,MAAM,CAAC,OAAO,EAAE,kDAAkD,EAAE;QAAEc,IAAI,EAAEL,WAAW,CAAC,CAAC;MAAE,CAAC,CAAC;IACjG;EACJ;AACJ;AAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AttributeArg, AttributeParam, BuiltinType, DataModelAttribute, DataModelFieldAttribute, ExpressionType } from '@zenstackhq/language/ast';
|
|
2
|
+
import { AstNode, ValidationAcceptor } from 'langium';
|
|
3
|
+
/**
|
|
4
|
+
* Checks if the given declarations have duplicated names
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateDuplicatedDeclarations(decls: Array<AstNode & {
|
|
7
|
+
name: string;
|
|
8
|
+
}>, accept: ValidationAcceptor): void;
|
|
9
|
+
/**
|
|
10
|
+
* Try getting string value from a potential string literal expression
|
|
11
|
+
*/
|
|
12
|
+
export declare function getStringLiteral(node: AstNode | undefined): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Determines if the given sourceType is assignable to a destination of destType
|
|
15
|
+
*/
|
|
16
|
+
export declare function typeAssignable(destType: ExpressionType, sourceType: ExpressionType): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Maps a ZModel builtin type to expression type
|
|
19
|
+
*/
|
|
20
|
+
export declare function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Null'): ExpressionType | 'Any';
|
|
21
|
+
/**
|
|
22
|
+
* Determines if the given attribute argument is assignable to the given attribute parameter
|
|
23
|
+
*/
|
|
24
|
+
export declare function assignableToAttributeParam(arg: AttributeArg, param: AttributeParam, attr: DataModelAttribute | DataModelFieldAttribute): boolean;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.assignableToAttributeParam = assignableToAttributeParam;
|
|
7
|
+
exports.getStringLiteral = getStringLiteral;
|
|
8
|
+
exports.mapBuiltinTypeToExpressionType = mapBuiltinTypeToExpressionType;
|
|
9
|
+
exports.typeAssignable = typeAssignable;
|
|
10
|
+
exports.validateDuplicatedDeclarations = validateDuplicatedDeclarations;
|
|
11
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
12
|
+
/**
|
|
13
|
+
* Checks if the given declarations have duplicated names
|
|
14
|
+
*/
|
|
15
|
+
function validateDuplicatedDeclarations(decls, accept) {
|
|
16
|
+
const groupByName = decls.reduce((group, decl) => {
|
|
17
|
+
group[decl.name] = group[decl.name] ?? [];
|
|
18
|
+
group[decl.name].push(decl);
|
|
19
|
+
return group;
|
|
20
|
+
}, {});
|
|
21
|
+
for (const [name, decls] of Object.entries(groupByName)) {
|
|
22
|
+
if (decls.length > 1) {
|
|
23
|
+
accept('error', `Duplicated declaration name "${name}"`, {
|
|
24
|
+
node: decls[1]
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Try getting string value from a potential string literal expression
|
|
32
|
+
*/
|
|
33
|
+
function getStringLiteral(node) {
|
|
34
|
+
if ((0, _ast.isLiteralExpr)(node) && typeof node.value === 'string') {
|
|
35
|
+
return node.value;
|
|
36
|
+
} else {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Determines if the given sourceType is assignable to a destination of destType
|
|
43
|
+
*/
|
|
44
|
+
function typeAssignable(destType, sourceType) {
|
|
45
|
+
switch (destType) {
|
|
46
|
+
case 'Any':
|
|
47
|
+
return true;
|
|
48
|
+
case 'Float':
|
|
49
|
+
return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';
|
|
50
|
+
default:
|
|
51
|
+
return sourceType === 'Any' || sourceType === destType;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Maps a ZModel builtin type to expression type
|
|
57
|
+
*/
|
|
58
|
+
function mapBuiltinTypeToExpressionType(type) {
|
|
59
|
+
switch (type) {
|
|
60
|
+
case 'Any':
|
|
61
|
+
case 'Boolean':
|
|
62
|
+
case 'String':
|
|
63
|
+
case 'DateTime':
|
|
64
|
+
case 'Int':
|
|
65
|
+
case 'Float':
|
|
66
|
+
case 'Null':
|
|
67
|
+
return type;
|
|
68
|
+
case 'BigInt':
|
|
69
|
+
return 'Int';
|
|
70
|
+
case 'Decimal':
|
|
71
|
+
return 'Float';
|
|
72
|
+
case 'Json':
|
|
73
|
+
case 'Bytes':
|
|
74
|
+
return 'Any';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Determines if the given attribute argument is assignable to the given attribute parameter
|
|
80
|
+
*/
|
|
81
|
+
function assignableToAttributeParam(arg, param, attr) {
|
|
82
|
+
const argResolvedType = arg.$resolvedType;
|
|
83
|
+
if (!argResolvedType) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
let dstType = param.type.type;
|
|
87
|
+
const dstIsArray = param.type.array;
|
|
88
|
+
const dstRef = param.type.reference;
|
|
89
|
+
if (dstType) {
|
|
90
|
+
if (typeof (argResolvedType === null || argResolvedType === void 0 ? void 0 : argResolvedType.decl) !== 'string') {
|
|
91
|
+
// destination type is not a reference, so argument type must be a plain expression
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {
|
|
95
|
+
if (dstIsArray) {
|
|
96
|
+
return (0, _ast.isArrayExpr)(arg.value) && !arg.value.items.find(item => !(0, _ast.isReferenceExpr)(item) || !(0, _ast.isDataModelField)(item.target.ref));
|
|
97
|
+
} else {
|
|
98
|
+
return (0, _ast.isReferenceExpr)(arg.value) && (0, _ast.isDataModelField)(arg.value.target.ref);
|
|
99
|
+
}
|
|
100
|
+
} else if (dstType === 'ContextType') {
|
|
101
|
+
if ((0, _ast.isDataModelField)(attr.$container)) {
|
|
102
|
+
var _attr$$container, _attr$$container$type;
|
|
103
|
+
if (!((_attr$$container = attr.$container) !== null && _attr$$container !== void 0 && (_attr$$container$type = _attr$$container.type) !== null && _attr$$container$type !== void 0 && _attr$$container$type.type)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);
|
|
107
|
+
} else {
|
|
108
|
+
dstType = 'Any';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return typeAssignable(dstType, argResolvedType.decl) && dstIsArray === argResolvedType.array;
|
|
112
|
+
} else {
|
|
113
|
+
return (dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) === argResolvedType.decl && dstIsArray === argResolvedType.array;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["validateDuplicatedDeclarations","decls","accept","groupByName","reduce","group","decl","name","push","Object","entries","length","node","getStringLiteral","isLiteralExpr","value","undefined","typeAssignable","destType","sourceType","mapBuiltinTypeToExpressionType","type","assignableToAttributeParam","arg","param","attr","argResolvedType","$resolvedType","dstType","dstIsArray","array","dstRef","reference","isArrayExpr","items","find","item","isReferenceExpr","isDataModelField","target","ref","$container"],"sources":["../../../src/language-server/validator/utils.ts"],"sourcesContent":["import {\n AttributeArg,\n AttributeParam,\n BuiltinType,\n DataModelAttribute,\n DataModelFieldAttribute,\n ExpressionType,\n isArrayExpr,\n isDataModelField,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstNode, ValidationAcceptor } from 'langium';\n\n/**\n * Checks if the given declarations have duplicated names\n */\nexport function validateDuplicatedDeclarations(\n decls: Array<AstNode & { name: string }>,\n accept: ValidationAcceptor\n): void {\n const groupByName = decls.reduce<Record<string, Array<AstNode & { name: string }>>>((group, decl) => {\n group[decl.name] = group[decl.name] ?? [];\n group[decl.name].push(decl);\n return group;\n }, {});\n\n for (const [name, decls] of Object.entries<AstNode[]>(groupByName)) {\n if (decls.length > 1) {\n accept('error', `Duplicated declaration name \"${name}\"`, {\n node: decls[1],\n });\n }\n }\n}\n\n/**\n * Try getting string value from a potential string literal expression\n */\nexport function getStringLiteral(node: AstNode | undefined): string | undefined {\n if (isLiteralExpr(node) && typeof node.value === 'string') {\n return node.value;\n } else {\n return undefined;\n }\n}\n\n/**\n * Determines if the given sourceType is assignable to a destination of destType\n */\nexport function typeAssignable(destType: ExpressionType, sourceType: ExpressionType): boolean {\n switch (destType) {\n case 'Any':\n return true;\n case 'Float':\n return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';\n default:\n return sourceType === 'Any' || sourceType === destType;\n }\n}\n\n/**\n * Maps a ZModel builtin type to expression type\n */\nexport function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Null'): ExpressionType | 'Any' {\n switch (type) {\n case 'Any':\n case 'Boolean':\n case 'String':\n case 'DateTime':\n case 'Int':\n case 'Float':\n case 'Null':\n return type;\n case 'BigInt':\n return 'Int';\n case 'Decimal':\n return 'Float';\n case 'Json':\n case 'Bytes':\n return 'Any';\n }\n}\n\n/**\n * Determines if the given attribute argument is assignable to the given attribute parameter\n */\nexport function assignableToAttributeParam(\n arg: AttributeArg,\n param: AttributeParam,\n attr: DataModelAttribute | DataModelFieldAttribute\n): boolean {\n const argResolvedType = arg.$resolvedType;\n if (!argResolvedType) {\n return false;\n }\n\n let dstType = param.type.type;\n const dstIsArray = param.type.array;\n const dstRef = param.type.reference;\n\n if (dstType) {\n if (typeof argResolvedType?.decl !== 'string') {\n // destination type is not a reference, so argument type must be a plain expression\n return false;\n }\n\n if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {\n if (dstIsArray) {\n return (\n isArrayExpr(arg.value) &&\n !arg.value.items.find((item) => !isReferenceExpr(item) || !isDataModelField(item.target.ref))\n );\n } else {\n return isReferenceExpr(arg.value) && isDataModelField(arg.value.target.ref);\n }\n } else if (dstType === 'ContextType') {\n if (isDataModelField(attr.$container)) {\n if (!attr.$container?.type?.type) {\n return false;\n }\n dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);\n } else {\n dstType = 'Any';\n }\n }\n\n return typeAssignable(dstType, argResolvedType.decl) && dstIsArray === argResolvedType.array;\n } else {\n return dstRef?.ref === argResolvedType.decl && dstIsArray === argResolvedType.array;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ValidationAcceptor, ValidationRegistry } from 'langium';
|
|
2
|
+
import { Attribute, DataModel, DataSource, Enum, Expression, Model } from '@zenstackhq/language/ast';
|
|
3
|
+
import type { ZModelServices } from '../zmodel-module';
|
|
4
|
+
/**
|
|
5
|
+
* Registry for validation checks.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ZModelValidationRegistry extends ValidationRegistry {
|
|
8
|
+
constructor(services: ZModelServices);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Implementation of custom validations.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ZModelValidator {
|
|
14
|
+
private shouldCheck;
|
|
15
|
+
checkModel(node: Model, accept: ValidationAcceptor): void;
|
|
16
|
+
checkDataSource(node: DataSource, accept: ValidationAcceptor): void;
|
|
17
|
+
checkDataModel(node: DataModel, accept: ValidationAcceptor): void;
|
|
18
|
+
checkEnum(node: Enum, accept: ValidationAcceptor): void;
|
|
19
|
+
checkAttribute(node: Attribute, accept: ValidationAcceptor): void;
|
|
20
|
+
checkExpression(node: Expression, accept: ValidationAcceptor): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ZModelValidator = exports.ZModelValidationRegistry = void 0;
|
|
7
|
+
var _langium = require("langium");
|
|
8
|
+
var _schemaValidator = _interopRequireDefault(require("./schema-validator"));
|
|
9
|
+
var _datasourceValidator = _interopRequireDefault(require("./datasource-validator"));
|
|
10
|
+
var _datamodelValidator = _interopRequireDefault(require("./datamodel-validator"));
|
|
11
|
+
var _attributeValidator = _interopRequireDefault(require("./attribute-validator"));
|
|
12
|
+
var _enumValidator = _interopRequireDefault(require("./enum-validator"));
|
|
13
|
+
var _expressionValidator = _interopRequireDefault(require("./expression-validator"));
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
/**
|
|
16
|
+
* Registry for validation checks.
|
|
17
|
+
*/
|
|
18
|
+
class ZModelValidationRegistry extends _langium.ValidationRegistry {
|
|
19
|
+
constructor(services) {
|
|
20
|
+
super(services);
|
|
21
|
+
const validator = services.validation.ZModelValidator;
|
|
22
|
+
const checks = {
|
|
23
|
+
Model: validator.checkModel,
|
|
24
|
+
DataSource: validator.checkDataSource,
|
|
25
|
+
DataModel: validator.checkDataModel,
|
|
26
|
+
Enum: validator.checkEnum,
|
|
27
|
+
Attribute: validator.checkAttribute,
|
|
28
|
+
Expression: validator.checkExpression
|
|
29
|
+
};
|
|
30
|
+
this.register(checks, validator);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Implementation of custom validations.
|
|
36
|
+
*/
|
|
37
|
+
exports.ZModelValidationRegistry = ZModelValidationRegistry;
|
|
38
|
+
class ZModelValidator {
|
|
39
|
+
shouldCheck(node) {
|
|
40
|
+
var _doc, _doc2;
|
|
41
|
+
let doc;
|
|
42
|
+
let currNode = node;
|
|
43
|
+
while (currNode) {
|
|
44
|
+
if (currNode.$document) {
|
|
45
|
+
doc = currNode.$document;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
currNode = currNode.$container;
|
|
49
|
+
}
|
|
50
|
+
return ((_doc = doc) === null || _doc === void 0 ? void 0 : _doc.parseResult.lexerErrors.length) === 0 && ((_doc2 = doc) === null || _doc2 === void 0 ? void 0 : _doc2.parseResult.parserErrors.length) === 0;
|
|
51
|
+
}
|
|
52
|
+
checkModel(node, accept) {
|
|
53
|
+
this.shouldCheck(node) && new _schemaValidator.default().validate(node, accept);
|
|
54
|
+
}
|
|
55
|
+
checkDataSource(node, accept) {
|
|
56
|
+
this.shouldCheck(node) && new _datasourceValidator.default().validate(node, accept);
|
|
57
|
+
}
|
|
58
|
+
checkDataModel(node, accept) {
|
|
59
|
+
this.shouldCheck(node) && new _datamodelValidator.default().validate(node, accept);
|
|
60
|
+
}
|
|
61
|
+
checkEnum(node, accept) {
|
|
62
|
+
this.shouldCheck(node) && new _enumValidator.default().validate(node, accept);
|
|
63
|
+
}
|
|
64
|
+
checkAttribute(node, accept) {
|
|
65
|
+
this.shouldCheck(node) && new _attributeValidator.default().validate(node, accept);
|
|
66
|
+
}
|
|
67
|
+
checkExpression(node, accept) {
|
|
68
|
+
new _expressionValidator.default().validate(node, accept);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.ZModelValidator = ZModelValidator;
|
|
72
|
+
//# sourceMappingURL=zmodel-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-validator.js","names":["ZModelValidationRegistry","ValidationRegistry","constructor","services","validator","validation","ZModelValidator","checks","Model","checkModel","DataSource","checkDataSource","DataModel","checkDataModel","Enum","checkEnum","Attribute","checkAttribute","Expression","checkExpression","register","shouldCheck","node","doc","currNode","$document","$container","parseResult","lexerErrors","length","parserErrors","accept","SchemaValidator","validate","DataSourceValidator","DataModelValidator","EnumValidator","AttributeValidator","ExpressionValidator"],"sources":["../../../src/language-server/validator/zmodel-validator.ts"],"sourcesContent":["import { AstNode, LangiumDocument, ValidationAcceptor, ValidationChecks, ValidationRegistry } from 'langium';\nimport { Attribute, DataModel, DataSource, Enum, Expression, Model, ZModelAstType } from '@zenstackhq/language/ast';\nimport type { ZModelServices } from '../zmodel-module';\nimport SchemaValidator from './schema-validator';\nimport DataSourceValidator from './datasource-validator';\nimport DataModelValidator from './datamodel-validator';\nimport AttributeValidator from './attribute-validator';\nimport EnumValidator from './enum-validator';\nimport ExpressionValidator from './expression-validator';\n\n/**\n * Registry for validation checks.\n */\nexport class ZModelValidationRegistry extends ValidationRegistry {\n constructor(services: ZModelServices) {\n super(services);\n const validator = services.validation.ZModelValidator;\n const checks: ValidationChecks<ZModelAstType> = {\n Model: validator.checkModel,\n DataSource: validator.checkDataSource,\n DataModel: validator.checkDataModel,\n Enum: validator.checkEnum,\n Attribute: validator.checkAttribute,\n Expression: validator.checkExpression,\n };\n this.register(checks, validator);\n }\n}\n\n/**\n * Implementation of custom validations.\n */\nexport class ZModelValidator {\n private shouldCheck(node: AstNode) {\n let doc: LangiumDocument | undefined;\n let currNode: AstNode | undefined = node;\n while (currNode) {\n if (currNode.$document) {\n doc = currNode.$document;\n break;\n }\n currNode = currNode.$container;\n }\n\n return doc?.parseResult.lexerErrors.length === 0 && doc?.parseResult.parserErrors.length === 0;\n }\n\n checkModel(node: Model, accept: ValidationAcceptor): void {\n this.shouldCheck(node) && new SchemaValidator().validate(node, accept);\n }\n\n checkDataSource(node: DataSource, accept: ValidationAcceptor): void {\n this.shouldCheck(node) && new DataSourceValidator().validate(node, accept);\n }\n\n checkDataModel(node: DataModel, accept: ValidationAcceptor): void {\n this.shouldCheck(node) && new DataModelValidator().validate(node, accept);\n }\n\n checkEnum(node: Enum, accept: ValidationAcceptor): void {\n this.shouldCheck(node) && new EnumValidator().validate(node, accept);\n }\n\n checkAttribute(node: Attribute, accept: ValidationAcceptor): void {\n this.shouldCheck(node) && new AttributeValidator().validate(node, accept);\n }\n\n checkExpression(node: Expression, accept: ValidationAcceptor): void {\n new ExpressionValidator().validate(node, accept);\n }\n}\n"],"mappings":";;;;;;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AAAyD;AAEzD;AACA;AACA;AACO,MAAMA,wBAAwB,SAASC,2BAAkB,CAAC;EAC7DC,WAAW,CAACC,QAAwB,EAAE;IAClC,KAAK,CAACA,QAAQ,CAAC;IACf,MAAMC,SAAS,GAAGD,QAAQ,CAACE,UAAU,CAACC,eAAe;IACrD,MAAMC,MAAuC,GAAG;MAC5CC,KAAK,EAAEJ,SAAS,CAACK,UAAU;MAC3BC,UAAU,EAAEN,SAAS,CAACO,eAAe;MACrCC,SAAS,EAAER,SAAS,CAACS,cAAc;MACnCC,IAAI,EAAEV,SAAS,CAACW,SAAS;MACzBC,SAAS,EAAEZ,SAAS,CAACa,cAAc;MACnCC,UAAU,EAAEd,SAAS,CAACe;IAC1B,CAAC;IACD,IAAI,CAACC,QAAQ,CAACb,MAAM,EAAEH,SAAS,CAAC;EACpC;AACJ;;AAEA;AACA;AACA;AAFA;AAGO,MAAME,eAAe,CAAC;EACjBe,WAAW,CAACC,IAAa,EAAE;IAAA;IAC/B,IAAIC,GAAgC;IACpC,IAAIC,QAA6B,GAAGF,IAAI;IACxC,OAAOE,QAAQ,EAAE;MACb,IAAIA,QAAQ,CAACC,SAAS,EAAE;QACpBF,GAAG,GAAGC,QAAQ,CAACC,SAAS;QACxB;MACJ;MACAD,QAAQ,GAAGA,QAAQ,CAACE,UAAU;IAClC;IAEA,OAAO,SAAAH,GAAG,yCAAH,KAAKI,WAAW,CAACC,WAAW,CAACC,MAAM,MAAK,CAAC,IAAI,UAAAN,GAAG,0CAAH,MAAKI,WAAW,CAACG,YAAY,CAACD,MAAM,MAAK,CAAC;EAClG;EAEApB,UAAU,CAACa,IAAW,EAAES,MAA0B,EAAQ;IACtD,IAAI,CAACV,WAAW,CAACC,IAAI,CAAC,IAAI,IAAIU,wBAAe,EAAE,CAACC,QAAQ,CAACX,IAAI,EAAES,MAAM,CAAC;EAC1E;EAEApB,eAAe,CAACW,IAAgB,EAAES,MAA0B,EAAQ;IAChE,IAAI,CAACV,WAAW,CAACC,IAAI,CAAC,IAAI,IAAIY,4BAAmB,EAAE,CAACD,QAAQ,CAACX,IAAI,EAAES,MAAM,CAAC;EAC9E;EAEAlB,cAAc,CAACS,IAAe,EAAES,MAA0B,EAAQ;IAC9D,IAAI,CAACV,WAAW,CAACC,IAAI,CAAC,IAAI,IAAIa,2BAAkB,EAAE,CAACF,QAAQ,CAACX,IAAI,EAAES,MAAM,CAAC;EAC7E;EAEAhB,SAAS,CAACO,IAAU,EAAES,MAA0B,EAAQ;IACpD,IAAI,CAACV,WAAW,CAACC,IAAI,CAAC,IAAI,IAAIc,sBAAa,EAAE,CAACH,QAAQ,CAACX,IAAI,EAAES,MAAM,CAAC;EACxE;EAEAd,cAAc,CAACK,IAAe,EAAES,MAA0B,EAAQ;IAC9D,IAAI,CAACV,WAAW,CAACC,IAAI,CAAC,IAAI,IAAIe,2BAAkB,EAAE,CAACJ,QAAQ,CAACX,IAAI,EAAES,MAAM,CAAC;EAC7E;EAEAZ,eAAe,CAACG,IAAgB,EAAES,MAA0B,EAAQ;IAChE,IAAIO,4BAAmB,EAAE,CAACL,QAAQ,CAACX,IAAI,EAAES,MAAM,CAAC;EACpD;AACJ;AAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DefaultLinker, LangiumDocument, LangiumServices } from 'langium';
|
|
2
|
+
import { CancellationToken } from 'vscode-jsonrpc';
|
|
3
|
+
/**
|
|
4
|
+
* Langium linker implementation which links references and resolves expression types
|
|
5
|
+
*/
|
|
6
|
+
export declare class ZModelLinker extends DefaultLinker {
|
|
7
|
+
private readonly descriptions;
|
|
8
|
+
constructor(services: LangiumServices);
|
|
9
|
+
link(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;
|
|
10
|
+
private linkReference;
|
|
11
|
+
private resolveFromScopeProviders;
|
|
12
|
+
private resolve;
|
|
13
|
+
private resolveBinary;
|
|
14
|
+
private resolveUnary;
|
|
15
|
+
private resolveReference;
|
|
16
|
+
private resolveArray;
|
|
17
|
+
private resolveInvocation;
|
|
18
|
+
private getContainingDataModel;
|
|
19
|
+
private resolveLiteral;
|
|
20
|
+
private resolveMemberAccess;
|
|
21
|
+
private resolveCollectionPredicate;
|
|
22
|
+
private resolveThis;
|
|
23
|
+
private resolveNull;
|
|
24
|
+
private resolveAttributeArg;
|
|
25
|
+
private findAttrParamForArg;
|
|
26
|
+
private resolveDefault;
|
|
27
|
+
private resolveToDeclaredType;
|
|
28
|
+
private resolveToBuiltinTypeOrDecl;
|
|
29
|
+
}
|