Skip to content

Commit 8699f3a

Browse files
committed
Only trigger jump to definition on mouse up to allow block selections
1 parent c2eba21 commit 8699f3a

File tree

1 file changed

+37
-20
lines changed

1 file changed

+37
-20
lines changed

packages/jupyterlab-lsp/src/features/jump_to.ts

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,32 @@ export class CMJumpToDefinition extends CodeMirrorIntegration {
7171
}
7272

7373
register() {
74-
this.editor_handlers.set(
75-
'mousedown',
76-
this._jumpToDefinitionOrRefernce.bind(this)
77-
);
74+
this.editor_handlers.set('mousedown', this._jumpOnMouseUp.bind(this));
7875
super.register();
7976
}
8077

78+
private _jumpOnMouseUp(
79+
virtualEditor: CodeMirrorVirtualEditor,
80+
event: MouseEvent
81+
) {
82+
document.body.addEventListener(
83+
'mouseup',
84+
(mouseUpEvent: MouseEvent) => {
85+
if (mouseUpEvent.target !== event.target) {
86+
// Cursor moved, e.g. block selection was attempted, see:
87+
// https://github.com/jupyter-lsp/jupyterlab-lsp/issues/823
88+
return;
89+
}
90+
return this._jumpToDefinitionOrRefernce(virtualEditor, event);
91+
},
92+
{
93+
once: true
94+
}
95+
);
96+
}
97+
8198
private _jumpToDefinitionOrRefernce(
82-
virtual_editor: CodeMirrorVirtualEditor,
99+
virtualEditor: CodeMirrorVirtualEditor,
83100
event: MouseEvent
84101
) {
85102
const { button } = event;
@@ -88,24 +105,24 @@ export class CMJumpToDefinition extends CodeMirrorIntegration {
88105
if (!shouldJump) {
89106
return;
90107
}
91-
let root_position = this.position_from_mouse(event);
92-
if (root_position == null) {
108+
let rootPosition = this.position_from_mouse(event);
109+
if (rootPosition == null) {
93110
this.console.warn(
94111
'Could not retrieve root position from mouse event to jump to definition/reference'
95112
);
96113
return;
97114
}
98-
let document = virtual_editor.document_at_root_position(root_position);
99-
let virtual_position =
100-
virtual_editor.root_position_to_virtual_position(root_position);
115+
let document = virtualEditor.document_at_root_position(rootPosition);
116+
let virtualPosition =
117+
virtualEditor.root_position_to_virtual_position(rootPosition);
101118

102119
const positionParams: lsp.TextDocumentPositionParams = {
103120
textDocument: {
104121
uri: document.document_info.uri
105122
},
106123
position: {
107-
line: virtual_position.line,
108-
character: virtual_position.ch
124+
line: virtualPosition.line,
125+
character: virtualPosition.ch
109126
}
110127
};
111128

@@ -239,19 +256,19 @@ export class CMJumpToDefinition extends CodeMirrorIntegration {
239256

240257
let { uri, range } = targetInfo;
241258

242-
let virtual_position = PositionConverter.lsp_to_cm(
259+
let virtualPosition = PositionConverter.lsp_to_cm(
243260
range.start
244261
) as IVirtualPosition;
245262

246263
if (uris_equal(uri, positionParams.textDocument.uri)) {
247-
let editor_index = this.adapter.get_editor_index_at(virtual_position);
264+
let editor_index = this.adapter.get_editor_index_at(virtualPosition);
248265
// if in current file, transform from the position within virtual document to the editor position:
249266
let editor_position =
250-
this.virtual_editor.transform_virtual_to_editor(virtual_position);
267+
this.virtual_editor.transform_virtual_to_editor(virtualPosition);
251268
if (editor_position === null) {
252269
this.console.warn(
253270
'Could not jump: conversion from virtual position to editor position failed',
254-
virtual_position
271+
virtualPosition
255272
);
256273
return JumpResult.PositioningFailure;
257274
}
@@ -281,7 +298,7 @@ export class CMJumpToDefinition extends CodeMirrorIntegration {
281298
return JumpResult.AssumeSuccess;
282299
} else {
283300
// otherwise there is no virtual document and we expect the returned position to be source position:
284-
let source_position_ce = PositionConverter.cm_to_ce(virtual_position);
301+
let source_position_ce = PositionConverter.cm_to_ce(virtualPosition);
285302
this.console.log(`Jumping to external file: ${uri}`);
286303
this.console.log('Jump target (source location):', source_position_ce);
287304

@@ -344,7 +361,7 @@ class JumperLabIntegration implements IFeatureLabIntegration {
344361
this.jumpers = new Map();
345362

346363
if (fileEditorTracker !== null) {
347-
fileEditorTracker.widgetAdded.connect((sender, widget) => {
364+
fileEditorTracker.widgetAdded.connect((_, widget) => {
348365
let fileEditor = widget.content;
349366

350367
if (fileEditor.editor instanceof CodeMirrorEditor) {
@@ -354,7 +371,7 @@ class JumperLabIntegration implements IFeatureLabIntegration {
354371
});
355372
}
356373

357-
notebookTracker.widgetAdded.connect(async (sender, widget) => {
374+
notebookTracker.widgetAdded.connect(async (_, widget) => {
358375
// NOTE: assuming that the default cells content factory produces CodeMirror editors(!)
359376
let jumper = new NotebookJumper(widget, documentManager);
360377
this.jumpers.set(widget.id, jumper);
@@ -432,7 +449,7 @@ const COMMANDS = (trans: TranslationBundle): IFeatureCommand[] => [
432449
},
433450
{
434451
id: 'jump-back',
435-
execute: async ({ connection, virtual_position, document, features }) => {
452+
execute: async ({ features }) => {
436453
const jump_feature = features.get(FEATURE_ID) as CMJumpToDefinition;
437454
jump_feature.jumper.global_jump_back();
438455
},

0 commit comments

Comments
 (0)