Ejemplo n.º 1
0
    def handle_signature(self, sig, signode):
        if debug.flags.disable_docs_edgeql_validation:
            signode['eql-fullname'] = fullname = re.split(r'\(| ', sig)[0]
            signode['eql-signature'] = sig
            mod, name = fullname.split('::')
            signode['eql-module'] = mod
            signode['eql-name'] = name

            return fullname

        from edb.edgeql.parser import parser as edgeql_parser
        from edb.edgeql import ast as ql_ast
        from edb.edgeql import codegen as ql_gen

        parser = edgeql_parser.EdgeQLBlockParser()
        try:
            astnode = parser.parse(f'create abstract constraint {sig};')[0]
        except Exception as ex:
            raise self.error(
                f'could not parse constraint signature {sig!r}') from ex

        if (not isinstance(astnode, ql_ast.CreateConstraint)
                or not isinstance(astnode.name, ql_ast.ObjectRef)):
            raise self.error(f'EdgeQL parser returned unsupported AST')

        modname = astnode.name.module
        constr_name = astnode.name.name
        if not modname:
            raise self.error(
                f'Missing module in EdgeQL constraint declaration')

        constr_repr = ql_gen.generate_source(astnode)

        m = re.match(
            r'''(?xs)
            ^
            create\sabstract\sconstraint\s
            (?P<f>.*?)(?:\s*on(?P<subj>.*))?
            $
        ''', constr_repr)
        if not m or not m.group('f'):
            raise self.error(
                f'could not recreate constraint signature from AST')
        constr_repr = m.group('f')

        signode['eql-module'] = modname
        signode['eql-name'] = constr_name
        signode['eql-fullname'] = fullname = f'{modname}::{constr_name}'
        signode['eql-signature'] = constr_repr
        subject = m.group('subj')
        if subject:
            subject = subject.strip()[1:-1]
            signode['eql-subjexpr'] = subject
            signode['eql-signature'] += f' on ({subject})'

        signode += s_nodes.desc_annotation('constraint', 'constraint')
        signode += d_nodes.Text(' ')
        signode += s_nodes.desc_name(fullname, fullname)

        return fullname
Ejemplo n.º 2
0
    def handle_signature(self, sig, signode):
        parser = edgeql_parser.EdgeQLBlockParser()
        try:
            astnode = parser.parse(
                f'CREATE FUNCTION {sig} USING SQL FUNCTION "xxx";')[0]
        except Exception as ex:
            raise shared.DirectiveParseError(
                self, f'could not parse function signature {sig!r}',
                cause=ex)

        if (not isinstance(astnode, ql_ast.CreateFunction) or
                not isinstance(astnode.name, ql_ast.ObjectRef)):
            raise shared.DirectiveParseError(
                self, f'EdgeQL parser returned unsupported AST')

        modname = astnode.name.module
        funcname = astnode.name.name
        if not modname:
            raise shared.DirectiveParseError(
                self, f'EdgeQL function declaration is missing namespace')

        func_repr = ql_gen.EdgeQLSourceGenerator.to_source(astnode)
        m = re.match(r'''(?xs)
            ^
            CREATE\sFUNCTION\s
            (?P<f>.*?)
            \sUSING\sSQL\sFUNCTION
            .*$
        ''', func_repr)
        if not m or not m.group('f'):
            raise shared.DirectiveParseError(
                self, f'could not recreate function signature from AST')
        func_repr = m.group('f')

        signode['eql-module'] = modname
        signode['eql-name'] = funcname
        signode['eql-fullname'] = fullname = f'{modname}::{funcname}'
        signode['eql-signature'] = func_repr

        signode += s_nodes.desc_annotation('function', 'function')
        signode += d_nodes.Text(' ')
        signode += s_nodes.desc_name(fullname, fullname)

        ret_repr = ql_gen.EdgeQLSourceGenerator.to_source(astnode.returning)
        if astnode.returning_typemod is qltypes.TypeModifier.SET_OF:
            ret_repr = f'SET OF {ret_repr}'
        elif astnode.returning_typemod is qltypes.TypeModifier.OPTIONAL:
            ret_repr = f'OPTIONAL {ret_repr}'
        signode += s_nodes.desc_returns(ret_repr, ret_repr)

        return fullname
Ejemplo n.º 3
0
    def handle_signature(self, sig, signode):
        parser = edgeql_parser.EdgeQLBlockParser()
        try:
            astnode = parser.parse(f'CREATE ABSTRACT CONSTRAINT {sig};')[0]
        except Exception as ex:
            raise shared.DirectiveParseError(
                self,
                f'could not parse constraint signature {sig!r}',
                cause=ex)

        if (not isinstance(astnode, ql_ast.CreateConstraint)
                or not isinstance(astnode.name, ql_ast.ObjectRef)):
            raise shared.DirectiveParseError(
                self, f'EdgeQL parser returned unsupported AST')

        modname = astnode.name.module
        constr_name = astnode.name.name
        if not modname:
            raise shared.DirectiveParseError(
                self, f'Missing module in EdgeQL constraint declaration')

        constr_repr = ql_gen.EdgeQLSourceGenerator.to_source(astnode)

        m = re.match(
            r'''(?xs)
            ^
            CREATE\sABSTRACT\sCONSTRAINT\s
            (?P<f>.*?)(?:\s*ON(?P<subj>.*))?
            $
        ''', constr_repr)
        if not m or not m.group('f'):
            raise shared.DirectiveParseError(
                self, f'could not recreate constraint signature from AST')
        constr_repr = m.group('f')

        signode['eql-module'] = modname
        signode['eql-name'] = constr_name
        signode['eql-fullname'] = fullname = f'{modname}::{constr_name}'
        signode['eql-signature'] = constr_repr
        subject = m.group('subj')
        if subject:
            subject = subject.strip()[1:-1]
            signode['eql-subjexpr'] = subject
            signode['eql-signature'] += f' ON ({subject})'

        signode += s_nodes.desc_annotation('constraint', 'constraint')
        signode += d_nodes.Text(' ')
        signode += s_nodes.desc_name(fullname, fullname)

        return fullname
Ejemplo n.º 4
0
    def handle_signature(self, sig, signode):
        if debug.flags.disable_docs_edgeql_validation:
            signode['eql-fullname'] = fullname = sig.split('(')[0]
            signode['eql-signature'] = sig
            mod, name = fullname.split('::')
            signode['eql-module'] = mod
            signode['eql-name'] = name

            return fullname

        from edb.edgeql.parser import parser as edgeql_parser
        from edb.edgeql import ast as ql_ast
        from edb.edgeql import codegen as ql_gen
        from edb.edgeql import qltypes

        parser = edgeql_parser.EdgeQLBlockParser()
        try:
            astnode = parser.parse(
                f'create function {sig} using SQL function "xxx";')[0]
        except Exception as ex:
            raise self.error(
                f'could not parse function signature {sig!r}') from ex

        if (not isinstance(astnode, ql_ast.CreateFunction)
                or not isinstance(astnode.name, ql_ast.ObjectRef)):
            raise self.error(f'EdgeQL parser returned unsupported AST')

        modname = astnode.name.module
        funcname = astnode.name.name
        if not modname:
            raise self.error(
                f'EdgeQL function declaration is missing namespace')

        func_repr = ql_gen.generate_source(astnode)
        m = re.match(
            r'''(?xs)
            ^
            create\sfunction\s
            (?P<f>.*?)
            \susing\ssql\sfunction
            .*$
        ''', func_repr)
        if not m or not m.group('f'):
            raise self.error(f'could not recreate function signature from AST')
        func_repr = m.group('f')

        signode['eql-module'] = modname
        signode['eql-name'] = funcname
        signode['eql-fullname'] = fullname = f'{modname}::{funcname}'
        signode['eql-signature'] = func_repr

        signode += s_nodes.desc_annotation('function', 'function')
        signode += d_nodes.Text(' ')
        signode += s_nodes.desc_name(fullname, fullname)

        ret_repr = ql_gen.generate_source(astnode.returning)
        if astnode.returning_typemod is qltypes.TypeModifier.SetOfType:
            ret_repr = f'set of {ret_repr}'
        elif astnode.returning_typemod is qltypes.TypeModifier.OptionalType:
            ret_repr = f'optional {ret_repr}'
        signode += s_nodes.desc_returns(ret_repr, ret_repr)

        return fullname