Skip to content

Commit

Permalink
Add import/export functionality for a single system/package
Browse files Browse the repository at this point in the history
- Model files and the 'package.json' are stored in a single YAML file
-- The official YAML document delimiter is used between documents
-- We store some additional metadata as comments for now

- Import always creates a folder on workspace root-level
-- User is asked to overwrite if folder already exists
  • Loading branch information
martin-fleck-at committed May 21, 2024
1 parent f0b6dc8 commit 3fc5ab8
Show file tree
Hide file tree
Showing 15 changed files with 544 additions and 34 deletions.
3 changes: 2 additions & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@
"NODE_NO_WARNINGS": "1"
},
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
"internalConsoleOptions": "neverOpen",
"outFiles": []
}
],
"compounds": [
Expand Down
2 changes: 1 addition & 1 deletion extensions/crossmodel-lang/esbuild.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const ctx = await esbuild.context({
'.js': '.cjs'
},
loader: { '.ts': 'ts' },
external: ['vscode'],
external: ['vscode', 'prettier'],
platform: 'node',
sourcemap: !minify,
minify,
Expand Down
3 changes: 2 additions & 1 deletion extensions/crossmodel-lang/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@
"chevrotain": "~11.0.3",
"commander": "~10.0.0",
"langium": "~2.1.3",
"type-fest": "^3.6.1",
"prettier": "^3.1.0",
"type-fest": "^4.18.2",
"vscode-languageclient": "9.0.1",
"vscode-languageserver": "9.0.1",
"vscode-languageserver-protocol": "^3.17.5",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ export class CrossModelIndex extends GModelIndex {

protected indexAstNode(node: AstNode): void {
const id = this.findId(node);
console.log('INDEX', node.$type, id);
if (id) {
this.indexSemanticElement(id, node);
}
Expand Down
8 changes: 8 additions & 0 deletions extensions/crossmodel-lang/src/model-server/model-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@ import {
OpenModelArgs,
ReferenceableElement,
RequestModel,
RequestSystemInfo,
ResolveReference,
ResolvedElement,
SaveModel,
SaveModelArgs,
SystemInfo,
SystemInfoArgs,
UpdateModel,
UpdateModelArgs
} from '@crossbreeze/protocol';
Expand Down Expand Up @@ -52,6 +55,11 @@ export class ModelServer implements Disposable {
this.toDispose.push(connection.onRequest(ResolveReference, args => this.resolve(args)));
this.toDispose.push(connection.onRequest(UpdateModel, args => this.updateModel(args)));
this.toDispose.push(connection.onRequest(SaveModel, args => this.saveModel(args)));
this.toDispose.push(connection.onRequest(RequestSystemInfo, args => this.systemInfo(args)));
}

protected systemInfo(args: SystemInfoArgs): Promise<SystemInfo | undefined> {
return this.modelService.getSystemInfo(args);
}

protected complete(args: CrossReferenceContext): Promise<ReferenceableElement[]> {
Expand Down
19 changes: 19 additions & 0 deletions extensions/crossmodel-lang/src/model-server/model-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,15 @@ import {
OpenModelArgs,
ReferenceableElement,
SaveModelArgs,
SystemInfo,
SystemInfoArgs,
UpdateModelArgs
} from '@crossbreeze/protocol';
import { AstNode, Deferred, DocumentState, isAstNode } from 'langium';
import { Disposable, OptionalVersionedTextDocumentIdentifier, Range, TextDocumentEdit, TextEdit, uinteger } from 'vscode-languageserver';
import { URI } from 'vscode-uri';
import { CrossModelServices, CrossModelSharedServices } from '../language-server/cross-model-module.js';
import { PackageAstNodeDescription } from '../language-server/cross-model-scope.js';
import { findDocument } from '../language-server/util/ast-util.js';
import { LANGUAGE_CLIENT_ID } from './openable-text-documents.js';

Expand Down Expand Up @@ -206,4 +209,20 @@ export class ModelService {
async resolveCrossReference(args: CrossReference): Promise<AstNode | undefined> {
return this.shared.CrossModel.references.ScopeProvider.resolveCrossReference(args);
}

async getSystemInfo(args: SystemInfoArgs): Promise<SystemInfo | undefined> {
const packageInfo = this.shared.workspace.PackageManager.getPackageInfoByURI(URI.parse(args.contextUri!));
if (!packageInfo) {
return undefined;
}
const packageId = packageInfo.id;
return {
packageFilePath: packageInfo.uri.fsPath,
modelFilePaths: this.shared.workspace.IndexManager.allElements()
.filter(desc => desc instanceof PackageAstNodeDescription && desc.packageId === packageId)
.map(desc => desc.documentUri.fsPath)
.distinct()
.toArray()
};
}
}
4 changes: 3 additions & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@
"@theia/core": "1.43.1",
"@theia/markers": "1.43.1",
"@theia/outline-view": "1.43.1",
"@theia/plugin-ext": "1.43.1"
"@theia/plugin-ext": "1.43.1",
"type-fest": "^4.18.2",
"yaml": "^2.4.1"
},
"theiaExtensions": [
{
Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/browser/core-frontend-module.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
/********************************************************************************
* Copyright (c) 2023 CrossBreeze.
********************************************************************************/
import { MenuContribution } from '@theia/core';
import { CommandContribution, MenuContribution } from '@theia/core';
import { ContainerModule } from '@theia/core/shared/inversify';
import { FileNavigatorWidget } from '@theia/navigator/lib/browser';
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
import { WorkspaceCommandContribution } from '@theia/workspace/lib/browser/workspace-commands';
import '../../style/index.css';
import { createCrossModelFileNavigatorWidget } from './cm-file-navigator-tree-widget';
import { CrossModelFileNavigatorContribution, CrossModelWorkspaceContribution } from './new-element-contribution';
import { ImportExportContribution } from './import-export-contribution';

export default new ContainerModule((bind, _unbind, _isBound, rebind) => {
bind(CrossModelWorkspaceContribution).toSelf().inSingletonScope();
Expand All @@ -19,4 +20,8 @@ export default new ContainerModule((bind, _unbind, _isBound, rebind) => {
rebind(FileNavigatorContribution).toService(CrossModelFileNavigatorContribution);

rebind(FileNavigatorWidget).toDynamicValue(ctx => createCrossModelFileNavigatorWidget(ctx.container));

bind(ImportExportContribution).toSelf().inSingletonScope();
bind(CommandContribution).toService(ImportExportContribution);
bind(MenuContribution).toService(ImportExportContribution);
});
Loading

0 comments on commit 3fc5ab8

Please sign in to comment.