@@ -5,6 +5,7 @@ import { DebugSessionTracker } from "../debug-session-tracker";
55import { DisposableContext } from "../disposable-context" ;
66
77import { DAPSymbolType } from ".." ;
8+ import { getDefaultConfigKey } from "../debug-configuration-provider" ;
89
910export class SymbolsProvider extends DisposableContext {
1011 constructor (
@@ -16,54 +17,64 @@ export class SymbolsProvider extends DisposableContext {
1617 this . pushSubscription ( vscode . commands . registerCommand (
1718 "lldb-dap.debug.showSymbols" ,
1819 ( ) => {
19- this . SelectModuleAndShowSymbols ( ) ;
20+ const session = vscode . debug . activeDebugSession ;
21+ if ( ! session ) return ;
22+
23+ this . SelectModuleAndShowSymbols ( session ) ;
2024 } ,
2125 ) ) ;
2226
2327 this . pushSubscription ( vscode . commands . registerCommand (
2428 "lldb-dap.modules.showSymbols" ,
2529 ( moduleItem : DebugProtocol . Module ) => {
2630 const session = vscode . debug . activeDebugSession ;
27- if ( ! session ) {
28- return ;
29- }
31+ if ( ! session ) return ;
32+
3033 this . showSymbolsForModule ( session , moduleItem ) ;
3134 } ,
3235 ) ) ;
33- }
3436
35- static async doesServerSupportSymbolsRequest ( session : vscode . DebugSession ) : Promise < boolean > {
36- try {
37- const dummyArguments = { _dummy : true } ;
38- await session . customRequest ( "moduleSymbols" , dummyArguments ) ;
39- return true ;
40- } catch ( _error ) {
41- return false ;
42- }
37+ this . tracker . onDidInitializeSession ( ( session ) => {
38+ this . GetLLDBServerVersion ( session ) . then ( ( version ) => {
39+ if ( version !== undefined ) {
40+ if ( version [ 0 ] >= 23 ) {
41+ vscode . commands . executeCommand ( "setContext" , "lldb-dap.supportsModuleSymbolsRequest" , true ) ;
42+ }
43+ }
44+ } ) ;
45+ } ) ;
46+
47+ this . tracker . onDidExitSession ( ( session ) => {
48+ vscode . commands . executeCommand ( "setContext" , "lldb-dap.supportsModuleSymbolsRequest" , false ) ;
49+ } ) ;
4350 }
4451
45- private async SelectModuleAndShowSymbols ( ) {
46- const session = vscode . debug . activeDebugSession ;
47- if ( ! session ) {
48- return ;
49- }
52+ private async GetLLDBServerVersion ( session : vscode . DebugSession ) : Promise < [ number , number , number ] | undefined > {
53+ const commandEscapePrefix = session . configuration . commandEscapePrefix || getDefaultConfigKey ( "commandEscapePrefix" ) ;
54+ const response = await session . customRequest ( "evaluate" , { expression : commandEscapePrefix + "version" , context : "repl" } ) ;
5055
51- if ( ! await SymbolsProvider . doesServerSupportSymbolsRequest ( session ) ) {
52- vscode . window . showErrorMessage ( "The debug adapter does not support symbol requests." ) ;
53- return ;
54- }
56+ const versionLine = response . result ?. split ( "\n" ) [ 0 ] ;
57+ if ( ! versionLine ) return undefined ;
58+
59+ const versionMatch = versionLine . match ( / ( \d + ) \. ( \d + ) \. ( \d + ) / ) ;
60+ if ( ! versionMatch ) return undefined ;
5561
62+ const [ major , minor , patch ] = versionMatch . slice ( 1 , 4 ) . map ( Number ) ;
63+ return [ major , minor , patch ] ;
64+ }
65+
66+ private async SelectModuleAndShowSymbols ( session : vscode . DebugSession ) {
5667 const modules = this . tracker . debugSessionModules ( session ) ;
5768 if ( ! modules || modules . length === 0 ) {
58- return ;
69+ return ;
5970 }
6071
6172 // Let the user select a module to show symbols for
6273 const selectedModule = await vscode . window . showQuickPick ( modules . map ( m => new ModuleQuickPickItem ( m ) ) , {
6374 placeHolder : "Select a module to show symbols for"
6475 } ) ;
6576 if ( ! selectedModule ) {
66- return ;
77+ return ;
6778 }
6879
6980 this . showSymbolsForModule ( session , selectedModule . module ) ;
@@ -86,8 +97,7 @@ export class SymbolsProvider extends DisposableContext {
8697
8798 private async getSymbolsForModule ( session : vscode . DebugSession , moduleId : string ) : Promise < DAPSymbolType [ ] > {
8899 console . log ( `Getting symbols for module: ${ moduleId } ` ) ;
89- const symbols_response : { symbols : Array < DAPSymbolType > } = await session . customRequest ( "moduleSymbols" , { moduleId } ) ;
90-
100+ const symbols_response : { symbols : Array < DAPSymbolType > } = await session . customRequest ( "moduleSymbols" , { moduleId, moduleName : '' } ) ;
91101
92102 return symbols_response ?. symbols || [ ] ;
93103 }
0 commit comments