Skip to content

Commit

Permalink
feat: support completion
Browse files Browse the repository at this point in the history
  • Loading branch information
zhanba committed Jan 30, 2024
1 parent 9d1f26b commit bb0f248
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 46 deletions.
26 changes: 13 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,32 +28,32 @@
"clean": "git clean -fX ."
},
"devDependencies": {
"@babel/plugin-proposal-decorators": "^7.23.3",
"@babel/plugin-proposal-decorators": "^7.23.9",
"@babel/plugin-transform-class-properties": "^7.23.3",
"@babel/plugin-transform-flow-strip-types": "^7.23.3",
"@babel/plugin-transform-private-methods": "^7.23.3",
"@babel/plugin-transform-private-property-in-object": "^7.23.4",
"@babel/preset-env": "^7.23.3",
"@babel/preset-env": "^7.23.9",
"@babel/preset-react": "^7.23.3",
"@babel/preset-typescript": "^7.23.3",
"@changesets/cli": "^2.26.2",
"@changesets/cli": "^2.27.1",
"@commitlint/cli": "^17.8.1",
"@commitlint/config-conventional": "^17.8.1",
"@swc/core": "^1.3.99",
"@swc/jest": "^0.2.29",
"@types/jest": "^29.5.9",
"@types/node": "^20.9.3",
"@types/react-test-renderer": "^18.0.6",
"@swc/core": "^1.3.107",
"@swc/jest": "^0.2.31",
"@types/jest": "^29.5.11",
"@types/node": "^20.11.10",
"@types/react-test-renderer": "^18.0.7",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"@umijs/lint": "^4.0.88",
"@umijs/lint": "^4.1.1",
"babel-jest": "^29.7.0",
"babel-plugin-parameter-decorator": "^1.0.16",
"dotenv-cli": "^7.3.0",
"eslint": "^8.54.0",
"eslint": "^8.56.0",
"eslint-config-prettier": "^8.10.0",
"eslint-plugin-import": "^2.29.0",
"eslint-plugin-mdx": "^2.2.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-mdx": "^2.3.4",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
Expand All @@ -67,7 +67,7 @@
"lint-staged": "^13.3.0",
"nx": "^16.10.0",
"postcss-less": "^6.0.0",
"prettier": "^3.1.1",
"prettier": "^3.2.4",
"react-test-renderer": "^18.2.0",
"stylelint": "^14.16.1",
"typescript": "^4.9.5"
Expand Down
8 changes: 2 additions & 6 deletions packages/libro-core/src/command/document-commands.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
FormatPainterOutlined,
SaveOutlined,
SettingOutlined,
} from '@ant-design/icons';
import { ClearOutlined, SaveOutlined, SettingOutlined } from '@ant-design/icons';
import type { Command } from '@difizen/mana-app';

export const DocumentCommands: Record<string, Command & { keybind?: string }> = {
Expand All @@ -19,7 +15,7 @@ export const DocumentCommands: Record<string, Command & { keybind?: string }> =
},
FormatCell: {
id: 'document.notebook.format_cell',
icon: FormatPainterOutlined,
icon: ClearOutlined,
label: 'format cell code',
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,7 @@ export class LibroCommandContribution implements CommandContribution {
return (
!libro?.model.readOnly &&
EditorCellView.is(cell) &&
cell.model.mimeType === MIME.python &&
path === LibroToolbarArea.CellRight
);
},
Expand Down
3 changes: 2 additions & 1 deletion packages/libro-language-client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@
"minimatch": "^9.0.3",
"semver": "^7.5.4",
"@difizen/monaco-editor-core": "^0.39.4",
"vscode-uri": "^3.0.8"
"vscode-uri": "^3.0.8",
"vscode-jsonrpc": "^8.2.0"
},
"peerDependencies": {
"react": "^18.2.0"
Expand Down
18 changes: 16 additions & 2 deletions packages/libro-language-client/src/common/protocolConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */

// import * as code from 'vscode';
import type { TextDocumentPositionParams } from '@difizen/vscode-languageserver-protocol';
import * as ls from '@difizen/vscode-languageserver-protocol';
import {
NotebookCellTextDocumentFilter,
Expand Down Expand Up @@ -33,7 +31,9 @@ import type {
SemanticTokensLegend,
TypeHierarchyItem,
WorkspaceEditEntryMetadata,
TextDocument,
} from 'vscode';
import { URI } from 'vscode-uri';

import ProtocolCallHierarchyItem from './protocolCallHierarchyItem.js';
import ProtocolCodeAction from './protocolCodeAction.js';
Expand Down Expand Up @@ -597,6 +597,10 @@ export interface Converter {
): Promise<InlineCompletionItem[] | InlineCompletionList | undefined>;

asInlineCompletionItem(item: ls.InlineCompletionItem): InlineCompletionItem;

// new

asTextDcouemnt(value: ls.TextDocumentIdentifier): TextDocument;
}

export interface URIConverter {
Expand Down Expand Up @@ -2531,6 +2535,14 @@ export function createConverter(
return inlineCompletionItem;
}

// new

function asTextDcouemnt(value: ls.TextDocumentIdentifier): TextDocument {
return {
uri: URI.parse(value.uri),
} as TextDocument;
}

return {
asUri,
asDocumentSelector,
Expand Down Expand Up @@ -2607,5 +2619,7 @@ export function createConverter(
asGlobPattern,
asInlineCompletionResult,
asInlineCompletionItem,
// new
asTextDcouemnt,
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import type {
TypeHierarchyProvider,
WorkspaceSymbolProvider,
InlayHintsProvider,
CompletionItem,
} from 'vscode';

import * as c2p from '../codeConverter.js';
Expand All @@ -51,6 +52,17 @@ import {
ProtocolToMonacoConverter,
} from './monaco-converter.js';
import { IMonacoLanguages } from './services.js';
import { CancellationToken, CompletionTriggerKind } from './vscodeAdaptor.js';

function overrideWithResolvedValue<T>(item: T, resolvedItem: T): void {
for (const key in resolvedItem) {
const value = resolvedItem[key];
// eslint-disable-next-line eqeqeq
if (value != null) {
item[key] = value;
}
}
}

@singleton({ token: IMonacoLanguages })
export class MonacoLanguages implements IMonacoLanguages {
Expand Down Expand Up @@ -261,7 +273,7 @@ export class MonacoLanguages implements IMonacoLanguages {
const params = this.m2p.asDocumentFormattingParams(model, options);
const result = await provider.provideDocumentFormattingEdits(
{ uri: model.uri } as any,
params.options,
params.options as any,
token,
);

Expand Down Expand Up @@ -331,12 +343,80 @@ export class MonacoLanguages implements IMonacoLanguages {
provider: CompletionItemProvider,
...triggerCharacters: string[]
): Disposable {
const completionProvider = this.createCompletionProvider(
provider,
...triggerCharacters,
);
return monaco.languages.registerCompletionItemProvider(
selector,
completionProvider,
);
}

protected createCompletionProvider(
provider: CompletionItemProvider,
...triggerCharacters: string[]
): monaco.languages.CompletionItemProvider {
return {
dispose: () => {
return;
triggerCharacters,
provideCompletionItems: async (model, position, context, token) => {
const wordUntil = model.getWordUntilPosition(position);
const defaultRange = new monaco.Range(
position.lineNumber,
wordUntil.startColumn,
position.lineNumber,
wordUntil.endColumn,
);
const params = this.m2p.asCompletionParams(model, position, context);
const result = await provider?.provideCompletionItems(
this.p2c.asTextDcouemnt(params.textDocument),
this.p2c.asPosition(params.position),
CancellationToken,
{
triggerCharacter: params.context?.triggerCharacter ?? '.',
triggerKind:
params.context?.triggerKind ?? CompletionTriggerKind.TriggerCharacter,
},
);

if (!result) {
return;
}

let items: CompletionItem[];
if (Array.isArray(result)) {
items = result;
} else {
items = result.items;
}
const res = items.map((item) =>
this.p2m.asCompletionItem(this.c2p.asCompletionItem(item), defaultRange),
);

return { suggestions: res };
},
resolveCompletionItem: provider.resolveCompletionItem
? async (item, token) => {
const protocolItem = this.m2p.asCompletionItem(item);
const codeItem = this.p2c.asCompletionItem(protocolItem);
const resolvedItem = await provider.resolveCompletionItem?.(
codeItem,
token,
);
if (resolvedItem) {
const proItem = this.c2p.asCompletionItem(resolvedItem);
const resolvedCompletionItem = this.p2m.asCompletionItem(
proItem,
item.range,
);
overrideWithResolvedValue(item, resolvedCompletionItem);
}
return item;
}
: undefined,
};
}

registerInlineCompletionItemProvider(
selector: DocumentSelector,
provider: InlineCompletionItemProvider,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ export const lspEnv: {
libroContainer: {} as Syringe.Container,
};

export let workspace: ILibroWorkspace = undefined;
export let window: ILibroWindow = undefined;
export let languages: IMonacoLanguages = undefined;
export let workspace: ILibroWorkspace = undefined as any;
export let window: ILibroWindow = undefined as any;
export let languages: IMonacoLanguages = undefined as any;

export const setupLspEnv = (container: Syringe.Container) => {
lspEnv.libroContainer = container;
Expand Down Expand Up @@ -120,3 +120,4 @@ export enum FileType {
}

export * from './extHostTypes.js';
export { CancellationToken } from 'vscode-jsonrpc';

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { PageConfig } from '@difizen/libro-kernel';
import type { ILanguageServerManager } from '@difizen/libro-lsp';
import { ILanguageServerManagerFactory } from '@difizen/libro-lsp';
import { ApplicationContribution, inject, singleton } from '@difizen/mana-app';
import { URI } from 'vscode-uri';

import { CloseAction, ErrorAction } from './common/api.js';
import { LSPEnv } from './common/vscodeAdaptor/lspEnv.js';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ export class LibroLanguageClientManager {
}
const client = await this.createLanguageClient(url, options);
this.clientMap.set(url, client);
// const featureState = client.languageClient
// .getFeature('textDocument/formatting')
// .getState();
// console.log(featureState);

return client;
}

Expand Down

0 comments on commit bb0f248

Please sign in to comment.