Lines Matching refs:First
85 lexToken(const char *&First, const char *const End);
87 dependency_directives_scan::Token &lexIncludeFilename(const char *&First,
96 tryLexIdentifierOrSkipLine(const char *&First, const char *const End);
99 LLVM_NODISCARD StringRef lexIdentifier(const char *&First,
108 const char *&First,
111 LLVM_NODISCARD bool scanImpl(const char *First, const char *const End);
112 LLVM_NODISCARD bool lexPPLine(const char *&First, const char *const End);
113 LLVM_NODISCARD bool lexAt(const char *&First, const char *const End);
114 LLVM_NODISCARD bool lexModule(const char *&First, const char *const End);
115 LLVM_NODISCARD bool lexDefine(const char *HashLoc, const char *&First,
117 LLVM_NODISCARD bool lexPragma(const char *&First, const char *const End);
118 LLVM_NODISCARD bool lexEndif(const char *&First, const char *const End);
119 LLVM_NODISCARD bool lexDefault(DirectiveKind Kind, const char *&First,
122 const char *&First,
124 void lexPPDirectiveBody(const char *&First, const char *const End);
175 static void skipOverSpaces(const char *&First, const char *const End) { in skipOverSpaces() argument
176 while (First != End && isHorizontalWhitespace(*First)) in skipOverSpaces()
177 ++First; in skipOverSpaces()
180 LLVM_NODISCARD static bool isRawStringLiteral(const char *First, in isRawStringLiteral() argument
182 assert(First <= Current); in isRawStringLiteral()
185 if (*Current != '"' || First == Current) in isRawStringLiteral()
192 if (First == Current || !isAsciiIdentifierContinue(*--Current)) in isRawStringLiteral()
197 return First == Current || !isAsciiIdentifierContinue(*--Current); in isRawStringLiteral()
200 if (*Current != '8' || First == Current || *Current-- != 'u') in isRawStringLiteral()
202 return First == Current || !isAsciiIdentifierContinue(*--Current); in isRawStringLiteral()
205 static void skipRawString(const char *&First, const char *const End) { in skipRawString() argument
206 assert(First[0] == '"'); in skipRawString()
207 assert(First[-1] == 'R'); in skipRawString()
209 const char *Last = ++First; in skipRawString()
213 First = Last; // Hit the end... just give up. in skipRawString()
217 StringRef Terminator(First, Last - First); in skipRawString()
220 First = Last; in skipRawString()
221 while (First != End && *First != ')') in skipRawString()
222 ++First; in skipRawString()
223 if (First == End) in skipRawString()
225 ++First; in skipRawString()
228 Last = First; in skipRawString()
229 while (Last != End && size_t(Last - First) < Terminator.size() && in skipRawString()
230 Terminator[Last - First] == *Last) in skipRawString()
235 First = Last; in skipRawString()
238 if (size_t(Last - First) < Terminator.size()) in skipRawString()
242 First = Last + 1; in skipRawString()
248 static unsigned isEOL(const char *First, const char *const End) { in isEOL() argument
249 if (First == End) in isEOL()
251 if (End - First > 1 && isVerticalWhitespace(First[0]) && in isEOL()
252 isVerticalWhitespace(First[1]) && First[0] != First[1]) in isEOL()
254 return !!isVerticalWhitespace(First[0]); in isEOL()
257 static void skipString(const char *&First, const char *const End) { in skipString() argument
258 assert(*First == '\'' || *First == '"' || *First == '<'); in skipString()
259 const char Terminator = *First == '<' ? '>' : *First; in skipString()
260 for (++First; First != End && *First != Terminator; ++First) { in skipString()
262 if (isVerticalWhitespace(*First)) in skipString()
264 if (*First != '\\') in skipString()
269 if (++First == End) in skipString()
271 if (!isWhitespace(*First)) in skipString()
274 const char *FirstAfterBackslashPastSpace = First; in skipString()
279 First = FirstAfterBackslashPastSpace + NLSize - 1; in skipString()
282 if (First != End) in skipString()
283 ++First; // Finish off the string. in skipString()
287 static unsigned skipNewline(const char *&First, const char *End) { in skipNewline() argument
288 if (First == End) in skipNewline()
290 assert(isVerticalWhitespace(*First)); in skipNewline()
291 unsigned Len = isEOL(First, End); in skipNewline()
293 First += Len; in skipNewline()
297 static bool wasLineContinuation(const char *First, unsigned EOLLen) { in wasLineContinuation() argument
298 return *(First - (int)EOLLen - 1) == '\\'; in wasLineContinuation()
301 static void skipToNewlineRaw(const char *&First, const char *const End) { in skipToNewlineRaw() argument
303 if (First == End) in skipToNewlineRaw()
306 unsigned Len = isEOL(First, End); in skipToNewlineRaw()
311 if (++First == End) in skipToNewlineRaw()
313 Len = isEOL(First, End); in skipToNewlineRaw()
316 if (First[-1] != '\\') in skipToNewlineRaw()
319 First += Len; in skipToNewlineRaw()
324 static void skipLineComment(const char *&First, const char *const End) { in skipLineComment() argument
325 assert(First[0] == '/' && First[1] == '/'); in skipLineComment()
326 First += 2; in skipLineComment()
327 skipToNewlineRaw(First, End); in skipLineComment()
330 static void skipBlockComment(const char *&First, const char *const End) { in skipBlockComment() argument
331 assert(First[0] == '/' && First[1] == '*'); in skipBlockComment()
332 if (End - First < 4) { in skipBlockComment()
333 First = End; in skipBlockComment()
336 for (First += 3; First != End; ++First) in skipBlockComment()
337 if (First[-1] == '*' && First[0] == '/') { in skipBlockComment()
338 ++First; in skipBlockComment()
367 static void skipLine(const char *&First, const char *const End) { in skipLine() argument
369 assert(First <= End); in skipLine()
370 if (First == End) in skipLine()
373 if (isVerticalWhitespace(*First)) { in skipLine()
374 skipNewline(First, End); in skipLine()
377 const char *Start = First; in skipLine()
378 while (First != End && !isVerticalWhitespace(*First)) { in skipLine()
380 if (*First == '"' || in skipLine()
381 (*First == '\'' && !isQuoteCppDigitSeparator(Start, First, End))) { in skipLine()
382 if (isRawStringLiteral(Start, First)) in skipLine()
383 skipRawString(First, End); in skipLine()
385 skipString(First, End); in skipLine()
390 if (*First != '/' || End - First < 2) { in skipLine()
391 ++First; in skipLine()
395 if (First[1] == '/') { in skipLine()
397 skipLineComment(First, End); in skipLine()
401 if (First[1] != '*') { in skipLine()
402 ++First; in skipLine()
407 skipBlockComment(First, End); in skipLine()
409 if (First == End) in skipLine()
413 unsigned Len = skipNewline(First, End); in skipLine()
414 if (!wasLineContinuation(First, Len)) // Continue past line-continuations. in skipLine()
419 static void skipDirective(StringRef Name, const char *&First, in skipDirective() argument
426 skipToNewlineRaw(First, End); in skipDirective()
428 skipLine(First, End); in skipDirective()
431 static void skipWhitespace(const char *&First, const char *const End) { in skipWhitespace() argument
433 assert(First <= End); in skipWhitespace()
434 skipOverSpaces(First, End); in skipWhitespace()
436 if (End - First < 2) in skipWhitespace()
439 if (First[0] == '\\' && isVerticalWhitespace(First[1])) { in skipWhitespace()
440 skipNewline(++First, End); in skipWhitespace()
445 if (First[0] != '/') in skipWhitespace()
449 if (First[1] == '/') { in skipWhitespace()
450 skipLineComment(First, End); in skipWhitespace()
455 if (First[1] != '*') in skipWhitespace()
459 skipBlockComment(First, End); in skipWhitespace()
463 bool Scanner::lexModuleDirectiveBody(DirectiveKind Kind, const char *&First, in lexModuleDirectiveBody() argument
467 const dependency_directives_scan::Token &Tok = lexToken(First, End); in lexModuleDirectiveBody()
476 skipWhitespace(First, End); in lexModuleDirectiveBody()
477 if (First == End) in lexModuleDirectiveBody()
479 if (!isVerticalWhitespace(*First)) in lexModuleDirectiveBody()
482 skipNewline(First, End); in lexModuleDirectiveBody()
486 dependency_directives_scan::Token &Scanner::lexToken(const char *&First, in lexToken() argument
490 First = Input.data() + TheLexer.getCurrentBufferOffset(); in lexToken()
491 assert(First <= End); in lexToken()
500 Scanner::lexIncludeFilename(const char *&First, const char *const End) { in lexIncludeFilename() argument
503 First = Input.data() + TheLexer.getCurrentBufferOffset(); in lexIncludeFilename()
504 assert(First <= End); in lexIncludeFilename()
512 void Scanner::lexPPDirectiveBody(const char *&First, const char *const End) { in lexPPDirectiveBody() argument
514 const dependency_directives_scan::Token &Tok = lexToken(First, End); in lexPPDirectiveBody()
521 Scanner::tryLexIdentifierOrSkipLine(const char *&First, const char *const End) { in tryLexIdentifierOrSkipLine() argument
522 const dependency_directives_scan::Token &Tok = lexToken(First, End); in tryLexIdentifierOrSkipLine()
525 skipLine(First, End); in tryLexIdentifierOrSkipLine()
550 StringRef Scanner::lexIdentifier(const char *&First, const char *const End) { in lexIdentifier() argument
551 Optional<StringRef> Id = tryLexIdentifierOrSkipLine(First, End); in lexIdentifier()
556 bool Scanner::isNextIdentifierOrSkipLine(StringRef Id, const char *&First, in isNextIdentifierOrSkipLine() argument
558 if (Optional<StringRef> FoundId = tryLexIdentifierOrSkipLine(First, End)) { in isNextIdentifierOrSkipLine()
561 skipLine(First, End); in isNextIdentifierOrSkipLine()
566 bool Scanner::lexAt(const char *&First, const char *const End) { in lexAt() argument
570 const dependency_directives_scan::Token &AtTok = lexToken(First, End); in lexAt()
574 if (!isNextIdentifierOrSkipLine("import", First, End)) in lexAt()
576 return lexModuleDirectiveBody(decl_at_import, First, End); in lexAt()
579 bool Scanner::lexModule(const char *&First, const char *const End) { in lexModule() argument
580 StringRef Id = lexIdentifier(First, End); in lexModule()
584 Optional<StringRef> NextId = tryLexIdentifierOrSkipLine(First, End); in lexModule()
591 skipLine(First, End); in lexModule()
595 skipWhitespace(First, End); in lexModule()
600 switch (*First) { in lexModule()
606 if (!isAsciiIdentifierContinue(*First)) { in lexModule()
607 skipLine(First, End); in lexModule()
612 TheLexer.seek(getOffsetAt(First), /*IsAtStartOfLine*/ false); in lexModule()
620 return lexModuleDirectiveBody(Kind, First, End); in lexModule()
623 bool Scanner::lexPragma(const char *&First, const char *const End) { in lexPragma() argument
624 Optional<StringRef> FoundId = tryLexIdentifierOrSkipLine(First, End); in lexPragma()
636 lexPPDirectiveBody(First, End); in lexPragma()
642 skipLine(First, End); in lexPragma()
647 if (!isNextIdentifierOrSkipLine("module", First, End)) in lexPragma()
651 if (!isNextIdentifierOrSkipLine("import", First, End)) in lexPragma()
655 lexPPDirectiveBody(First, End); in lexPragma()
660 bool Scanner::lexEndif(const char *&First, const char *const End) { in lexEndif() argument
673 skipLine(First, End); in lexEndif()
677 return lexDefault(pp_endif, First, End); in lexEndif()
680 bool Scanner::lexDefault(DirectiveKind Kind, const char *&First, in lexDefault() argument
682 lexPPDirectiveBody(First, End); in lexDefault()
687 static bool isStartOfRelevantLine(char First) { in isStartOfRelevantLine() argument
688 switch (First) { in isStartOfRelevantLine()
699 bool Scanner::lexPPLine(const char *&First, const char *const End) { in lexPPLine() argument
700 assert(First != End); in lexPPLine()
702 skipWhitespace(First, End); in lexPPLine()
703 assert(First <= End); in lexPPLine()
704 if (First == End) in lexPPLine()
707 if (!isStartOfRelevantLine(*First)) { in lexPPLine()
708 skipLine(First, End); in lexPPLine()
709 assert(First <= End); in lexPPLine()
713 TheLexer.seek(getOffsetAt(First), /*IsAtStartOfLine*/ true); in lexPPLine()
722 if (*First == '@') in lexPPLine()
723 return lexAt(First, End); in lexPPLine()
725 if (*First == 'i' || *First == 'e' || *First == 'm') in lexPPLine()
726 return lexModule(First, End); in lexPPLine()
735 const dependency_directives_scan::Token &HashTok = lexToken(First, End); in lexPPLine()
739 Optional<StringRef> FoundId = tryLexIdentifierOrSkipLine(First, End); in lexPPLine()
746 return lexPragma(First, End); in lexPPLine()
765 skipDirective(Id, First, End); in lexPPLine()
770 return lexEndif(First, End); in lexPPLine()
777 lexIncludeFilename(First, End); in lexPPLine()
784 return lexDefault(Kind, First, End); in lexPPLine()
787 static void skipUTF8ByteOrderMark(const char *&First, const char *const End) { in skipUTF8ByteOrderMark() argument
788 if ((End - First) >= 3 && First[0] == '\xef' && First[1] == '\xbb' && in skipUTF8ByteOrderMark()
789 First[2] == '\xbf') in skipUTF8ByteOrderMark()
790 First += 3; in skipUTF8ByteOrderMark()
793 bool Scanner::scanImpl(const char *First, const char *const End) { in scanImpl() argument
794 skipUTF8ByteOrderMark(First, End); in scanImpl()
795 while (First != End) in scanImpl()
796 if (lexPPLine(First, End)) in scanImpl()