@@ -31,6 +31,8 @@ export interface GDBTargetConfigurationSubProvider {
3131 provider : vscode . DebugConfigurationProvider ;
3232}
3333
34+ type ResolverType = 'resolveDebugConfiguration' | 'resolveDebugConfigurationWithSubstitutedVariables' ;
35+
3436const SUPPORTED_SUBPROVIDERS : GDBTargetConfigurationSubProvider [ ] = [
3537 { serverRegExp : PYOCD_SERVER_TYPE_REGEXP , provider : new PyocdConfigurationProvider ( ) } ,
3638 { serverRegExp : JLINK_SERVER_TYPE_REGEXP , provider : new JlinkConfigurationProvider ( ) } ,
@@ -49,47 +51,77 @@ export class GDBTargetConfigurationProvider implements vscode.DebugConfiguration
4951 ) ;
5052 }
5153
52- private isRelevantSubprovider ( serverType : string , subProvider : GDBTargetConfigurationSubProvider ) : boolean {
54+ private isRelevantSubprovider ( resolverType : ResolverType , serverType : string , subProvider : GDBTargetConfigurationSubProvider ) : boolean {
5355 const serverTypeMatch = subProvider . serverRegExp . test ( serverType ) ;
54- const hasResolverFunction = ! ! subProvider . provider . resolveDebugConfigurationWithSubstitutedVariables ;
56+ const hasResolverFunction = ! ! subProvider . provider [ resolverType ] ;
5557 return serverTypeMatch && hasResolverFunction ;
5658 }
5759
58- private getRelevantSubproviders ( serverType ?: string ) : GDBTargetConfigurationSubProvider [ ] {
60+ private getRelevantSubproviders ( resolverType : ResolverType , serverType ?: string ) : GDBTargetConfigurationSubProvider [ ] {
5961 if ( ! serverType ) {
6062 return [ ] ;
6163 }
62- return this . subProviders . filter ( subProvider => this . isRelevantSubprovider ( serverType , subProvider ) ) ;
64+ return this . subProviders . filter ( subProvider => this . isRelevantSubprovider ( resolverType , serverType , subProvider ) ) ;
65+ }
66+
67+ private getRelevantSubprovider ( resolverType : ResolverType , serverType ?: string ) : GDBTargetConfigurationSubProvider | undefined {
68+ const subproviders = this . getRelevantSubproviders ( resolverType , serverType ) ;
69+ if ( ! subproviders . length ) {
70+ logger . debug ( 'No relevant configuration subproviders found' ) ;
71+ return undefined ;
72+ }
73+ if ( subproviders . length > 1 ) {
74+ logger . warn ( 'Multiple configuration subproviders detected. Using first in list:' ) ;
75+ subproviders . forEach ( ( subprovider , index ) => logger . warn ( `#${ index } : '${ subprovider . serverRegExp } '` ) ) ;
76+ }
77+ return subproviders [ 0 ] ;
6378 }
6479
65- public async resolveDebugConfigurationWithSubstitutedVariables (
80+ private async resolveDebugConfigurationByResolverType (
81+ resolverType : ResolverType ,
6682 folder : vscode . WorkspaceFolder | undefined ,
6783 debugConfiguration : vscode . DebugConfiguration ,
6884 token ?: vscode . CancellationToken
6985 ) : Promise < vscode . DebugConfiguration | null | undefined > {
70- logger . debug ( ' Check for relevant configuration subproviders' ) ;
86+ logger . debug ( ` ${ resolverType } : Check for relevant configuration subproviders` ) ;
7187 const gdbTargetConfig : GDBTargetConfiguration = debugConfiguration ;
7288 const gdbServerType = gdbTargetConfig . target ?. server ;
73- const relevantSubproviders = this . getRelevantSubproviders ( gdbServerType ) ;
74- if ( ! relevantSubproviders . length ) {
75- logger . debug ( 'No relevant configuration subproviders found' ) ;
89+ const subprovider = this . getRelevantSubprovider ( resolverType , gdbServerType ) ;
90+ if ( ! subprovider ) {
7691 return debugConfiguration ;
7792 }
78- if ( relevantSubproviders . length > 1 ) {
79- logger . warn ( `Multiple subproviders detected for '${ debugConfiguration . request } ' configuration '${ debugConfiguration . name } '. Using first in list:` ) ;
80- relevantSubproviders . forEach ( ( subprovider , index ) => logger . warn ( `#${ index } : '${ subprovider . serverRegExp } '` ) ) ;
81- }
82- const selectedSubprovider = relevantSubproviders [ 0 ] ;
83- if ( ! selectedSubprovider . provider . resolveDebugConfigurationWithSubstitutedVariables ) {
84- logger . debug ( `Subprovider '${ selectedSubprovider . serverRegExp } ' does not implement 'resolveDebugConfigurationWithSubstitutedVariables'.` ) ;
93+ if ( ! subprovider . provider [ resolverType ] ) {
94+ logger . debug ( `${ resolverType } : Subprovider '${ subprovider . serverRegExp } ' does not implement '${ resolverType } '.` ) ;
8595 return debugConfiguration ;
8696 }
87- logger . debug ( `Resolve config with subprovider '${ selectedSubprovider . serverRegExp } '` ) ;
88- const resolvedConfig = await selectedSubprovider . provider . resolveDebugConfigurationWithSubstitutedVariables ( folder , debugConfiguration , token ) ;
97+ logger . debug ( `${ resolverType } : Resolve config with subprovider '${ subprovider . serverRegExp } '` ) ;
98+ logger . debug ( `${ resolverType } : original config:` ) ;
99+ logger . debug ( JSON . stringify ( debugConfiguration ) ) ;
100+ const resolvedConfig = await subprovider . provider [ resolverType ] ( folder , debugConfiguration , token ) ;
89101 if ( ! resolvedConfig ) {
90- logger . error ( `Resolving config failed with subprovider '${ selectedSubprovider . serverRegExp } '` ) ;
102+ logger . error ( `${ resolverType } : Resolving config failed with subprovider '${ subprovider . serverRegExp } '` ) ;
91103 }
104+ logger . debug ( `${ resolverType } : resolved config:` ) ;
105+ logger . debug ( JSON . stringify ( resolvedConfig ) ) ;
106+ logger . debug ( `${ resolverType } : expected server command line:` ) ;
107+ const resolvedGDBConfig = resolvedConfig as GDBTargetConfiguration ;
108+ logger . debug ( `${ resolvedGDBConfig . target ?. server } ${ resolvedGDBConfig . target ?. serverParameters ?. join ( ' ' ) } ` ) ;
92109 return resolvedConfig ;
93110 }
94111
112+ public resolveDebugConfiguration (
113+ folder : vscode . WorkspaceFolder | undefined ,
114+ debugConfiguration : vscode . DebugConfiguration ,
115+ token ?: vscode . CancellationToken
116+ ) : Promise < vscode . DebugConfiguration | null | undefined > {
117+ return this . resolveDebugConfigurationByResolverType ( 'resolveDebugConfiguration' , folder , debugConfiguration , token ) ;
118+ }
119+
120+ public resolveDebugConfigurationWithSubstitutedVariables (
121+ folder : vscode . WorkspaceFolder | undefined ,
122+ debugConfiguration : vscode . DebugConfiguration ,
123+ token ?: vscode . CancellationToken
124+ ) : Promise < vscode . DebugConfiguration | null | undefined > {
125+ return this . resolveDebugConfigurationByResolverType ( 'resolveDebugConfigurationWithSubstitutedVariables' , folder , debugConfiguration , token ) ;
126+ }
95127}
0 commit comments