@krassowski/jupyterlab-lsp
Version:
Language Server Protocol integration for JupyterLab
136 lines (135 loc) • 6.78 kB
TypeScript
import { JupyterFrontEnd } from '@jupyterlab/application';
import { CodeEditor } from '@jupyterlab/codeeditor';
import { DocumentRegistry, IDocumentWidget } from '@jupyterlab/docregistry';
import { TranslationBundle } from '@jupyterlab/translation';
import { Signal } from '@lumino/signaling';
import { ICommandContext } from '../command_manager';
import { LSPConnection } from '../connection';
import { DocumentConnectionManager, IDocumentConnectionData } from '../connection_manager';
import { EditorAdapter } from '../editor_integration/editor_adapter';
import { IFeature, IFeatureEditorIntegration } from '../feature';
import { ILSPExtension, ILSPLogConsole } from '../index';
import { LanguageIdentifier } from '../lsp';
import { IRootPosition, IVirtualPosition } from '../positioning';
import { IForeignContext, VirtualDocument } from '../virtual/document';
import { IVirtualEditor } from '../virtual/editor';
import IEditor = CodeEditor.IEditor;
export declare class StatusMessage {
/**
* The text message to be shown on the statusbar
*/
message: string;
changed: Signal<StatusMessage, void>;
private timer;
constructor();
/**
* Set the text message and (optionally) the timeout to remove it.
* @param message
* @param timeout - number of ms to until the message is cleaned;
* -1 if the message should stay up indefinitely;
* defaults to 3000ms (3 seconds)
*/
set(message: string, timeout?: number): void;
clear(): void;
private expire_timer;
}
export interface IEditorChangedData {
editor: CodeEditor.IEditor;
}
/**
* Foreign code: low level adapter is not aware of the presence of foreign languages;
* it operates on the virtual document and must not attempt to infer the language dependencies
* as this would make the logic of inspections caching impossible to maintain, thus the WidgetAdapter
* has to handle that, keeping multiple connections and multiple virtual documents.
*/
export declare abstract class WidgetAdapter<T extends IDocumentWidget> {
protected extension: ILSPExtension;
widget: T;
protected adapters: Map<VirtualDocument.id_path, EditorAdapter<IVirtualEditor<IEditor>>>;
adapterConnected: Signal<WidgetAdapter<T>, IDocumentConnectionData>;
isConnected: boolean;
connection_manager: DocumentConnectionManager;
status_message: StatusMessage;
trans: TranslationBundle;
protected isDisposed: boolean;
console: ILSPLogConsole;
protected app: JupyterFrontEnd;
activeEditorChanged: Signal<WidgetAdapter<T>, IEditorChangedData>;
editorAdded: Signal<WidgetAdapter<T>, IEditorChangedData>;
editorRemoved: Signal<WidgetAdapter<T>, IEditorChangedData>;
update_finished: Promise<void>;
initialized: Promise<void>;
/**
* (re)create virtual document using current path and language
*/
abstract create_virtual_document(): VirtualDocument;
abstract get_editor_index_at(position: IVirtualPosition): number;
abstract get_editor_index(ce_editor: CodeEditor.IEditor): number;
abstract get_editor_wrapper(ce_editor: CodeEditor.IEditor): HTMLElement;
protected constructor(extension: ILSPExtension, widget: T);
protected get foreign_code_extractors(): import("..").IForeignCodeExtractorsRegistry;
protected get code_overrides(): import("../overrides/tokens").ICodeOverridesRegistry;
on_connection_closed(manager: DocumentConnectionManager, { virtual_document }: IDocumentConnectionData): void;
dispose(): void;
virtual_editor: IVirtualEditor<IEditor>;
abstract get document_path(): string;
abstract get mime_type(): string;
get widget_id(): string;
get language(): LanguageIdentifier;
abstract get language_file_extension(): string | undefined;
disconnect(): void;
protected reload_connection(): void;
protected on_save_state(context: any, state: DocumentRegistry.SaveState): void;
abstract activeEditor: CodeEditor.IEditor | undefined;
abstract get editors(): CodeEditor.IEditor[];
/**
* public for use in tests (but otherwise could be private)
*/
update_documents(): Promise<void> | undefined;
get has_multiple_editors(): boolean;
protected on_connected(data: IDocumentConnectionData): Promise<void>;
/**
* Opens a connection for the document. The connection may or may
* not be initialized, yet, and depending on when this is called, the client
* may not be fully connected.
*
* @param virtual_document a VirtualDocument
* @param send_open whether to open the document immediately
*/
protected connect_document(virtual_document: VirtualDocument, send_open?: boolean): Promise<void>;
private create_virtual_editor;
protected init_virtual(): void;
/**
* Handler for opening a document contained in a parent document. The assumption
* is that the editor already exists for this, and as such the document
* should be queued for immediate opening.
*
* @param host the VirtualDocument that contains the VirtualDocument in another language
* @param context information about the foreign VirtualDocument
*/
protected on_foreign_document_opened(host: VirtualDocument, context: IForeignContext): Promise<void>;
private on_foreign_document_closed;
document_changed(virtual_document: VirtualDocument, document: VirtualDocument, is_init?: boolean): void;
connect_adapter(virtual_document: VirtualDocument, connection: LSPConnection, features?: IFeature[] | null): EditorAdapter<any>;
private disconnect_adapter;
get_features(virtual_document: VirtualDocument): Map<string, IFeatureEditorIntegration<IVirtualEditor<CodeEditor.IEditor>>> | undefined;
private connect;
/**
* Connect the change signal in order to update all virtual documents after a change.
*
* Update to the state of a notebook may be done without a notice on the CodeMirror level,
* e.g. when a cell is deleted. Therefore a JupyterLab-specific signals are watched instead.
*
* While by not using the change event of CodeMirror editors we loose an easy way to send selective,
* (range) updates this can be still implemented by comparison of before/after states of the
* virtual documents, which is even more resilient and -obviously - editor-independent.
*/
private connect_contentChanged_signal;
private create_adapter;
private onContentChanged;
get_position_from_context_menu(): IRootPosition | null;
abstract context_from_active_document(): ICommandContext | null;
get_context(root_position: IRootPosition): ICommandContext | null;
get_context_from_context_menu(): ICommandContext | null;
abstract get wrapper_element(): HTMLElement;
}