def apply_augments(self, auglist, p_elem, pset): """Handle substatements of augments from `auglist`. The augments are applied in the context of `p_elem`. `pset` is a patch set containing patches that may be applicable to descendants. """ for a in auglist: par = a.parent if p_elem.name == "choice" or a.search_one("when") is None: wel = p_elem else: if p_elem.interleave: kw = "interleave" else: kw = "group" wel = SchemaNode(kw, p_elem, interleave=p_elem.interleave) wel.occur = p_elem.occur if par.keyword == "uses": self.handle_substmts(a, wel, pset) continue if par.keyword == "submodule": mnam = par.i_including_modulename else: mnam = par.arg if self.prefix_stack[-1] == self.module_prefixes[mnam]: self.handle_substmts(a, wel, pset) else: self.prefix_stack.append(self.module_prefixes[mnam]) self.handle_substmts(a, wel, pset) self.prefix_stack.pop()
def notification_stmt(self, stmt, p_elem, pset): notel = SchemaNode("nma:notification", self.notifications) notel.occur = 2 elem = SchemaNode.element(self.qname(stmt), notel, interleave=True, occur=2) augs, new_pset = self.process_patches(pset, stmt, elem)[1:] self.handle_substmts(stmt, elem, new_pset) self.apply_augments(augs, elem, new_pset)
def rpc_stmt(self, stmt, p_elem, pset): rpcel = SchemaNode("nma:rpc", self.rpcs) r_pset = self.process_patches(pset, stmt, rpcel)[2] inpel = SchemaNode("nma:input", rpcel) elem = SchemaNode.element(self.qname(stmt), inpel, occur=2) augs, pset = self.process_patches(r_pset,stmt,elem,"input")[1:] inst = stmt.search_one("input") if inst: self.handle_substmts(inst, elem, pset) else: SchemaNode("empty", elem) self.apply_augments(augs, elem, pset) augs, pset = self.process_patches(r_pset,stmt,None,"output")[1:] oust = stmt.search_one("output") if oust or augs: outel = SchemaNode("nma:output", rpcel) outel.occur = 2 if oust: self.handle_substmts(oust, outel, pset) self.apply_augments(augs, outel, pset) self.handle_substmts(stmt, rpcel, r_pset)
def rpc_stmt(self, stmt, p_elem, pset): rpcel = SchemaNode("nma:rpc", self.rpcs) r_pset = self.process_patches(pset, stmt, rpcel)[2] inpel = SchemaNode("nma:input", rpcel) elem = SchemaNode.element(self.qname(stmt), inpel, occur=2) augs, pset = self.process_patches(r_pset, stmt, elem, "input")[1:] inst = stmt.search_one("input") if inst: self.handle_substmts(inst, elem, pset) else: SchemaNode("empty", elem) self.apply_augments(augs, elem, pset) augs, pset = self.process_patches(r_pset, stmt, None, "output")[1:] oust = stmt.search_one("output") if oust or augs: outel = SchemaNode("nma:output", rpcel) outel.occur = 2 if oust: self.handle_substmts(oust, outel, pset) self.apply_augments(augs, outel, pset) self.handle_substmts(stmt, rpcel, r_pset)