Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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))
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
Archivo: ddl.py Proyecto: alipqb/edgedb
 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)
Ejemplo n.º 8
0
Archivo: ddl.py Proyecto: alipqb/edgedb
 def reduce_EXTENDING_TypeNameList_OptInheritPosition(self, *kids):
     self.val = qlast.AlterAddInherit(bases=kids[1].val,
                                      position=kids[2].val)