ModuleMap.cpp revision 489ad43b77c10a98df80f1395de81e3f52697e76
1a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===--- ModuleMap.cpp - Describe the layout of modules ---------*- C++ -*-===//
2a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
3a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//                     The LLVM Compiler Infrastructure
4a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
5a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// This file is distributed under the University of Illinois Open Source
6a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// License. See LICENSE.TXT for details.
7a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
8a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===----------------------------------------------------------------------===//
9a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
10a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// This file defines the ModuleMap implementation, which describes the layout
11a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// of a module as it relates to headers.
12a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
13a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===----------------------------------------------------------------------===//
14a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/ModuleMap.h"
15a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/Lexer.h"
16a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/LiteralSupport.h"
17a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/LexDiagnostic.h"
18a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/Diagnostic.h"
19a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/FileManager.h"
20a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetInfo.h"
21a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetOptions.h"
22a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Allocator.h"
23ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor#include "llvm/Support/FileSystem.h"
24a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Host.h"
258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor#include "llvm/Support/PathV2.h"
26a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/raw_ostream.h"
27a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringRef.h"
28a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringSwitch.h"
29a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorusing namespace clang;
30a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
3190db26000aefe9335370013eec64c85232d80227Douglas GregorModule::ExportDecl
3290db26000aefe9335370013eec64c85232d80227Douglas GregorModuleMap::resolveExport(Module *Mod,
3390db26000aefe9335370013eec64c85232d80227Douglas Gregor                         const Module::UnresolvedExportDecl &Unresolved,
3490db26000aefe9335370013eec64c85232d80227Douglas Gregor                         bool Complain) {
350adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  // We may have just a wildcard.
360adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  if (Unresolved.Id.empty()) {
370adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    assert(Unresolved.Wildcard && "Invalid unresolved export");
380adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    return Module::ExportDecl(0, true);
390adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  }
400adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
4190db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Find the starting module.
4290db26000aefe9335370013eec64c85232d80227Douglas Gregor  Module *Context = lookupModuleUnqualified(Unresolved.Id[0].first, Mod);
4390db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (!Context) {
4490db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Complain)
4590db26000aefe9335370013eec64c85232d80227Douglas Gregor      Diags->Report(Unresolved.Id[0].second,
4690db26000aefe9335370013eec64c85232d80227Douglas Gregor                    diag::err_mmap_missing_module_unqualified)
4790db26000aefe9335370013eec64c85232d80227Douglas Gregor        << Unresolved.Id[0].first << Mod->getFullModuleName();
4890db26000aefe9335370013eec64c85232d80227Douglas Gregor
4990db26000aefe9335370013eec64c85232d80227Douglas Gregor    return Module::ExportDecl();
5090db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
5190db26000aefe9335370013eec64c85232d80227Douglas Gregor
5290db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Dig into the module path.
5390db26000aefe9335370013eec64c85232d80227Douglas Gregor  for (unsigned I = 1, N = Unresolved.Id.size(); I != N; ++I) {
5490db26000aefe9335370013eec64c85232d80227Douglas Gregor    Module *Sub = lookupModuleQualified(Unresolved.Id[I].first,
5590db26000aefe9335370013eec64c85232d80227Douglas Gregor                                        Context);
5690db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (!Sub) {
5790db26000aefe9335370013eec64c85232d80227Douglas Gregor      if (Complain)
5890db26000aefe9335370013eec64c85232d80227Douglas Gregor        Diags->Report(Unresolved.Id[I].second,
5990db26000aefe9335370013eec64c85232d80227Douglas Gregor                      diag::err_mmap_missing_module_qualified)
6090db26000aefe9335370013eec64c85232d80227Douglas Gregor          << Unresolved.Id[I].first << Context->getFullModuleName()
6190db26000aefe9335370013eec64c85232d80227Douglas Gregor          << SourceRange(Unresolved.Id[0].second, Unresolved.Id[I-1].second);
6290db26000aefe9335370013eec64c85232d80227Douglas Gregor
6390db26000aefe9335370013eec64c85232d80227Douglas Gregor      return Module::ExportDecl();
6490db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
6590db26000aefe9335370013eec64c85232d80227Douglas Gregor
6690db26000aefe9335370013eec64c85232d80227Douglas Gregor    Context = Sub;
6790db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
6890db26000aefe9335370013eec64c85232d80227Douglas Gregor
6990db26000aefe9335370013eec64c85232d80227Douglas Gregor  return Module::ExportDecl(Context, Unresolved.Wildcard);
7090db26000aefe9335370013eec64c85232d80227Douglas Gregor}
7190db26000aefe9335370013eec64c85232d80227Douglas Gregor
72a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC) {
73a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
74a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>(
75a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor            new DiagnosticsEngine(DiagIDs));
76a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true);
77a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceMgr = new SourceManager(*Diags, FileMgr);
78a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
79a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
80a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() {
8109fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor  for (llvm::StringMap<Module *>::iterator I = Modules.begin(),
8209fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor                                        IEnd = Modules.end();
8309fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor       I != IEnd; ++I) {
8409fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor    delete I->getValue();
8509fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor  }
8609fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor
87a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  delete SourceMgr;
88a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
89a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
901a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) {
9165f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  llvm::DenseMap<const FileEntry *, Module *>::iterator Known
9265f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor    = Headers.find(File);
9365f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  if (Known != Headers.end())
9465f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor    return Known->second;
9565f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor
96adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  const DirectoryEntry *Dir = File->getDir();
97adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs;
98adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  StringRef DirName = Dir->getName();
99e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
100e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  // Keep walking up the directory hierarchy, looking for a directory with
101e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  // an umbrella header.
102e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  do {
103e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
104e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      = UmbrellaDirs.find(Dir);
105adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    if (KnownDir != UmbrellaDirs.end()) {
106adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      Module *Result = KnownDir->second;
1079f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor
1089f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor      // Search up the module stack until we find a module with an umbrella
10910694cee2588442bee1e717f5042c58ffee25279Douglas Gregor      // directory.
1109f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor      Module *UmbrellaModule = Result;
11110694cee2588442bee1e717f5042c58ffee25279Douglas Gregor      while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
1129f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor        UmbrellaModule = UmbrellaModule->Parent;
1139f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor
1149f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor      if (UmbrellaModule->InferSubmodules) {
115e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // Infer submodules for each of the directories we found between
116e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // the directory of the umbrella header and the directory where
117e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // the actual header is located.
118e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
119e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // For a framework module, the umbrella directory is the framework
120e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // directory, so strip off the "Headers" or "PrivateHeaders".
12123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor        bool Explicit = UmbrellaModule->InferExplicitSubmodules;
122e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        unsigned LastSkippedDir = SkippedDirs.size();
12323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor        if (LastSkippedDir && UmbrellaModule->IsFramework) {
12423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor          if (llvm::sys::path::filename(SkippedDirs.back()->getName())
12523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                == "PrivateHeaders") {
12623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor            // For private headers, add an explicit "Private" module.
12723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor            // FIXME: This feels somewhat hackish. Do we want to introduce
12823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor            // some kind of "umbrella directory" here?
12923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor            Result = findOrCreateModule("Private", Result,
13023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                        /*IsFramework=*/false,
13123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                        /*IsExplicit=*/true).first;
13223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor            Explicit = true;
13323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor          }
13423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor
135e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          --LastSkippedDir;
13623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor        }
137e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
138e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        for (unsigned I = LastSkippedDir; I != 0; --I) {
139e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // Find or create the module that corresponds to this directory name.
140e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
141e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
14223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                      Explicit).first;
143e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
144e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // Associate the module and the directory.
145e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          UmbrellaDirs[SkippedDirs[I-1]] = Result;
146e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
147e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // If inferred submodules export everything they import, add a
148e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // wildcard to the set of exports.
1499f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor          if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
150e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor            Result->Exports.push_back(Module::ExportDecl(0, true));
151e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        }
152e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
153e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // Infer a submodule with the same name as this header file.
154e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        StringRef Name = llvm::sys::path::stem(File->getName());
155e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
15623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                    Explicit).first;
157e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
158e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // If inferred submodules export everything they import, add a
159e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // wildcard to the set of exports.
1609f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor        if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
161e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          Result->Exports.push_back(Module::ExportDecl(0, true));
162e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      } else {
163e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // Record each of the directories we stepped through as being part of
164e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // the module we found, since the umbrella header covers them all.
165e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
166e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          UmbrellaDirs[SkippedDirs[I]] = Result;
167e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      }
168adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
169e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      Headers[File] = Result;
170adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      return Result;
171adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    }
172adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
173adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    SkippedDirs.push_back(Dir);
174e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
175e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    // Retrieve our parent path.
176e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    DirName = llvm::sys::path::parent_path(DirName);
177e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    if (DirName.empty())
178e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      break;
179e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
180e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    // Resolve the parent path to a directory entry.
181e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    Dir = SourceMgr->getFileManager().getDirectory(DirName);
182e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  } while (Dir);
183adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
18465f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  return 0;
18565f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor}
18665f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor
1871a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModule(StringRef Name) {
188484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  llvm::StringMap<Module *>::iterator Known = Modules.find(Name);
189484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  if (Known != Modules.end())
190484535e45b4d301847a157e943c7823da5d40884Douglas Gregor    return Known->getValue();
191484535e45b4d301847a157e943c7823da5d40884Douglas Gregor
192484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  return 0;
193484535e45b4d301847a157e943c7823da5d40884Douglas Gregor}
194484535e45b4d301847a157e943c7823da5d40884Douglas Gregor
19590db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) {
19690db26000aefe9335370013eec64c85232d80227Douglas Gregor  for(; Context; Context = Context->Parent) {
19790db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Module *Sub = lookupModuleQualified(Name, Context))
19890db26000aefe9335370013eec64c85232d80227Douglas Gregor      return Sub;
19990db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
20090db26000aefe9335370013eec64c85232d80227Douglas Gregor
20190db26000aefe9335370013eec64c85232d80227Douglas Gregor  return findModule(Name);
20290db26000aefe9335370013eec64c85232d80227Douglas Gregor}
20390db26000aefe9335370013eec64c85232d80227Douglas Gregor
20490db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) {
20590db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (!Context)
20690db26000aefe9335370013eec64c85232d80227Douglas Gregor    return findModule(Name);
20790db26000aefe9335370013eec64c85232d80227Douglas Gregor
20890db26000aefe9335370013eec64c85232d80227Douglas Gregor  llvm::StringMap<Module *>::iterator Sub = Context->SubModules.find(Name);
20990db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (Sub != Context->SubModules.end())
21090db26000aefe9335370013eec64c85232d80227Douglas Gregor    return Sub->getValue();
21190db26000aefe9335370013eec64c85232d80227Douglas Gregor
21290db26000aefe9335370013eec64c85232d80227Douglas Gregor  return 0;
21390db26000aefe9335370013eec64c85232d80227Douglas Gregor}
21490db26000aefe9335370013eec64c85232d80227Douglas Gregor
2151a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool>
216392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
217392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                              bool IsExplicit) {
218392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Try to find an existing module with this name.
219392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (Module *Found = Parent? Parent->SubModules[Name] : Modules[Name])
220392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    return std::make_pair(Found, false);
221392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
222392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Create a new module with this name.
223392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
224392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                              IsExplicit);
225392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (Parent)
226392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Parent->SubModules[Name] = Result;
227392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  else
228392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Modules[Name] = Result;
229392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  return std::make_pair(Result, true);
230392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
231392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
2321a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *
2332821c7f8870629b56b9c41e1c50c7a091edd544dDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName,
234ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                                const DirectoryEntry *FrameworkDir,
235ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                                Module *Parent) {
2362821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // Check whether we've already found this module.
237ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
238ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    return Mod;
239ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor
240ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  FileManager &FileMgr = SourceMgr->getFileManager();
2412821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
2422821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // Look for an umbrella header.
2432821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
2442821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::sys::path::append(UmbrellaName, "Headers");
2452821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::sys::path::append(UmbrellaName, ModuleName + ".h");
246ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
2472821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
2482821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // FIXME: If there's no umbrella header, we could probably scan the
2492821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // framework to load *everything*. But, it's not clear that this is a good
2502821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // idea.
2512821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  if (!UmbrellaHeader)
2522821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor    return 0;
2532821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
254ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  Module *Result = new Module(ModuleName, SourceLocation(), Parent,
255ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                              /*IsFramework=*/true, /*IsExplicit=*/false);
256ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor
257ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  if (Parent)
258ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    Parent->SubModules[ModuleName] = Result;
259ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  else
260ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    Modules[ModuleName] = Result;
261ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor
262489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  // umbrella header "umbrella-header-name"
26310694cee2588442bee1e717f5042c58ffee25279Douglas Gregor  Result->Umbrella = UmbrellaHeader;
2642821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  Headers[UmbrellaHeader] = Result;
2652821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  UmbrellaDirs[FrameworkDir] = Result;
266209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor
267209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  // export *
268209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  Result->Exports.push_back(Module::ExportDecl(0, true));
269209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor
270e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  // module * { export * }
271e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Result->InferSubmodules = true;
272e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Result->InferExportWildcard = true;
273e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
274ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  // Look for subframeworks.
275ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  llvm::error_code EC;
27652b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  llvm::SmallString<128> SubframeworksDirName
27752b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor    = StringRef(FrameworkDir->getName());
278ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  llvm::sys::path::append(SubframeworksDirName, "Frameworks");
27952b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  llvm::SmallString<128> SubframeworksDirNameNative;
28052b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  llvm::sys::path::native(SubframeworksDirName.str(),
28152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor                          SubframeworksDirNameNative);
28252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  for (llvm::sys::fs::directory_iterator
28352b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor         Dir(SubframeworksDirNameNative.str(), EC), DirEnd;
284ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor       Dir != DirEnd && !EC; Dir.increment(EC)) {
285ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    if (!StringRef(Dir->path()).endswith(".framework"))
286ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor      continue;
287ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor
288ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    if (const DirectoryEntry *SubframeworkDir
289ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor          = FileMgr.getDirectory(Dir->path())) {
290ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor      // FIXME: Do we want to warn about subframeworks without umbrella headers?
291ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor      inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir,
292ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                           Result);
293ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    }
294ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  }
295d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
29623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor  // Look for private headers.
29723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor  Module *ModulePrivate = 0;
29823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor  llvm::SmallString<128> PrivateHeadersDirName(FrameworkDir->getName());
29923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor  llvm::sys::path::append(PrivateHeadersDirName, "PrivateHeaders");
30052b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  llvm::SmallString<128> PrivateHeadersDirNameNative;
30152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  llvm::sys::path::native(PrivateHeadersDirName.str(),
30252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor                          PrivateHeadersDirNameNative);
30352b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  for (llvm::sys::fs::directory_iterator
30452b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor         Dir(PrivateHeadersDirNameNative.str(), EC), DirEnd;
30523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor       Dir != DirEnd && !EC; Dir.increment(EC)) {
30623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor    // Check whether this entry has an extension typically associated with
30723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor    // headers.
30823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor    if (!llvm::StringSwitch<bool>(llvm::sys::path::extension(Dir->path()))
30923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor           .Cases(".h", ".H", ".hh", ".hpp", true)
31023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor           .Default(false))
31123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      continue;
31223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor
31323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor    if (const FileEntry *PrivateHeader = FileMgr.getFile(Dir->path())) {
31423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      // Create the "private" submodule, if we haven't done so already.
31523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      if (!ModulePrivate) {
31623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor        ModulePrivate = findOrCreateModule("Private", Result,
31723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                           /*IsFramework=*/false,
31823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                           /*IsExplicit=*/true).first;
31923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      }
32023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor
32123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      Module *Sub = findOrCreateModule(llvm::sys::path::stem(Dir->path()),
32223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                       ModulePrivate, /*IsFramework=*/false,
32323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                       /*IsExplicit=*/true).first;
32423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      // header "the private header"
32523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      Sub->Headers.push_back(PrivateHeader);
32623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor
32723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      // export *
32823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      Sub->Exports.push_back(Module::ExportDecl(0, true));
32923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor
33023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor      Headers[PrivateHeader] = Sub;
33123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor    }
33223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor  }
33323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor
3342821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  return Result;
3352821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor}
3362821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
337e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){
338e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Headers[UmbrellaHeader] = Mod;
33910694cee2588442bee1e717f5042c58ffee25279Douglas Gregor  Mod->Umbrella = UmbrellaHeader;
340e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
341e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  const DirectoryEntry *UmbrellaDir = UmbrellaHeader->getDir();
342e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  if (Mod->IsFramework)
343e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    UmbrellaDir = SourceMgr->getFileManager().getDirectory(
344e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor                    llvm::sys::path::parent_path(UmbrellaDir->getName()));
345e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
346e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  UmbrellaDirs[UmbrellaDir] = Mod;
347e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor}
348e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
349e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::addHeader(Module *Mod, const FileEntry *Header) {
350e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Mod->Headers.push_back(Header);
351e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Headers[Header] = Mod;
352e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor}
353e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
354f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry *
3551a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModuleMap::getContainingModuleMapFile(Module *Module) {
356f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  if (Module->DefinitionLoc.isInvalid() || !SourceMgr)
357f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor    return 0;
358f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
359f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  return SourceMgr->getFileEntryForID(
360f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor           SourceMgr->getFileID(Module->DefinitionLoc));
361f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor}
362f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
363a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() {
364a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::errs() << "Modules:";
365a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
366a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                                        MEnd = Modules.end();
367a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor       M != MEnd; ++M)
368804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor    M->getValue()->print(llvm::errs(), 2);
369a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
370a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::errs() << "Headers:";
371a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  for (llvm::DenseMap<const FileEntry *, Module *>::iterator
372a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor            H = Headers.begin(),
373a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor         HEnd = Headers.end();
374a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor       H != HEnd; ++H) {
375a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    llvm::errs() << "  \"" << H->first->getName() << "\" -> "
376a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 << H->second->getFullModuleName() << "\n";
377a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
378a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
379a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
38090db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) {
38190db26000aefe9335370013eec64c85232d80227Douglas Gregor  bool HadError = false;
38290db26000aefe9335370013eec64c85232d80227Douglas Gregor  for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) {
38390db26000aefe9335370013eec64c85232d80227Douglas Gregor    Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I],
38490db26000aefe9335370013eec64c85232d80227Douglas Gregor                                              Complain);
3850adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    if (Export.getPointer() || Export.getInt())
38690db26000aefe9335370013eec64c85232d80227Douglas Gregor      Mod->Exports.push_back(Export);
38790db26000aefe9335370013eec64c85232d80227Douglas Gregor    else
38890db26000aefe9335370013eec64c85232d80227Douglas Gregor      HadError = true;
38990db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
39090db26000aefe9335370013eec64c85232d80227Douglas Gregor  Mod->UnresolvedExports.clear();
39190db26000aefe9335370013eec64c85232d80227Douglas Gregor  return HadError;
39290db26000aefe9335370013eec64c85232d80227Douglas Gregor}
39390db26000aefe9335370013eec64c85232d80227Douglas Gregor
39455988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
39555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (Loc.isInvalid())
39655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
39755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
39855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  // Use the expansion location to determine which module we're in.
39955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
40055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (!ExpansionLoc.isFileID())
40155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
40255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
40355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
40455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  const SourceManager &SrcMgr = Loc.getManager();
40555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  FileID ExpansionFileID = ExpansionLoc.getFileID();
40655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  const FileEntry *ExpansionFile = SrcMgr.getFileEntryForID(ExpansionFileID);
40755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (!ExpansionFile)
40855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
40955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
41055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  // Find the module that owns this header.
41155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  return findModuleForHeader(ExpansionFile);
41255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor}
41355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
414a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------//
415a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser
416a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------//
417a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
418a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang {
419a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  /// \brief A token in a module map file.
420a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  struct MMToken {
421a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    enum TokenKind {
422a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      EndOfFile,
423a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      HeaderKeyword,
424a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Identifier,
425a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ExplicitKeyword,
42690db26000aefe9335370013eec64c85232d80227Douglas Gregor      ExportKeyword,
427a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor      FrameworkKeyword,
428a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ModuleKeyword,
42990db26000aefe9335370013eec64c85232d80227Douglas Gregor      Period,
430a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      UmbrellaKeyword,
43190db26000aefe9335370013eec64c85232d80227Douglas Gregor      Star,
432a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringLiteral,
433a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      LBrace,
434a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      RBrace
435a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    } Kind;
436a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
437a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned Location;
438a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned StringLength;
439a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    const char *StringData;
440a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
441a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void clear() {
442a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Kind = EndOfFile;
443a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Location = 0;
444a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringLength = 0;
445a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringData = 0;
446a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
447a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
448a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool is(TokenKind K) const { return Kind == K; }
449a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
450a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceLocation getLocation() const {
451a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return SourceLocation::getFromRawEncoding(Location);
452a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
453a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
454a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    StringRef getString() const {
455a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return StringRef(StringData, StringLength);
456a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
457a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  };
458a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
459a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  class ModuleMapParser {
460a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Lexer &L;
461a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceManager &SourceMgr;
462a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    DiagnosticsEngine &Diags;
463a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    ModuleMap &Map;
464a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
4658b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    /// \brief The directory that this module map resides in.
4668b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    const DirectoryEntry *Directory;
4678b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor
468a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Whether an error occurred.
469a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool HadError;
470a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
471a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Default target information, used only for string literal
472a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// parsing.
473a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    TargetInfo *Target;
474a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
475a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Stores string data for the various string literals referenced
476a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// during parsing.
477a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    llvm::BumpPtrAllocator StringData;
478a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
479a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief The current token.
480a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    MMToken Tok;
481a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
482a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief The active module.
4831a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    Module *ActiveModule;
484a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
485a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Consume the current token and return its location.
486a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceLocation consumeToken();
487a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
488a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Skip tokens until we reach the a token with the given kind
489a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// (or the end of the file).
490a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void skipUntil(MMToken::TokenKind K);
491587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
492587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    typedef llvm::SmallVector<std::pair<std::string, SourceLocation>, 2>
493587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      ModuleId;
494587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    bool parseModuleId(ModuleId &Id);
495a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void parseModuleDecl();
496489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    void parseHeaderDecl(SourceLocation UmbrellaLoc);
49790db26000aefe9335370013eec64c85232d80227Douglas Gregor    void parseExportDecl();
4981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    void parseInferredSubmoduleDecl(bool Explicit);
499a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
500a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  public:
501a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
502a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                             DiagnosticsEngine &Diags,
5038b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor                             ModuleMap &Map,
5048b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor                             const DirectoryEntry *Directory)
5058b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map),
5068b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor        Directory(Directory), HadError(false), ActiveModule(0)
507a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    {
508a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      TargetOptions TargetOpts;
509a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      TargetOpts.Triple = llvm::sys::getDefaultTargetTriple();
510a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
511a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
512a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Tok.clear();
513a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
514a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
515a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
516a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool parseModuleMapFile();
517a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  };
518a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
519a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
520a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() {
521a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry:
522a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation Result = Tok.getLocation();
523a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Tok.clear();
524a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
525a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Token LToken;
526a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  L.LexFromRawLexer(LToken);
527a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Tok.Location = LToken.getLocation().getRawEncoding();
528a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  switch (LToken.getKind()) {
529a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::raw_identifier:
530a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringData = LToken.getRawIdentifierData();
531a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringLength = LToken.getLength();
532a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
533a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("header", MMToken::HeaderKeyword)
534a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("explicit", MMToken::ExplicitKeyword)
53590db26000aefe9335370013eec64c85232d80227Douglas Gregor                 .Case("export", MMToken::ExportKeyword)
536a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor                 .Case("framework", MMToken::FrameworkKeyword)
537a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("module", MMToken::ModuleKeyword)
538a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("umbrella", MMToken::UmbrellaKeyword)
539a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Default(MMToken::Identifier);
540a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
541a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
542a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::eof:
543a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::EndOfFile;
544a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
545a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
546a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::l_brace:
547a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::LBrace;
548a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
549a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
55090db26000aefe9335370013eec64c85232d80227Douglas Gregor  case tok::period:
55190db26000aefe9335370013eec64c85232d80227Douglas Gregor    Tok.Kind = MMToken::Period;
55290db26000aefe9335370013eec64c85232d80227Douglas Gregor    break;
55390db26000aefe9335370013eec64c85232d80227Douglas Gregor
554a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::r_brace:
555a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::RBrace;
556a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
557a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
55890db26000aefe9335370013eec64c85232d80227Douglas Gregor  case tok::star:
55990db26000aefe9335370013eec64c85232d80227Douglas Gregor    Tok.Kind = MMToken::Star;
56090db26000aefe9335370013eec64c85232d80227Douglas Gregor    break;
56190db26000aefe9335370013eec64c85232d80227Douglas Gregor
562a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::string_literal: {
563a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Parse the string literal.
564a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    LangOptions LangOpts;
565a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
566a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    if (StringLiteral.hadError)
567a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      goto retry;
568a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
569a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Copy the string literal into our string data allocator.
570a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned Length = StringLiteral.GetStringLength();
571a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    char *Saved = StringData.Allocate<char>(Length + 1);
572a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    memcpy(Saved, StringLiteral.GetString().data(), Length);
573a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Saved[Length] = 0;
574a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
575a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Form the token.
576a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::StringLiteral;
577a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringData = Saved;
578a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringLength = Length;
579a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
580a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
581a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
582a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::comment:
583a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    goto retry;
584a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
585a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  default:
586a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
587a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
588a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    goto retry;
589a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
590a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
591a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return Result;
592a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
593a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
594a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) {
595a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  unsigned braceDepth = 0;
596a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
597a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
598a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
599a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return;
600a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
601a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::LBrace:
602a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (Tok.is(K) && braceDepth == 0)
603a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
604a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
605a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ++braceDepth;
606a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
607a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
608a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
609a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (braceDepth > 0)
610a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        --braceDepth;
611a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      else if (Tok.is(K))
612a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
613a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
614a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
615a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    default:
616a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (braceDepth == 0 && Tok.is(K))
617a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
618a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
619a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
620a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
621a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor   consumeToken();
622a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (true);
623a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
624a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
625587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \brief Parse a module-id.
626587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///
627587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///   module-id:
628587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     identifier
629587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     identifier '.' module-id
630587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///
631587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \returns true if an error occurred, false otherwise.
632587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregorbool ModuleMapParser::parseModuleId(ModuleId &Id) {
633587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  Id.clear();
634587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  do {
635587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    if (Tok.is(MMToken::Identifier)) {
636587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
637587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      consumeToken();
638587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    } else {
639587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
640587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      return true;
641587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    }
642587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
643587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    if (!Tok.is(MMToken::Period))
644587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      break;
645587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
646587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    consumeToken();
647587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  } while (true);
648587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
649587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  return false;
650587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor}
651587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
652a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration.
653a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
654a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-declaration:
655587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     'explicit'[opt] 'framework'[opt] 'module' module-id { module-member* }
656a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
657a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-member:
658a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     header-declaration
659587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     submodule-declaration
66090db26000aefe9335370013eec64c85232d80227Douglas Gregor///     export-declaration
6611e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///
6621e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///   submodule-declaration:
6631e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///     module-declaration
6641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///     inferred-submodule-declaration
665a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() {
666a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
667a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor         Tok.is(MMToken::FrameworkKeyword));
668d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Parse 'explicit' or 'framework' keyword, if present.
669587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  SourceLocation ExplicitLoc;
670a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Explicit = false;
671d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  bool Framework = false;
672a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
673a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  // Parse 'explicit' keyword, if present.
674d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  if (Tok.is(MMToken::ExplicitKeyword)) {
675587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    ExplicitLoc = consumeToken();
676a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Explicit = true;
677a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
678d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
679d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Parse 'framework' keyword, if present.
680d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  if (Tok.is(MMToken::FrameworkKeyword)) {
681d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    consumeToken();
682d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    Framework = true;
683d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  }
684a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
685a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse 'module' keyword.
686a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::ModuleKeyword)) {
687e6fb9876970e2dc55f091522644efa16caa9ba06Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
688a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
689a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
690a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
691a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
692a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  consumeToken(); // 'module' keyword
6931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
6941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // If we have a wildcard for the module name, this is an inferred submodule.
6951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Parse it.
6961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (Tok.is(MMToken::Star))
6971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    return parseInferredSubmoduleDecl(Explicit);
698a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
699a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the module name.
700587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  ModuleId Id;
701587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (parseModuleId(Id)) {
702587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    HadError = true;
703587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    return;
704587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  }
705587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
706587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (ActiveModule) {
707587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    if (Id.size() > 1) {
708587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
709587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        << SourceRange(Id.front().second, Id.back().second);
710587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
711587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      HadError = true;
712587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      return;
713587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    }
714587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  } else if (Id.size() == 1 && Explicit) {
715587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // Top-level modules can't be explicit.
716587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
717587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    Explicit = false;
718587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    ExplicitLoc = SourceLocation();
719a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
720a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
721587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
722587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  Module *PreviousActiveModule = ActiveModule;
723587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (Id.size() > 1) {
724587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // This module map defines a submodule. Go find the module of which it
725587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // is a submodule.
726587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    ActiveModule = 0;
727587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
728587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
729587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        ActiveModule = Next;
730587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        continue;
731587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      }
732587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
733587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      if (ActiveModule) {
734587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
735587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor          << Id[I].first << ActiveModule->getTopLevelModule();
736587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      } else {
737587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
738587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      }
739587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      HadError = true;
740587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      return;
741587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    }
742587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  }
743587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
744587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  StringRef ModuleName = Id.back().first;
745587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  SourceLocation ModuleNameLoc = Id.back().second;
746a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the opening brace.
748a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::LBrace)) {
749a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
750a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << ModuleName;
751a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
752a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
753a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
754a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation LBraceLoc = consumeToken();
755a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
756a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Determine whether this (sub)module has already been defined.
757a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::StringMap<Module *> &ModuleSpace
758a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    = ActiveModule? ActiveModule->SubModules : Map.Modules;
759a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::StringMap<Module *>::iterator ExistingModule
760a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    = ModuleSpace.find(ModuleName);
761a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (ExistingModule != ModuleSpace.end()) {
762a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
763a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << ModuleName;
764a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(ExistingModule->getValue()->DefinitionLoc,
765a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 diag::note_mmap_prev_definition);
766a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
767a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Skip the module definition.
768a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    skipUntil(MMToken::RBrace);
769a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    if (Tok.is(MMToken::RBrace))
770a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
771a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
772a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
773a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
774a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
775a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
776a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Start defining this module.
777a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  ActiveModule = new Module(ModuleName, ModuleNameLoc, ActiveModule, Framework,
778a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor                            Explicit);
779a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  ModuleSpace[ModuleName] = ActiveModule;
780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Done = false;
782a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
783a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
784a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
785a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
786a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Done = true;
787a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
788a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
789a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ExplicitKeyword:
790d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    case MMToken::FrameworkKeyword:
791a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ModuleKeyword:
792a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseModuleDecl();
793a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
794a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
79590db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::ExportKeyword:
79690db26000aefe9335370013eec64c85232d80227Douglas Gregor      parseExportDecl();
79790db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
79890db26000aefe9335370013eec64c85232d80227Douglas Gregor
799489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    case MMToken::UmbrellaKeyword:
800489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      parseHeaderDecl(consumeToken());
801a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
802a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
803489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    case MMToken::HeaderKeyword:
804489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      parseHeaderDecl(SourceLocation());
805a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
806489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
807a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    default:
808a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
809a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
810a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
811a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
812a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (!Done);
813a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
814a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (Tok.is(MMToken::RBrace))
815a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
816a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  else {
817a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
818a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
819a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
820a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
821a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
822587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  // We're done parsing this module. Pop back to the previous module.
823587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  ActiveModule = PreviousActiveModule;
824a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
825d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
826d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// \brief Append to \p Paths the set of paths needed to get to the
827d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// subframework in which the given module lives.
828d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregorvoid appendSubframeworkPaths(Module *Mod, llvm::SmallVectorImpl<char> &Path) {
829d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Collect the framework names from the given module to the top-level module.
830d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  llvm::SmallVector<StringRef, 2> Paths;
831d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  for (; Mod; Mod = Mod->Parent) {
832d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    if (Mod->IsFramework)
833d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor      Paths.push_back(Mod->Name);
834d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  }
835d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
836d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  if (Paths.empty())
837d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    return;
838d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
839d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Add Frameworks/Name.framework for each subframework.
840d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  for (unsigned I = Paths.size() - 1; I != 0; --I) {
841d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    llvm::sys::path::append(Path, "Frameworks");
842d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    llvm::sys::path::append(Path, Paths[I-1] + ".framework");
843d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  }
844d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor}
845d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
846489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// \brief Parse a header declaration.
847a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
848489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor///   header-declaration:
849489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor///     'umbrella'[opt] 'header' string-literal
850489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregorvoid ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) {
851489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  assert(Tok.is(MMToken::HeaderKeyword));
852489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  consumeToken();
853489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
854489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  bool Umbrella = UmbrellaLoc.isValid();
855a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
856a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the header name.
857a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::StringLiteral)) {
858a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
859489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      << "header";
860a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
861a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
862a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
863587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  std::string FileName = Tok.getString();
864a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation FileNameLoc = consumeToken();
865489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
8668b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Check whether we already have an umbrella header.
867489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  if (Umbrella && ActiveModule->getUmbrellaHeader()) {
8688b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_umbrella_header_conflict)
8698b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << ActiveModule->getFullModuleName()
87010694cee2588442bee1e717f5042c58ffee25279Douglas Gregor      << ActiveModule->getUmbrellaHeader()->getName();
8718b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
8728b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    return;
8738b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
874a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
8758b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Look for this file.
876587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  const FileEntry *File = 0;
8778b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  llvm::SmallString<128> PathName;
878587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (llvm::sys::path::is_absolute(FileName)) {
879587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    PathName = FileName;
880587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    File = SourceMgr.getFileManager().getFile(PathName);
881587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  } else {
882587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // Search for the header file within the search directory.
88318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    PathName += Directory->getName();
884587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    unsigned PathLength = PathName.size();
88518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
886d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    if (ActiveModule->isPartOfFramework()) {
887d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor      appendSubframeworkPaths(ActiveModule, PathName);
888587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
889587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      // Check whether this file is in the public headers.
89018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      llvm::sys::path::append(PathName, "Headers");
891587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      llvm::sys::path::append(PathName, FileName);
892587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      File = SourceMgr.getFileManager().getFile(PathName);
893587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
894587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      if (!File) {
895587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        // Check whether this file is in the private headers.
896587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        PathName.resize(PathLength);
897587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        llvm::sys::path::append(PathName, "PrivateHeaders");
898587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        llvm::sys::path::append(PathName, FileName);
899587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        File = SourceMgr.getFileManager().getFile(PathName);
900587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      }
901587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    } else {
902587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      // Lookup for normal headers.
903587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      llvm::sys::path::append(PathName, FileName);
904587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      File = SourceMgr.getFileManager().getFile(PathName);
905d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    }
90618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  }
907a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
9088b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
9098b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Come up with a lazy way to do this.
910587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (File) {
9118b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    if (const Module *OwningModule = Map.Headers[File]) {
9128b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
9138b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor        << FileName << OwningModule->getFullModuleName();
9148b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      HadError = true;
915489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    } else if (Umbrella) {
916489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      const DirectoryEntry *UmbrellaDir = File->getDir();
917489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      if (ActiveModule->IsFramework) {
918489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        // For framework modules, use the framework directory as the umbrella
919489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        // directory.
920489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        UmbrellaDir = SourceMgr.getFileManager().getDirectory(
921489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor                        llvm::sys::path::parent_path(UmbrellaDir->getName()));
922489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      }
923489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
924489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) {
925489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
926489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor          << OwningModule->getFullModuleName();
927489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        HadError = true;
928489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      } else {
929489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        // Record this umbrella header.
930489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        Map.setUmbrellaHeader(ActiveModule, File);
931489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      }
9328b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    } else {
933489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      // Record this header.
934e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      Map.addHeader(ActiveModule, File);
9358b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    }
9368b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  } else {
9378b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
9388b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << false << FileName;
9398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
9408b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
941a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
942a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
94390db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration.
94490db26000aefe9335370013eec64c85232d80227Douglas Gregor///
94590db26000aefe9335370013eec64c85232d80227Douglas Gregor///   export-declaration:
94690db26000aefe9335370013eec64c85232d80227Douglas Gregor///     'export' wildcard-module-id
94790db26000aefe9335370013eec64c85232d80227Douglas Gregor///
94890db26000aefe9335370013eec64c85232d80227Douglas Gregor///   wildcard-module-id:
94990db26000aefe9335370013eec64c85232d80227Douglas Gregor///     identifier
95090db26000aefe9335370013eec64c85232d80227Douglas Gregor///     '*'
95190db26000aefe9335370013eec64c85232d80227Douglas Gregor///     identifier '.' wildcard-module-id
95290db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() {
95390db26000aefe9335370013eec64c85232d80227Douglas Gregor  assert(Tok.is(MMToken::ExportKeyword));
95490db26000aefe9335370013eec64c85232d80227Douglas Gregor  SourceLocation ExportLoc = consumeToken();
95590db26000aefe9335370013eec64c85232d80227Douglas Gregor
95690db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Parse the module-id with an optional wildcard at the end.
95790db26000aefe9335370013eec64c85232d80227Douglas Gregor  ModuleId ParsedModuleId;
95890db26000aefe9335370013eec64c85232d80227Douglas Gregor  bool Wildcard = false;
95990db26000aefe9335370013eec64c85232d80227Douglas Gregor  do {
96090db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Tok.is(MMToken::Identifier)) {
96190db26000aefe9335370013eec64c85232d80227Douglas Gregor      ParsedModuleId.push_back(std::make_pair(Tok.getString(),
96290db26000aefe9335370013eec64c85232d80227Douglas Gregor                                              Tok.getLocation()));
96390db26000aefe9335370013eec64c85232d80227Douglas Gregor      consumeToken();
96490db26000aefe9335370013eec64c85232d80227Douglas Gregor
96590db26000aefe9335370013eec64c85232d80227Douglas Gregor      if (Tok.is(MMToken::Period)) {
96690db26000aefe9335370013eec64c85232d80227Douglas Gregor        consumeToken();
96790db26000aefe9335370013eec64c85232d80227Douglas Gregor        continue;
96890db26000aefe9335370013eec64c85232d80227Douglas Gregor      }
96990db26000aefe9335370013eec64c85232d80227Douglas Gregor
97090db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
97190db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
97290db26000aefe9335370013eec64c85232d80227Douglas Gregor
97390db26000aefe9335370013eec64c85232d80227Douglas Gregor    if(Tok.is(MMToken::Star)) {
97490db26000aefe9335370013eec64c85232d80227Douglas Gregor      Wildcard = true;
9750adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      consumeToken();
97690db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
97790db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
97890db26000aefe9335370013eec64c85232d80227Douglas Gregor
97990db26000aefe9335370013eec64c85232d80227Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
98090db26000aefe9335370013eec64c85232d80227Douglas Gregor    HadError = true;
98190db26000aefe9335370013eec64c85232d80227Douglas Gregor    return;
98290db26000aefe9335370013eec64c85232d80227Douglas Gregor  } while (true);
98390db26000aefe9335370013eec64c85232d80227Douglas Gregor
98490db26000aefe9335370013eec64c85232d80227Douglas Gregor  Module::UnresolvedExportDecl Unresolved = {
98590db26000aefe9335370013eec64c85232d80227Douglas Gregor    ExportLoc, ParsedModuleId, Wildcard
98690db26000aefe9335370013eec64c85232d80227Douglas Gregor  };
98790db26000aefe9335370013eec64c85232d80227Douglas Gregor  ActiveModule->UnresolvedExports.push_back(Unresolved);
98890db26000aefe9335370013eec64c85232d80227Douglas Gregor}
98990db26000aefe9335370013eec64c85232d80227Douglas Gregor
9901e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregorvoid ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) {
9911e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  assert(Tok.is(MMToken::Star));
9921e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  SourceLocation StarLoc = consumeToken();
9931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  bool Failed = false;
9941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
9951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Inferred modules must be submodules.
9961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (!ActiveModule) {
9971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
9981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Failed = true;
9991e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
10001e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10011e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Inferred modules must have umbrella headers.
100210694cee2588442bee1e717f5042c58ffee25279Douglas Gregor  if (!Failed && !ActiveModule->getUmbrellaHeader()) {
10031e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
10041e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Failed = true;
10051e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
10061e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10071e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Check for redefinition of an inferred module.
1008ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  if (!Failed && ActiveModule->InferSubmodules) {
10091e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1010ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor    if (ActiveModule->InferredSubmoduleLoc.isValid())
1011ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor      Diags.Report(ActiveModule->InferredSubmoduleLoc,
10121e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor                   diag::note_mmap_prev_definition);
10131e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Failed = true;
10141e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
10151e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // If there were any problems with this inferred submodule, skip its body.
10171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (Failed) {
10181e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    if (Tok.is(MMToken::LBrace)) {
10191e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
10201e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      skipUntil(MMToken::RBrace);
10211e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      if (Tok.is(MMToken::RBrace))
10221e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor        consumeToken();
10231e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    }
10241e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    HadError = true;
10251e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    return;
10261e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
10271e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10281e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Note that we have an inferred submodule.
1029ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  ActiveModule->InferSubmodules = true;
1030ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  ActiveModule->InferredSubmoduleLoc = StarLoc;
1031ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  ActiveModule->InferExplicitSubmodules = Explicit;
10321e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10331e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Parse the opening brace.
10341e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (!Tok.is(MMToken::LBrace)) {
10351e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
10361e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    HadError = true;
10371e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    return;
10381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
10391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  SourceLocation LBraceLoc = consumeToken();
10401e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10411e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Parse the body of the inferred submodule.
10421e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  bool Done = false;
10431e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  do {
10441e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    switch (Tok.Kind) {
10451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::EndOfFile:
10461e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::RBrace:
10471e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      Done = true;
10481e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      break;
10491e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10501e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::ExportKeyword: {
10511e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
10521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      if (Tok.is(MMToken::Star))
1053ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor        ActiveModule->InferExportWildcard = true;
10541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      else
10551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor        Diags.Report(Tok.getLocation(),
10561e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor                     diag::err_mmap_expected_export_wildcard);
10571e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
10581e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      break;
10591e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    }
10601e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10611e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::ExplicitKeyword:
10621e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::ModuleKeyword:
10631e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::HeaderKeyword:
10641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::UmbrellaKeyword:
10651e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    default:
10661e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member);
10671e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
10681e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      break;
10691e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    }
10701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  } while (!Done);
10711e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
10721e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (Tok.is(MMToken::RBrace))
10731e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    consumeToken();
10741e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  else {
10751e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
10761e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
10771e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    HadError = true;
10781e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
10791e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor}
10801e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
1081a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file.
1082a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
1083a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-map-file:
1084a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     module-declaration*
1085a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() {
1086a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
1087a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
1088a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
1089a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return HadError;
1090a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1091587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    case MMToken::ExplicitKeyword:
1092a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ModuleKeyword:
1093a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    case MMToken::FrameworkKeyword:
1094a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseModuleDecl();
1095a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
1096a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
109790db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::ExportKeyword:
1098a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::HeaderKeyword:
1099a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::Identifier:
1100a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::LBrace:
110190db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::Period:
1102a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
110390db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::Star:
1104a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::StringLiteral:
1105a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::UmbrellaKeyword:
1106a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1107a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      HadError = true;
1108a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
1109a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
1110a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
1111a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (true);
1112a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1113a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return HadError;
1114a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
1115a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1116a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) {
1117a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
1118a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
1119a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Buffer)
1120a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return true;
1121a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1122a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse this module map file.
1123a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, LangOpts);
1124a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->getClient()->BeginSourceFile(LangOpts);
11258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir());
1126a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Result = Parser.parseModuleMapFile();
1127a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->getClient()->EndSourceFile();
1128a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1129a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return Result;
1130a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
1131