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
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
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
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