Skip to content

Commit 0ee6266

Browse files
WIP: Format code in workspace
1 parent 2b0acd7 commit 0ee6266

12 files changed

Lines changed: 367 additions & 69 deletions

File tree

libs/shared/src/lib/idl-commands.interface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ export const IDL_COMMANDS = {
5959
ADD_DOCS_TO_FILE: `${BASE_CODE}addDocsToFile`,
6060
/** Formats a file */
6161
FORMAT_FILE: `${BASE_CODE}formatFile`,
62+
/** Formats all files in a workspace */
63+
FORMAT_WORKSPACE: `${BASE_CODE}formatWorkspace`,
6264
/** Generate task file */
6365
GENERATE_TASK: `${BASE_CODE}generateTask`,
6466
/** Migrate PRO code to the ENVI DL 3.0 API */

libs/translation/src/lib/languages/en/en.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export const EN: ITranslation = {
4848
disableProblemSetting: 'IDL: Disable Problem Code via Setting',
4949
fixProblem: 'IDL: Fix Problem for Code Action',
5050
formatFile: 'IDL: Format File',
51+
formatWorkspace: 'IDL: Format Files in Workspace',
5152
generateTask: 'IDL: Generate ENVI or IDL Task',
5253
migrateToDL30API: 'IDL: Migrate Code to ENVI Deep Learning 3.0 API',
5354
},
@@ -112,6 +113,7 @@ export const EN: ITranslation = {
112113
'Error while disabling problem code via settings',
113114
fixProblem: 'Error while fixing problem from code action',
114115
formatFile: 'Error while formatting file',
116+
formatWorkspace: 'Error while formatting workspace',
115117
generateTask: 'Error while generating task',
116118
migrateToDL30API: 'Error while migrating code',
117119
},
@@ -162,6 +164,12 @@ export const EN: ITranslation = {
162164
},
163165
},
164166
notifications: {
167+
formatWorkspace: {
168+
notAllFilesFormatted:
169+
'Some files were not formatted, see logs for more details',
170+
pickWorkspace:
171+
'Specify the open workspace to format all IDL files for (Task and PRO)',
172+
},
165173
initConfig: {
166174
noWorkspaceOpen: 'No currently open workspaces',
167175
allWorkspacesHaveConfig:
@@ -629,6 +637,7 @@ export const EN: ITranslation = {
629637
onDocumentFormatting: 'Problem formatting file',
630638
onDocumentFormattingProblemCode:
631639
'Unable to format code due to syntax error or problem in file',
640+
onWorkspaceFormatting: 'Error while formatting files in workspace',
632641
onHover: 'Problem resolving hover help',
633642
onAddDocs: 'Problem adding/updating routine docs for file',
634643
onDidClose: 'Problem when closing file',
@@ -663,6 +672,9 @@ export const EN: ITranslation = {
663672
startDocsServer:
664673
'Error while starting local docs server, is the port already in use?',
665674
},
675+
progress: {
676+
formatWorkspace: 'Formatting workspace...',
677+
},
666678
types: {
667679
unknown: {
668680
function: 'Unknown function',

libs/translation/src/lib/translation.interface.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ export interface ICommandTranslation {
2727
addDocsToFile: string;
2828
/** Format file */
2929
formatFile: string;
30+
/** Format all code in a workspace */
31+
formatWorkspace: string;
3032
/** Generates a task file */
3133
generateTask: string;
3234
/** Migrate PRO code to the ENVI DL 3.0 API */
@@ -314,6 +316,13 @@ export interface ITranslation {
314316
/** Title of the dialog for picking workspace folders to initialize config files for */
315317
dialogTitle: string;
316318
};
319+
/** Messages when formatting the workspace */
320+
formatWorkspace: {
321+
/** Title of the dialog for picking workspace to format files in */
322+
pickWorkspace: string;
323+
/** When there are files we failed to format */
324+
notAllFilesFormatted: string;
325+
};
317326
};
318327
};
319328
/** Translations related to configuring the extension */
@@ -453,6 +462,8 @@ export interface ITranslation {
453462
onDefinition: string;
454463
/** Error formatting */
455464
onDocumentFormatting: string;
465+
/** Error formatting workspace */
466+
onWorkspaceFormatting: string;
456467
/** Unable to format because of syntax error */
457468
onDocumentFormattingProblemCode: string;
458469
/** Auto-complete */
@@ -511,6 +522,11 @@ export interface ITranslation {
511522
/** Error when starting the docs server because of a port conflict */
512523
startDocsServer: string;
513524
};
525+
/** Titles for progress messages */
526+
progress: {
527+
/** Progress for formatting workspace */
528+
formatWorkspace: string;
529+
};
514530
/** Messages for types */
515531
types: {
516532
/** When we encounter unknown things */

libs/vscode/client/src/lib/register-code-commands.ts

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { MIGRATION_TYPE_LOOKUP } from '@idl/assembling/migrators-types';
22
import { IDL_COMMAND_LOG } from '@idl/logger';
3-
import { IDL_COMMANDS, IDL_LANGUAGE_NAME } from '@idl/shared';
3+
import { CleanPath, IDL_COMMANDS, IDL_LANGUAGE_NAME } from '@idl/shared';
44
import { IDL_TRANSLATION } from '@idl/translation';
55
import { IAutoFixIDLDiagnostic } from '@idl/types/diagnostic';
66
import {
@@ -18,6 +18,7 @@ import {
1818
ReplaceDocumentContent,
1919
VSCodeTelemetryLogger,
2020
} from '@idl/vscode/shared';
21+
import { basename } from 'path';
2122
import { ExtensionContext } from 'vscode';
2223
import * as vscode from 'vscode';
2324

@@ -314,6 +315,85 @@ export function RegisterCodeCommands(ctx: ExtensionContext) {
314315
})
315316
);
316317

318+
ctx.subscriptions.push(
319+
vscode.commands.registerCommand(
320+
IDL_COMMANDS.CODE.FORMAT_WORKSPACE,
321+
async (): Promise<boolean> => {
322+
try {
323+
LogCommandInfo('Format workspace');
324+
325+
/**
326+
* Get workspace folders
327+
*/
328+
const folders = vscode.workspace.workspaceFolders;
329+
330+
// make sure we have workspace folders
331+
if (folders === undefined) {
332+
vscode.window.showInformationMessage(
333+
IDL_TRANSLATION.commands.notifications.initConfig.noWorkspaceOpen
334+
);
335+
return false;
336+
}
337+
// filter out folders that have existing idl.json
338+
const checkFolders = folders.map((folder) =>
339+
CleanPath(folder.uri.fsPath)
340+
);
341+
342+
// target is what we return
343+
const res = await vscode.window.showQuickPick(
344+
checkFolders.map((folder) => {
345+
return {
346+
label: basename(folder),
347+
description: folder,
348+
target: folder, // return value
349+
};
350+
}),
351+
{
352+
title:
353+
IDL_TRANSLATION.commands.notifications.formatWorkspace
354+
.pickWorkspace,
355+
canPickMany: false,
356+
}
357+
);
358+
359+
// make sure we have a folder
360+
if (res !== undefined) {
361+
VSCodeTelemetryLogger(USAGE_METRIC_LOOKUP.RUN_COMMAND, {
362+
idl_command: IDL_COMMANDS.CODE.FORMAT_WORKSPACE,
363+
});
364+
365+
// format and get response
366+
const resp = await LANGUAGE_SERVER_MESSENGER.sendRequest(
367+
LANGUAGE_SERVER_MESSAGE_LOOKUP.FORMAT_WORKSPACE,
368+
{ folders: [res.target] }
369+
);
370+
371+
// if we have failures alert user
372+
if (resp.failures.length > 0) {
373+
IDL_LOGGER.log({
374+
type: 'warn',
375+
content: [
376+
IDL_TRANSLATION.commands.notifications.formatWorkspace
377+
.notAllFilesFormatted,
378+
resp.failures,
379+
],
380+
alert:
381+
IDL_TRANSLATION.commands.notifications.formatWorkspace
382+
.notAllFilesFormatted,
383+
});
384+
}
385+
}
386+
} catch (err) {
387+
LogCommandError(
388+
'Error while executing command to format files in workspace',
389+
err,
390+
cmdErrors.code.formatWorkspace
391+
);
392+
}
393+
}
394+
)
395+
);
396+
317397
ctx.subscriptions.push(
318398
vscode.commands.registerCommand(
319399
IDL_COMMANDS.CODE.GENERATE_TASK,
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
export * from './lib/lsp-messages.interface';
2+
export * from './lib/message-name-normalizer';
13
export * from './lib/messages/folder-delete.message.interface';
4+
export * from './lib/messages/formatting-messages.interface';
25
export * from './lib/messages/generate-task.message.interface';
36
export * from './lib/messages/indexing.message.interface';
4-
export * from './lib/lsp-messages.interface';
5-
export * from './lib/message-name-normalizer';
67
export * from './lib/messages/migrate-code.message.interface';
78
export * from './lib/messages/notebook-to-pro-code.message.interface';
8-
export * from './lib/parse-server-message';
99
export * from './lib/messages/rename.message.interface';
1010
export * from './lib/messages/retrieve-docs.message.interface';
11-
export * from './lib/serialize-server-message';
1211
export * from './lib/messages/workspace-config.message.interface';
12+
export * from './lib/parse-server-message';
13+
export * from './lib/serialize-server-message';

libs/vscode/events/messages/src/lib/lsp-messages.interface.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import {
99
import {
1010
AddDocsMessage,
1111
FormatFileMessage,
12+
FormatWorkspaceMessage,
13+
FormatWorkspacePayload,
14+
FormatWorkspaceResponse,
1215
} from './messages/formatting-messages.interface';
1316
import {
1417
GenerateTaskMessage,
@@ -29,6 +32,10 @@ import {
2932
INotebookToProCodeResponse,
3033
NotebookToProCodeMessage,
3134
} from './messages/notebook-to-pro-code.message.interface';
35+
import {
36+
ProgressMessage,
37+
ProgressMessagePayload,
38+
} from './messages/progress.message.interface';
3239
import {
3340
FileRenameMessage,
3441
IFileRenamePayload,
@@ -51,13 +58,15 @@ export type LanguageServerMessage =
5158
| AddDocsMessage
5259
| FileRenameMessage
5360
| FormatFileMessage
61+
| FormatWorkspaceMessage
5462
| FolderDeleteMessage
5563
| GenerateTaskMessage
5664
| IndexingMessage
5765
| InitWorkspaceConfigMessage
5866
| LoggingMessage
5967
| MigrateCodeLSPMessage
6068
| NotebookToProCodeMessage
69+
| ProgressMessage
6170
| RetrieveDocsMessage
6271
| UsageMetricLSPMessage
6372
| WorkspaceConfigMessage;
@@ -72,6 +81,8 @@ export type LanguageServerPayload<T extends LanguageServerMessage> =
7281
? IFolderDeletePayload
7382
: T extends FormatFileMessage
7483
? DocumentFormattingParams
84+
: T extends FormatWorkspaceMessage
85+
? FormatWorkspacePayload
7586
: T extends GenerateTaskMessage
7687
? IGenerateTaskPayload
7788
: T extends IndexingMessage
@@ -86,6 +97,8 @@ export type LanguageServerPayload<T extends LanguageServerMessage> =
8697
? INotebookToProCodePayload
8798
: T extends RetrieveDocsMessage
8899
? IRetrieveDocsPayload
100+
: T extends ProgressMessage
101+
? ProgressMessagePayload
89102
: T extends UsageMetricLSPMessage
90103
? IUsageMetricAndPayload<UsageMetric>
91104
: T extends WorkspaceConfigMessage
@@ -94,12 +107,14 @@ export type LanguageServerPayload<T extends LanguageServerMessage> =
94107

95108
/** Strictly typed payloads to/from the language server */
96109
export type LanguageServerResponse<T extends LanguageServerMessage> =
97-
T extends RetrieveDocsMessage
98-
? IRetrieveDocsResponse
110+
T extends FormatWorkspaceMessage
111+
? FormatWorkspaceResponse
99112
: T extends MigrateCodeLSPMessage
100113
? MigrateCodeLSPResponse
101114
: T extends NotebookToProCodeMessage
102115
? INotebookToProCodeResponse
116+
: T extends RetrieveDocsMessage
117+
? IRetrieveDocsResponse
103118
: any;
104119

105120
/** Strictly typed lookup of language server messages */
@@ -112,6 +127,8 @@ export interface ILanguageServerMessages {
112127
FOLDER_DELETE: FolderDeleteMessage;
113128
/** Message to specify that we are formatting a file */
114129
FORMAT_FILE: FormatFileMessage;
130+
/** Message to specify that we are formatting files in a workspace */
131+
FORMAT_WORKSPACE: FormatWorkspaceMessage;
115132
/** Message for generating tasks */
116133
GENERATE_TASK: GenerateTaskMessage;
117134
/** When we index or finish indexing folders */
@@ -124,6 +141,8 @@ export interface ILanguageServerMessages {
124141
MIGRATE_CODE: MigrateCodeLSPMessage;
125142
/** Convert notebooks to PRO code */
126143
NOTEBOOK_TO_PRO_CODE: NotebookToProCodeMessage;
144+
/** Progress message */
145+
PROGRESS: ProgressMessage;
127146
/** Message to retrieve docs */
128147
RETRIEVE_DOCS: RetrieveDocsMessage;
129148
/** Message to update workspace config */
@@ -143,12 +162,14 @@ export const LANGUAGE_SERVER_MESSAGE_LOOKUP: ILanguageServerMessages = {
143162
FILE_RENAME: 'textDocument/didRename',
144163
FOLDER_DELETE: 'will-delete-folders',
145164
FORMAT_FILE: 'format-file',
165+
FORMAT_WORKSPACE: 'format-workspace',
146166
GENERATE_TASK: 'generate/task',
147167
INDEXING: 'indexing',
148168
INIT_WORKSPACE_CONFIG: 'init-workspace-config',
149169
LOG: 'log',
150170
MIGRATE_CODE: 'migrate-code',
151171
NOTEBOOK_TO_PRO_CODE: 'notebook/to-pro-code',
172+
PROGRESS: 'progress',
152173
RETRIEVE_DOCS: 'retrieve-docs',
153174
USAGE_METRIC: 'usage-metric-lsp',
154175
WORKSPACE_CONFIG: 'workspace-config',

libs/vscode/events/server/src/lib/vscode-server-event-manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class VSCodeServerEventManager {
2727
}
2828

2929
/**
30-
* Send message to the language server
30+
* Send message to the VSCode Client
3131
*/
3232
sendNotification<T extends LanguageServerMessage>(
3333
message: T,

0 commit comments

Comments
 (0)