llvm::errs() <<
"comments::Token Kind="<< Kind <<
" ";
24llvm::errs() <<
" "<< Length <<
" \""<< L.
getSpelling(*
this,
SM) <<
"\"\n";
40llvm::BumpPtrAllocator &Allocator,
42 char*Resolved = Allocator.Allocate<
char>(UNI_MAX_UTF8_BYTES_PER_CODE_POINT);
43 char*ResolvedPtr = Resolved;
44 if(llvm::ConvertCodePointToUTF8(CodePoint, ResolvedPtr))
45 returnStringRef(Resolved, ResolvedPtr - Resolved);
52#include "clang/AST/CommentHTMLTags.inc" 53#include "clang/AST/CommentHTMLNamedCharacterReferences.inc" 57StringRef Lexer::resolveHTMLNamedCharacterReference(StringRef Name)
const{
59 returnllvm::StringSwitch<StringRef>(Name)
63.Case(
"quot",
"\"")
64.Case(
"apos",
"\'")
66.Default(translateHTMLNamedCharacterReferenceToUTF8(Name));
69StringRef Lexer::resolveHTMLDecimalCharacterReference(StringRef Name)
const{
70 unsignedCodePoint = 0;
71 for(
unsignedi = 0, e = Name.size(); i != e; ++i) {
74CodePoint += Name[i] -
'0';
79StringRef Lexer::resolveHTMLHexCharacterReference(StringRef Name)
const{
80 unsignedCodePoint = 0;
81 for(
unsignedi = 0, e = Name.size(); i != e; ++i) {
83 const char C= Name[i];
85CodePoint += llvm::hexDigitValue(
C);
90voidLexer::skipLineStartingDecorations() {
92assert(CommentState == LCS_InsideCComment);
94 if(BufferPtr == CommentEnd)
97 const char*NewBufferPtr = BufferPtr;
99 if(++NewBufferPtr == CommentEnd)
101 if(*NewBufferPtr ==
'*')
102BufferPtr = NewBufferPtr + 1;
107const char*findNewline(
const char*BufferPtr,
const char*BufferEnd) {
108 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
115const char*
skipNewline(
const char*BufferPtr,
const char*BufferEnd) {
116 if(BufferPtr == BufferEnd)
119 if(*BufferPtr ==
'\n')
122assert(*BufferPtr ==
'\r');
124 if(BufferPtr != BufferEnd && *BufferPtr ==
'\n')
130const char*skipNamedCharacterReference(
const char*BufferPtr,
131 const char*BufferEnd) {
132 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
139const char*skipDecimalCharacterReference(
const char*BufferPtr,
140 const char*BufferEnd) {
141 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
148const char*skipHexCharacterReference(
const char*BufferPtr,
149 const char*BufferEnd) {
150 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
157boolisHTMLIdentifierStartingCharacter(
char C) {
161boolisHTMLIdentifierCharacter(
char C) {
165const char*skipHTMLIdentifier(
const char*BufferPtr,
const char*BufferEnd) {
166 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
167 if(!isHTMLIdentifierCharacter(*BufferPtr))
177const char*skipHTMLQuotedString(
const char*BufferPtr,
const char*BufferEnd)
179 const charQuote = *BufferPtr;
180assert(Quote ==
'\"'|| Quote ==
'\'');
183 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
184 const char C= *BufferPtr;
185 if(
C== Quote && BufferPtr[-1] !=
'\\')
191const char*
skipWhitespace(
const char*BufferPtr,
const char*BufferEnd) {
192 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
199bool isWhitespace(
const char*BufferPtr,
const char*BufferEnd) {
203boolisCommandNameStartCharacter(
char C) {
207boolisCommandNameCharacter(
char C) {
211const char*skipCommandName(
const char*BufferPtr,
const char*BufferEnd) {
212 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
213 if(!isCommandNameCharacter(*BufferPtr))
221const char*findBCPLCommentEnd(
const char*BufferPtr,
const char*BufferEnd) {
222 const char*CurPtr = BufferPtr;
223 while(CurPtr != BufferEnd) {
226 if(CurPtr == BufferEnd)
230 const char*EscapePtr = CurPtr - 1;
234 if(*EscapePtr ==
'\\'||
235(EscapePtr - 2 >= BufferPtr && EscapePtr[0] ==
'/'&&
236EscapePtr[-1] ==
'?'&& EscapePtr[-2] ==
'?')) {
247const char*findCCommentEnd(
const char*BufferPtr,
const char*BufferEnd) {
248 for( ; BufferPtr != BufferEnd; ++BufferPtr) {
249 if(*BufferPtr ==
'*') {
250assert(BufferPtr + 1 != BufferEnd);
251 if(*(BufferPtr + 1) ==
'/')
255llvm_unreachable(
"buffer end hit before '*/' was seen");
260voidLexer::formTokenWithChars(Token &
Result,
const char*TokEnd,
262 const unsignedTokLen = TokEnd - BufferPtr;
263 Result.setLocation(getSourceLocation(BufferPtr));
265 Result.setLength(TokLen);
267 Result.TextPtr =
"<UNSET>";
273const char*Lexer::skipTextToken() {
274 const char*TokenPtr = BufferPtr;
275assert(TokenPtr < CommentEnd);
276StringRef TokStartSymbols = ParseCommands ?
"\n\r\\@\"&<":
"\n\r";
280StringRef(TokenPtr, CommentEnd - TokenPtr).find_first_of(TokStartSymbols);
281 if(End == StringRef::npos)
286 if(*(TokenPtr + End) ==
'\"') {
288End = StringRef(TokenPtr, CommentEnd - TokenPtr).find_first_of(
"\n\r\"");
289 if(End != StringRef::npos && *(TokenPtr + End) ==
'\"')
293 returnTokenPtr + End;
296voidLexer::lexCommentText(Token &
T) {
297assert(CommentState == LCS_InsideBCPLComment ||
298CommentState == LCS_InsideCComment);
301 autoHandleNonCommandToken = [&]() ->
void{
302assert(State == LS_Normal);
304 const char*TokenPtr = BufferPtr;
305assert(TokenPtr < CommentEnd);
312 if(CommentState == LCS_InsideCComment)
313skipLineStartingDecorations();
317 returnformTextToken(
T, skipTextToken());
322 returnHandleNonCommandToken();
327 caseLS_VerbatimBlockFirstLine:
328lexVerbatimBlockFirstLine(
T);
330 caseLS_VerbatimBlockBody:
331lexVerbatimBlockBody(
T);
333 caseLS_VerbatimLineText:
334lexVerbatimLineText(
T);
336 caseLS_HTMLStartTag:
337lexHTMLStartTag(
T);
344assert(State == LS_Normal);
345 const char*TokenPtr = BufferPtr;
346assert(TokenPtr < CommentEnd);
356 if(TokenPtr == CommentEnd) {
357formTextToken(
T, TokenPtr);
365 case '\\':
case '@':
case '&':
case '$':
366 case '#':
case '<':
case '>':
case '%':
367 case '\"':
case '.':
case ':':
370 if(
C==
':'&& TokenPtr != CommentEnd && *TokenPtr ==
':') {
374StringRef UnescapedText(BufferPtr + 1, TokenPtr - (BufferPtr + 1));
375formTokenWithChars(
T, TokenPtr,
tok::text);
376 T.setText(UnescapedText);
381 if(!isCommandNameStartCharacter(*TokenPtr)) {
382formTextToken(
T, TokenPtr);
386TokenPtr = skipCommandName(TokenPtr, CommentEnd);
387 unsignedLength = TokenPtr - (BufferPtr + 1);
391 if(Length == 1 && TokenPtr[-1] ==
'f'&& TokenPtr != CommentEnd) {
393 if(
C==
'$'||
C==
'('||
C==
')'||
C==
'['||
C==
']'||
394 C==
'{'||
C==
'}') {
400StringRef CommandName(BufferPtr + 1, Length);
405StringRef CorrectedName = Info->
Name;
406SourceLocation
Loc= getSourceLocation(BufferPtr);
407SourceLocation EndLoc = getSourceLocation(TokenPtr);
408SourceRange FullRange = SourceRange(
Loc, EndLoc);
409SourceRange CommandRange(
Loc.getLocWithOffset(1), EndLoc);
410Diag(
Loc, diag::warn_correct_comment_command_name)
411<< FullRange << CommandName << CorrectedName
415 T.setUnknownCommandName(CommandName);
416Diag(
T.getLocation(), diag::warn_unknown_comment_command_name)
417<< SourceRange(
T.getLocation(),
T.getEndLocation());
421 if(Info->IsVerbatimBlockCommand) {
422setupAndLexVerbatimBlock(
T, TokenPtr, *BufferPtr, Info);
425 if(Info->IsVerbatimLineCommand) {
426setupAndLexVerbatimLine(
T, TokenPtr, Info);
429formTokenWithChars(
T, TokenPtr, CommandKind);
430 T.setCommandID(Info->getID());
435lexHTMLCharacterReference(
T);
440 if(TokenPtr == CommentEnd) {
441formTextToken(
T, TokenPtr);
444 const char C= *TokenPtr;
445 if(isHTMLIdentifierStartingCharacter(
C))
446setupAndLexHTMLStartTag(
T);
448setupAndLexHTMLEndTag(
T);
450formTextToken(
T, TokenPtr);
455 returnHandleNonCommandToken();
459voidLexer::setupAndLexVerbatimBlock(Token &
T,
460 const char*TextBegin,
461 charMarker,
constCommandInfo *Info) {
462assert(Info->IsVerbatimBlockCommand);
464VerbatimBlockEndCommandName.clear();
465VerbatimBlockEndCommandName.append(Marker ==
'\\'?
"\\":
"@");
466VerbatimBlockEndCommandName.append(Info->EndCommandName);
469 T.setVerbatimBlockID(Info->getID());
474 if(BufferPtr != CommentEnd &&
477State = LS_VerbatimBlockBody;
481State = LS_VerbatimBlockFirstLine;
484voidLexer::lexVerbatimBlockFirstLine(Token &
T) {
486assert(BufferPtr < CommentEnd);
492 const char*Newline = findNewline(BufferPtr, CommentEnd);
493StringRef
Line(BufferPtr, Newline - BufferPtr);
496 size_tPos =
Line.find(VerbatimBlockEndCommandName);
498 const char*NextLine;
499 if(Pos == StringRef::npos) {
503}
else if(Pos == 0) {
505 const char*End = BufferPtr + VerbatimBlockEndCommandName.size();
506StringRef Name(BufferPtr + 1, End - (BufferPtr + 1));
513TextEnd = BufferPtr + Pos;
522StringRef
Text(BufferPtr, TextEnd - BufferPtr);
524 T.setVerbatimBlockText(
Text);
526State = LS_VerbatimBlockBody;
529voidLexer::lexVerbatimBlockBody(Token &
T) {
530assert(State == LS_VerbatimBlockBody);
532 if(CommentState == LCS_InsideCComment)
533skipLineStartingDecorations();
535 if(BufferPtr == CommentEnd) {
537 T.setVerbatimBlockText(
"");
541lexVerbatimBlockFirstLine(
T);
544voidLexer::setupAndLexVerbatimLine(Token &
T,
const char*TextBegin,
545 constCommandInfo *Info) {
546assert(Info->IsVerbatimLineCommand);
548 T.setVerbatimLineID(Info->getID());
550State = LS_VerbatimLineText;
553voidLexer::lexVerbatimLineText(Token &
T) {
554assert(State == LS_VerbatimLineText);
557 const char*Newline = findNewline(BufferPtr, CommentEnd);
558StringRef
Text(BufferPtr, Newline - BufferPtr);
560 T.setVerbatimLineText(
Text);
565voidLexer::lexHTMLCharacterReference(Token &
T) {
566 const char*TokenPtr = BufferPtr;
567assert(*TokenPtr ==
'&');
569 if(TokenPtr == CommentEnd) {
570formTextToken(
T, TokenPtr);
575 boolisDecimal =
false;
579TokenPtr = skipNamedCharacterReference(TokenPtr, CommentEnd);
581}
else if(
C==
'#') {
583 if(TokenPtr == CommentEnd) {
584formTextToken(
T, TokenPtr);
590TokenPtr = skipDecimalCharacterReference(TokenPtr, CommentEnd);
592}
else if(
C==
'x'||
C==
'X') {
595TokenPtr = skipHexCharacterReference(TokenPtr, CommentEnd);
597formTextToken(
T, TokenPtr);
601formTextToken(
T, TokenPtr);
604 if(NamePtr == TokenPtr || TokenPtr == CommentEnd ||
606formTextToken(
T, TokenPtr);
609StringRef Name(NamePtr, TokenPtr - NamePtr);
613Resolved = resolveHTMLNamedCharacterReference(Name);
615Resolved = resolveHTMLDecimalCharacterReference(Name);
617Resolved = resolveHTMLHexCharacterReference(Name);
619 if(Resolved.empty()) {
620formTextToken(
T, TokenPtr);
623formTokenWithChars(
T, TokenPtr,
tok::text);
624 T.setText(Resolved);
627voidLexer::setupAndLexHTMLStartTag(Token &
T) {
628assert(BufferPtr[0] ==
'<'&&
629isHTMLIdentifierStartingCharacter(BufferPtr[1]));
630 const char*TagNameEnd = skipHTMLIdentifier(BufferPtr + 2, CommentEnd);
631StringRef Name(BufferPtr + 1, TagNameEnd - (BufferPtr + 1));
632 if(!isHTMLTagName(Name)) {
633formTextToken(
T, TagNameEnd);
638 T.setHTMLTagStartName(Name);
642 const char C= *BufferPtr;
643 if(BufferPtr != CommentEnd &&
644(
C==
'>'||
C==
'/'|| isHTMLIdentifierStartingCharacter(
C)))
645State = LS_HTMLStartTag;
648voidLexer::lexHTMLStartTag(Token &
T) {
649assert(State == LS_HTMLStartTag);
651 const char*TokenPtr = BufferPtr;
653 if(isHTMLIdentifierCharacter(
C)) {
654TokenPtr = skipHTMLIdentifier(TokenPtr, CommentEnd);
655StringRef Ident(BufferPtr, TokenPtr - BufferPtr);
657 T.setHTMLIdent(Ident);
666 const char*OpenQuote = TokenPtr;
667TokenPtr = skipHTMLQuotedString(TokenPtr, CommentEnd);
668 const char*ClosingQuote = TokenPtr;
669 if(TokenPtr != CommentEnd)
672 T.setHTMLQuotedString(StringRef(OpenQuote + 1,
673ClosingQuote - (OpenQuote + 1)));
683 if(TokenPtr != CommentEnd && *TokenPtr ==
'>') {
687formTextToken(
T, TokenPtr);
697 if(BufferPtr == CommentEnd) {
703 if(!isHTMLIdentifierStartingCharacter(
C) &&
704 C!=
'='&&
C!=
'\"'&&
C!=
'\''&&
C!=
'>'&&
C!=
'/') {
710voidLexer::setupAndLexHTMLEndTag(Token &
T) {
711assert(BufferPtr[0] ==
'<'&& BufferPtr[1] ==
'/');
713 const char*TagNameBegin =
skipWhitespace(BufferPtr + 2, CommentEnd);
714 const char*TagNameEnd = skipHTMLIdentifier(TagNameBegin, CommentEnd);
715StringRef Name(TagNameBegin, TagNameEnd - TagNameBegin);
716 if(!isHTMLTagName(Name)) {
717formTextToken(
T, TagNameEnd);
724 T.setHTMLTagEndName(Name);
726 if(BufferPtr != CommentEnd && *BufferPtr ==
'>')
727State = LS_HTMLEndTag;
730voidLexer::lexHTMLEndTag(Token &
T) {
731assert(BufferPtr != CommentEnd && *BufferPtr ==
'>');
739 const char*BufferStart,
const char*BufferEnd,
boolParseCommands)
740: Allocator(Allocator), Diags(Diags), Traits(Traits),
741BufferStart(BufferStart), BufferEnd(BufferEnd), BufferPtr(BufferStart),
742FileLoc(FileLoc), ParseCommands(ParseCommands),
743CommentState(LCS_BeforeComment), State(LS_Normal) {}
747 switch(CommentState) {
748 caseLCS_BeforeComment:
749 if(BufferPtr == BufferEnd) {
750formTokenWithChars(
T, BufferPtr,
tok::eof);
754assert(*BufferPtr ==
'/');
756 switch(*BufferPtr) {
760 if(BufferPtr != BufferEnd) {
765 const char C= *BufferPtr;
766 if(
C==
'/'||
C==
'!')
773 if(BufferPtr != BufferEnd && *BufferPtr ==
'<')
776CommentState = LCS_InsideBCPLComment;
777 if(State != LS_VerbatimBlockBody && State != LS_VerbatimBlockFirstLine)
779CommentEnd = findBCPLCommentEnd(BufferPtr, BufferEnd);
786 const char C= *BufferPtr;
787 if((
C==
'*'&& *(BufferPtr + 1) !=
'/') ||
C==
'!')
791 if(BufferPtr != BufferEnd && *BufferPtr ==
'<')
794CommentState = LCS_InsideCComment;
796CommentEnd = findCCommentEnd(BufferPtr, BufferEnd);
800llvm_unreachable(
"second character of comment should be '/' or '*'");
803 caseLCS_BetweenComments: {
806 const char*EndWhitespace = BufferPtr;
807 while(EndWhitespace != BufferEnd && *EndWhitespace !=
'/')
816CommentState = LCS_BeforeComment;
820 caseLCS_InsideBCPLComment:
821 caseLCS_InsideCComment:
822 if(BufferPtr != CommentEnd) {
827 if(CommentState == LCS_InsideCComment) {
828assert(BufferPtr[0] ==
'*'&& BufferPtr[1] ==
'/');
830assert(BufferPtr <= BufferEnd);
836CommentState = LCS_BetweenComments;
840CommentState = LCS_BetweenComments;
852 boolInvalidTemp =
false;
857 const char*
Begin=
File.data() + LocInfo.second;
enum clang::sema::@1704::IndirectLocalPathEntry::EntryKind Kind
static bool isNamed(const NamedDecl *ND, const char(&Str)[Len])
static unsigned skipNewline(const char *&First, const char *End)
static unsigned skipWhitespace(unsigned Idx, StringRef Str, unsigned Length)
Skip over whitespace in the string, starting at the given index.
Concrete class used by the front-end to report problems and issues.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Encodes a location in the source.
void print(raw_ostream &OS, const SourceManager &SM) const
This class handles loading and caching of source files into memory.
StringRef getBufferData(FileID FID, bool *Invalid=nullptr) const
Return a StringRef to the source buffer data for the specified FileID.
std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
The JSON file list parser is used to communicate input to InstallAPI.
LLVM_READONLY bool isVerticalWhitespace(unsigned char c)
Returns true if this character is vertical ASCII whitespace: '\n', '\r'.
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
LLVM_READONLY bool isAlphanumeric(unsigned char c)
Return true if this character is an ASCII letter or digit: [a-zA-Z0-9].
LLVM_READONLY bool isHorizontalWhitespace(unsigned char c)
Returns true if this character is horizontal ASCII whitespace: ' ', '\t', '\f', '\v'.
@ Result
The result type of a method or function.
LLVM_READONLY bool isDigit(unsigned char c)
Return true if this character is an ASCII digit: [0-9].
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
LLVM_READONLY bool isHexDigit(unsigned char c)
Return true if this character is an ASCII hex digit: [0-9a-fA-F].
const FunctionProtoType * T
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4