Exemplo n.º 1
0
    def check_enum_call(self, node: Expression, var_name: str,
                        is_func_scope: bool) -> Optional[TypeInfo]:
        """Check if a call defines an Enum.

        Example:

          A = enum.Enum('A', 'foo bar')

        is equivalent to:

          class A(enum.Enum):
              foo = 1
              bar = 2
        """
        if not isinstance(node, CallExpr):
            return None
        call = node
        callee = call.callee
        if not isinstance(callee, RefExpr):
            return None
        fullname = callee.fullname
        if fullname not in ('enum.Enum', 'enum.IntEnum', 'enum.Flag',
                            'enum.IntFlag'):
            return None
        items, values, ok = self.parse_enum_call_args(call,
                                                      fullname.split('.')[-1])
        if not ok:
            # Error. Construct dummy return value.
            info = self.build_enum_call_typeinfo(var_name, [], fullname,
                                                 node.line)
        else:
            name = cast(Union[StrExpr, UnicodeExpr], call.args[0]).value
            if name != var_name or is_func_scope:
                # Give it a unique name derived from the line number.
                name += '@' + str(call.line)
            info = self.build_enum_call_typeinfo(name, items, fullname,
                                                 call.line)
            # Store generated TypeInfo under both names, see semanal_namedtuple for more details.
            if name != var_name or is_func_scope:
                self.api.add_symbol_skip_local(name, info)
        call.analyzed = EnumCallExpr(info, items, values)
        call.analyzed.set_line(call.line, call.column)
        info.line = node.line
        return info
Exemplo n.º 2
0
    def check_enum_call(self, node: Expression, var_name: str,
                        is_func_scope: bool) -> Optional[TypeInfo]:
        """Check if a call defines an Enum.

        Example:

          A = enum.Enum('A', 'foo bar')

        is equivalent to:

          class A(enum.Enum):
              foo = 1
              bar = 2
        """
        if not isinstance(node, CallExpr):
            return None
        call = node
        callee = call.callee
        if not isinstance(callee, RefExpr):
            return None
        fullname = callee.fullname
        if fullname not in ('enum.Enum', 'enum.IntEnum', 'enum.Flag',
                            'enum.IntFlag'):
            return None
        items, values, ok = self.parse_enum_call_args(call,
                                                      fullname.split('.')[-1])
        if not ok:
            # Error. Construct dummy return value.
            return self.build_enum_call_typeinfo(var_name, [], fullname)
        name = cast(Union[StrExpr, UnicodeExpr], call.args[0]).value
        if name != var_name or is_func_scope:
            # Give it a unique name derived from the line number.
            name += '@' + str(call.line)
        info = self.build_enum_call_typeinfo(name, items, fullname)
        # Store it as a global just in case it would remain anonymous.
        # (Or in the nearest class if there is one.)
        stnode = SymbolTableNode(GDEF, info)
        self.api.add_symbol_table_node(name, stnode)
        call.analyzed = EnumCallExpr(info, items, values)
        call.analyzed.set_line(call.line, call.column)
        return info
Exemplo n.º 3
0
 def visit_enum_call_expr(self, node: EnumCallExpr) -> EnumCallExpr:
     return EnumCallExpr(node.info, node.items, node.values)
Exemplo n.º 4
0
 def visit_enum_call_expr(self, node: EnumCallExpr) -> None:
     node.info = self.fixup_and_reset_typeinfo(node.info)
     self.process_synthetic_type_info(node.info)
     super().visit_enum_call_expr(node)
Exemplo n.º 5
0
 def visit_enum_call_expr(self, node: EnumCallExpr) -> None:
     node.info = self.fixup(node.info)
     self.process_type_info(node.info)
     super().visit_enum_call_expr(node)
Exemplo n.º 6
0
 def visit_enum_call_expr(self, node: EnumCallExpr) -> None:
     node.info = self.fixup_and_reset_typeinfo(node.info)
     self.process_synthetic_type_info(node.info)
     super().visit_enum_call_expr(node)