Skip to content

Commit 2e38c4e

Browse files
snjezargrunber
authored andcommitted
Re-implement smart semicolon detection through text document change API
Signed-off-by: Snjezana Peco <snjezana.peco@redhat.com>
1 parent 54714ff commit 2e38c4e

7 files changed

Lines changed: 44 additions & 64 deletions

File tree

package.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,11 +1301,6 @@
13011301
"command": "java.server.restart",
13021302
"title": "%java.server.restart%",
13031303
"category": "Java"
1304-
},
1305-
{
1306-
"command": "java.edit.smartSemicolonDetection.command",
1307-
"title": "%java.edit.smartSemicolonDetection%",
1308-
"category": "Java"
13091304
}
13101305
],
13111306
"keybindings": [
@@ -1323,11 +1318,6 @@
13231318
"key": "ctrl+shift+v",
13241319
"mac": "cmd+shift+v",
13251320
"when": "javaLSReady && editorLangId == java"
1326-
},
1327-
{
1328-
"command": "java.edit.smartSemicolonDetection.command",
1329-
"key": ";",
1330-
"when": "config.java.edit.smartSemicolonDetection.enabled && editorTextFocus && !editorReadonly && javaLSReady && editorLangId == java"
13311321
}
13321322
],
13331323
"menus": {

src/commands.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,5 @@ export namespace Commands {
339339
* Smart semicolon detection.
340340
*/
341341
export const SMARTSEMICOLON_DETECTION = "java.edit.smartSemicolonDetection";
342-
export const SMARTSEMICOLON_DETECTION_CMD = "java.edit.smartSemicolonDetection.command";
343342

344343
}

src/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { initialize as initializeRecommendation } from './recommendation';
2424
import * as requirements from './requirements';
2525
import { runtimeStatusBarProvider } from './runtimeStatusBarProvider';
2626
import { serverStatusBarProvider } from './serverStatusBarProvider';
27-
import { ACTIVE_BUILD_TOOL_STATE, cleanWorkspaceFileName, getJavaServerMode, handleTextBlockClosing, onConfigurationChange, ServerMode } from './settings';
27+
import { ACTIVE_BUILD_TOOL_STATE, cleanWorkspaceFileName, getJavaServerMode, handleTextDocumentChanges, onConfigurationChange, ServerMode } from './settings';
2828
import { snippetCompletionProvider } from './snippetCompletionProvider';
2929
import { JavaClassEditorProvider } from './javaClassEditor';
3030
import { StandardLanguageClient } from './standardLanguageClient';
@@ -452,7 +452,7 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
452452
}
453453
}));
454454
}
455-
context.subscriptions.push(workspace.onDidChangeTextDocument(event => handleTextBlockClosing(event.document, event.contentChanges)));
455+
context.subscriptions.push(workspace.onDidChangeTextDocument(event => handleTextDocumentChanges(event.document, event.contentChanges)));
456456
});
457457
});
458458
}

src/settings.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Commands } from './commands';
77
import { cleanupLombokCache } from './lombokSupport';
88
import { ensureExists, getJavaConfiguration } from './utils';
99
import { apiManager } from './apiManager';
10-
import { setSmartSemiColonDetectionState } from './smartSemicolonDetection';
10+
import { isActive, setActive, smartSemicolonDetection } from './smartSemicolonDetection';
1111

1212
const DEFAULT_HIDDEN_FILES: string[] = ['**/.classpath', '**/.project', '**/.settings', '**/.factorypath'];
1313
const IS_WORKSPACE_JDK_ALLOWED = "java.ls.isJdkAllowed";
@@ -319,22 +319,33 @@ function unregisterGradleWrapperPromptDialog(sha256: string) {
319319
}
320320
}
321321

322-
export function handleTextBlockClosing(document: TextDocument, changes: readonly import("vscode").TextDocumentContentChangeEvent[]): any {
322+
let serverReady = false;
323+
324+
export function handleTextDocumentChanges(document: TextDocument, changes: readonly import("vscode").TextDocumentContentChangeEvent[]): any {
325+
if (!serverReady) {
326+
apiManager.getApiInstance().serverReady().then(() => {
327+
serverReady = true;
328+
});
329+
}
323330
const activeTextEditor = window.activeTextEditor;
324331
const activeDocument = activeTextEditor && activeTextEditor.document;
325332
if (document !== activeDocument || changes.length === 0 || document.languageId !== 'java') {
333+
setActive(false);
326334
return;
327335
}
328336
const lastChange = changes[changes.length - 1];
329337
if (lastChange.text === null || lastChange.text.length <= 0) {
338+
setActive(false);
330339
return;
331340
}
332341
if (lastChange.text !== '"""";') {
333-
if (lastChange.text !== ';') {
334-
setSmartSemiColonDetectionState(null, null);
342+
if (lastChange.text === ';' && serverReady && !isActive()) {
343+
smartSemicolonDetection();
335344
}
345+
setActive(false);
336346
return;
337347
}
348+
setActive(false);
338349
const selection = activeTextEditor.selection.active;
339350
if (selection !== null) {
340351
const start = new Position(selection.line, selection.character - 2);

src/smartSemicolonDetection.ts

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,45 @@
11
'use strict';
22

3-
import { commands, ExtensionContext, Position, Range, Selection, window } from 'vscode';
3+
import { commands, Position, Range, Selection, window } from 'vscode';
44
import { Commands } from './commands';
55
import { getJavaConfiguration } from './utils';
6+
let active = false;
67

7-
let oldPosition: Position = null;
8-
let newPosition: Position = null;
9-
10-
export function registerSmartSemicolonDetection(context: ExtensionContext) {
11-
context.subscriptions.push(commands.registerCommand(Commands.SMARTSEMICOLON_DETECTION_CMD, async () => {
12-
if (!didSmartSemicolonInsertion() && enabled()) {
13-
const params: SmartDetectionParams = {
14-
uri: window.activeTextEditor.document.uri.toString(),
15-
position: window.activeTextEditor!.selection.active,
16-
};
17-
const response: SmartDetectionParams = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.SMARTSEMICOLON_DETECTION, JSON.stringify(params));
18-
if (response !== null) {
19-
window.activeTextEditor!.edit(editBuilder => {
20-
oldPosition = window.activeTextEditor!.selection.active;
21-
editBuilder.insert(response.position, ";");
22-
window.activeTextEditor.selections = [new Selection(response.position, response.position)];
23-
newPosition = window.activeTextEditor!.selection.active;
24-
});
25-
return;
26-
}
8+
export async function smartSemicolonDetection() {
9+
if (enabled()) {
10+
const params: SmartDetectionParams = {
11+
uri: window.activeTextEditor.document.uri.toString(),
12+
position: window.activeTextEditor!.selection.active,
13+
};
14+
setActive(true);
15+
const response: SmartDetectionParams = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.SMARTSEMICOLON_DETECTION, JSON.stringify(params));
16+
if (response !== null) {
17+
window.activeTextEditor!.edit(editBuilder => {
18+
const oldPosition = window.activeTextEditor!.selection.active;
19+
editBuilder.delete(new Range(new Position(oldPosition.line, oldPosition.character - 1), oldPosition));
20+
const newPos = new Position(response.position.line, response.position.character + 1);
21+
editBuilder.insert(newPos, ";");
22+
window.activeTextEditor.selections = [new Selection(newPos, newPos)];
23+
// newPosition = window.activeTextEditor!.selection.active;
24+
});
25+
return;
2726
}
28-
window.activeTextEditor!.edit(editBuilder => {
29-
editBuilder.insert(window.activeTextEditor!.selection.active, ";");
30-
});
31-
newPosition = null;
32-
oldPosition = null;
33-
}));
27+
}
3428
}
3529

3630
interface SmartDetectionParams {
3731
uri: String;
3832
position: Position;
3933
}
4034

41-
function didSmartSemicolonInsertion() {
42-
const smartSemicolonInsertion = window.activeTextEditor.selections.length === 1 && enabled() && oldPosition !== null && newPosition !== null;
43-
if (smartSemicolonInsertion) {
44-
const active = window.activeTextEditor!.selection.active;
45-
const prev = new Position(active.line, active.character === 0 ? 0 : active.character - 1);
46-
return newPosition.isEqual(prev);
47-
}
48-
return smartSemicolonInsertion;
49-
}
50-
5135
function enabled() {
5236
return getJavaConfiguration().get<boolean>("edit.smartSemicolonDetection.enabled");
5337
}
5438

55-
export function setSmartSemiColonDetectionState(oldPos: Position, newPos: Position) {
56-
oldPosition = oldPos;
57-
newPos = newPos;
39+
export function isActive() {
40+
return active;
41+
}
42+
43+
export function setActive(pActive: boolean) {
44+
active = pActive;
5845
}

src/standardLanguageClient.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import { getAllJavaProjects, getJavaConfig, getJavaConfiguration } from "./utils
3838
import { Telemetry } from "./telemetry";
3939
import { TelemetryEvent } from "@redhat-developer/vscode-redhat-telemetry/lib";
4040
import { registerDocumentValidationListener } from './diagnostic';
41-
import { registerSmartSemicolonDetection } from './smartSemicolonDetection';
4241
import { listJdks, sortJdksBySource, sortJdksByVersion } from './jdkUtils';
4342

4443
const extensionName = 'Language Support for Java';
@@ -137,11 +136,6 @@ export class StandardLanguageClient {
137136
// clients may not have properly configured documentPaste
138137
logger.error(error);
139138
}
140-
try {
141-
registerSmartSemicolonDetection(context);
142-
} catch (error) {
143-
logger.error(error);
144-
}
145139
activationProgressNotification.hide();
146140
if (!hasImported) {
147141
showImportFinishNotification(context);

test/standard-mode-suite/extension.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ suite('Java Language Extension - Standard', () => {
116116
Commands.UPDATE_SOURCE_ATTACHMENT,
117117
Commands.UPDATE_SOURCE_ATTACHMENT_CMD,
118118
Commands.SMARTSEMICOLON_DETECTION,
119-
Commands.SMARTSEMICOLON_DETECTION_CMD,
120119
Commands.RESOLVE_SOURCE_ATTACHMENT,
121120
].sort();
122121
const foundJavaCommands = commands.filter((value) => {

0 commit comments

Comments
 (0)