@@ -335,6 +335,44 @@ def list_attributes(self, obj):
335335 return dir (obj )
336336
337337
338+ class ArrayObjectMembersCompletion (BaseCompletionType ):
339+
340+ def __init__ (self , shown_before_tab = True , mode = SIMPLE ):
341+ self ._shown_before_tab = shown_before_tab
342+ self .completer = AttrCompletion (mode = mode )
343+
344+ def matches (self , cursor_offset , line , ** kwargs ):
345+ if 'locals_' not in kwargs :
346+ return None
347+ locals_ = kwargs ['locals_' ]
348+
349+ r = self .locate (cursor_offset , line )
350+ if r is None :
351+ return None
352+ member_part = r [2 ]
353+ _ , _ , dexpr = lineparts .current_array_with_indexer (cursor_offset , line )
354+ try :
355+ locals_ ['temp_val_from_array' ] = safe_eval (dexpr , locals_ )
356+ except (EvaluationError , IndexError ):
357+ return set ()
358+
359+ temp_line = line .replace (member_part , 'temp_val_from_array.' )
360+
361+ matches = self .completer .matches (len (temp_line ), temp_line , ** kwargs )
362+ matches_with_correct_name = \
363+ set (match .replace ('temp_val_from_array.' , member_part ) for match in matches )
364+
365+ del locals_ ['temp_val_from_array' ]
366+
367+ return matches_with_correct_name
368+
369+ def locate (self , current_offset , line ):
370+ return lineparts .current_array_item_member_name (current_offset , line )
371+
372+ def format (self , match ):
373+ return after_last_dot (match )
374+
375+
338376class DictKeyCompletion (BaseCompletionType ):
339377
340378 def matches (self , cursor_offset , line , ** kwargs ):
@@ -565,6 +603,7 @@ def get_default_completer(mode=SIMPLE):
565603 MagicMethodCompletion (mode = mode ),
566604 MultilineJediCompletion (mode = mode ),
567605 GlobalCompletion (mode = mode ),
606+ ArrayObjectMembersCompletion (mode = mode ),
568607 CumulativeCompleter ((AttrCompletion (mode = mode ),
569608 ParameterNameCompletion (mode = mode )),
570609 mode = mode )
0 commit comments