parameters: (context, sequence)
return_statement: return added_types
docstring: Checks if a `Array` has "add" (append, insert, extend) statements:
  
      >>> a = [""]
      >>> a.append(1)
docstring_summary: Checks if a `Array` has "add" (append, insert, extend) statements:
docstring_tokens: Checks if a Array has add ( append insert extend ) statements :
function: def _check_array_additions(context, sequence):
      """
      Checks if a `Array` has "add" (append, insert, extend) statements:
  
      >>> a = [""]
      >>> a.append(1)
      """
      from jedi.evaluate import arguments
  
      debug.dbg('Dynamic array search for %s' % sequence, color='MAGENTA')
      module_context = context.get_root_context()
      if not settings.dynamic_array_additions or isinstance(module_context, compiled.CompiledObject):
          debug.dbg('Dynamic array search aborted.', color='MAGENTA')
          return ContextSet()
  
      def find_additions(context, arglist, add_name):
          params = list(arguments.TreeArguments(context.evaluator, context, arglist).unpack())
          result = set()
          if add_name in ['insert']:
              params = params[1:]
          if add_name in ['append', 'add', 'insert']:
              for key, whatever in params:
                  result.add(whatever)
          elif add_name in ['extend', 'update']:
              for key, lazy_context in params:
                  result |= set(lazy_context.infer().iterate())
          return result
  
      temp_param_add, settings.dynamic_params_for_other_modules = \
          settings.dynamic_params_for_other_modules, False
  
      is_list = sequence.name.string_name == 'list'
      search_names = (['append', 'extend', 'insert'] if is_list else ['add', 'update'])
  
      added_types = set()
      for add_name in search_names:
          try:
              possible_names = module_context.tree_node.get_used_names()[add_name]
          except KeyError:
              continue
          else:
              for name in possible_names:
                  context_node = context.tree_node
                  if not (context_node.start_pos < name.start_pos < context_node.end_pos):
                      continue
                  trailer = name.parent
                  power = trailer.parent
                  trailer_pos = power.children.index(trailer)
                  try:
                      execution_trailer = power.children[trailer_pos + 1]
                  except IndexError:
                      continue
                  else:
                      if execution_trailer.type != 'trailer' \
                              or execution_trailer.children[0] != '(' \
                              or execution_trailer.children[1] == ')':
                          continue
  
                  random_context = context.create_context(name)
  
                  with recursion.execution_allowed(context.evaluator, power) as allowed:
                      if allowed:
                          found = evaluate_call_of_leaf(
                              random_context,
                              name,
                              cut_own_trailer=True
                          )
                          if sequence in found:
                              # The arrays match. Now add the results
                              added_types |= find_additions(
                                  random_context,
                                  execution_trailer.children[1],
                                  add_name
                              )
  
      # reset settings
      settings.dynamic_params_for_other_modules = temp_param_add
      debug.dbg('Dynamic array result %s' % added_types, color='MAGENTA')
      return added_types
function_tokens: def _check_array_additions ( context , sequence ) : from jedi . evaluate import arguments debug . dbg ( 'Dynamic array search for %s' % sequence , color = 'MAGENTA' ) module_context = context . get_root_context ( ) if not settings . dynamic_array_additions or isinstance ( module_context , compiled . CompiledObject ) : debug . dbg ( 'Dynamic array search aborted.' , color = 'MAGENTA' ) return ContextSet ( ) def find_additions ( context , arglist , add_name ) : params = list ( arguments . TreeArguments ( context . evaluator , context , arglist ) . unpack ( ) ) result = set ( ) if add_name in [ 'insert' ] : params = params [ 1 : ] if add_name in [ 'append' , 'add' , 'insert' ] : for key , whatever in params : result . add ( whatever ) elif add_name in [ 'extend' , 'update' ] : for key , lazy_context in params : result |= set ( lazy_context . infer ( ) . iterate ( ) ) return result temp_param_add , settings . dynamic_params_for_other_modules = settings . dynamic_params_for_other_modules , False is_list = sequence . name . string_name == 'list' search_names = ( [ 'append' , 'extend' , 'insert' ] if is_list else [ 'add' , 'update' ] ) added_types = set ( ) for add_name in search_names : try : possible_names = module_context . tree_node . get_used_names ( ) [ add_name ] except KeyError : continue else : for name in possible_names : context_node = context . tree_node if not ( context_node . start_pos < name . start_pos < context_node . end_pos ) : continue trailer = name . parent power = trailer . parent trailer_pos = power . children . index ( trailer ) try : execution_trailer = power . children [ trailer_pos + 1 ] except IndexError : continue else : if execution_trailer . type != 'trailer' or execution_trailer . children [ 0 ] != '(' or execution_trailer . children [ 1 ] == ')' : continue random_context = context . create_context ( name ) with recursion . execution_allowed ( context . evaluator , power ) as allowed : if allowed : found = evaluate_call_of_leaf ( random_context , name , cut_own_trailer = True ) if sequence in found : # The arrays match. Now add the results added_types |= find_additions ( random_context , execution_trailer . children [ 1 ] , add_name ) # reset settings settings . dynamic_params_for_other_modules = temp_param_add debug . dbg ( 'Dynamic array result %s' % added_types , color = 'MAGENTA' ) return added_types