mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
100 lines
3.5 KiB
C++
100 lines
3.5 KiB
C++
//===--- OutputFileMap.h - Map of inputs to multiple outputs ----*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_BASIC_OUTPUTFILEMAP_H
|
|
#define SWIFT_BASIC_OUTPUTFILEMAP_H
|
|
|
|
#include "swift/Basic/FileTypes.h"
|
|
#include "swift/Basic/LLVM.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/Support/Error.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/SourceMgr.h"
|
|
#include "llvm/Support/YAMLParser.h"
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
namespace swift {
|
|
|
|
using TypeToPathMap = llvm::DenseMap<file_types::ID, std::string>;
|
|
|
|
/// A two-tiered map used to specify paths for multiple output files associated
|
|
/// with each input file in a compilation job.
|
|
///
|
|
/// The structure is a map from input paths to sub-maps, each of which maps
|
|
/// file types to output paths.
|
|
class OutputFileMap {
|
|
private:
|
|
llvm::StringMap<TypeToPathMap> InputToOutputsMap;
|
|
|
|
public:
|
|
OutputFileMap() {}
|
|
|
|
~OutputFileMap() = default;
|
|
|
|
/// Loads an OutputFileMap from the given \p Path into the receiver, if
|
|
/// possible.
|
|
static llvm::Expected<OutputFileMap>
|
|
loadFromPath(StringRef Path, StringRef workingDirectory,
|
|
bool addEntriesForSourceRangeDependencies);
|
|
|
|
static llvm::Expected<OutputFileMap>
|
|
loadFromBuffer(StringRef Data, StringRef workingDirectory,
|
|
bool addEntriesForSourceRangeDependencies);
|
|
|
|
/// Loads an OutputFileMap from the given \p Buffer, taking ownership
|
|
/// of the buffer in the process.
|
|
///
|
|
/// When non-empty, \p workingDirectory is used to resolve relative paths in
|
|
/// the output file map.
|
|
static llvm::Expected<OutputFileMap>
|
|
loadFromBuffer(std::unique_ptr<llvm::MemoryBuffer> Buffer,
|
|
StringRef workingDirectory,
|
|
bool addEntriesForSourceRangeDependencies);
|
|
|
|
/// Get the map of outputs for the given \p Input, if present in the
|
|
/// OutputFileMap. (If not present, returns nullptr.)
|
|
const TypeToPathMap *getOutputMapForInput(StringRef Input) const;
|
|
|
|
/// Get a map of outputs for the given \p Input, creating it in
|
|
/// the OutputFileMap if not already present.
|
|
TypeToPathMap &getOrCreateOutputMapForInput(StringRef Input);
|
|
|
|
/// Get the map of outputs for a single compile product.
|
|
const TypeToPathMap *getOutputMapForSingleOutput() const;
|
|
|
|
/// Get or create the map of outputs for a single compile product.
|
|
TypeToPathMap &getOrCreateOutputMapForSingleOutput();
|
|
|
|
/// Dump the OutputFileMap to the given \p os.
|
|
void dump(llvm::raw_ostream &os, bool Sort = false) const;
|
|
|
|
/// Write the OutputFileMap for the \p inputs so it can be parsed.
|
|
///
|
|
/// It is not an error if the map does not contain an entry for a particular
|
|
/// input. Instead, an empty sub-map will be written into the output.
|
|
void write(llvm::raw_ostream &os, ArrayRef<StringRef> inputs) const;
|
|
|
|
private:
|
|
/// Parses the given \p Buffer and returns either an OutputFileMap or
|
|
/// error, taking ownership of \p Buffer in the process.
|
|
static llvm::Expected<OutputFileMap>
|
|
parse(std::unique_ptr<llvm::MemoryBuffer> Buffer, StringRef workingDirectory,
|
|
bool addEntriesForSourceRangeDependencies);
|
|
};
|
|
|
|
} // end namespace swift
|
|
|
|
#endif
|