2727
2828namespace Microsoft . Python . LanguageServer . Implementation {
2929 public sealed partial class Server {
30+ private static int _symbolHierarchyDepthLimit = 10 ;
3031 private static int _symbolHierarchyMaxSymbols = 1000 ;
3132
3233 public override async Task < SymbolInformation [ ] > WorkspaceSymbols ( WorkspaceSymbolParams @params , CancellationToken cancellationToken ) {
@@ -73,8 +74,9 @@ private static async Task<List<IMemberResult>> GetModuleVariablesAsync(ProjectEn
7374 }
7475
7576 private static IEnumerable < IMemberResult > GetModuleVariables ( ProjectEntry entry , GetMemberOptions opts , string prefix , IModuleAnalysis analysis ) {
76- var all = analysis . GetAllMembers ( SourceLocation . None , opts ) ;
77- return all
77+ var breadthFirst = analysis . Scope . TraverseBreadthFirst ( s => s . Children ) ;
78+ var all = breadthFirst . SelectMany ( c => analysis . GetAllAvailableMembersFromScope ( c , opts ) ) ;
79+ var result = all
7880 . Where ( m => {
7981 if ( m . Values . Any ( v => v . DeclaringModule == entry || v . Locations . Any ( l => l . DocumentUri == entry . DocumentUri ) ) ) {
8082 if ( string . IsNullOrEmpty ( prefix ) || m . Name . StartsWithOrdinal ( prefix , ignoreCase : true ) ) {
@@ -83,17 +85,10 @@ private static IEnumerable<IMemberResult> GetModuleVariables(ProjectEntry entry,
8385 }
8486 return false ;
8587 } )
86- . Take ( _symbolHierarchyMaxSymbols )
87- . Concat ( GetChildScopesVariables ( analysis , analysis . Scope , opts ) )
8888 . Take ( _symbolHierarchyMaxSymbols ) ;
89+ return result ;
8990 }
9091
91- private static IEnumerable < IMemberResult > GetChildScopesVariables ( IModuleAnalysis analysis , IScope scope , GetMemberOptions opts )
92- => scope . TraverseBreadthFirst ( s => s . Children ) . SelectMany ( c => GetScopeVariables ( analysis , c , opts ) ) ;
93-
94- private static IEnumerable < IMemberResult > GetScopeVariables ( IModuleAnalysis analysis , IScope scope , GetMemberOptions opts )
95- => analysis . GetAllAvailableMembersFromScope ( scope , opts ) . Concat ( GetChildScopesVariables ( analysis , scope , opts ) ) ;
96-
9792 private SymbolInformation ToSymbolInformation ( IMemberResult m ) {
9893 var res = new SymbolInformation {
9994 name = m . Name ,
@@ -118,9 +113,8 @@ private SymbolInformation ToSymbolInformation(IMemberResult m) {
118113 private DocumentSymbol [ ] ToDocumentSymbols ( List < IMemberResult > members ) {
119114 var topLevel = new List < IMemberResult > ( ) ;
120115 var childMap = new Dictionary < IMemberResult , List < IMemberResult > > ( ) ;
121- var totalCount = 0 ;
122116
123- foreach ( var m in members . Take ( _symbolHierarchyMaxSymbols ) ) {
117+ foreach ( var m in members ) {
124118 var parent = members . FirstOrDefault ( x => x . Scope ? . Node == m . Scope ? . OuterScope ? . Node && x . Name == m . Scope ? . Name ) ;
125119 if ( parent != null ) {
126120 if ( ! childMap . TryGetValue ( parent , out var children ) ) {
@@ -132,18 +126,16 @@ private DocumentSymbol[] ToDocumentSymbols(List<IMemberResult> members) {
132126 }
133127 }
134128
135- var symbols = topLevel . SelectMany ( t => t
136- . TraverseBreadthFirst ( c => childMap . ContainsKey ( c ) ? childMap [ c ] : Enumerable . Empty < IMemberResult > ( ) )
137- . Take ( _symbolHierarchyMaxSymbols )
129+ var symbols = topLevel
138130 . GroupBy ( mr => mr . Name )
139131 . Select ( g => g . First ( ) )
140- . Select ( m => ToDocumentSymbol ( m , childMap ) ) )
132+ . Select ( m => ToDocumentSymbol ( m , childMap , 0 ) )
141133 . ToArray ( ) ;
142134
143135 return symbols ;
144136 }
145137
146- private DocumentSymbol ToDocumentSymbol ( IMemberResult m , Dictionary < IMemberResult , List < IMemberResult > > childMap ) {
138+ private DocumentSymbol ToDocumentSymbol ( IMemberResult m , Dictionary < IMemberResult , List < IMemberResult > > childMap , int currentDepth ) {
147139 var res = new DocumentSymbol {
148140 name = m . Name ,
149141 detail = m . Name ,
@@ -152,9 +144,9 @@ private DocumentSymbol ToDocumentSymbol(IMemberResult m, Dictionary<IMemberResul
152144 _functionKind = GetFunctionKind ( m )
153145 } ;
154146
155- if ( childMap . TryGetValue ( m , out var children ) ) {
147+ if ( childMap . TryGetValue ( m , out var children ) && currentDepth < _symbolHierarchyDepthLimit ) {
156148 res . children = children
157- . Select ( x => ToDocumentSymbol ( x , childMap ) )
149+ . Select ( x => ToDocumentSymbol ( x , childMap , currentDepth + 1 ) )
158150 . ToArray ( ) ;
159151 } else {
160152 res . children = Array . Empty < DocumentSymbol > ( ) ;
0 commit comments