def _apply_field_ast( self, schema: s_schema.Schema, context: sd.CommandContext, node: qlast.DDLOperation, op: sd.AlterObjectProperty, ) -> None: if op.property == 'bases': explicit_bases = self.get_explicit_bases(schema, context, op.new_value) if explicit_bases: if isinstance(node, qlast.CreateObject): node.bases = [ qlast.TypeName(maintype=utils.name_to_ast_ref(b)) for b in explicit_bases ] else: node.commands.append( qlast.AlterAddInherit(bases=[ utils.name_to_ast_ref(b) for b in explicit_bases ], )) elif op.property == 'is_abstract': node.is_abstract = op.new_value elif op.property == 'is_final': node.is_final = op.new_value else: super()._apply_field_ast(schema, context, node, op)
def _apply_rebase_ast(self, context, node, op): from . import inheriting parent_ctx = context.get(CommandContextToken) parent_op = parent_ctx.op rebase = next( iter( parent_op.get_subcommands( type=inheriting.RebaseInheritingObject))) dropped = rebase.removed_bases added = rebase.added_bases if dropped: node.commands.append( qlast.AlterDropInherit(bases=[ qlast.ObjectRef(module=b.classname.module, name=b.classname.name) for b in dropped ])) for bases, pos in added: if isinstance(pos, tuple): pos_node = qlast.Position(position=pos[0], ref=qlast.ObjectRef( module=pos[1].classname.module, name=pos[1].classname.name)) else: pos_node = qlast.Position(position=pos) node.commands.append( qlast.AlterAddInherit(bases=[ qlast.ObjectRef(module=b.classname.module, name=b.classname.name) for b in bases ], position=pos_node))
def _apply_rebase_ast(self, context: sd.CommandContext, node: qlast.ObjectDDL, op: Any) -> Any: rebase = next(iter(self.get_subcommands(type=RebaseInheritingObject))) dropped = rebase.removed_bases added = rebase.added_bases if dropped: node.commands.append( qlast.AlterDropInherit(bases=[ qlast.ObjectRef(module=b.classname.module, name=b.classname.name) for b in dropped ])) for bases, pos in added: if isinstance(pos, tuple): pos_node = qlast.Position(position=pos[0], ref=qlast.ObjectRef( module=pos[1].classname.module, name=pos[1].classname.name)) else: pos_node = qlast.Position(position=pos) node.commands.append( qlast.AlterAddInherit(bases=[ qlast.ObjectRef(module=b.classname.module, name=b.classname.name) for b in bases ], position=pos_node))
def _apply_field_ast(self, schema, context, node, op): if op.property == 'bases': mcls = self.get_schema_metaclass() default_base = mcls.get_default_base_name() if not isinstance(op.new_value, so.ObjectList): bases = so.ObjectList.create(schema, op.new_value) else: bases = op.new_value base_names = [ b for b in bases.names(schema, allow_unresolved=True) if b != default_base and sn.shortname_from_fullname(b) == b ] if base_names: if isinstance(node, qlast.CreateObject): node.bases = [ qlast.TypeName(maintype=qlast.ObjectRef( name=b.name, module=b.module)) for b in base_names ] else: node.commands.append( qlast.AlterAddInherit(bases=[ qlast.ObjectRef(module=b.module, name=b.name) for b in base_names ], )) elif op.property == 'is_abstract': node.is_abstract = op.new_value elif op.property == 'is_final': node.is_final = op.new_value else: super()._apply_field_ast(schema, context, node, op)
def _apply_field_ast( self, schema: s_schema.Schema, context: sd.CommandContext, node: qlast.DDLOperation, op: sd.AlterObjectProperty, ) -> None: if op.property == 'bases': mcls = self.get_schema_metaclass() default_base = mcls.get_default_base_name() bases = op.new_value assert isinstance(bases, so.ObjectList) base_names: List[sn.SchemaName] = [ b for b in bases.names(schema, allow_unresolved=True) if isinstance(b, sn.SchemaName) if b != default_base and sn.shortname_from_fullname(b) == b ] if base_names: if isinstance(node, qlast.CreateObject): node.bases = [ qlast.TypeName( maintype=qlast.ObjectRef( name=b.name, module=b.module ) ) for b in base_names ] else: node.commands.append( qlast.AlterAddInherit( bases=[ qlast.ObjectRef( module=b.module, name=b.name ) for b in base_names ], ) ) elif op.property == 'is_abstract': node.is_abstract = op.new_value elif op.property == 'is_final': node.is_final = op.new_value else: super()._apply_field_ast(schema, context, node, op)
def _get_ast( self, schema: s_schema.Schema, context: sd.CommandContext, *, parent_node: Optional[qlast.DDLOperation] = None, ) -> Optional[qlast.DDLOperation]: assert parent_node is not None dropped = self._get_bases_for_ast(schema, context, self.removed_bases) if dropped: parent_node.commands.append( qlast.AlterDropInherit(bases=[ cast(qlast.TypeName, utils.typeref_to_ast(schema, b)) for b in dropped ], )) for bases, pos in self.added_bases: bases = self._get_bases_for_ast(schema, context, bases) if not bases: continue if isinstance(pos, tuple): typ = utils.typeref_to_ast(schema, pos[1]) assert isinstance(typ, qlast.TypeName) assert isinstance(typ.maintype, qlast.ObjectRef) pos_node = qlast.Position( position=pos[0], ref=typ.maintype, ) else: pos_node = qlast.Position(position=pos) parent_node.commands.append( qlast.AlterAddInherit( bases=[ cast(qlast.TypeName, utils.typeref_to_ast(schema, b)) for b in bases ], position=pos_node, )) return None
def reduce_EXTENDING_ShortNodeNameList_OptInheritPosition(self, *kids): self.val = qlast.AlterAddInherit( bases=[qlast.TypeName(maintype=b) for b in kids[1].val], position=kids[2].val)
def reduce_EXTENDING_TypeNameList_OptInheritPosition(self, *kids): self.val = qlast.AlterAddInherit(bases=kids[1].val, position=kids[2].val)