Skip to content

Commit

Permalink
update its class name and references after filename renamed
Browse files Browse the repository at this point in the history
Signed-off-by: Jinbo Wang <jinbwan@microsoft.com>
  • Loading branch information
testforstephen authored and fbricon committed Apr 8, 2020
1 parent b59fbab commit 9cdbf88
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 5 deletions.
62 changes: 57 additions & 5 deletions src/fileEventHandler.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
'use strict';

import * as path from 'path';
import { workspace, FileCreateEvent, ExtensionContext, window, TextDocument, SnippetString, commands, Uri } from 'vscode';
import { workspace, FileCreateEvent, ExtensionContext, window, TextDocument, SnippetString, commands, Uri, FileRenameEvent, ProgressLocation } from 'vscode';
import { LanguageClient } from 'vscode-languageclient';
import { ListCommandResult } from './buildpath';
import { Commands } from './commands';
import { DidRenameFiles } from './protocol';

let serverReady: boolean = false;

Expand All @@ -13,16 +14,20 @@ export function setServerStatus(ready: boolean) {
}

export function registerFileEventHandlers(client: LanguageClient, context: ExtensionContext, ) {
if (workspace.onDidCreateFiles) {// Theia doesn't support workspace.onDidCreateFiles yet
context.subscriptions.push(workspace.onDidCreateFiles(handleNewJavaFiles));
}
if (workspace.onDidCreateFiles) {// Theia doesn't support workspace.onDidCreateFiles yet
context.subscriptions.push(workspace.onDidCreateFiles(handleNewJavaFiles));
}

if (workspace.onDidRenameFiles) {
context.subscriptions.push(workspace.onDidRenameFiles((e: FileRenameEvent) => handleRenameFiles(e, client)));
}
}

async function handleNewJavaFiles(e: FileCreateEvent) {
const emptyFiles: Uri[] = [];
const textDocuments: TextDocument[] = [];
for (const uri of e.files) {
if (!uri.fsPath || !uri.fsPath.endsWith(".java")) {
if (!isJavaFile(uri)) {
continue;
}

Expand Down Expand Up @@ -67,6 +72,53 @@ async function handleNewJavaFiles(e: FileCreateEvent) {
}
}

async function handleRenameFiles(e: FileRenameEvent, client: LanguageClient) {
if (!serverReady) {
return;
}

const javaRenameEvents: Array<{ oldUri: string, newUri: string }> = e.files.filter(event =>
isJavaFile(event.oldUri) && isJavaFile(event.newUri)
&& isInSameDirectory(event.oldUri, event.newUri)
).map(event => {
return {
oldUri: event.oldUri.toString(),
newUri: event.newUri.toString(),
};
});

if (!javaRenameEvents.length) {
return;
}

window.withProgress({ location: ProgressLocation.Window }, async (p) => {
return new Promise(async (resolve, reject) => {
p.report({ message: "Computing rename updates..." });
try {
const edit = await client.sendRequest(DidRenameFiles.type, {
files: javaRenameEvents
});
const codeEdit = client.protocol2CodeConverter.asWorkspaceEdit(edit);
if (codeEdit) {
workspace.applyEdit(codeEdit);
}
} finally {
resolve();
}
});
});
}

function isJavaFile(uri: Uri): boolean {
return uri.fsPath && uri.fsPath.endsWith(".java");
}

function isInSameDirectory(oldUri: Uri, newUri: Uri): boolean {
const oldDir = path.dirname(oldUri.fsPath);
const newDir = path.dirname(newUri.fsPath);
return !path.relative(oldDir, newDir);
}

function resolveTypeName(filePath: string): string {
const fileName: string = path.basename(filePath);
const extName: string = path.extname(fileName);
Expand Down
8 changes: 8 additions & 0 deletions src/protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -368,3 +368,11 @@ export interface LinkLocation extends Location {
export namespace FindLinks {
export const type = new RequestType<FindLinksParams, LinkLocation[], void, void>('java/findLinks');
}

export interface FileRenameParams {
files: Array<{ oldUri: string, newUri: string }>;
}

export namespace DidRenameFiles {
export const type = new RequestType<FileRenameParams, WorkspaceEdit, void, void>('java/didRenameFiles');
}

0 comments on commit 9cdbf88

Please sign in to comment.