code: def _complete_type_chain(self, symbol, fullsymbol):
          
          target, targmod = self._get_chain_parent_symbol(symbol, fullsymbol)
          if target is None:
              return {}
  
          result = {}
          #We might know what kind of symbol to limit the completion by depending on whether
          #it was preceded by a "call " for example. Check the context's el_call
          if symbol != "":
              if self.context.el_call != "sub":
                  for mkey in target.members:
                      if self._symbol_in(symbol, mkey):
                          result[mkey] = target.members[mkey]
  
              for ekey in target.executables:
                  if (self._symbol_in(symbol, ekey)):
                      if self.context.el_call == "sub":
                          if (isinstance(target.executables[ekey], Subroutine)):
                              result[ekey] = target.executables[ekey]
                      else:
                          if (isinstance(target.executables[ekey], Function)):
                              result[ekey] = target.executables[ekey]
          else:
              if self.context.el_call != "sub":
                  result.update(target.members)
                  subdict = {k: target.executables[k] for k in target.executables
                             if isinstance(target.executables[k].target, Function)}
                  result.update(subdict)
              else:
                  subdict = {k: target.executables[k] for k in target.executables
                             if isinstance(target.executables[k].target, Subroutine)}
                  result.update(subdict)
  
          return result
docs: Suggests completion for the end of a type chain.