docs: def get_next_mangled_name(self):
          """
          1. Do not shadow a mangled name from a parent scope
             if we reference the original name from that scope
             in this scope or any sub-scope.
  
          2. Do not shadow an original name from a parent scope
             if it's not mangled and we reference it in this scope
             or any sub-scope.
  
          """
          while True:
              mangled = next(self.base54)
  
              # case 1
              ancestor = self._get_scope_with_mangled(mangled)
              if (ancestor is not None
                  and self.refs.get(ancestor.rev_mangled[mangled]) is ancestor
                  ):
                  continue
  
              # case 2
              ancestor = self._get_scope_with_symbol(mangled)
              if (ancestor is not None
                  and self.refs.get(mangled) is ancestor
                  and mangled not in ancestor.mangled
                  ):
                  continue
  
              # make sure a new mangled name is not a reserved word
              if mangled.upper() in Lexer.keywords:
                  continue
  
              return mangled