Exemplo n.º 1
0
def add_attribute_to_class(
    api: SemanticAnalyzerPluginInterface,
    cls: ClassDef,
    name: str,
    typ: Type,
    final: bool = False,
) -> None:
    """
    Adds a new attribute to a class definition.
    This currently only generates the symbol table entry and no corresponding AssignmentStatement
    """
    info = cls.info

    # NOTE: we would like the plugin generated node to dominate, but we still
    # need to keep any existing definitions so they get semantically analyzed.
    if name in info.names:
        # Get a nice unique name instead.
        r_name = get_unique_redefinition_name(name, info.names)
        info.names[r_name] = info.names[name]

    node = Var(name, typ)
    node.info = info
    node.is_final = final
    node._fullname = info.fullname + '.' + name
    info.names[name] = SymbolTableNode(MDEF, node, plugin_generated=True)
Exemplo n.º 2
0
 def visit_var(self, node: Var) -> Var:
     # Note that a Var must be transformed to a Var.
     if node in self.var_map:
         return self.var_map[node]
     new = Var(node.name, self.optional_type(node.type))
     new.line = node.line
     new._fullname = node._fullname
     new.info = node.info
     new.is_self = node.is_self
     new.is_ready = node.is_ready
     new.is_initialized_in_class = node.is_initialized_in_class
     new.is_staticmethod = node.is_staticmethod
     new.is_classmethod = node.is_classmethod
     new.is_property = node.is_property
     new.is_final = node.is_final
     new.final_value = node.final_value
     new.final_unset_in_class = node.final_unset_in_class
     new.final_set_in_init = node.final_set_in_init
     new.set_line(node.line)
     self.var_map[node] = new
     return new
Exemplo n.º 3
0
 def visit_var(self, node: Var) -> Var:
     # Note that a Var must be transformed to a Var.
     if node in self.var_map:
         return self.var_map[node]
     new = Var(node.name(), self.optional_type(node.type))
     new.line = node.line
     new._fullname = node._fullname
     new.info = node.info
     new.is_self = node.is_self
     new.is_ready = node.is_ready
     new.is_initialized_in_class = node.is_initialized_in_class
     new.is_staticmethod = node.is_staticmethod
     new.is_classmethod = node.is_classmethod
     new.is_property = node.is_property
     new.is_final = node.is_final
     new.final_value = node.final_value
     new.final_unset_in_class = node.final_unset_in_class
     new.final_set_in_init = node.final_set_in_init
     new.set_line(node.line)
     self.var_map[node] = new
     return new
Exemplo n.º 4
0
 def _reset_var_final_flags(self, v: Var) -> None:
     v.is_final = False
     v.final_unset_in_class = False
     v.final_set_in_init = False
     v.final_value = None
Exemplo n.º 5
0
 def _reset_var_final_flags(self, v: Var) -> None:
     v.is_final = False
     v.final_unset_in_class = False
     v.final_set_in_init = False
     v.final_value = None