16#include "llvm/Support/ErrorHandling.h"
21 for (StringRef::const_iterator I = S.begin(), E = S.end(); I != E; ++I) {
32 llvm::BumpPtrAllocator &Allocator;
36 bool NoMoreInterestingTokens;
43 const char *BufferStart;
44 const char *BufferEnd;
45 const char *BufferPtr;
54 return Pos.CurToken >= Toks.size();
60 const Token &
Tok = Toks[Pos.CurToken];
62 Pos.BufferStart =
Tok.getText().begin();
63 Pos.BufferEnd =
Tok.getText().end();
64 Pos.BufferPtr = Pos.BufferStart;
65 Pos.BufferStartLoc =
Tok.getLocation();
69 const unsigned CharNo = Pos.BufferPtr - Pos.BufferStart;
75 assert(Pos.BufferPtr != Pos.BufferEnd);
76 return *Pos.BufferPtr;
81 assert(Pos.BufferPtr != Pos.BufferEnd);
83 if (Pos.BufferPtr == Pos.BufferEnd) {
85 if (isEnd() && !addToken())
95 unsigned BracketCount = 0;
97 const char C = peek();
98 WordText.push_back(
C);
122 if (NoMoreInterestingTokens)
127 Token Newline = P.Tok;
131 NoMoreInterestingTokens =
true;
136 NoMoreInterestingTokens =
true;
140 Toks.push_back(P.Tok);
142 if (Toks.size() == 1)
147 void consumeWhitespace() {
158 const char *TokBegin,
163 Result.setLength(TokLength);
165 Result.TextPtr =
"<UNSET>";
173 Allocator(Allocator), P(P), NoMoreInterestingTokens(
false) {
185 Position SavedPos = Pos;
190 const char *WordBegin = Pos.BufferPtr;
194 const char C = peek();
199 if (!lexTemplate(WordText))
202 WordText.push_back(
C);
211 const unsigned Length = WordText.size();
217 char *TextPtr = Allocator.Allocate<
char>(Length + 1);
219 memcpy(TextPtr, WordText.c_str(), Length + 1);
220 StringRef
Text = StringRef(TextPtr, Length);
222 formTokenWithChars(
Tok, Loc, WordBegin, Length,
Text);
238 llvm::StringRef LineStart(Pos.BufferPtr - Offset - 3, 4);
239 return LineStart.starts_with(
"\\par") || LineStart.starts_with(
"@par");
247 Position SavedPos = Pos;
251 const char *WordBegin = Pos.BufferPtr;
260 WordText.push_back(peek());
261 if (Pos.BufferPtr + 1 == Pos.BufferEnd) {
268 unsigned Length = WordText.size();
274 char *TextPtr = Allocator.Allocate<
char>(Length + 1);
276 memcpy(TextPtr, WordText.c_str(), Length + 1);
277 StringRef
Text = StringRef(TextPtr, Length);
279 formTokenWithChars(
Tok, Loc, WordBegin, Length,
Text);
288 Position SavedPos = Pos;
292 const char *WordBegin = Pos.BufferPtr;
295 const char C = peek();
297 WordText.push_back(
C);
302 if (WordText.ends_with(
':'))
304 const unsigned Length = WordText.size();
310 char *TextPtr = Allocator.Allocate<
char>(Length + 1);
312 memcpy(TextPtr, WordText.c_str(), Length + 1);
313 StringRef
Text = StringRef(TextPtr, Length);
315 formTokenWithChars(
Tok, Loc, WordBegin, Length,
Text);
323 Position SavedPos = Pos;
327 const char *WordBegin = Pos.BufferPtr;
331 const char C = peek();
332 if (
C == OpenDelim) {
333 WordText.push_back(
C);
339 while (!
Error && !isEnd()) {
341 WordText.push_back(
C);
346 if (!
Error &&
C != CloseDelim)
354 const unsigned Length = WordText.size();
355 char *TextPtr = Allocator.Allocate<
char>(Length + 1);
357 memcpy(TextPtr, WordText.c_str(), Length + 1);
358 StringRef
Text = StringRef(TextPtr, Length);
360 formTokenWithChars(
Tok, Loc, WordBegin,
361 Pos.BufferPtr - WordBegin,
Text);
370 bool HavePartialTok =
false;
372 if (Pos.BufferPtr != Pos.BufferStart) {
373 formTokenWithChars(PartialTok, getSourceLocation(),
374 Pos.BufferPtr, Pos.BufferEnd - Pos.BufferPtr,
375 StringRef(Pos.BufferPtr,
376 Pos.BufferEnd - Pos.BufferPtr));
377 HavePartialTok =
true;
381 P.putBack(
ArrayRef(Toks.begin() + Pos.CurToken, Toks.end()));
382 Pos.CurToken = Toks.size();
385 P.putBack(PartialTok);
389Parser::Parser(
Lexer &L,
Sema &S, llvm::BumpPtrAllocator &Allocator,
392 L(L), S(S), Allocator(Allocator), SourceMgr(SourceMgr), Diags(Diags),
403 S.actOnParamCommandDirectionArg(PC,
409 S.actOnParamCommandParamNameArg(PC,
419 S.actOnTParamCommandParamNameArg(TPC,
429 unsigned ParsedArgs = 0;
431 while (ParsedArgs < NumArgs && Retokenizer.
lexWord(Arg)) {
445 unsigned ParsedArgs = 0;
448 while (ParsedArgs < NumArgs && Retokenizer.
lexType(Arg)) {
463 unsigned ParsedArgs = 0;
466 while (ParsedArgs < NumArgs && Retokenizer.
lexParHeading(Arg)) {
481 const CommandInfo *Info = Traits.getCommandInfo(Tok.getCommandID());
485 PC = S.actOnParamCommandStart(Tok.getLocation(),
486 Tok.getEndLocation(),
490 TPC = S.actOnTParamCommandStart(Tok.getLocation(),
491 Tok.getEndLocation(),
495 BC = S.actOnBlockCommandStart(Tok.getLocation(),
496 Tok.getEndLocation(),
502 if (isTokBlockCommand()) {
507 S.actOnParamCommandFinish(PC, Paragraph);
510 S.actOnTParamCommandFinish(TPC, Paragraph);
513 S.actOnBlockCommandFinish(BC, Paragraph);
518 if (PC || TPC || Info->
NumArgs > 0) {
528 S.actOnBlockCommandArgs(
531 S.actOnBlockCommandArgs(BC,
541 bool EmptyParagraph =
false;
542 if (isTokBlockCommand())
543 EmptyParagraph =
true;
547 EmptyParagraph = isTokBlockCommand();
553 Paragraph = S.actOnParagraphComment({});
562 S.actOnParamCommandFinish(PC, Paragraph);
565 S.actOnTParamCommandFinish(TPC, Paragraph);
568 S.actOnBlockCommandFinish(BC, Paragraph);
577 const CommandInfo *Info = Traits.getCommandInfo(Tok.getCommandID());
579 const Token CommandTok = Tok;
590 if (Args.size() < Info->
NumArgs) {
592 diag::warn_doc_inline_command_not_enough_arguments)
606 S.actOnHTMLStartTagStart(Tok.getLocation(),
607 Tok.getHTMLTagStartName());
612 switch (Tok.getKind()) {
624 Diag(Tok.getLocation(),
625 diag::warn_doc_html_start_tag_expected_quoted_string)
637 Equals.getLocation(),
639 Tok.getEndLocation()),
640 Tok.getHTMLQuotedString()));
646 S.actOnHTMLStartTagFinish(HST, S.copyArray(
ArrayRef(Attrs)),
653 S.actOnHTMLStartTagFinish(HST, S.copyArray(
ArrayRef(Attrs)),
661 Diag(Tok.getLocation(),
662 diag::warn_doc_html_start_tag_expected_ident_or_greater);
671 S.actOnHTMLStartTagFinish(HST, S.copyArray(
ArrayRef(Attrs)),
678 S.actOnHTMLStartTagFinish(HST, S.copyArray(
ArrayRef(Attrs)),
681 bool StartLineInvalid;
682 const unsigned StartLine = SourceMgr.getPresumedLineNumber(
686 const unsigned EndLine = SourceMgr.getPresumedLineNumber(
689 if (StartLineInvalid || EndLineInvalid || StartLine == EndLine)
690 Diag(Tok.getLocation(),
691 diag::warn_doc_html_start_tag_expected_ident_or_greater)
694 Diag(Tok.getLocation(),
695 diag::warn_doc_html_start_tag_expected_ident_or_greater);
696 Diag(HST->
getLocation(), diag::note_doc_html_tag_started_here)
706 Token TokEndTag = Tok;
710 Loc = Tok.getLocation();
723 switch (Tok.getKind()) {
730 Content.push_back(S.actOnUnknownCommand(Tok.getLocation(),
731 Tok.getEndLocation(),
732 Tok.getUnknownCommandName()));
738 const CommandInfo *Info = Traits.getCommandInfo(Tok.getCommandID());
740 if (Content.size() == 0)
745 Diag(Tok.getLocation(),
746 diag::warn_verbatim_block_end_without_start)
749 <<
SourceRange(Tok.getLocation(), Tok.getEndLocation());
754 Content.push_back(S.actOnUnknownCommand(Tok.getLocation(),
755 Tok.getEndLocation(),
774 Token WhitespaceTok = Tok;
781 putBack(WhitespaceTok);
783 if (Content.size() > 0)
784 Content.back()->addTrailingNewline();
798 Content.push_back(S.actOnText(Tok.getLocation(),
799 Tok.getEndLocation(),
812 llvm_unreachable(
"should not see this token");
817 return S.actOnParagraphComment(S.copyArray(
ArrayRef(Content)));
824 S.actOnVerbatimBlockStart(Tok.getLocation(),
825 Tok.getVerbatimBlockID());
838 Line = S.actOnVerbatimBlockLine(Tok.getLocation(),
839 Tok.getVerbatimBlockText());
846 Line = S.actOnVerbatimBlockLine(Tok.getLocation(),
"");
849 Lines.push_back(
Line);
853 const CommandInfo *Info = Traits.getCommandInfo(Tok.getVerbatimBlockID());
877 TextBegin = Tok.getLocation();
878 Text = Tok.getVerbatimLineText();
893 switch (Tok.getKind()) {
918 llvm_unreachable(
"should not see this token");
920 llvm_unreachable(
"bogus token kind");
936 return S.actOnFullComment(S.copyArray(
ArrayRef(Blocks)));
Defines the SourceManager interface.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Concrete class used by the front-end to report problems and issues.
Encodes a location in the source.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
U cast(CodeGen::Address addr)