saqut-compiler/llvm/include/clang/Lex/ModuleMapFile.h

172 lines
4.5 KiB
C++

//===- ModuleMapFile.h - Parsing and representation -------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_LEX_MODULEMAPFILE_H
#define LLVM_CLANG_LEX_MODULEMAPFILE_H
#include "clang/Basic/LLVM.h"
// TODO: Consider moving ModuleId to another header, parsing a modulemap file is
// intended to not depend on anything about the clang::Module class.
#include "clang/Basic/Module.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/StringRef.h"
#include <optional>
#include <variant>
namespace clang {
class DiagnosticsEngine;
class SourceManager;
namespace modulemap {
struct ExportDecl;
/// All declarations that can appear in a `module` declaration.
using Decl =
std::variant<struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl,
struct ModuleDecl, struct ExcludeDecl, struct ExportDecl,
struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl,
struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl>;
struct RequiresFeature {
StringRef Feature;
SourceLocation Location;
bool RequiredState = true; /// False if preceded by '!'.
};
struct RequiresDecl {
SourceLocation Location;
std::vector<RequiresFeature> Features;
};
struct HeaderDecl {
StringRef Path;
SourceLocation Location;
SourceLocation PathLoc;
std::optional<int64_t> Size;
std::optional<int64_t> MTime;
LLVM_PREFERRED_TYPE(bool)
unsigned Private : 1;
LLVM_PREFERRED_TYPE(bool)
unsigned Textual : 1;
LLVM_PREFERRED_TYPE(bool)
unsigned Umbrella : 1;
LLVM_PREFERRED_TYPE(bool)
unsigned Excluded : 1;
};
struct UmbrellaDirDecl {
StringRef Path;
SourceLocation Location;
};
struct ModuleDecl {
ModuleId Id;
SourceLocation Location; /// Points to the first keyword in the decl.
ModuleAttributes Attrs;
std::vector<Decl> Decls;
LLVM_PREFERRED_TYPE(bool)
unsigned Explicit : 1;
LLVM_PREFERRED_TYPE(bool)
unsigned Framework : 1;
};
struct ExcludeDecl {
SourceLocation Location;
StringRef Module;
};
struct ExportDecl {
ModuleId Id;
SourceLocation Location;
bool Wildcard; /// True if the last element of the ModuleId is '*'.
};
struct ExportAsDecl {
SourceLocation Location;
ModuleId Id;
};
struct ExternModuleDecl {
SourceLocation Location;
ModuleId Id;
StringRef Path;
};
struct UseDecl {
SourceLocation Location;
ModuleId Id;
};
struct LinkDecl {
StringRef Library;
SourceLocation Location;
LLVM_PREFERRED_TYPE(bool)
unsigned Framework : 1;
};
struct ConfigMacrosDecl {
std::vector<StringRef> Macros;
SourceLocation Location;
LLVM_PREFERRED_TYPE(bool)
unsigned Exhaustive : 1;
};
struct ConflictDecl {
SourceLocation Location;
ModuleId Id;
StringRef Message;
};
using TopLevelDecl = std::variant<ModuleDecl, ExternModuleDecl>;
/// Represents the parsed form of a module map file.
///
/// This holds many reference types (StringRef, SourceLocation, etc.) whose
/// lifetimes are bound by the SourceManager and FileManager used.
struct ModuleMapFile {
/// The FileID used to parse this module map. This is always a local ID.
FileID ID;
/// The directory in which the module map was discovered. Declarations in
/// the module map are relative to this directory.
OptionalDirectoryEntryRef Dir;
/// Beginning of the file, used for moduleMapFileRead callback.
SourceLocation Start;
bool IsSystem;
std::vector<TopLevelDecl> Decls;
void dump(llvm::raw_ostream &out) const;
};
/// Parse a module map file into an in memory representation.
///
/// \param ID a valid local FileID.
/// \param Dir the directory in which this module map was found.
/// \param SM the SourceManager for \a ID.
/// \param Diags where to send the diagnostics.
/// \param IsSystem was this module map found in a system search path.
/// \param Offset optional offset into the buffer associated with \a ID. This is
/// used for handling `#pragma clang module build`. Set to the end
/// of the module map on return.
///
/// \returns The parsed ModuleMapFile if successful, std::nullopt otherwise.
std::optional<ModuleMapFile>
parseModuleMap(FileID ID, clang::DirectoryEntryRef Dir, SourceManager &SM,
DiagnosticsEngine &Diags, bool IsSystem, unsigned *Offset);
} // namespace modulemap
} // namespace clang
#endif