15dc60fe5SEugene Zelenko //===- PreprocessorLexer.cpp - C Language Family Lexer --------------------===//
26c90efb9STed Kremenek //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66c90efb9STed Kremenek //
76c90efb9STed Kremenek //===----------------------------------------------------------------------===//
86c90efb9STed Kremenek //
96c90efb9STed Kremenek //  This file implements the PreprocessorLexer and Token interfaces.
106c90efb9STed Kremenek //
116c90efb9STed Kremenek //===----------------------------------------------------------------------===//
126c90efb9STed Kremenek 
136c90efb9STed Kremenek #include "clang/Lex/PreprocessorLexer.h"
146c90efb9STed Kremenek #include "clang/Basic/SourceManager.h"
153a02247dSChandler Carruth #include "clang/Lex/LexDiagnostic.h"
163a02247dSChandler Carruth #include "clang/Lex/Preprocessor.h"
175dc60fe5SEugene Zelenko #include "clang/Lex/Token.h"
185dc60fe5SEugene Zelenko #include <cassert>
195dc60fe5SEugene Zelenko 
206c90efb9STed Kremenek using namespace clang;
216c90efb9STed Kremenek 
anchor()2268e081d6SDavid Blaikie void PreprocessorLexer::anchor() {}
2368e081d6SDavid Blaikie 
PreprocessorLexer(Preprocessor * pp,FileID fid)2461ef3db2SArgyrios Kyrtzidis PreprocessorLexer::PreprocessorLexer(Preprocessor *pp, FileID fid)
255dc60fe5SEugene Zelenko     : PP(pp), FID(fid) {
2661ef3db2SArgyrios Kyrtzidis   if (pp)
2761ef3db2SArgyrios Kyrtzidis     InitialNumSLocEntries = pp->getSourceManager().local_sloc_entry_size();
2861ef3db2SArgyrios Kyrtzidis }
2961ef3db2SArgyrios Kyrtzidis 
309fc8faf9SAdrian Prantl /// After the preprocessor has parsed a \#include, lex and
316c90efb9STed Kremenek /// (potentially) macro expand the filename.
LexIncludeFilename(Token & FilenameTok)326c90efb9STed Kremenek void PreprocessorLexer::LexIncludeFilename(Token &FilenameTok) {
33b9b05100SRichard Smith   assert(ParsingFilename == false && "reentered LexIncludeFilename");
346c90efb9STed Kremenek 
356c90efb9STed Kremenek   // We are now parsing a filename!
366c90efb9STed Kremenek   ParsingFilename = true;
376c90efb9STed Kremenek 
386c90efb9STed Kremenek   // Lex the filename.
390834a4b9SEli Friedman   if (LexingRawMode)
406c90efb9STed Kremenek     IndirectLex(FilenameTok);
410834a4b9SEli Friedman   else
420834a4b9SEli Friedman     PP->Lex(FilenameTok);
436c90efb9STed Kremenek 
446c90efb9STed Kremenek   // We should have obtained the filename now.
456c90efb9STed Kremenek   ParsingFilename = false;
466c90efb9STed Kremenek }
47d32480d3SChris Lattner 
48d32480d3SChris Lattner /// getFileEntry - Return the FileEntry corresponding to this FileID.  Like
49d32480d3SChris Lattner /// getFileID(), this only works for lexers with attached preprocessors.
50*0b09b5d4SJan Svoboda OptionalFileEntryRefDegradesToFileEntryPtr
getFileEntry() const51*0b09b5d4SJan Svoboda PreprocessorLexer::getFileEntry() const {
52*0b09b5d4SJan Svoboda   return PP->getSourceManager().getFileEntryRefForID(getFileID());
53d32480d3SChris Lattner }
54