Exemple #1
0
def RemoveMutableParameters(ast):
    """Change all mutable parameters in a pytd AST to a non-mutable form."""
    ast = ast.Visit(optimize.AbsorbMutableParameters())
    ast = ast.Visit(optimize.CombineContainers())
    ast = ast.Visit(optimize.MergeTypeParameters())
    ast = ast.Visit(visitors.AdjustSelf(force=True))
    return ast
Exemple #2
0
def RemoveMutableParameters(ast):
    """Change all mutable parameters in a pytd AST to a non-mutable form."""
    # late import, because optimize uses utils.py.
    from pytype.pytd import optimize  # pylint: disable=g-import-not-at-top
    ast = ast.Visit(optimize.AbsorbMutableParameters())
    ast = ast.Visit(optimize.CombineContainers())
    ast = ast.Visit(optimize.MergeTypeParameters())
    ast = ast.Visit(visitors.AdjustSelf(force=True))
    return ast
Exemple #3
0
    def test_merge_type_parameters(self):
        # This test uses pytd of the kind that's typically the output of
        # AbsorbMutableParameters.
        # See comment in RemoveMutableParameters
        src = pytd_src("""
      from typing import Any
      T = TypeVar('T')
      T2 = TypeVar('T2')
      T3 = TypeVar('T3')
      class A(typing.Generic[T], object):
          def foo(self, x: Union[T, T2]) -> T2: ...
          def bar(self, x: Union[T, T2, T3]) -> T3: ...
          def baz(self, x: Union[T, T2], y: Union[T2, T3]) -> Any: ...

      K = TypeVar('K')
      V = TypeVar('V')
      class D(typing.Generic[K, V], object):
          def foo(self, x: T) -> Union[K, T]: ...
          def bar(self, x: T) -> Union[V, T]: ...
          def baz(self, x: Union[K, V]) -> Union[K, V]: ...
          def lorem(self, x: T) -> Union[T, K, V]: ...
          def ipsum(self, x: T) -> Union[T, K]: ...
    """)
        expected = pytd_src("""
      from typing import Any
      T = TypeVar('T')
      T2 = TypeVar('T2')
      T3 = TypeVar('T3')
      class A(typing.Generic[T], object):
          def foo(self, x: T) -> T: ...
          def bar(self, x: T) -> T: ...
          def baz(self, x: T, y: T) -> Any: ...

      K = TypeVar('K')
      V = TypeVar('V')
      class D(typing.Generic[K, V], object):
          def foo(self, x: K) -> K: ...
          def bar(self, x: V) -> V: ...
          def baz(self, x: Union[K, V]) -> Union[K, V]: ...
          def lorem(self, x: Union[K, V]) -> Union[K, V]: ...
          def ipsum(self, x: K) -> K: ...
      """)
        tree = self.Parse(src)
        new_tree = tree.Visit(optimize.MergeTypeParameters())
        self.AssertSourceEquals(new_tree, expected)
Exemple #4
0
    def testMergeTypeParameters(self):
        # This test uses pytd of the kind that's typically the output of
        # AbsorbMutableParameters.
        # See comment in RemoveMutableParameters
        src = textwrap.dedent("""
      T = TypeVar('T')
      T2 = TypeVar('T2')
      T3 = TypeVar('T3')
      class A(typing.Generic[T], object):
          def foo(self, x: T or T2) -> T2
          def bar(self, x: T or T2 or T3) -> T3
          def baz(self, x: T or T2, y: T2 or T3) -> ?

      K = TypeVar('K')
      V = TypeVar('V')
      class D(typing.Generic[K, V], object):
          def foo(self, x: T) -> K or T
          def bar(self, x: T) -> V or T
          def baz(self, x: K or V) -> K or V
          def lorem(self, x: T) -> T or K or V
          def ipsum(self, x: T) -> T or K
    """)
        expected = textwrap.dedent("""
      T = TypeVar('T')
      T2 = TypeVar('T2')
      T3 = TypeVar('T3')
      class A(typing.Generic[T], object):
          def foo(self, x: T) -> T
          def bar(self, x: T) -> T
          def baz(self, x: T, y: T) -> ?

      K = TypeVar('K')
      V = TypeVar('V')
      class D(typing.Generic[K, V], object):
          def foo(self, x: K) -> K
          def bar(self, x: V) -> V
          def baz(self, x: K or V) -> K or V
          def lorem(self, x: K or V) -> K or V
          def ipsum(self, x: K) -> K
      """)
        tree = self.Parse(src)
        new_tree = tree.Visit(optimize.MergeTypeParameters())
        self.AssertSourceEquals(new_tree, expected)