Lines Matching refs:self

49     def __init__(self,  argument
54 self.info = info
55 self.doc: Optional['QAPIDoc'] = doc
60 def __init__(self, parser: 'QAPISchemaParser', msg: str): argument
92 def __init__(self, argument
96 self._fname = fname
97 self._included = previously_included or set()
98 self._included.add(os.path.abspath(self._fname))
99 self.src = ''
102 self.info = QAPISourceInfo(self._fname, incl_info)
103 self.tok: Union[None, str] = None
104 self.pos = 0
105 self.cursor = 0
106 self.val: Optional[Union[bool, str]] = None
107 self.line_pos = 0
110 self.exprs: List[QAPIExpression] = []
111 self.docs: List[QAPIDoc] = []
114 self._parse()
116 def _parse(self) -> None: argument
125 with open(self._fname, 'r', encoding='utf-8') as fp:
126 self.src = fp.read()
127 if self.src == '' or self.src[-1] != '\n':
128 self.src += '\n'
131 self.accept()
134 while self.tok is not None:
135 info = self.info
136 if self.tok == '#':
137 self.reject_expr_doc(cur_doc)
138 cur_doc = self.get_doc()
139 self.docs.append(cur_doc)
142 expr = self.get_expr()
148 self.reject_expr_doc(cur_doc)
155 incl_fname = os.path.join(os.path.dirname(self._fname),
157 self._add_expr(OrderedDict({'include': incl_fname}), info)
158 exprs_include = self._include(include, info, incl_fname,
159 self._included)
161 self.exprs.extend(exprs_include.exprs)
162 self.docs.extend(exprs_include.docs)
164 self.reject_expr_doc(cur_doc)
172 self._pragma(name, value, info)
177 self._add_expr(expr, info, cur_doc)
179 self.reject_expr_doc(cur_doc)
181 def _add_expr(self, expr: Mapping[str, object], argument
184 self.exprs.append(QAPIExpression(expr, info, doc))
249 def accept(self, skip_comment: bool = True) -> None: argument
295 self.tok = self.src[self.cursor]
296 self.pos = self.cursor
297 self.cursor += 1
298 self.val = None
300 if self.tok == '#':
301 if self.src[self.cursor] == '#':
304 self.cursor = self.src.find('\n', self.cursor)
306 self.val = self.src[self.pos:self.cursor]
308 elif self.tok in '{}:,[]':
310 elif self.tok == "'":
315 ch = self.src[self.cursor]
316 self.cursor += 1
318 raise QAPIParseError(self, "missing terminating \"'\"")
323 raise QAPIParseError(self,
330 self.val = string
334 self, "funny character in string")
336 elif self.src.startswith('true', self.pos):
337 self.val = True
338 self.cursor += 3
340 elif self.src.startswith('false', self.pos):
341 self.val = False
342 self.cursor += 4
344 elif self.tok == '\n':
345 if self.cursor == len(self.src):
346 self.tok = None
348 self.info = self.info.next_line()
349 self.line_pos = self.cursor
350 elif not self.tok.isspace():
354 self.src[self.cursor-1:])
355 raise QAPIParseError(self, "stray '%s'" % match.group(0))
357 def get_members(self) -> Dict[str, object]: argument
359 if self.tok == '}':
360 self.accept()
362 if self.tok != "'":
363 raise QAPIParseError(self, "expected string or '}'")
365 key = self.val
368 self.accept()
369 if self.tok != ':':
370 raise QAPIParseError(self, "expected ':'")
371 self.accept()
373 raise QAPIParseError(self, "duplicate key '%s'" % key)
374 expr[key] = self.get_expr()
375 if self.tok == '}':
376 self.accept()
378 if self.tok != ',':
379 raise QAPIParseError(self, "expected ',' or '}'")
380 self.accept()
381 if self.tok != "'":
382 raise QAPIParseError(self, "expected string")
384 def get_values(self) -> List[object]: argument
386 if self.tok == ']':
387 self.accept()
389 if self.tok not in tuple("{['tf"):
391 self, "expected '{', '[', ']', string, or boolean")
393 expr.append(self.get_expr())
394 if self.tok == ']':
395 self.accept()
397 if self.tok != ',':
398 raise QAPIParseError(self, "expected ',' or ']'")
399 self.accept()
401 def get_expr(self) -> _ExprValue: argument
403 if self.tok == '{':
404 self.accept()
405 expr = self.get_members()
406 elif self.tok == '[':
407 self.accept()
408 expr = self.get_values()
409 elif self.tok in tuple("'tf"):
410 assert isinstance(self.val, (str, bool))
411 expr = self.val
412 self.accept()
415 self, "expected '{', '[', string, or boolean")
418 def get_doc_line(self) -> Optional[str]: argument
419 if self.tok != '#':
421 self, "documentation comment must end with '##'")
422 assert isinstance(self.val, str)
423 if self.val.startswith('##'):
425 if self.val != '##':
427 self, "junk after '##' at end of documentation comment")
429 if self.val == '#':
431 if self.val[1] != ' ':
432 raise QAPIParseError(self, "missing space after #")
433 return self.val[2:].rstrip()
439 def get_doc_indented(self, doc: 'QAPIDoc') -> Optional[str]: argument
440 self.accept(False)
441 line = self.get_doc_line()
444 self.accept(False)
445 line = self.get_doc_line()
454 self.accept(False)
455 line = self.get_doc_line()
458 if self._match_at_name_colon(line):
465 self,
471 def get_doc_paragraph(self, doc: 'QAPIDoc') -> Optional[str]: argument
473 self.accept(False)
474 line = self.get_doc_line()
481 def get_doc(self) -> 'QAPIDoc': argument
482 if self.val != '##':
484 self, "junk after '##' at start of documentation comment")
485 info = self.info
486 self.accept(False)
487 line = self.get_doc_line()
491 raise QAPIParseError(self, "line should end with ':'")
497 raise QAPIParseError(self, "name required after '@'")
499 self.accept(False)
500 line = self.get_doc_line()
506 self.accept(False)
507 line = self.get_doc_line()
514 self, "duplicated 'Features:' line")
515 self.accept(False)
516 line = self.get_doc_line()
518 self.accept(False)
519 line = self.get_doc_line()
521 and (match := self._match_at_name_colon(line))):
522 doc.new_feature(self.info, match.group(1))
526 line = self.get_doc_indented(doc)
529 self, 'feature descriptions expected')
531 elif match := self._match_at_name_colon(line):
535 self,
539 and (match := self._match_at_name_colon(line))):
540 doc.new_argument(self.info, match.group(1))
544 line = self.get_doc_indented(doc)
568 raise QAPIParseError(self, emsg)
576 raise QAPIParseError(self, emsg)
578 doc.new_tagged_section(self.info, match.group(1))
582 line = self.get_doc_indented(doc)
586 self,
590 doc.ensure_untagged_section(self.info)
592 line = self.get_doc_paragraph(doc)
596 doc.ensure_untagged_section(self.info)
599 if match := self._match_at_name_colon(line):
601 self,
607 self,
610 self.accept(False)
611 line = self.get_doc_line()
614 self.accept()
640 def __init__(self, info: QAPISourceInfo, argument
643 self.info = info
645 self.tag = tag
647 self.text = ''
649 def append_line(self, line: str) -> None: argument
650 self.text += line + '\n'
653 def __init__(self, info: QAPISourceInfo, tag: str): argument
655 self.member: Optional['QAPISchemaMember'] = None
657 def connect(self, member: 'QAPISchemaMember') -> None: argument
658 self.member = member
660 def __init__(self, info: QAPISourceInfo, symbol: Optional[str] = None): argument
662 self.info = info
664 self.symbol: Optional[str] = symbol
666 self.all_sections: List[QAPIDoc.Section] = [QAPIDoc.Section(info)]
668 self.body: Optional[QAPIDoc.Section] = self.all_sections[0]
670 self.args: Dict[str, QAPIDoc.ArgSection] = {}
671 self.features: Dict[str, QAPIDoc.ArgSection] = {}
673 self.returns: Optional[QAPIDoc.Section] = None
674 self.errors: Optional[QAPIDoc.Section] = None
676 self.since: Optional[QAPIDoc.Section] = None
678 self.sections: List[QAPIDoc.Section] = []
680 def end(self) -> None: argument
681 for section in self.all_sections:
687 def ensure_untagged_section(self, info: QAPISourceInfo) -> None: argument
688 if self.all_sections and not self.all_sections[-1].tag:
690 self.all_sections[-1].text += '\n'
693 section = self.Section(info)
694 self.sections.append(section)
695 self.all_sections.append(section)
697 def new_tagged_section(self, info: QAPISourceInfo, tag: str) -> None: argument
698 section = self.Section(info, tag)
700 if self.returns:
703 self.returns = section
705 if self.errors:
708 self.errors = section
710 if self.since:
713 self.since = section
714 self.sections.append(section)
715 self.all_sections.append(section)
717 def _new_description(self, info: QAPISourceInfo, name: str, argument
723 section = self.ArgSection(info, '@' + name)
724 self.all_sections.append(section)
727 def new_argument(self, info: QAPISourceInfo, name: str) -> None: argument
728 self._new_description(info, name, self.args)
730 def new_feature(self, info: QAPISourceInfo, name: str) -> None: argument
731 self._new_description(info, name, self.features)
733 def append_line(self, line: str) -> None: argument
734 self.all_sections[-1].append_line(line)
736 def connect_member(self, member: 'QAPISchemaMember') -> None: argument
737 if member.name not in self.args:
739 if self.symbol not in member.info.pragma.documentation_exceptions:
743 self.args[member.name] = QAPIDoc.ArgSection(
744 self.info, '@' + member.name)
745 self.args[member.name].connect(member)
747 def connect_feature(self, feature: 'QAPISchemaFeature') -> None: argument
748 if feature.name not in self.features:
752 self.features[feature.name].connect(feature)
754 def check_expr(self, expr: QAPIExpression) -> None: argument
756 if self.returns and 'returns' not in expr:
758 self.returns.info,
761 if self.returns:
763 self.returns.info,
765 if self.errors:
767 self.errors.info,
770 def check(self) -> None: argument
787 check_args_section(self.args, 'member')
788 check_args_section(self.features, 'feature')