Lines Matching refs:First
89 lexToken(const char *&First, const char *const End);
92 lexIncludeFilename(const char *&First, const char *const End);
94 void skipLine(const char *&First, const char *const End);
95 void skipDirective(StringRef Name, const char *&First, const char *const End);
107 tryLexIdentifierOrSkipLine(const char *&First, const char *const End);
110 [[nodiscard]] StringRef lexIdentifier(const char *&First,
119 const char *&First,
127 [[nodiscard]] bool isNextTokenOrSkipLine(tok::TokenKind K, const char *&First,
136 tryLexStringLiteralOrSkipLine(const char *&First, const char *const End);
138 [[nodiscard]] bool scanImpl(const char *First, const char *const End);
139 [[nodiscard]] bool lexPPLine(const char *&First, const char *const End);
140 [[nodiscard]] bool lexAt(const char *&First, const char *const End);
141 [[nodiscard]] bool lexModule(const char *&First, const char *const End);
142 [[nodiscard]] bool lexDefine(const char *HashLoc, const char *&First,
144 [[nodiscard]] bool lexPragma(const char *&First, const char *const End);
145 [[nodiscard]] bool lex_Pragma(const char *&First, const char *const End);
146 [[nodiscard]] bool lexEndif(const char *&First, const char *const End);
147 [[nodiscard]] bool lexDefault(DirectiveKind Kind, const char *&First,
150 const char *&First,
152 void lexPPDirectiveBody(const char *&First, const char *const End);
204 static void skipOverSpaces(const char *&First, const char *const End) { in skipOverSpaces() argument
205 while (First != End && isHorizontalWhitespace(*First)) in skipOverSpaces()
206 ++First; in skipOverSpaces()
209 [[nodiscard]] static bool isRawStringLiteral(const char *First, in isRawStringLiteral() argument
211 assert(First <= Current); in isRawStringLiteral()
214 if (*Current != '"' || First == Current) in isRawStringLiteral()
221 if (First == Current || !isAsciiIdentifierContinue(*--Current)) in isRawStringLiteral()
226 return First == Current || !isAsciiIdentifierContinue(*--Current); in isRawStringLiteral()
229 if (*Current != '8' || First == Current || *Current-- != 'u') in isRawStringLiteral()
231 return First == Current || !isAsciiIdentifierContinue(*--Current); in isRawStringLiteral()
234 static void skipRawString(const char *&First, const char *const End) { in skipRawString() argument
235 assert(First[0] == '"'); in skipRawString()
236 assert(First[-1] == 'R'); in skipRawString()
238 const char *Last = ++First; in skipRawString()
242 First = Last; // Hit the end... just give up. in skipRawString()
246 StringRef Terminator(First, Last - First); in skipRawString()
249 First = Last; in skipRawString()
250 while (First != End && *First != ')') in skipRawString()
251 ++First; in skipRawString()
252 if (First == End) in skipRawString()
254 ++First; in skipRawString()
257 Last = First; in skipRawString()
258 while (Last != End && size_t(Last - First) < Terminator.size() && in skipRawString()
259 Terminator[Last - First] == *Last) in skipRawString()
264 First = Last; in skipRawString()
267 if (size_t(Last - First) < Terminator.size()) in skipRawString()
271 First = Last + 1; in skipRawString()
277 static unsigned isEOL(const char *First, const char *const End) { in isEOL() argument
278 if (First == End) in isEOL()
280 if (End - First > 1 && isVerticalWhitespace(First[0]) && in isEOL()
281 isVerticalWhitespace(First[1]) && First[0] != First[1]) in isEOL()
283 return !!isVerticalWhitespace(First[0]); in isEOL()
286 static void skipString(const char *&First, const char *const End) { in skipString() argument
287 assert(*First == '\'' || *First == '"' || *First == '<'); in skipString()
288 const char Terminator = *First == '<' ? '>' : *First; in skipString()
289 for (++First; First != End && *First != Terminator; ++First) { in skipString()
291 if (isVerticalWhitespace(*First)) in skipString()
293 if (*First != '\\') in skipString()
298 if (++First == End) in skipString()
300 if (!isWhitespace(*First)) in skipString()
303 const char *FirstAfterBackslashPastSpace = First; in skipString()
308 First = FirstAfterBackslashPastSpace + NLSize - 1; in skipString()
311 if (First != End) in skipString()
312 ++First; // Finish off the string. in skipString()
316 static unsigned skipNewline(const char *&First, const char *End) { in skipNewline() argument
317 if (First == End) in skipNewline()
319 assert(isVerticalWhitespace(*First)); in skipNewline()
320 unsigned Len = isEOL(First, End); in skipNewline()
322 First += Len; in skipNewline()
326 static bool wasLineContinuation(const char *First, unsigned EOLLen) { in wasLineContinuation() argument
327 return *(First - (int)EOLLen - 1) == '\\'; in wasLineContinuation()
330 static void skipToNewlineRaw(const char *&First, const char *const End) { in skipToNewlineRaw() argument
332 if (First == End) in skipToNewlineRaw()
335 unsigned Len = isEOL(First, End); in skipToNewlineRaw()
340 if (++First == End) in skipToNewlineRaw()
342 Len = isEOL(First, End); in skipToNewlineRaw()
345 if (First[-1] != '\\') in skipToNewlineRaw()
348 First += Len; in skipToNewlineRaw()
353 static void skipLineComment(const char *&First, const char *const End) { in skipLineComment() argument
354 assert(First[0] == '/' && First[1] == '/'); in skipLineComment()
355 First += 2; in skipLineComment()
356 skipToNewlineRaw(First, End); in skipLineComment()
359 static void skipBlockComment(const char *&First, const char *const End) { in skipBlockComment() argument
360 assert(First[0] == '/' && First[1] == '*'); in skipBlockComment()
361 if (End - First < 4) { in skipBlockComment()
362 First = End; in skipBlockComment()
365 for (First += 3; First != End; ++First) in skipBlockComment()
366 if (First[-1] == '*' && First[0] == '/') { in skipBlockComment()
367 ++First; in skipBlockComment()
396 void Scanner::skipLine(const char *&First, const char *const End) { in skipLine() argument
398 assert(First <= End); in skipLine()
399 if (First == End) in skipLine()
402 if (isVerticalWhitespace(*First)) { in skipLine()
403 skipNewline(First, End); in skipLine()
406 const char *Start = First; in skipLine()
407 while (First != End && !isVerticalWhitespace(*First)) { in skipLine()
409 if (*First == '"' || in skipLine()
410 (*First == '\'' && !isQuoteCppDigitSeparator(Start, First, End))) { in skipLine()
411 LastTokenPtr = First; in skipLine()
412 if (isRawStringLiteral(Start, First)) in skipLine()
413 skipRawString(First, End); in skipLine()
415 skipString(First, End); in skipLine()
420 if (*First != '/' || End - First < 2) { in skipLine()
421 LastTokenPtr = First; in skipLine()
422 ++First; in skipLine()
426 if (First[1] == '/') { in skipLine()
428 skipLineComment(First, End); in skipLine()
432 if (First[1] != '*') { in skipLine()
433 LastTokenPtr = First; in skipLine()
434 ++First; in skipLine()
439 skipBlockComment(First, End); in skipLine()
441 if (First == End) in skipLine()
445 unsigned Len = skipNewline(First, End); in skipLine()
446 if (!wasLineContinuation(First, Len)) // Continue past line-continuations. in skipLine()
451 void Scanner::skipDirective(StringRef Name, const char *&First, in skipDirective() argument
458 skipToNewlineRaw(First, End); in skipDirective()
460 skipLine(First, End); in skipDirective()
463 static void skipWhitespace(const char *&First, const char *const End) { in skipWhitespace() argument
465 assert(First <= End); in skipWhitespace()
466 skipOverSpaces(First, End); in skipWhitespace()
468 if (End - First < 2) in skipWhitespace()
471 if (First[0] == '\\' && isVerticalWhitespace(First[1])) { in skipWhitespace()
472 skipNewline(++First, End); in skipWhitespace()
477 if (First[0] != '/') in skipWhitespace()
481 if (First[1] == '/') { in skipWhitespace()
482 skipLineComment(First, End); in skipWhitespace()
487 if (First[1] != '*') in skipWhitespace()
491 skipBlockComment(First, End); in skipWhitespace()
495 bool Scanner::lexModuleDirectiveBody(DirectiveKind Kind, const char *&First, in lexModuleDirectiveBody() argument
499 const dependency_directives_scan::Token &Tok = lexToken(First, End); in lexModuleDirectiveBody()
508 skipWhitespace(First, End); in lexModuleDirectiveBody()
509 if (First == End) in lexModuleDirectiveBody()
511 if (!isVerticalWhitespace(*First)) in lexModuleDirectiveBody()
514 skipNewline(First, End); in lexModuleDirectiveBody()
518 dependency_directives_scan::Token &Scanner::lexToken(const char *&First, in lexToken() argument
522 First = Input.data() + TheLexer.getCurrentBufferOffset(); in lexToken()
523 assert(First <= End); in lexToken()
532 Scanner::lexIncludeFilename(const char *&First, const char *const End) { in lexIncludeFilename() argument
535 First = Input.data() + TheLexer.getCurrentBufferOffset(); in lexIncludeFilename()
536 assert(First <= End); in lexIncludeFilename()
544 void Scanner::lexPPDirectiveBody(const char *&First, const char *const End) { in lexPPDirectiveBody() argument
546 const dependency_directives_scan::Token &Tok = lexToken(First, End); in lexPPDirectiveBody()
578 Scanner::tryLexIdentifierOrSkipLine(const char *&First, const char *const End) { in tryLexIdentifierOrSkipLine() argument
579 const dependency_directives_scan::Token &Tok = lexToken(First, End); in tryLexIdentifierOrSkipLine()
582 skipLine(First, End); in tryLexIdentifierOrSkipLine()
589 StringRef Scanner::lexIdentifier(const char *&First, const char *const End) { in lexIdentifier() argument
590 std::optional<StringRef> Id = tryLexIdentifierOrSkipLine(First, End); in lexIdentifier()
595 bool Scanner::isNextIdentifierOrSkipLine(StringRef Id, const char *&First, in isNextIdentifierOrSkipLine() argument
598 tryLexIdentifierOrSkipLine(First, End)) { in isNextIdentifierOrSkipLine()
601 skipLine(First, End); in isNextIdentifierOrSkipLine()
606 bool Scanner::isNextTokenOrSkipLine(tok::TokenKind K, const char *&First, in isNextTokenOrSkipLine() argument
608 const dependency_directives_scan::Token &Tok = lexToken(First, End); in isNextTokenOrSkipLine()
611 skipLine(First, End); in isNextTokenOrSkipLine()
616 Scanner::tryLexStringLiteralOrSkipLine(const char *&First, in tryLexStringLiteralOrSkipLine() argument
618 const dependency_directives_scan::Token &Tok = lexToken(First, End); in tryLexStringLiteralOrSkipLine()
621 skipLine(First, End); in tryLexStringLiteralOrSkipLine()
628 bool Scanner::lexAt(const char *&First, const char *const End) { in lexAt() argument
632 const dependency_directives_scan::Token &AtTok = lexToken(First, End); in lexAt()
636 if (!isNextIdentifierOrSkipLine("import", First, End)) in lexAt()
638 return lexModuleDirectiveBody(decl_at_import, First, End); in lexAt()
641 bool Scanner::lexModule(const char *&First, const char *const End) { in lexModule() argument
642 StringRef Id = lexIdentifier(First, End); in lexModule()
646 std::optional<StringRef> NextId = tryLexIdentifierOrSkipLine(First, End); in lexModule()
653 skipLine(First, End); in lexModule()
657 skipWhitespace(First, End); in lexModule()
662 switch (*First) { in lexModule()
666 skipLine(First, End); in lexModule()
670 (void)lexToken(First, End); in lexModule()
671 if (!tryLexIdentifierOrSkipLine(First, End)) in lexModule()
679 if (!isAsciiIdentifierContinue(*First)) { in lexModule()
680 skipLine(First, End); in lexModule()
685 TheLexer.seek(getOffsetAt(First), /*IsAtStartOfLine*/ false); in lexModule()
693 return lexModuleDirectiveBody(Kind, First, End); in lexModule()
696 bool Scanner::lex_Pragma(const char *&First, const char *const End) { in lex_Pragma() argument
697 if (!isNextTokenOrSkipLine(tok::l_paren, First, End)) in lex_Pragma()
700 std::optional<StringRef> Str = tryLexStringLiteralOrSkipLine(First, End); in lex_Pragma()
702 if (!Str || !isNextTokenOrSkipLine(tok::r_paren, First, End)) in lex_Pragma()
722 skipLine(First, End); in lex_Pragma()
731 bool Scanner::lexPragma(const char *&First, const char *const End) { in lexPragma() argument
732 std::optional<StringRef> FoundId = tryLexIdentifierOrSkipLine(First, End); in lexPragma()
744 lexPPDirectiveBody(First, End); in lexPragma()
750 skipLine(First, End); in lexPragma()
754 FoundId = tryLexIdentifierOrSkipLine(First, End); in lexPragma()
761 lexPPDirectiveBody(First, End); in lexPragma()
767 skipLine(First, End); in lexPragma()
772 if (!isNextIdentifierOrSkipLine("import", First, End)) in lexPragma()
776 lexPPDirectiveBody(First, End); in lexPragma()
781 bool Scanner::lexEndif(const char *&First, const char *const End) { in lexEndif() argument
794 skipLine(First, End); in lexEndif()
798 return lexDefault(pp_endif, First, End); in lexEndif()
801 bool Scanner::lexDefault(DirectiveKind Kind, const char *&First, in lexDefault() argument
803 lexPPDirectiveBody(First, End); in lexDefault()
808 static bool isStartOfRelevantLine(char First) { in isStartOfRelevantLine() argument
809 switch (First) { in isStartOfRelevantLine()
821 bool Scanner::lexPPLine(const char *&First, const char *const End) { in lexPPLine() argument
822 assert(First != End); in lexPPLine()
824 skipWhitespace(First, End); in lexPPLine()
825 assert(First <= End); in lexPPLine()
826 if (First == End) in lexPPLine()
829 if (!isStartOfRelevantLine(*First)) { in lexPPLine()
830 skipLine(First, End); in lexPPLine()
831 assert(First <= End); in lexPPLine()
835 LastTokenPtr = First; in lexPPLine()
837 TheLexer.seek(getOffsetAt(First), /*IsAtStartOfLine*/ true); in lexPPLine()
846 if (*First == '@') in lexPPLine()
847 return lexAt(First, End); in lexPPLine()
849 if (*First == 'i' || *First == 'e' || *First == 'm') in lexPPLine()
850 return lexModule(First, End); in lexPPLine()
852 if (*First == '_') { in lexPPLine()
853 if (isNextIdentifierOrSkipLine("_Pragma", First, End)) in lexPPLine()
854 return lex_Pragma(First, End); in lexPPLine()
865 const dependency_directives_scan::Token &HashTok = lexToken(First, End); in lexPPLine()
870 skipLine(First, End); in lexPPLine()
871 assert(First <= End); in lexPPLine()
877 std::optional<StringRef> FoundId = tryLexIdentifierOrSkipLine(First, End); in lexPPLine()
884 return lexPragma(First, End); in lexPPLine()
903 skipDirective(Id, First, End); in lexPPLine()
908 return lexEndif(First, End); in lexPPLine()
916 if (lexIncludeFilename(First, End).is(tok::eod)) { in lexPPLine()
917 skipDirective(Id, First, End); in lexPPLine()
926 return lexDefault(Kind, First, End); in lexPPLine()
929 static void skipUTF8ByteOrderMark(const char *&First, const char *const End) { in skipUTF8ByteOrderMark() argument
930 if ((End - First) >= 3 && First[0] == '\xef' && First[1] == '\xbb' && in skipUTF8ByteOrderMark()
931 First[2] == '\xbf') in skipUTF8ByteOrderMark()
932 First += 3; in skipUTF8ByteOrderMark()
935 bool Scanner::scanImpl(const char *First, const char *const End) { in scanImpl() argument
936 skipUTF8ByteOrderMark(First, End); in scanImpl()
937 while (First != End) in scanImpl()
938 if (lexPPLine(First, End)) in scanImpl()