@@ -5,7 +5,7 @@ import { CodeActionParams, LanguageClient } from 'vscode-languageclient';
55import { Commands } from './commands' ;
66import { applyWorkspaceEdit } from './extension' ;
77import { ListOverridableMethodsRequest , AddOverridableMethodsRequest , CheckHashCodeEqualsStatusRequest , GenerateHashCodeEqualsRequest ,
8- OrganizeImportsRequest , ImportCandidate , ImportSelection , GenerateToStringRequest , CheckToStringStatusRequest , VariableBinding , ResolveUnimplementedAccessorsRequest , GenerateAccessorsRequest , CheckConstructorStatusRequest , GenerateConstructorsRequest } from './protocol' ;
8+ OrganizeImportsRequest , ImportCandidate , ImportSelection , GenerateToStringRequest , CheckToStringStatusRequest , VariableBinding , ResolveUnimplementedAccessorsRequest , GenerateAccessorsRequest , CheckConstructorStatusRequest , GenerateConstructorsRequest , CheckDelegateMethodsStatusRequest , GenerateDelegateMethodsRequest } from './protocol' ;
99
1010export function registerCommands ( languageClient : LanguageClient , context : ExtensionContext ) {
1111 registerOverrideMethodsCommand ( languageClient , context ) ;
@@ -15,6 +15,7 @@ export function registerCommands(languageClient: LanguageClient, context: Extens
1515 registerGenerateToStringCommand ( languageClient , context ) ;
1616 registerGenerateAccessorsCommand ( languageClient , context ) ;
1717 registerGenerateConstructorsCommand ( languageClient , context ) ;
18+ registerGenerateDelegateMethodsCommand ( languageClient , context ) ;
1819}
1920
2021function registerOverrideMethodsCommand ( languageClient : LanguageClient , context : ExtensionContext ) : void {
@@ -295,3 +296,64 @@ function registerGenerateConstructorsCommand(languageClient: LanguageClient, con
295296 applyWorkspaceEdit ( workspaceEdit , languageClient ) ;
296297 } ) ) ;
297298}
299+
300+ function registerGenerateDelegateMethodsCommand ( languageClient : LanguageClient , context : ExtensionContext ) : void {
301+ context . subscriptions . push ( commands . registerCommand ( Commands . GENERATE_DELEGATE_METHODS_PROMPT , async ( params : CodeActionParams ) => {
302+ const status = await languageClient . sendRequest ( CheckDelegateMethodsStatusRequest . type , params ) ;
303+ if ( ! status || ! status . delegateFields || ! status . delegateFields . length ) {
304+ window . showWarningMessage ( "All delegatable methods are already implemented." ) ;
305+ return ;
306+ }
307+
308+ let selectedDelegateField = status . delegateFields [ 0 ] ;
309+ if ( status . delegateFields . length > 1 ) {
310+ const fieldItems = status . delegateFields . map ( ( delegateField ) => {
311+ return {
312+ label : `${ delegateField . field . name } : ${ delegateField . field . type } ` ,
313+ originalField : delegateField ,
314+ } ;
315+ } ) ;
316+ const selectedFieldItem = await window . showQuickPick ( fieldItems , {
317+ placeHolder : 'Select target to generate delegates for.' ,
318+ } ) ;
319+ if ( ! selectedFieldItem ) {
320+ return ;
321+ }
322+
323+ selectedDelegateField = selectedFieldItem . originalField ;
324+ }
325+
326+ let delegateEntryItems = selectedDelegateField . delegateMethods . map ( delegateMethod => {
327+ return {
328+ label : `${ selectedDelegateField . field . name } .${ delegateMethod . name } (${ delegateMethod . parameters . join ( ',' ) } )` ,
329+ originalField : selectedDelegateField . field ,
330+ originalMethod : delegateMethod ,
331+ }
332+ } ) ;
333+
334+ if ( ! delegateEntryItems . length ) {
335+ window . showWarningMessage ( "All delegatable methods are already implemented." ) ;
336+ return ;
337+ }
338+
339+ const selectedDelegateEntryItems = await window . showQuickPick ( delegateEntryItems , {
340+ canPickMany : true ,
341+ placeHolder : 'Select methods to generate delegates for.' ,
342+ } ) ;
343+ if ( ! selectedDelegateEntryItems || ! selectedDelegateEntryItems . length ) {
344+ return ;
345+ }
346+
347+ const delegateEntries = selectedDelegateEntryItems . map ( item => {
348+ return {
349+ field : item . originalField ,
350+ delegateMethod : item . originalMethod ,
351+ } ;
352+ } ) ;
353+ const workspaceEdit = await languageClient . sendRequest ( GenerateDelegateMethodsRequest . type , {
354+ context : params ,
355+ delegateEntries,
356+ } ) ;
357+ applyWorkspaceEdit ( workspaceEdit , languageClient ) ;
358+ } ) ) ;
359+ }
0 commit comments