zenstack 1.0.0 → 1.0.1
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/LICENSE +1 -1
- package/README.md +194 -1
- package/bin/cli +3 -0
- package/bin/post-install.js +24 -0
- package/cli/actions/generate.d.ts +13 -0
- package/cli/actions/generate.js +71 -0
- package/cli/actions/generate.js.map +1 -0
- package/cli/actions/index.d.ts +3 -0
- package/cli/actions/index.js +20 -0
- package/cli/actions/index.js.map +1 -0
- package/cli/actions/info.d.ts +4 -0
- package/cli/actions/info.js +63 -0
- package/cli/actions/info.js.map +1 -0
- package/cli/actions/init.d.ts +12 -0
- package/cli/actions/init.js +83 -0
- package/cli/actions/init.js.map +1 -0
- package/cli/cli-error.d.ts +5 -0
- package/cli/cli-error.js +10 -0
- package/cli/cli-error.js.map +1 -0
- package/cli/cli-util.d.ts +21 -0
- package/cli/cli-util.js +211 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/config.d.ts +10 -0
- package/cli/config.js +62 -0
- package/cli/config.js.map +1 -0
- package/cli/index.d.ts +7 -0
- package/cli/index.js +128 -0
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +24 -0
- package/cli/plugin-runner.js +229 -0
- package/cli/plugin-runner.js.map +1 -0
- package/constants.d.ts +1 -0
- package/constants.js +6 -0
- package/constants.js.map +1 -0
- package/language-server/constants.d.ts +22 -0
- package/language-server/constants.js +27 -0
- package/language-server/constants.js.map +1 -0
- package/language-server/main.d.ts +1 -0
- package/language-server/main.js +13 -0
- package/language-server/main.js.map +1 -0
- package/language-server/types.d.ts +10 -0
- package/language-server/types.js +3 -0
- package/language-server/types.js.map +1 -0
- package/language-server/utils.d.ts +5 -0
- package/language-server/utils.js +22 -0
- package/language-server/utils.js.map +1 -0
- package/language-server/validator/attribute-application-validator.d.ts +15 -0
- package/language-server/validator/attribute-application-validator.js +246 -0
- package/language-server/validator/attribute-application-validator.js.map +1 -0
- package/language-server/validator/attribute-validator.d.ts +9 -0
- package/language-server/validator/attribute-validator.js +14 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +22 -0
- package/language-server/validator/datamodel-validator.js +329 -0
- package/language-server/validator/datamodel-validator.js.map +1 -0
- package/language-server/validator/datasource-validator.d.ts +12 -0
- package/language-server/validator/datasource-validator.js +66 -0
- package/language-server/validator/datasource-validator.js.map +1 -0
- package/language-server/validator/enum-validator.d.ts +11 -0
- package/language-server/validator/enum-validator.js +25 -0
- package/language-server/validator/enum-validator.js.map +1 -0
- package/language-server/validator/expression-validator.d.ts +10 -0
- package/language-server/validator/expression-validator.js +135 -0
- package/language-server/validator/expression-validator.js.map +1 -0
- package/language-server/validator/function-decl-validator.d.ts +9 -0
- package/language-server/validator/function-decl-validator.js +13 -0
- package/language-server/validator/function-decl-validator.js.map +1 -0
- package/language-server/validator/function-invocation-validator.d.ts +11 -0
- package/language-server/validator/function-invocation-validator.js +135 -0
- package/language-server/validator/function-invocation-validator.js.map +1 -0
- package/language-server/validator/schema-validator.d.ts +13 -0
- package/language-server/validator/schema-validator.js +49 -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 +154 -0
- package/language-server/validator/utils.js.map +1 -0
- package/language-server/validator/zmodel-validator.d.ts +25 -0
- package/language-server/validator/zmodel-validator.js +83 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-code-action.d.ts +15 -0
- package/language-server/zmodel-code-action.js +118 -0
- package/language-server/zmodel-code-action.js.map +1 -0
- package/language-server/zmodel-definition.d.ts +7 -0
- package/language-server/zmodel-definition.js +31 -0
- package/language-server/zmodel-definition.js.map +1 -0
- package/language-server/zmodel-formatter.d.ts +9 -0
- package/language-server/zmodel-formatter.js +76 -0
- package/language-server/zmodel-formatter.js.map +1 -0
- package/language-server/zmodel-linker.d.ts +32 -0
- package/language-server/zmodel-linker.js +447 -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 +16 -0
- package/language-server/zmodel-scope.js +100 -0
- package/language-server/zmodel-scope.js.map +1 -0
- package/language-server/zmodel-workspace-manager.d.ts +12 -0
- package/language-server/zmodel-workspace-manager.js +138 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +140 -8
- package/plugins/access-policy/expression-writer.d.ts +46 -0
- package/plugins/access-policy/expression-writer.js +580 -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 +22 -0
- package/plugins/access-policy/index.js.map +1 -0
- package/plugins/access-policy/policy-guard-generator.d.ts +22 -0
- package/plugins/access-policy/policy-guard-generator.js +634 -0
- package/plugins/access-policy/policy-guard-generator.js.map +1 -0
- package/plugins/model-meta/index.d.ts +4 -0
- package/plugins/model-meta/index.js +232 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +17 -0
- package/plugins/plugin-utils.js +80 -0
- package/plugins/plugin-utils.js.map +1 -0
- package/plugins/prisma/indent-string.d.ts +4 -0
- package/plugins/prisma/indent-string.js +12 -0
- package/plugins/prisma/indent-string.js.map +1 -0
- package/plugins/prisma/index.d.ts +4 -0
- package/plugins/prisma/index.js +22 -0
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +145 -0
- package/plugins/prisma/prisma-builder.js +358 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +29 -0
- package/plugins/prisma/schema-generator.js +336 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/prisma/zmodel-code-generator.d.ts +30 -0
- package/plugins/prisma/zmodel-code-generator.js +124 -0
- package/plugins/prisma/zmodel-code-generator.js.map +1 -0
- package/plugins/zod/generator.d.ts +4 -0
- package/plugins/zod/generator.js +254 -0
- package/plugins/zod/generator.js.map +1 -0
- package/plugins/zod/index.d.ts +4 -0
- package/plugins/zod/index.js +24 -0
- package/plugins/zod/index.js.map +1 -0
- package/plugins/zod/transformer.d.ts +68 -0
- package/plugins/zod/transformer.js +554 -0
- package/plugins/zod/transformer.js.map +1 -0
- package/plugins/zod/types.d.ts +25 -0
- package/plugins/zod/types.js +3 -0
- package/plugins/zod/types.js.map +1 -0
- package/plugins/zod/utils/removeDir.d.ts +1 -0
- package/plugins/zod/utils/removeDir.js +30 -0
- package/plugins/zod/utils/removeDir.js.map +1 -0
- package/plugins/zod/utils/schema-gen.d.ts +3 -0
- package/plugins/zod/utils/schema-gen.js +188 -0
- package/plugins/zod/utils/schema-gen.js.map +1 -0
- package/res/prism-zmodel.js +20 -0
- package/res/starter.zmodel +51 -0
- package/res/stdlib.zmodel +506 -0
- package/telemetry.d.ts +21 -0
- package/telemetry.js +129 -0
- package/telemetry.js.map +1 -0
- package/utils/ast-utils.d.ts +13 -0
- package/utils/ast-utils.js +136 -0
- package/utils/ast-utils.js.map +1 -0
- package/utils/exec-utils.d.ts +6 -0
- package/utils/exec-utils.js +13 -0
- package/utils/exec-utils.js.map +1 -0
- package/utils/pkg-utils.d.ts +3 -0
- package/utils/pkg-utils.js +64 -0
- package/utils/pkg-utils.js.map +1 -0
- package/utils/typescript-expression-transformer.d.ts +54 -0
- package/utils/typescript-expression-transformer.js +326 -0
- package/utils/typescript-expression-transformer.js.map +1 -0
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +20 -0
- package/utils/version-utils.js.map +1 -0
- package/.vscode/extensions.json +0 -7
- package/.vscode/launch.json +0 -49
- package/.vscode/settings.json +0 -4
- package/packages/internal/jest.config.ts +0 -32
- package/packages/internal/package.json +0 -42
- package/packages/internal/src/constants.ts +0 -1
- package/packages/internal/src/handler/data/guard-utils.ts +0 -7
- package/packages/internal/src/handler/data/handler.ts +0 -415
- package/packages/internal/src/handler/data/query-processor.ts +0 -504
- package/packages/internal/src/handler/index.ts +0 -1
- package/packages/internal/src/handler/types.ts +0 -20
- package/packages/internal/src/index.ts +0 -3
- package/packages/internal/src/request-handler.ts +0 -27
- package/packages/internal/src/request.ts +0 -101
- package/packages/internal/src/types.ts +0 -40
- package/packages/internal/tests/query-processor.test.ts +0 -172
- package/packages/internal/tsconfig.json +0 -21
- package/packages/runtime/auth.d.ts +0 -1
- package/packages/runtime/auth.js +0 -3
- package/packages/runtime/hooks.d.ts +0 -10
- package/packages/runtime/hooks.js +0 -3
- package/packages/runtime/index.d.ts +0 -3
- package/packages/runtime/index.js +0 -1
- package/packages/runtime/package-lock.json +0 -512
- package/packages/runtime/package.json +0 -16
- package/packages/runtime/server.d.ts +0 -1
- package/packages/runtime/server.js +0 -3
- package/packages/runtime/types.d.ts +0 -1
- package/packages/runtime/types.js +0 -3
- package/packages/schema/.eslintrc.json +0 -13
- package/packages/schema/.vscodeignore +0 -4
- package/packages/schema/asset/logo-dark.png +0 -0
- package/packages/schema/asset/logo-light.png +0 -0
- package/packages/schema/bin/cli +0 -3
- package/packages/schema/jest.config.ts +0 -32
- package/packages/schema/langium-config.json +0 -14
- package/packages/schema/langium-quickstart.md +0 -41
- package/packages/schema/language-configuration.json +0 -30
- package/packages/schema/package.json +0 -96
- package/packages/schema/src/cli/cli-util.ts +0 -80
- package/packages/schema/src/cli/index.ts +0 -64
- package/packages/schema/src/extension.ts +0 -76
- package/packages/schema/src/generator/constants.ts +0 -5
- package/packages/schema/src/generator/index.ts +0 -92
- package/packages/schema/src/generator/next-auth/index.ts +0 -197
- package/packages/schema/src/generator/package.template.json +0 -9
- package/packages/schema/src/generator/prisma/expression-writer.ts +0 -352
- package/packages/schema/src/generator/prisma/index.ts +0 -32
- package/packages/schema/src/generator/prisma/plain-expression-builder.ts +0 -91
- package/packages/schema/src/generator/prisma/prisma-builder.ts +0 -366
- package/packages/schema/src/generator/prisma/query-gard-generator.ts +0 -208
- package/packages/schema/src/generator/prisma/schema-generator.ts +0 -300
- package/packages/schema/src/generator/react-hooks/index.ts +0 -181
- package/packages/schema/src/generator/service/index.ts +0 -107
- package/packages/schema/src/generator/tsconfig.template.json +0 -17
- package/packages/schema/src/generator/types.ts +0 -17
- package/packages/schema/src/generator/utils.ts +0 -9
- package/packages/schema/src/language-server/generated/ast.ts +0 -603
- package/packages/schema/src/language-server/generated/grammar.ts +0 -2190
- package/packages/schema/src/language-server/generated/module.ts +0 -24
- package/packages/schema/src/language-server/main.ts +0 -12
- package/packages/schema/src/language-server/stdlib.zmodel +0 -22
- package/packages/schema/src/language-server/types.ts +0 -9
- package/packages/schema/src/language-server/zmodel-index.ts +0 -33
- package/packages/schema/src/language-server/zmodel-linker.ts +0 -409
- package/packages/schema/src/language-server/zmodel-module.ts +0 -90
- package/packages/schema/src/language-server/zmodel-scope.ts +0 -21
- package/packages/schema/src/language-server/zmodel-validator.ts +0 -35
- package/packages/schema/src/language-server/zmodel.langium +0 -186
- package/packages/schema/src/utils/exec-utils.ts +0 -5
- package/packages/schema/src/utils/indent-string.ts +0 -6
- package/packages/schema/syntaxes/zmodel.json +0 -57
- package/packages/schema/syntaxes/zmodel.tmLanguage.json +0 -57
- package/packages/schema/tests/generator/expression-writer.test.ts +0 -676
- package/packages/schema/tests/generator/prisma-builder.test.ts +0 -138
- package/packages/schema/tests/schema/parser.test.ts +0 -423
- package/packages/schema/tests/schema/sample-todo.test.ts +0 -14
- package/packages/schema/tests/utils.ts +0 -38
- package/packages/schema/tsconfig.json +0 -23
- package/pnpm-workspace.yaml +0 -3
- package/samples/todo/.env +0 -2
- package/samples/todo/.eslintrc.json +0 -3
- package/samples/todo/.vscode/launch.json +0 -11
- package/samples/todo/README.md +0 -34
- package/samples/todo/components/AuthGuard.tsx +0 -17
- package/samples/todo/components/Avatar.tsx +0 -22
- package/samples/todo/components/BreadCrumb.tsx +0 -44
- package/samples/todo/components/ManageMembers.tsx +0 -134
- package/samples/todo/components/NavBar.tsx +0 -57
- package/samples/todo/components/SpaceMembers.tsx +0 -76
- package/samples/todo/components/Spaces.tsx +0 -28
- package/samples/todo/components/TimeInfo.tsx +0 -17
- package/samples/todo/components/Todo.tsx +0 -72
- package/samples/todo/components/TodoList.tsx +0 -77
- package/samples/todo/lib/context.ts +0 -31
- package/samples/todo/next.config.js +0 -10
- package/samples/todo/package-lock.json +0 -7527
- package/samples/todo/package.json +0 -45
- package/samples/todo/pages/_app.tsx +0 -50
- package/samples/todo/pages/api/auth/[...nextauth].ts +0 -83
- package/samples/todo/pages/api/zenstack/[...path].ts +0 -16
- package/samples/todo/pages/create-space.tsx +0 -114
- package/samples/todo/pages/index.tsx +0 -32
- package/samples/todo/pages/space/[slug]/[listId]/index.tsx +0 -88
- package/samples/todo/pages/space/[slug]/index.tsx +0 -169
- package/samples/todo/postcss.config.js +0 -6
- package/samples/todo/public/avatar.jpg +0 -0
- package/samples/todo/public/favicon.ico +0 -0
- package/samples/todo/public/logo.png +0 -0
- package/samples/todo/public/vercel.svg +0 -4
- package/samples/todo/styles/globals.css +0 -7
- package/samples/todo/tailwind.config.js +0 -11
- package/samples/todo/tsconfig.json +0 -28
- package/samples/todo/types/next-auth.d.ts +0 -14
- package/samples/todo/types/next.d.ts +0 -16
- package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +0 -153
- package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +0 -23
- package/samples/todo/zenstack/migrations/migration_lock.toml +0 -3
- package/samples/todo/zenstack/schema.prisma +0 -126
- package/samples/todo/zenstack/schema.zmodel +0 -161
- package/tests/integration/jest.config.ts +0 -16
- package/tests/integration/package-lock.json +0 -1081
- package/tests/integration/package.json +0 -27
- package/tests/integration/tests/operation-coverate.test.ts +0 -563
- package/tests/integration/tests/operations.zmodel +0 -69
- package/tests/integration/tests/todo-e2e.test.ts +0 -577
- package/tests/integration/tests/todo.zmodel +0 -123
- package/tests/integration/tests/tsconfig.template.json +0 -10
- package/tests/integration/tests/utils.ts +0 -133
- package/tests/integration/tsconfig.json +0 -10
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/******************************************************************************
|
|
2
|
-
* This file was generated by langium-cli 0.4.0.
|
|
3
|
-
* DO NOT EDIT MANUALLY!
|
|
4
|
-
******************************************************************************/
|
|
5
|
-
|
|
6
|
-
import { LangiumGeneratedServices, LangiumGeneratedSharedServices, LangiumSharedServices, LangiumServices, LanguageMetaData, Module } from 'langium';
|
|
7
|
-
import { ZModelAstReflection } from './ast';
|
|
8
|
-
import { ZModelGrammar } from './grammar';
|
|
9
|
-
|
|
10
|
-
export const ZModelLanguageMetaData: LanguageMetaData = {
|
|
11
|
-
languageId: 'zmodel',
|
|
12
|
-
fileExtensions: ['.zmodel'],
|
|
13
|
-
caseInsensitive: false
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const ZModelGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedServices> = {
|
|
17
|
-
AstReflection: () => new ZModelAstReflection()
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export const ZModelGeneratedModule: Module<LangiumServices, LangiumGeneratedServices> = {
|
|
21
|
-
Grammar: () => ZModelGrammar(),
|
|
22
|
-
LanguageMetaData: () => ZModelLanguageMetaData,
|
|
23
|
-
parser: {}
|
|
24
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { startLanguageServer } from 'langium';
|
|
2
|
-
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';
|
|
3
|
-
import { createZModelServices } from './zmodel-module';
|
|
4
|
-
|
|
5
|
-
// Create a connection to the client
|
|
6
|
-
const connection = createConnection(ProposedFeatures.all);
|
|
7
|
-
|
|
8
|
-
// Inject the shared services and language-specific services
|
|
9
|
-
const { shared } = createZModelServices({ connection });
|
|
10
|
-
|
|
11
|
-
// Start the language server with the shared services
|
|
12
|
-
startLanguageServer(shared);
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
enum ReferentialIntegrity {
|
|
2
|
-
Cascade
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
function env() String {}
|
|
6
|
-
function auth() User {}
|
|
7
|
-
function now() DateTime {}
|
|
8
|
-
function uuid() String {}
|
|
9
|
-
function cuid() String {}
|
|
10
|
-
function autoincrement() Int {}
|
|
11
|
-
|
|
12
|
-
attribute id()
|
|
13
|
-
attribute index()
|
|
14
|
-
attribute relation()
|
|
15
|
-
attribute default()
|
|
16
|
-
attribute updatedAt()
|
|
17
|
-
attribute unique()
|
|
18
|
-
attribute allow()
|
|
19
|
-
attribute deny()
|
|
20
|
-
attribute email()
|
|
21
|
-
attribute url()
|
|
22
|
-
attribute length()
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AstNodeDescription,
|
|
3
|
-
DefaultAstNodeDescriptionProvider,
|
|
4
|
-
interruptAndCheck,
|
|
5
|
-
LangiumDocument,
|
|
6
|
-
LangiumServices,
|
|
7
|
-
streamAllContents,
|
|
8
|
-
} from 'langium';
|
|
9
|
-
import { CancellationToken } from 'vscode-languageserver';
|
|
10
|
-
import { isEnumField } from './generated/ast';
|
|
11
|
-
|
|
12
|
-
export class ZModelDescriptionProvider extends DefaultAstNodeDescriptionProvider {
|
|
13
|
-
constructor(services: LangiumServices) {
|
|
14
|
-
super(services);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
async createDescriptions(
|
|
18
|
-
document: LangiumDocument,
|
|
19
|
-
cancelToken = CancellationToken.None
|
|
20
|
-
): Promise<AstNodeDescription[]> {
|
|
21
|
-
const descr = await super.createDescriptions(document, cancelToken);
|
|
22
|
-
// add enum fields so they can be globally resolved across modules
|
|
23
|
-
for (const node of streamAllContents(document.parseResult.value)) {
|
|
24
|
-
await interruptAndCheck(cancelToken);
|
|
25
|
-
if (isEnumField(node)) {
|
|
26
|
-
await descr.push(
|
|
27
|
-
this.createDescription(node, node.name, document)
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return descr;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,409 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AstNode,
|
|
3
|
-
AstNodeDescription,
|
|
4
|
-
AstNodeDescriptionProvider,
|
|
5
|
-
DefaultLinker,
|
|
6
|
-
DocumentState,
|
|
7
|
-
interruptAndCheck,
|
|
8
|
-
isReference,
|
|
9
|
-
LangiumDocument,
|
|
10
|
-
LangiumServices,
|
|
11
|
-
LinkingError,
|
|
12
|
-
Reference,
|
|
13
|
-
streamContents,
|
|
14
|
-
} from 'langium';
|
|
15
|
-
import { CancellationToken } from 'vscode-jsonrpc';
|
|
16
|
-
import {
|
|
17
|
-
AbstractDeclaration,
|
|
18
|
-
isDataModel,
|
|
19
|
-
Function,
|
|
20
|
-
FunctionParamType,
|
|
21
|
-
DataModelFieldType,
|
|
22
|
-
ReferenceTarget,
|
|
23
|
-
MemberAccessExpr,
|
|
24
|
-
DataModel,
|
|
25
|
-
LiteralExpr,
|
|
26
|
-
InvocationExpr,
|
|
27
|
-
ArrayExpr,
|
|
28
|
-
ReferenceExpr,
|
|
29
|
-
UnaryExpr,
|
|
30
|
-
BinaryExpr,
|
|
31
|
-
EnumField,
|
|
32
|
-
DataModelField,
|
|
33
|
-
FunctionParam,
|
|
34
|
-
ThisExpr,
|
|
35
|
-
NullExpr,
|
|
36
|
-
} from './generated/ast';
|
|
37
|
-
import { TypedNode } from './types';
|
|
38
|
-
|
|
39
|
-
interface DefaultReference extends Reference {
|
|
40
|
-
_ref?: AstNode | LinkingError;
|
|
41
|
-
_nodeDescription?: AstNodeDescription;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
type ScopeProvider = (name: string) => ReferenceTarget | undefined;
|
|
45
|
-
|
|
46
|
-
export class ZModelLinker extends DefaultLinker {
|
|
47
|
-
private readonly descriptions: AstNodeDescriptionProvider;
|
|
48
|
-
|
|
49
|
-
constructor(services: LangiumServices) {
|
|
50
|
-
super(services);
|
|
51
|
-
this.descriptions = services.workspace.AstNodeDescriptionProvider;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async link(
|
|
55
|
-
document: LangiumDocument,
|
|
56
|
-
cancelToken = CancellationToken.None
|
|
57
|
-
): Promise<void> {
|
|
58
|
-
if (
|
|
59
|
-
document.parseResult.lexerErrors?.length > 0 ||
|
|
60
|
-
document.parseResult.parserErrors?.length > 0
|
|
61
|
-
) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
for (const node of streamContents(document.parseResult.value)) {
|
|
66
|
-
await interruptAndCheck(cancelToken);
|
|
67
|
-
this.resolve(node, document);
|
|
68
|
-
}
|
|
69
|
-
document.state = DocumentState.Linked;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
linkReference(
|
|
73
|
-
container: AstNode,
|
|
74
|
-
property: string,
|
|
75
|
-
document: LangiumDocument,
|
|
76
|
-
extraScopes: ScopeProvider[]
|
|
77
|
-
) {
|
|
78
|
-
if (
|
|
79
|
-
!this.resolveFromScopeProviders(
|
|
80
|
-
container,
|
|
81
|
-
property,
|
|
82
|
-
document,
|
|
83
|
-
extraScopes
|
|
84
|
-
)
|
|
85
|
-
) {
|
|
86
|
-
const reference: Reference<AstNode> = (container as any)[property];
|
|
87
|
-
this.doLink({ reference, container, property }, document);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
resolveFromScopeProviders(
|
|
92
|
-
node: AstNode,
|
|
93
|
-
property: string,
|
|
94
|
-
document: LangiumDocument,
|
|
95
|
-
providers: ScopeProvider[]
|
|
96
|
-
) {
|
|
97
|
-
const reference: DefaultReference = (node as any)[property];
|
|
98
|
-
for (const provider of providers) {
|
|
99
|
-
const target = provider(reference.$refText);
|
|
100
|
-
if (target) {
|
|
101
|
-
reference._ref = target;
|
|
102
|
-
reference._nodeDescription =
|
|
103
|
-
this.descriptions.createDescription(
|
|
104
|
-
target,
|
|
105
|
-
target.name,
|
|
106
|
-
document
|
|
107
|
-
);
|
|
108
|
-
return target;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
resolve(
|
|
115
|
-
node: AstNode,
|
|
116
|
-
document: LangiumDocument,
|
|
117
|
-
extraScopes: ScopeProvider[] = []
|
|
118
|
-
) {
|
|
119
|
-
switch (node.$type) {
|
|
120
|
-
case LiteralExpr:
|
|
121
|
-
this.resolveLiteral(node as LiteralExpr);
|
|
122
|
-
break;
|
|
123
|
-
|
|
124
|
-
case InvocationExpr:
|
|
125
|
-
this.resolveInvocation(
|
|
126
|
-
node as InvocationExpr,
|
|
127
|
-
document,
|
|
128
|
-
extraScopes
|
|
129
|
-
);
|
|
130
|
-
break;
|
|
131
|
-
|
|
132
|
-
case ArrayExpr:
|
|
133
|
-
this.resolveArray(node as ArrayExpr, document, extraScopes);
|
|
134
|
-
break;
|
|
135
|
-
|
|
136
|
-
case ReferenceExpr:
|
|
137
|
-
this.resolveReference(
|
|
138
|
-
node as ReferenceExpr,
|
|
139
|
-
document,
|
|
140
|
-
extraScopes
|
|
141
|
-
);
|
|
142
|
-
break;
|
|
143
|
-
|
|
144
|
-
case MemberAccessExpr:
|
|
145
|
-
this.resolveMemberAccess(
|
|
146
|
-
node as MemberAccessExpr,
|
|
147
|
-
document,
|
|
148
|
-
extraScopes
|
|
149
|
-
);
|
|
150
|
-
break;
|
|
151
|
-
|
|
152
|
-
case UnaryExpr:
|
|
153
|
-
this.resolveUnary(node as UnaryExpr, document, extraScopes);
|
|
154
|
-
break;
|
|
155
|
-
|
|
156
|
-
case BinaryExpr:
|
|
157
|
-
this.resolveBinary(node as BinaryExpr, document, extraScopes);
|
|
158
|
-
break;
|
|
159
|
-
|
|
160
|
-
case ThisExpr:
|
|
161
|
-
this.resolveThis(node as ThisExpr, document, extraScopes);
|
|
162
|
-
break;
|
|
163
|
-
|
|
164
|
-
case NullExpr:
|
|
165
|
-
this.resolveNull(node as NullExpr, document, extraScopes);
|
|
166
|
-
break;
|
|
167
|
-
|
|
168
|
-
default:
|
|
169
|
-
this.resolveDefault(node, document, extraScopes);
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
resolveBinary(
|
|
175
|
-
node: BinaryExpr,
|
|
176
|
-
document: LangiumDocument<AstNode>,
|
|
177
|
-
extraScopes: ScopeProvider[]
|
|
178
|
-
) {
|
|
179
|
-
switch (node.operator) {
|
|
180
|
-
// TODO: support arithmetics?
|
|
181
|
-
// case '+':
|
|
182
|
-
// case '-':
|
|
183
|
-
// case '*':
|
|
184
|
-
// case '/':
|
|
185
|
-
// this.resolve(node.left, document, extraScopes);
|
|
186
|
-
// this.resolve(node.right, document, extraScopes);
|
|
187
|
-
// this.resolveToBuiltinTypeOrDecl(node, 'Int');
|
|
188
|
-
// break;
|
|
189
|
-
|
|
190
|
-
case '>':
|
|
191
|
-
case '>=':
|
|
192
|
-
case '<':
|
|
193
|
-
case '<=':
|
|
194
|
-
case '==':
|
|
195
|
-
case '!=':
|
|
196
|
-
case '&&':
|
|
197
|
-
case '||':
|
|
198
|
-
this.resolve(node.left, document, extraScopes);
|
|
199
|
-
this.resolve(node.right, document, extraScopes);
|
|
200
|
-
this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
|
|
201
|
-
break;
|
|
202
|
-
|
|
203
|
-
case '?':
|
|
204
|
-
case '!':
|
|
205
|
-
case '^':
|
|
206
|
-
this.resolveCollectionPredicate(node, document, extraScopes);
|
|
207
|
-
break;
|
|
208
|
-
|
|
209
|
-
default:
|
|
210
|
-
throw Error(`Unsupported binary operator: ${node.operator}`);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
resolveUnary(
|
|
215
|
-
node: UnaryExpr,
|
|
216
|
-
document: LangiumDocument<AstNode>,
|
|
217
|
-
extraScopes: ScopeProvider[]
|
|
218
|
-
) {
|
|
219
|
-
this.resolve(node.operand, document, extraScopes);
|
|
220
|
-
(node as TypedNode).$resolvedType = (
|
|
221
|
-
node.operand as TypedNode
|
|
222
|
-
).$resolvedType;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
resolveReference(
|
|
226
|
-
node: ReferenceExpr,
|
|
227
|
-
document: LangiumDocument<AstNode>,
|
|
228
|
-
extraScopes: ScopeProvider[]
|
|
229
|
-
) {
|
|
230
|
-
this.linkReference(node, 'target', document, extraScopes);
|
|
231
|
-
node.args.forEach((arg) => this.resolve(arg, document, extraScopes));
|
|
232
|
-
|
|
233
|
-
if (node.target.ref) {
|
|
234
|
-
// resolve type
|
|
235
|
-
if (node.target.ref.$type === EnumField) {
|
|
236
|
-
this.resolveToBuiltinTypeOrDecl(
|
|
237
|
-
node,
|
|
238
|
-
node.target.ref.$container
|
|
239
|
-
);
|
|
240
|
-
} else {
|
|
241
|
-
this.resolveToDeclaredType(
|
|
242
|
-
node,
|
|
243
|
-
(node.target.ref as DataModelField | FunctionParam).type
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
resolveArray(
|
|
250
|
-
node: ArrayExpr,
|
|
251
|
-
document: LangiumDocument<AstNode>,
|
|
252
|
-
extraScopes: ScopeProvider[]
|
|
253
|
-
) {
|
|
254
|
-
node.items.forEach((item) => this.resolve(item, document, extraScopes));
|
|
255
|
-
|
|
256
|
-
const itemType = (node.items[0] as TypedNode).$resolvedType;
|
|
257
|
-
if (itemType?.decl) {
|
|
258
|
-
this.resolveToBuiltinTypeOrDecl(node, itemType.decl, true);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
resolveInvocation(
|
|
263
|
-
node: InvocationExpr,
|
|
264
|
-
document: LangiumDocument,
|
|
265
|
-
extraScopes: ScopeProvider[]
|
|
266
|
-
) {
|
|
267
|
-
this.linkReference(node, 'function', document, extraScopes);
|
|
268
|
-
node.args.forEach((arg) => this.resolve(arg, document, extraScopes));
|
|
269
|
-
const funcDecl = node.function.ref as Function;
|
|
270
|
-
this.resolveToDeclaredType(node, funcDecl.returnType);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
resolveLiteral(node: LiteralExpr) {
|
|
274
|
-
const type =
|
|
275
|
-
typeof node.value === 'string'
|
|
276
|
-
? 'String'
|
|
277
|
-
: typeof node.value === 'boolean'
|
|
278
|
-
? 'Boolean'
|
|
279
|
-
: typeof node.value === 'number'
|
|
280
|
-
? 'Int'
|
|
281
|
-
: undefined;
|
|
282
|
-
|
|
283
|
-
if (type) {
|
|
284
|
-
this.resolveToBuiltinTypeOrDecl(node, type);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
resolveMemberAccess(
|
|
289
|
-
node: MemberAccessExpr,
|
|
290
|
-
document: LangiumDocument<AstNode>,
|
|
291
|
-
extraScopes: ScopeProvider[]
|
|
292
|
-
) {
|
|
293
|
-
this.resolve(node.operand, document, extraScopes);
|
|
294
|
-
const operandResolved = (node.operand as TypedNode).$resolvedType;
|
|
295
|
-
|
|
296
|
-
if (
|
|
297
|
-
operandResolved &&
|
|
298
|
-
!operandResolved.array &&
|
|
299
|
-
isDataModel(operandResolved.decl)
|
|
300
|
-
) {
|
|
301
|
-
const modelDecl = operandResolved.decl as DataModel;
|
|
302
|
-
const provider = (name: string) =>
|
|
303
|
-
modelDecl.fields.find((f) => f.name === name);
|
|
304
|
-
extraScopes = [provider, ...extraScopes];
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
this.linkReference(node, 'member', document, extraScopes);
|
|
308
|
-
if (node.member.ref) {
|
|
309
|
-
this.resolveToDeclaredType(node, node.member.ref.type);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
resolveCollectionPredicate(
|
|
314
|
-
node: BinaryExpr,
|
|
315
|
-
document: LangiumDocument,
|
|
316
|
-
extraScopes: ScopeProvider[]
|
|
317
|
-
) {
|
|
318
|
-
this.resolve(node.left, document, extraScopes);
|
|
319
|
-
|
|
320
|
-
const resolvedType = this.getResolvedType(node.left);
|
|
321
|
-
if (
|
|
322
|
-
resolvedType &&
|
|
323
|
-
isDataModel(resolvedType.decl) &&
|
|
324
|
-
resolvedType.array
|
|
325
|
-
) {
|
|
326
|
-
const dataModelDecl = resolvedType.decl;
|
|
327
|
-
const provider = (name: string) =>
|
|
328
|
-
dataModelDecl.fields.find((f) => f.name === name);
|
|
329
|
-
extraScopes = [provider, ...extraScopes];
|
|
330
|
-
this.resolve(node.right, document, extraScopes);
|
|
331
|
-
this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
|
|
332
|
-
} else {
|
|
333
|
-
// TODO: how to attach type-checking error?
|
|
334
|
-
throw new Error(`Unresolved collection predicate`);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
resolveThis(
|
|
339
|
-
node: ThisExpr,
|
|
340
|
-
document: LangiumDocument<AstNode>,
|
|
341
|
-
extraScopes: ScopeProvider[]
|
|
342
|
-
) {
|
|
343
|
-
let decl: AstNode | undefined = node.$container;
|
|
344
|
-
|
|
345
|
-
while (decl && !isDataModel(decl)) {
|
|
346
|
-
decl = decl.$container;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (decl) {
|
|
350
|
-
this.resolveToBuiltinTypeOrDecl(node, decl);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
resolveNull(
|
|
355
|
-
node: NullExpr,
|
|
356
|
-
document: LangiumDocument<AstNode>,
|
|
357
|
-
extraScopes: ScopeProvider[]
|
|
358
|
-
) {
|
|
359
|
-
// TODO: how to really resolve null?
|
|
360
|
-
this.resolveToBuiltinTypeOrDecl(node, 'Null');
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
resolveDefault(
|
|
364
|
-
node: AstNode,
|
|
365
|
-
document: LangiumDocument<AstNode>,
|
|
366
|
-
extraScopes: ScopeProvider[]
|
|
367
|
-
) {
|
|
368
|
-
for (const property of Object.keys(node)) {
|
|
369
|
-
if (!property.startsWith('$')) {
|
|
370
|
-
const value = (node as any)[property];
|
|
371
|
-
if (isReference(value)) {
|
|
372
|
-
this.linkReference(node, property, document, extraScopes);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
for (const child of streamContents(node)) {
|
|
377
|
-
this.resolve(child, document, extraScopes);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// utils
|
|
382
|
-
|
|
383
|
-
getResolvedType(node: AstNode) {
|
|
384
|
-
return (node as TypedNode).$resolvedType;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
resolveToDeclaredType(
|
|
388
|
-
node: AstNode,
|
|
389
|
-
type: FunctionParamType | DataModelFieldType
|
|
390
|
-
) {
|
|
391
|
-
const _node: TypedNode = node;
|
|
392
|
-
if (type.type) {
|
|
393
|
-
_node.$resolvedType = { decl: type.type, array: type.array };
|
|
394
|
-
} else if (type.reference) {
|
|
395
|
-
_node.$resolvedType = {
|
|
396
|
-
decl: type.reference.ref,
|
|
397
|
-
array: type.array,
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
resolveToBuiltinTypeOrDecl(
|
|
403
|
-
node: AstNode,
|
|
404
|
-
type: string | AbstractDeclaration,
|
|
405
|
-
array = false
|
|
406
|
-
) {
|
|
407
|
-
(node as TypedNode).$resolvedType = { decl: type, array };
|
|
408
|
-
}
|
|
409
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createDefaultModule,
|
|
3
|
-
createDefaultSharedModule,
|
|
4
|
-
DefaultSharedModuleContext,
|
|
5
|
-
inject,
|
|
6
|
-
LangiumServices,
|
|
7
|
-
LangiumSharedServices,
|
|
8
|
-
Module,
|
|
9
|
-
PartialLangiumServices,
|
|
10
|
-
} from 'langium';
|
|
11
|
-
import {
|
|
12
|
-
ZModelGeneratedModule,
|
|
13
|
-
ZModelGeneratedSharedModule,
|
|
14
|
-
} from './generated/module';
|
|
15
|
-
import { ZModelDescriptionProvider } from './zmodel-index';
|
|
16
|
-
import { ZModelLinker } from './zmodel-linker';
|
|
17
|
-
import { ZModelScopeComputation } from './zmodel-scope';
|
|
18
|
-
import { ZModelValidationRegistry, ZModelValidator } from './zmodel-validator';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Declaration of custom services - add your own service classes here.
|
|
22
|
-
*/
|
|
23
|
-
export type ZModelAddedServices = {
|
|
24
|
-
validation: {
|
|
25
|
-
ZModelValidator: ZModelValidator;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Union of Langium default services and your custom services - use this as constructor parameter
|
|
31
|
-
* of custom service classes.
|
|
32
|
-
*/
|
|
33
|
-
export type ZModelServices = LangiumServices & ZModelAddedServices;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Dependency injection module that overrides Langium default services and contributes the
|
|
37
|
-
* declared custom services. The Langium defaults can be partially specified to override only
|
|
38
|
-
* selected services, while the custom services must be fully specified.
|
|
39
|
-
*/
|
|
40
|
-
export const ZModelModule: Module<
|
|
41
|
-
ZModelServices,
|
|
42
|
-
PartialLangiumServices & ZModelAddedServices
|
|
43
|
-
> = {
|
|
44
|
-
references: {
|
|
45
|
-
ScopeComputation: (services) => new ZModelScopeComputation(services),
|
|
46
|
-
Linker: (services) => new ZModelLinker(services),
|
|
47
|
-
// NameProvider: () => new ZModelNameProvider(),
|
|
48
|
-
},
|
|
49
|
-
validation: {
|
|
50
|
-
ValidationRegistry: (services) =>
|
|
51
|
-
new ZModelValidationRegistry(services),
|
|
52
|
-
ZModelValidator: () => new ZModelValidator(),
|
|
53
|
-
},
|
|
54
|
-
workspace: {
|
|
55
|
-
AstNodeDescriptionProvider: (services) =>
|
|
56
|
-
new ZModelDescriptionProvider(services),
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Create the full set of services required by Langium.
|
|
62
|
-
*
|
|
63
|
-
* First inject the shared services by merging two modules:
|
|
64
|
-
* - Langium default shared services
|
|
65
|
-
* - Services generated by langium-cli
|
|
66
|
-
*
|
|
67
|
-
* Then inject the language-specific services by merging three modules:
|
|
68
|
-
* - Langium default language-specific services
|
|
69
|
-
* - Services generated by langium-cli
|
|
70
|
-
* - Services specified in this file
|
|
71
|
-
*
|
|
72
|
-
* @param context Optional module context with the LSP connection
|
|
73
|
-
* @returns An object wrapping the shared services and the language-specific services
|
|
74
|
-
*/
|
|
75
|
-
export function createZModelServices(context?: DefaultSharedModuleContext): {
|
|
76
|
-
shared: LangiumSharedServices;
|
|
77
|
-
ZModel: ZModelServices;
|
|
78
|
-
} {
|
|
79
|
-
const shared = inject(
|
|
80
|
-
createDefaultSharedModule(context),
|
|
81
|
-
ZModelGeneratedSharedModule
|
|
82
|
-
);
|
|
83
|
-
const ZModel = inject(
|
|
84
|
-
createDefaultModule({ shared }),
|
|
85
|
-
ZModelGeneratedModule,
|
|
86
|
-
ZModelModule
|
|
87
|
-
);
|
|
88
|
-
shared.ServiceRegistry.register(ZModel);
|
|
89
|
-
return { shared, ZModel };
|
|
90
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DefaultScopeComputation,
|
|
3
|
-
LangiumDocument,
|
|
4
|
-
LangiumServices,
|
|
5
|
-
PrecomputedScopes,
|
|
6
|
-
} from 'langium';
|
|
7
|
-
import { CancellationToken } from 'vscode-jsonrpc';
|
|
8
|
-
|
|
9
|
-
export class ZModelScopeComputation extends DefaultScopeComputation {
|
|
10
|
-
constructor(services: LangiumServices) {
|
|
11
|
-
super(services);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
async computeScope(
|
|
15
|
-
document: LangiumDocument,
|
|
16
|
-
cancelToken = CancellationToken.None
|
|
17
|
-
): Promise<PrecomputedScopes> {
|
|
18
|
-
// Dummy for now
|
|
19
|
-
return super.computeScope(document, cancelToken);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
// ValidationAcceptor,
|
|
3
|
-
ValidationChecks,
|
|
4
|
-
ValidationRegistry,
|
|
5
|
-
} from 'langium';
|
|
6
|
-
import { ZModelAstType } from './generated/ast';
|
|
7
|
-
import type { ZModelServices } from './zmodel-module';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Registry for validation checks.
|
|
11
|
-
*/
|
|
12
|
-
export class ZModelValidationRegistry extends ValidationRegistry {
|
|
13
|
-
constructor(services: ZModelServices) {
|
|
14
|
-
super(services);
|
|
15
|
-
const validator = services.validation.ZModelValidator;
|
|
16
|
-
const checks: ValidationChecks<ZModelAstType> = {
|
|
17
|
-
// Person: validator.checkPersonStartsWithCapital
|
|
18
|
-
};
|
|
19
|
-
this.register(checks, validator);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Implementation of custom validations.
|
|
25
|
-
*/
|
|
26
|
-
export class ZModelValidator {
|
|
27
|
-
// checkPersonStartsWithCapital(person: Person, accept: ValidationAcceptor): void {
|
|
28
|
-
// if (person.name) {
|
|
29
|
-
// const firstChar = person.name.substring(0, 1);
|
|
30
|
-
// if (firstChar.toUpperCase() !== firstChar) {
|
|
31
|
-
// accept('warning', 'Person name should start with a capital.', { node: person, property: 'name' });
|
|
32
|
-
// }
|
|
33
|
-
// }
|
|
34
|
-
// }
|
|
35
|
-
}
|