std::string BriefParser::Parse() { std::string Paragraph; bool InFirstParagraph = true; bool InBrief = false; while (Tok.isNot(tok::eof)) { if (Tok.is(tok::text)) { if (InFirstParagraph || InBrief) Paragraph += Tok.getText(); ConsumeToken(); continue; } if (Tok.is(tok::command)) { StringRef Name = Tok.getCommandName(); if (Name == "brief") { Paragraph.clear(); InBrief = true; ConsumeToken(); continue; } // Block commands implicitly start a new paragraph. if (isBlockCommand(Name)) { // We found an implicit paragraph end. InFirstParagraph = false; if (InBrief) { InBrief = false; break; } } } if (Tok.is(tok::newline)) { if (InFirstParagraph || InBrief) Paragraph += ' '; ConsumeToken(); if (Tok.is(tok::newline)) { ConsumeToken(); // We found a paragraph end. InFirstParagraph = false; if (InBrief) { InBrief = false; break; } } continue; } // We didn't handle this token, so just drop it. ConsumeToken(); } cleanupBrief(Paragraph); return Paragraph; }
std::string BriefParser::Parse() { std::string FirstParagraphOrBrief; std::string ReturnsParagraph; bool InFirstParagraph = true; bool InBrief = false; bool InReturns = false; while (Tok.isNot(tok::eof)) { if (Tok.is(tok::text)) { if (InFirstParagraph || InBrief) FirstParagraphOrBrief += Tok.getText(); else if (InReturns) ReturnsParagraph += Tok.getText(); ConsumeToken(); continue; } if (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) { const CommandInfo *Info = Traits.getCommandInfo(Tok.getCommandID()); if (Info->IsBriefCommand) { FirstParagraphOrBrief.clear(); InBrief = true; ConsumeToken(); continue; } if (Info->IsReturnsCommand) { InReturns = true; InBrief = false; InFirstParagraph = false; ReturnsParagraph += "Returns "; ConsumeToken(); continue; } // Block commands implicitly start a new paragraph. if (Info->IsBlockCommand) { // We found an implicit paragraph end. InFirstParagraph = false; if (InBrief) break; } } if (Tok.is(tok::newline)) { if (InFirstParagraph || InBrief) FirstParagraphOrBrief += ' '; else if (InReturns) ReturnsParagraph += ' '; ConsumeToken(); // If the next token is a whitespace only text, ignore it. Thus we allow // two paragraphs to be separated by line that has only whitespace in it. // // We don't need to add a space to the parsed text because we just added // a space for the newline. if (Tok.is(tok::text)) { if (isWhitespace(Tok.getText())) ConsumeToken(); } if (Tok.is(tok::newline)) { ConsumeToken(); // We found a paragraph end. This ends the brief description if // \\brief command or its equivalent was explicitly used. // Stop scanning text because an explicit \\brief paragraph is the // preffered one. if (InBrief) break; // End first paragraph if we found some non-whitespace text. if (InFirstParagraph && !isWhitespace(FirstParagraphOrBrief)) InFirstParagraph = false; // End the \\returns paragraph because we found the paragraph end. InReturns = false; } continue; } // We didn't handle this token, so just drop it. ConsumeToken(); } cleanupBrief(FirstParagraphOrBrief); if (!FirstParagraphOrBrief.empty()) return FirstParagraphOrBrief; cleanupBrief(ReturnsParagraph); return ReturnsParagraph; }