1ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek//===--- PreprocessorLexer.cpp - C Language Family Lexer ------------------===// 2ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// 3ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// The LLVM Compiler Infrastructure 4ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// 5ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// This file is distributed under the University of Illinois Open Source 6ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// License. See LICENSE.TXT for details. 7ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// 8ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek//===----------------------------------------------------------------------===// 9ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// 10ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// This file implements the PreprocessorLexer and Token interfaces. 11ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek// 12ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek//===----------------------------------------------------------------------===// 13ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek 14ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek#include "clang/Lex/PreprocessorLexer.h" 15ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek#include "clang/Basic/SourceManager.h" 1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LexDiagnostic.h" 1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h" 18ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenekusing namespace clang; 19ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek 2099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid PreprocessorLexer::anchor() { } 2199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 22d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios KyrtzidisPreprocessorLexer::PreprocessorLexer(Preprocessor *pp, FileID fid) 23d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis : PP(pp), FID(fid), InitialNumSLocEntries(0), 24d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis ParsingPreprocessorDirective(false), 256e649737898ffb627c377fd8fa0a437d0a42ae4aDaniel Dunbar ParsingFilename(false), LexingRawMode(false) { 26d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis if (pp) 27d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis InitialNumSLocEntries = pp->getSourceManager().local_sloc_entry_size(); 28d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis} 29d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis 30d986853fcb6a5ac15235aa6af9a096f25050d596James Dennett/// \brief After the preprocessor has parsed a \#include, lex and 31ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek/// (potentially) macro expand the filename. 32ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenekvoid PreprocessorLexer::LexIncludeFilename(Token &FilenameTok) { 33ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek assert(ParsingPreprocessorDirective && 34ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek ParsingFilename == false && 35ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek "Must be in a preprocessing directive!"); 36ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek 37ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek // We are now parsing a filename! 38ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek ParsingFilename = true; 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek // Lex the filename. 41d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman if (LexingRawMode) 42d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman IndirectLex(FilenameTok); 43d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman else 44d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman PP->Lex(FilenameTok); 45ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek 46ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek // We should have obtained the filename now. 47ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek ParsingFilename = false; 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek // No filename? 5084021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (FilenameTok.is(tok::eod)) 51306fda76b0818eb7c215094123f2e16729a44aedChris Lattner PP->Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename); 52ab91b7086cceadce2cfd6a69cc90cebcdfcea07fTed Kremenek} 532b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 542b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner/// getFileEntry - Return the FileEntry corresponding to this FileID. Like 552b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner/// getFileID(), this only works for lexers with attached preprocessors. 562b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattnerconst FileEntry *PreprocessorLexer::getFileEntry() const { 572b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return PP->getSourceManager().getFileEntryForID(getFileID()); 582b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner} 59