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