File: sametype.py

package info (click to toggle)
mypy 0.812-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 18,596 kB
  • sloc: python: 74,869; cpp: 11,212; ansic: 3,935; makefile: 238; sh: 13
file content (59 lines) | stat: -rw-r--r-- 2,162 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
"""Same type check for RTypes."""

from mypyc.ir.rtypes import (
    RType, RTypeVisitor, RInstance, RPrimitive, RTuple, RVoid, RUnion, RStruct
)
from mypyc.ir.func_ir import FuncSignature


def is_same_type(a: RType, b: RType) -> bool:
    return a.accept(SameTypeVisitor(b))


def is_same_signature(a: FuncSignature, b: FuncSignature) -> bool:
    return (len(a.args) == len(b.args)
            and is_same_type(a.ret_type, b.ret_type)
            and all(is_same_type(t1.type, t2.type) and t1.name == t2.name
                    for t1, t2 in zip(a.args, b.args)))


def is_same_method_signature(a: FuncSignature, b: FuncSignature) -> bool:
    return (len(a.args) == len(b.args)
            and is_same_type(a.ret_type, b.ret_type)
            and all(is_same_type(t1.type, t2.type) and t1.name == t2.name
                    for t1, t2 in zip(a.args[1:], b.args[1:])))


class SameTypeVisitor(RTypeVisitor[bool]):
    def __init__(self, right: RType) -> None:
        self.right = right

    def visit_rinstance(self, left: RInstance) -> bool:
        return isinstance(self.right, RInstance) and left.name == self.right.name

    def visit_runion(self, left: RUnion) -> bool:
        if isinstance(self.right, RUnion):
            items = list(self.right.items)
            for left_item in left.items:
                for j, right_item in enumerate(items):
                    if is_same_type(left_item, right_item):
                        del items[j]
                        break
                else:
                    return False
            return not items
        return False

    def visit_rprimitive(self, left: RPrimitive) -> bool:
        return left is self.right

    def visit_rtuple(self, left: RTuple) -> bool:
        return (isinstance(self.right, RTuple)
            and len(self.right.types) == len(left.types)
            and all(is_same_type(t1, t2) for t1, t2 in zip(left.types, self.right.types)))

    def visit_rstruct(self, left: RStruct) -> bool:
        return isinstance(self.right, RStruct) and self.right.name == left.name

    def visit_rvoid(self, left: RVoid) -> bool:
        return isinstance(self.right, RVoid)