On Mon, May 27, 2024 at 7:58 AM Markus Armbruster <arm...@redhat.com> wrote:
> John Snow <js...@redhat.com> writes: > > > On Thu, May 16, 2024, 1:58 AM Markus Armbruster <arm...@redhat.com> > wrote: > > > >> John Snow <js...@redhat.com> writes: > >> > >> > Instead of using the info object for the doc block as a whole, update > >> > the info pointer for each call to ensure_untagged_section when the > >> > existing section is otherwise empty. This way, Sphinx error > information > >> > will match precisely to where the text actually starts. > >> > > >> > Signed-off-by: John Snow <js...@redhat.com> > >> > --- > >> > scripts/qapi/parser.py | 9 +++++++-- > >> > 1 file changed, 7 insertions(+), 2 deletions(-) > >> > > >> > diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py > >> > index 8cdd5334ec6..41b9319e5cb 100644 > >> > --- a/scripts/qapi/parser.py > >> > +++ b/scripts/qapi/parser.py > >> > @@ -662,8 +662,13 @@ def end(self) -> None: > >> > > >> > def ensure_untagged_section(self, info: QAPISourceInfo) -> None: > >> > if self.all_sections and not self.all_sections[-1].tag: > >> > - # extend current section > >> > - self.all_sections[-1].text += '\n' > >> > >> Before, we always append a newline. > >> > >> > + section = self.all_sections[-1] > >> > + # Section is empty so far; update info to start *here*. > >> > + if not section.text: > >> > + section.info = info > >> > + else: > >> > + # extend current section > >> > + self.all_sections[-1].text += '\n' > >> > >> Afterwards, we append it only when the section already has some text. > >> > >> The commit message claims the patch only adjusts section.info. That's > a > >> lie :) > >> > > > > Well. It wasn't intentional, so it wasn't a lie... it was just wrong :) > > > > > >> I believe the change makes no difference because .end() strips leading > >> and trailing newline. > >> > >> > return > >> > # start new section > >> > section = self.Section(info) > >> > >> You could fix the commit message, but I think backing out the > >> no-difference change is easier. The appended patch works in my testing. > >> > >> Next one. Your patch changes the meaning of section.info. Here's its > >> initialization: > >> > >> class Section: > >> # pylint: disable=too-few-public-methods > >> def __init__(self, info: QAPISourceInfo, > >> tag: Optional[str] = None): > >> ---> # section source info, i.e. where it begins > >> self.info = info > >> # section tag, if any ('Returns', '@name', ...) > >> self.tag = tag > >> # section text without tag > >> self.text = '' > >> > >> The comment is now wrong. Calls for a thorough review of .info's uses. > >> > > > > Hmm... Did I really change its meaning? I guess it's debatable what > "where > > it begins" means. Does the tagless section start... > > > > ## <-- Here? > > # Hello! <-- Or here? > > ## > > > > I assert the *section* starts wherever the first line of text it contains > > starts. Nothing else makes any sense. > > > > There is value in recording where the doc block starts, but that's not a > > task for the *section* info. > > > > I don't think I understand your feedback. > > This was before my vacation, and my memory is foggy, ... I may have > gotten confused back then. Let me have a fresh look now. > > self.info gets initialized in Section.__init__() to whatever info it > gets passed. > > Your patch makes .ensure_untagged_section() overwrite this Section.info > when it extends an untagged section that is still empty. Hmmm. I'd > prefer .info to remain constant after initialization. > but, we don't have the right info when we initialize the entire QAPIDoc object, because the section hasn't truly actually started yet, so I don't think I can actually achieve your preference. > > I figure this overwrite can happen only when extenting the body section > QAPIDoc.__init__() creates. In that case, it adjusts .info from > beginning of doc comment to first non-blank line. > Yes, that's the intended effect and in practice, the only time it actually happens. This patch is necessary for accurate error reporting info, otherwise we get off-by-ones (or more, maybe). I believe the problem actually affects the current generator too (I don't see why it wouldn't), but I didn't test that because I'm trying to replace it. > > Thoughts? > > I think this patch is fine?. > >> The alternative to changing .info's meaning is to add another member > >> with the meaning you need. Then we have to review .info's uses to find > >> out which ones to switch to the new one. > > > > > >> Left for later. > >> > >> > >> diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py > >> index 8cdd5334ec..abeae1ca77 100644 > >> --- a/scripts/qapi/parser.py > >> +++ b/scripts/qapi/parser.py > >> @@ -663,7 +663,10 @@ def end(self) -> None: > >> def ensure_untagged_section(self, info: QAPISourceInfo) -> None: > >> if self.all_sections and not self.all_sections[-1].tag: > >> # extend current section > >> - self.all_sections[-1].text += '\n' > >> + section = self.all_sections[-1] > >> + if not section.text: > >> + section.info = info > >> + section.text += '\n' > >> return > >> # start new section > >> section = self.Section(info) > >> > >> > >