From f95cc166058ed5f1acc524d5228f54be9e087743 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Thu, 29 Jul 2021 20:36:51 +0200 Subject: [PATCH 1/4] Added modifier line number --- src/Types.ts | 6 ++++++ src/processTargets.ts | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/Types.ts b/src/Types.ts index 0d4aac840c..8832eb98bc 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -84,6 +84,11 @@ export interface SubpieceModifier { export interface MatchingPairSymbolModifier { type: "matchingPairSymbol"; } +export interface LineNumberModifier { + type: "lineNumber"; + lineNumber: number; + isRelative: boolean; +} export interface IdentityModifier { type: "identity"; } @@ -93,6 +98,7 @@ export type Modifier = | ContainingScopeModifier | SubpieceModifier | MatchingPairSymbolModifier + | LineNumberModifier | IdentityModifier; export type SelectionType = diff --git a/src/processTargets.ts b/src/processTargets.ts index d5cdb968d9..9edddc2488 100644 --- a/src/processTargets.ts +++ b/src/processTargets.ts @@ -292,6 +292,22 @@ function transformSelection( context: {}, }, ]; + + case "lineNumber": { + console.log(selection.selection); + const line = modifier.isRelative + ? selection.editor.selection.active.line + modifier.lineNumber + : modifier.lineNumber; + return [ + { + selection: update(selection, { + selection: () => new Selection(line, 0, line, 0), + }), + context: {}, + }, + ]; + } + case "matchingPairSymbol": case "surroundingPair": throw new Error("Not implemented"); From fefe2269e28b6a155636c5ebb7ab22f8db761c39 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Thu, 29 Jul 2021 21:17:04 +0200 Subject: [PATCH 2/4] Added event that checks for edits outside of viewport --- src/extension.ts | 18 ++++++++++++++++++ src/processTargets.ts | 1 - 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index 5297e0f3f2..653b26f95e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -181,12 +181,30 @@ export async function activate(context: vscode.ExtensionContext) { addDecorationsDebounced(); + function checkForEditsOutsideViewport(event: vscode.TextDocumentChangeEvent) { + const editor = vscode.window.activeTextEditor; + if (editor == null || editor.document !== event.document) { + return; + } + const { start, end } = editor.visibleRanges[0]; + for (const edit of event.contentChanges) { + if (edit.range.end.isBefore(start) || edit.range.start.isAfter(end)) { + vscode.window.showWarningMessage( + `Modification outside of viewport at lines: [${edit.range.start.line}, ${edit.range.end.line}]` + ); + return; + } + } + } + function handleEdit(edit: vscode.TextDocumentChangeEvent) { if (navigationMap != null) { navigationMap.updateTokenRanges(edit); } addDecorationsDebounced(); + + checkForEditsOutsideViewport(edit); } const recomputeDecorationStyles = async () => { diff --git a/src/processTargets.ts b/src/processTargets.ts index 9edddc2488..056066ed60 100644 --- a/src/processTargets.ts +++ b/src/processTargets.ts @@ -294,7 +294,6 @@ function transformSelection( ]; case "lineNumber": { - console.log(selection.selection); const line = modifier.isRelative ? selection.editor.selection.active.line + modifier.lineNumber : modifier.lineNumber; From 143ed348f1304fc85b5a180d3cf24e864a4f744f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 30 Jul 2021 01:08:46 +0200 Subject: [PATCH 3/4] Improved warning message --- src/extension.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 653b26f95e..c606eae356 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -187,14 +187,24 @@ export async function activate(context: vscode.ExtensionContext) { return; } const { start, end } = editor.visibleRanges[0]; + const ranges = []; for (const edit of event.contentChanges) { - if (edit.range.end.isBefore(start) || edit.range.start.isAfter(end)) { - vscode.window.showWarningMessage( - `Modification outside of viewport at lines: [${edit.range.start.line}, ${edit.range.end.line}]` - ); - return; + if ( + edit.range.end.isBeforeOrEqual(start) || + edit.range.start.isAfterOrEqual(end) + ) { + ranges.push(edit.range); } } + if (ranges.length > 0) { + ranges.sort((a, b) => a.start.line - b.start.line); + const linesText = ranges + .map((range) => `${range.start.line + 1}-${range.end.line + 1}`) + .join(", "); + vscode.window.showWarningMessage( + `Modification outside of viewport at lines: ${linesText}` + ); + } } function handleEdit(edit: vscode.TextDocumentChangeEvent) { From c1e212e31d858551b932c6c5ef873d98ab7e0989 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 30 Jul 2021 02:34:17 +0200 Subject: [PATCH 4/4] Support ranges in line modifier --- src/Types.ts | 8 ++++++-- src/processTargets.ts | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Types.ts b/src/Types.ts index 8832eb98bc..d629f13217 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -84,11 +84,15 @@ export interface SubpieceModifier { export interface MatchingPairSymbolModifier { type: "matchingPairSymbol"; } -export interface LineNumberModifier { - type: "lineNumber"; +export interface LineNumberModifierPosition { lineNumber: number; isRelative: boolean; } +export interface LineNumberModifier { + type: "lineNumber"; + anchor: LineNumberModifierPosition; + active: LineNumberModifierPosition; +} export interface IdentityModifier { type: "identity"; } diff --git a/src/processTargets.ts b/src/processTargets.ts index 056066ed60..e7cad287cb 100644 --- a/src/processTargets.ts +++ b/src/processTargets.ts @@ -14,6 +14,7 @@ import { Target, TypedSelection, Modifier, + LineNumberModifierPosition } from "./Types"; import { performInsideOutsideAdjustment } from "./performInsideOutsideAdjustment"; import { SUBWORD_MATCHER } from "./constants"; @@ -294,13 +295,20 @@ function transformSelection( ]; case "lineNumber": { - const line = modifier.isRelative - ? selection.editor.selection.active.line + modifier.lineNumber - : modifier.lineNumber; + const getLine = (linePosition: LineNumberModifierPosition) => + linePosition.isRelative + ? selection.editor.selection.active.line + linePosition.lineNumber + : linePosition.lineNumber; return [ { selection: update(selection, { - selection: () => new Selection(line, 0, line, 0), + selection: () => + new Selection( + getLine(modifier.anchor), + 0, + getLine(modifier.active), + 0 + ), }), context: {}, },