docs: def get_name(self, seq=None):
          """Returns ([tokens], next_token_info)."""
          if seq is not None:
              it = iter(seq)
  
              def get_next_token():
                  return next(it)
          else:
              get_next_token = self._get_next_token
  
          next_token = get_next_token()
          tokens = []
          last_token_was_name = False
          while (next_token.token_type == tokenize.NAME or
                 (next_token.token_type == tokenize.SYNTAX and
                  next_token.name in ('::', '<'))):
              # Two NAMEs in a row means the identifier should terminate.
              # It's probably some sort of variable declaration.
              if last_token_was_name and next_token.token_type == tokenize.NAME:
                  break
              last_token_was_name = next_token.token_type == tokenize.NAME
              tokens.append(next_token)
              # Handle templated names.
              if next_token.name == '<':
                  tokens.extend(self._get_matching_char('<', '>',
                                                        get_next_token))
                  last_token_was_name = True
              next_token = get_next_token()
          return tokens, next_token