def visit(self, node):
     source_code = self.context.source_code
     source_file = self.context.source_file
     try:
         if source_code and hasattr(node, 'lineno'):
             self._lineno = node.lineno
             self._col_offset = node.col_offset
         if anno.hasanno(node, anno.Basic.SKIP_PROCESSING):
             return node
         return super(Base, self).visit(node)
     except (ValueError, AttributeError, KeyError, NotImplementedError,
             AssertionError) as e:
         msg = '%s: %s\nOccurred at node:\n%s' % (
             e.__class__.__name__, str(e),
             pretty_printer.fmt(node, color=False))
         if source_code:
             line = source_code.splitlines()[self._lineno - 1]
         else:
             line = '<no source available>'
         six.reraise(
             PyFlowParseError,
             PyFlowParseError(
                 msg,
                 (source_file, self._lineno, self._col_offset + 1, line)),
             sys.exc_info()[2])
예제 #2
0
 def visit_FunctionDef(self, node):
     self.generic_visit(node)
     for dec in node.decorator_list:
         if isinstance(dec, gast.Call):
             dec = dec.func
         if not anno.hasanno(dec, 'live_val'):
             raise ValueError('Could not resolve decorator: %s' %
                              pretty_printer.fmt(dec))
         dec_value = anno.getanno(dec, 'live_val')
         if dec_value in self.remove_decorators:
             continue
         raise ValueError('Dont know how to convert decorators for now.')
     node.decorator_list = []
     return node
예제 #3
0
 def visit_FunctionDef(self, node):
   self.generic_visit(node)
   for dec in node.decorator_list:
     if isinstance(dec, gast.Call):
       dec = dec.func
     if not anno.hasanno(dec, 'live_val'):
       raise ValueError(
           'Could not resolve decorator: %s' % pretty_printer.fmt(dec))
     dec_value = anno.getanno(dec, 'live_val')
     if dec_value in self.remove_decorators:
       continue
     raise ValueError('Dont know how to convert decorators for now.')
   node.decorator_list = []
   return node
예제 #4
0
 def visit(self, node):
     try:
         if self._source and hasattr(node, 'lineno'):
             self._lineno = node.lineno
             self._col_offset = node.col_offset
         return super(Base, self).visit(node)
     except ValueError as e:
         msg = '%s\nOccurred at node:\n%s' % (str(e),
                                              pretty_printer.fmt(node))
         if self._source:
             line = self._source.splitlines()[self._lineno - 1]
         else:
             line = '<no source available>'
         raise PyFlowParseError(
             msg, (self._file, self._lineno, self._col_offset + 1, line))
예제 #5
0
 def visit_FunctionDef(self, node):
   self.generic_visit(node)
   kept_decorators = []
   for dec in node.decorator_list:
     if isinstance(dec, gast.Call):
       dec_func = dec.func
     else:
       dec_func = dec
     if not anno.hasanno(dec_func, 'live_val'):
       raise ValueError(
           'Could not resolve decorator: %s' % pretty_printer.fmt(dec_func))
     dec_value = anno.getanno(dec_func, 'live_val')
     if dec_value not in self.remove_decorators:
       kept_decorators.append(dec)
   node.decorator_list = kept_decorators
   return node
예제 #6
0
 def visit_FunctionDef(self, node):
     self.generic_visit(node)
     kept_decorators = []
     for dec in node.decorator_list:
         if isinstance(dec, gast.Call):
             dec_func = dec.func
         else:
             dec_func = dec
         if not anno.hasanno(dec_func, 'live_val'):
             raise ValueError('Could not resolve decorator: %s' %
                              pretty_printer.fmt(dec_func))
         dec_value = anno.getanno(dec_func, 'live_val')
         if dec_value not in self.remove_decorators:
             kept_decorators.append(dec)
     node.decorator_list = kept_decorators
     return node
예제 #7
0
 def visit(self, node):
   try:
     source_code = self.context.source_code
     source_file = self.context.source_file
     if source_code and hasattr(node, 'lineno'):
       self._lineno = node.lineno
       self._col_offset = node.col_offset
     return super(Base, self).visit(node)
   except ValueError as e:
     msg = '%s\nOccurred at node:\n%s' % (str(e), pretty_printer.fmt(node))
     if source_code:
       line = self._source.splitlines()[self._lineno - 1]
     else:
       line = '<no source available>'
     raise PyFlowParseError(
         msg, (source_file, self._lineno, self._col_offset + 1, line))
예제 #8
0
 def test_format(self):
     node = ast.FunctionDef(name='f',
                            args=ast.arguments(
                                args=[ast.Name(id='a', ctx=ast.Param())],
                                vararg=None,
                                kwarg=None,
                                defaults=[]),
                            body=[
                                ast.Return(
                                    ast.BinOp(op=ast.Add(),
                                              left=ast.Name(id='a',
                                                            ctx=ast.Load()),
                                              right=ast.Num(1)))
                            ],
                            decorator_list=[],
                            returns=None)
     # Just checking for functionality, the color control characters make it
     # difficult to inspect the result.
     self.assertIsNotNone(pretty_printer.fmt(node))
예제 #9
0
    def visit_FunctionDef(self, node):
        self.generic_visit(node)
        kept_decorators = []
        for dec in node.decorator_list:
            if isinstance(dec, gast.Call):
                dec_func = dec.func
            else:
                dec_func = dec

            # Special cases.
            # TODO(mdan): Is there any way we can treat these more generically?
            # We may want to forego using decorators altogether if we can't
            # properly support them.
            if isinstance(dec_func,
                          gast.Name) and dec_func.id in ('classmethod', ):
                # Assumption: decorators are only visible in the AST when converting
                # a function inline (via another decorator).
                # In that case, the converted function is no longer part of the
                # original object that it was declared into.
                # This is currently verified by tests.
                continue

            if not anno.hasanno(dec_func, 'live_val'):
                raise ValueError('Could not resolve decorator: %s' %
                                 pretty_printer.fmt(dec_func))

            dec_value = anno.getanno(dec_func, 'live_val')
            if dec_value not in self.remove_decorators:
                kept_decorators.append((dec, dec_value))

        for _, dec_value in kept_decorators:
            if dec_value.__module__ == '__main__':
                raise ValueError(
                    'decorator "%s" was not allowed because it is declared '
                    'in the module "%s". To fix this, declare it in a separate '
                    'module that we can import it from.' %
                    (dec_value, dec_value.__module__))
            else:
                self.additional_dependencies.add(dec_value)

        node.decorator_list = [dec for dec, _ in kept_decorators]
        return node
예제 #10
0
 def visit(self, node):
   try:
     source_code = self.context.source_code
     source_file = self.context.source_file
     if source_code and hasattr(node, 'lineno'):
       self._lineno = node.lineno
       self._col_offset = node.col_offset
     return super(Base, self).visit(node)
   except (ValueError, AttributeError, NotImplementedError) as e:
     msg = '%s: %s\nOccurred at node:\n%s' % (e.__class__.__name__, str(e),
                                              pretty_printer.fmt(node))
     if source_code:
       line = source_code.splitlines()[self._lineno - 1]
     else:
       line = '<no source available>'
     six.reraise(PyFlowParseError,
                 PyFlowParseError(
                     msg,
                     (source_file, self._lineno, self._col_offset + 1, line)),
                 sys.exc_info()[2])
예제 #11
0
 def test_format(self):
   node = ast.FunctionDef(
       name='f',
       args=ast.arguments(
           args=[ast.Name(id='a', ctx=ast.Param())],
           vararg=None,
           kwarg=None,
           defaults=[]),
       body=[
           ast.Return(
               ast.BinOp(
                   op=ast.Add(),
                   left=ast.Name(id='a', ctx=ast.Load()),
                   right=ast.Num(1)))
       ],
       decorator_list=[],
       returns=None)
   # Just checking for functionality, the color control characters make it
   # difficult to inspect the result.
   self.assertIsNotNone(pretty_printer.fmt(node))
예제 #12
0
  def visit_FunctionDef(self, node):
    self.generic_visit(node)
    kept_decorators = []
    for dec in node.decorator_list:
      if isinstance(dec, gast.Call):
        dec_func = dec.func
      else:
        dec_func = dec

      # Special cases.
      # TODO(mdan): Is there any way we can treat these more generically?
      # We may want to forego using decorators altogether if we can't
      # properly support them.
      if isinstance(dec_func, gast.Name) and dec_func.id in ('classmethod',):
        # Assumption: decorators are only visible in the AST when converting
        # a function inline (via another decorator).
        # In that case, the converted function is no longer part of the
        # original object that it was declared into.
        # This is currently verified by tests.
        continue

      if not anno.hasanno(dec_func, 'live_val'):
        raise ValueError(
            'Could not resolve decorator: %s' % pretty_printer.fmt(dec_func))

      dec_value = anno.getanno(dec_func, 'live_val')
      if dec_value not in self.remove_decorators:
        kept_decorators.append((dec, dec_value))

    for _, dec_value in kept_decorators:
      if dec_value.__module__ == '__main__':
        raise ValueError(
            'decorator "%s" was not allowed because it is declared '
            'in the module "%s". To fix this, declare it in a separate '
            'module that we can import it from.' % (dec_value,
                                                    dec_value.__module__))
      else:
        self.additional_dependencies.add(dec_value)

    node.decorator_list = [dec for dec, _ in kept_decorators]
    return node
예제 #13
0
  def compiled(self, node, *symbols):
    source = None

    self.dynamic_calls = []
    def converted_call(*args):
      """Mock version of api.converted_call."""
      self.dynamic_calls.append(args)
      return 7

    try:
      result, source = compiler.ast_to_object(node)
      result.tf = self.make_fake_mod('fake_tf', *symbols)
      result.py2tf_utils = utils
      result.py2tf_api = self.make_fake_mod('fake_api', converted_call)
      yield result
    except Exception:  # pylint:disable=broad-except
      if source is None:
        print('Offending AST:\n%s' % pretty_printer.fmt(node, color=False))
      else:
        print('Offending compiled code:\n%s' % source)
      raise
예제 #14
0
  def compiled(self, node, *symbols):
    source = None

    self.dynamic_calls = []
    def converted_call(*args):
      """Mock version of api.converted_call."""
      self.dynamic_calls.append(args)
      return 7

    try:
      result, source = compiler.ast_to_object(node)
      result.tf = self.make_fake_mod('fake_tf', *symbols)
      result.py2tf_utils = utils
      result.py2tf_api = self.make_fake_mod('fake_api', converted_call)
      yield result
    except Exception:  # pylint:disable=broad-except
      if source is None:
        print('Offending AST:\n%s' % pretty_printer.fmt(node, color=False))
      else:
        print('Offending compiled code:\n%s' % source)
      raise
예제 #15
0
 def visit(self, node):
   source_code = self.context.source_code
   source_file = self.context.source_file
   try:
     if source_code and hasattr(node, 'lineno'):
       self._lineno = node.lineno
       self._col_offset = node.col_offset
     if anno.hasanno(node, anno.Basic.SKIP_PROCESSING):
       return node
     return super(Base, self).visit(node)
   except (ValueError, AttributeError, KeyError, NotImplementedError,
           AssertionError) as e:
     msg = '%s: %s\nOffending source:\n%s\n\nOccurred at node:\n%s' % (
         e.__class__.__name__, str(e), try_ast_to_source(node),
         pretty_printer.fmt(node, color=False))
     if source_code:
       line = source_code.splitlines()[self._lineno - 1]
     else:
       line = '<no source available>'
     six.reraise(PyFlowParseError,
                 PyFlowParseError(
                     msg,
                     (source_file, self._lineno, self._col_offset + 1, line)),
                 sys.exc_info()[2])
예제 #16
0
 def debug_print(self, node):
   """Helper method useful for debugging."""
   if __debug__:
     print(pretty_printer.fmt(node))
   return node
예제 #17
0
 def debug_print(self, node):
     """Helper method useful for debugging."""
     if __debug__:
         print(pretty_printer.fmt(node))
     return node