Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,28 @@
// Ignore all dependencies (optional)
"${workspaceFolder}/node_modules/**"
]
},
{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/packages/ide/vscode"
],
"sourceMaps": true,
"outFiles": ["${workspaceFolder}/packages/ide/vscode/dist/**/*.js"]
},
{
"name": "Attach to Language Server",
"type": "node",
"port": 6009,
"request": "attach",
"skipFiles": ["<node_internals>/**"],
"sourceMaps": true,
"outFiles": [
"${workspaceFolder}/packages/ide/vscode/dist/**/*.js",
"${workspaceFolder}/packages/ide/vscode/node_modules/langium"
]
}
]
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
},
"keywords": [],
"author": "",
"license": "ISC",
"license": "MIT",
"devDependencies": {
"@swc/core": "^1.10.15",
"@typescript-eslint/eslint-plugin": "~7.3.1",
Expand Down
1 change: 1 addition & 0 deletions packages/ide/vscode/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
syntaxes/
1 change: 1 addition & 0 deletions packages/ide/vscode/LICENSE
Binary file added packages/ide/vscode/asset/logo-256-bg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added packages/ide/vscode/asset/logo-dark-256.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added packages/ide/vscode/asset/logo-light-256.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions packages/ide/vscode/language-configuration.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"comments": {
// symbol used for single line comment. Remove this entry if your language does not support line comments
"lineComment": "//",
// symbols used for start and end a block comment. Remove this entry if your language does not support block comments
"blockComment": ["/*", "*/"]
},
// symbols used as brackets
"brackets": [
["{", "}"],
["[", "]"],
["(", ")"]
],
// symbols that are auto closed when typing
"autoClosingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
["'", "'"],
{ "open": "/**", "close": " */", "notIn": ["string"] }
],
// symbols that can be used to surround a selection
"surroundingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
["'", "'"]
],
"wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\#\\%\\^\\&\\*\\-\\=\\+\\{\\}\\(\\)\\[\\]\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\s]+)"
}
88 changes: 88 additions & 0 deletions packages/ide/vscode/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
{
"name": "zenstack",
"publisher": "zenstack",
"version": "3.0.0",
"displayName": "ZenStack Language Tools",
"description": "VSCode extension for ZenStack ZModel language",
"private": true,
"repository": {
"type": "git",
"url": "https://github.com/zenstackhq/zenstack-v3"
},
"scripts": {
"build": "tsc --noEmit && tsup",
"watch": "run-p watch:*",
"watch:tsc": "tsc --watch --noEmit",
"watch:tsup": "tsup --watch",
"lint": "eslint src --ext ts",
"vscode:publish": "pnpm build && vsce publish --no-dependencies --pre-release --follow-symlinks",
"vscode:package": "pnpm build && vsce package --no-dependencies"
},
"homepage": "https://zenstack.dev",
"icon": "asset/logo-256-bg.png",
"keywords": [
"fullstack",
"react",
"typescript",
"data modeling",
"prisma"
],
"author": {
"name": "ZenStack Team"
},
"license": "MIT",
"packageManager": "[email protected]",
"dependencies": {
"langium": "~3.3.0",
"vscode-languageclient": "^9.0.1",
"vscode-languageserver": "^9.0.1",
"@zenstackhq/language": "workspace:*"
},
"devDependencies": {
"@types/vscode": "^1.63.0"
},
"files": [
"dist",
"res",
"syntaxes",
"asset",
"language-configuration.json"
],
"engines": {
"vscode": "^1.63.0",
"node": ">=18.0.0"
},
"categories": [
"Programming Languages"
],
"contributes": {
"languages": [
{
"id": "zmodel",
"aliases": [
"ZenStack Model",
"zmodel"
],
"extensions": [
".zmodel"
],
"configuration": "./language-configuration.json",
"icon": {
"light": "./asset/logo-light-256.png",
"dark": "./asset/logo-dark-256.png"
}
}
],
"grammars": [
{
"language": "zmodel",
"scopeName": "source.zmodel",
"path": "./syntaxes/zmodel.tmLanguage.json"
}
]
},
"activationEvents": [
"onLanguage:zmodel"
],
"main": "./dist/extension.js"
}
1 change: 1 addition & 0 deletions packages/ide/vscode/res
67 changes: 67 additions & 0 deletions packages/ide/vscode/src/extension/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import * as path from 'node:path';
import type * as vscode from 'vscode';
import type {
LanguageClientOptions,
ServerOptions,
} from 'vscode-languageclient/node.js';
import { LanguageClient, TransportKind } from 'vscode-languageclient/node.js';

let client: LanguageClient;

// This function is called when the extension is activated.
export function activate(context: vscode.ExtensionContext): void {
client = startLanguageClient(context);
}

// This function is called when the extension is deactivated.
export function deactivate(): Thenable<void> | undefined {
if (client) {
return client.stop();
}
return undefined;
}

function startLanguageClient(context: vscode.ExtensionContext): LanguageClient {
const serverModule = context.asAbsolutePath(
path.join('dist', 'language-server.js')
);
// The debug options for the server
// --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging.
// By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached.
const debugOptions = {
execArgv: [
'--nolazy',
`--inspect${process.env['DEBUG_BREAK'] ? '-brk' : ''}=${
process.env['DEBUG_SOCKET'] || '6009'
}`,
],
};

// If the extension is launched in debug mode then the debug server options are used
// Otherwise the run options are used
const serverOptions: ServerOptions = {
run: { module: serverModule, transport: TransportKind.ipc },
debug: {
module: serverModule,
transport: TransportKind.ipc,
options: debugOptions,
},
};

// Options to control the language client
const clientOptions: LanguageClientOptions = {
documentSelector: [{ scheme: '*', language: 'zmodel' }],
};

// Create the language client and start the client.
const client = new LanguageClient(
'zmodel',
'ZModel',
serverOptions,
clientOptions
);

// Start the client. This will also launch the server
client.start();
return client;
}
19 changes: 19 additions & 0 deletions packages/ide/vscode/src/language-server/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { createZModelLanguageServices } from '@zenstackhq/language';
import { startLanguageServer } from 'langium/lsp';
import { NodeFileSystem } from 'langium/node';
import {
createConnection,
ProposedFeatures,
} from 'vscode-languageserver/node.js';

// Create a connection to the client
const connection = createConnection(ProposedFeatures.all);

// Inject the shared services and language-specific services
const { shared } = createZModelLanguageServices({
connection,
...NodeFileSystem,
});

// Start the language server with the shared services
startLanguageServer(shared);
1 change: 1 addition & 0 deletions packages/ide/vscode/syntaxes
7 changes: 7 additions & 0 deletions packages/ide/vscode/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"outDir": "dist"
},
"include": ["src/**/*.ts"]
}
14 changes: 14 additions & 0 deletions packages/ide/vscode/tsup.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { defineConfig } from 'tsup';

export default defineConfig({
entry: {
extension: 'src/extension/main.ts',
'language-server': 'src/language-server/main.ts',
},
outDir: 'dist',
splitting: false,
clean: true,
format: ['cjs'],
noExternal: [/^(?!vscode$)/],
external: ['vscode'],
});
23 changes: 18 additions & 5 deletions packages/language/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
"license": "MIT",
"author": "ZenStack Team",
"files": [
"dist"
"dist",
"res"
],
"type": "module",
"scripts": {
Expand All @@ -20,12 +21,24 @@
},
"exports": {
".": {
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
},
"./ast": {
"import": "./dist/ast.js",
"types": "./dist/ast.d.ts"
"import": {
"types": "./dist/ast.d.ts",
"default": "./dist/ast.js"
},
"require": {
"types": "./dist/ast.d.cts",
"default": "./dist/ast.cjs"
}
},
"./package.json": {
"import": "./package.json",
Expand Down
14 changes: 7 additions & 7 deletions packages/language/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,16 @@ export async function loadDocument(
}

// load standard library

// isomorphic __dirname
const _dirname =
typeof __dirname !== 'undefined'
? __dirname
: path.dirname(fileURLToPath(import.meta.url));
const stdLib =
await services.shared.workspace.LangiumDocuments.getOrCreateDocument(
URI.file(
path.resolve(
path.join(
path.dirname(fileURLToPath(import.meta.url)),
'./res',
STD_LIB_MODULE_NAME
)
)
path.resolve(path.join(_dirname, '../res', STD_LIB_MODULE_NAME))
)
);

Expand Down
19 changes: 16 additions & 3 deletions packages/language/src/module.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { inject, type Module } from 'langium';
import { inject, type DeepPartial, type Module } from 'langium';
import {
createDefaultModule,
createDefaultSharedModule,
Expand All @@ -13,8 +13,9 @@ import {
ZModelLanguageMetaData,
} from './generated/module';
import { ZModelValidator, registerValidationChecks } from './validator';
import { ZModelScopeComputation, ZModelScopeProvider } from './zmodel-scope';
import { ZModelLinker } from './zmodel-linker';
import { ZModelScopeComputation, ZModelScopeProvider } from './zmodel-scope';
import { ZModelWorkspaceManager } from './zmodel-workspace-manager';
export { ZModelLanguageMetaData };

/**
Expand Down Expand Up @@ -51,6 +52,17 @@ export const ZModelLanguageModule: Module<
},
};

export type ZModelSharedServices = LangiumSharedServices;

export const ZModelSharedModule: Module<
ZModelSharedServices,
DeepPartial<ZModelSharedServices>
> = {
workspace: {
WorkspaceManager: (services) => new ZModelWorkspaceManager(services),
},
};

/**
* Create the full set of services required by Langium.
*
Expand All @@ -74,7 +86,8 @@ export function createZModelLanguageServices(
} {
const shared = inject(
createDefaultSharedModule(context),
ZModelGeneratedSharedModule
ZModelGeneratedSharedModule,
ZModelSharedModule
);
const ZModelLanguage = inject(
createDefaultModule({ shared }),
Expand Down
Loading