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
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
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)
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)