//===--- FrontendInputs.h ---------------------------------------*- 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_FRONTEND_FRONTENDINPUTS_H #define SWIFT_FRONTEND_FRONTENDINPUTS_H #include "swift/AST/Module.h" #include "swift/Frontend/InputFile.h" #include "llvm/ADT/Hashing.h" #include "llvm/ADT/MapVector.h" #include #include namespace llvm { class MemoryBuffer; } namespace swift { /// Information about all the inputs and outputs to the frontend. class FrontendInputsAndOutputs { friend class ArgsToFrontendInputsConverter; std::vector AllInputs; llvm::StringMap PrimaryInputs; public: FrontendInputsAndOutputs() = default; FrontendInputsAndOutputs(const FrontendInputsAndOutputs &other); FrontendInputsAndOutputs &operator=(const FrontendInputsAndOutputs &other); // Readers: // All inputs: ArrayRef getAllInputs() const { return AllInputs; } std::vector getInputFilenames() const; unsigned inputCount() const { return AllInputs.size(); } bool hasInputs() const { return !AllInputs.empty(); } bool hasSingleInput() const { return inputCount() == 1; } const InputFile &firstInput() const { return AllInputs[0]; } InputFile &firstInput() { return AllInputs[0]; } const InputFile &lastInput() const { return AllInputs.back(); } StringRef getFilenameOfFirstInput() const; bool isReadingFromStdin() const; void forEachInput(llvm::function_ref fn) const; // Primaries: const InputFile &firstPrimaryInput() const; const InputFile &lastPrimaryInput() const; void forEachPrimaryInput(llvm::function_ref fn) const; unsigned primaryInputCount() const { return PrimaryInputs.size(); } // Primary count readers: bool hasUniquePrimaryInput() const { return primaryInputCount() == 1; } bool hasPrimaryInputs() const { return primaryInputCount() > 0; } bool isWholeModule() const { return !hasPrimaryInputs(); } /// Fails an assertion if there is more than one primary input. /// Used in situations where only one primary input can be handled /// and where batch mode has not been implemented yet. void assertMustNotBeMoreThanOnePrimaryInput() const; // Count-dependend readers: /// \return the unique primary input, if one exists. const InputFile *getUniquePrimaryInput() const; const InputFile &getRequiredUniquePrimaryInput() const; /// \return the name of the unique primary input, or an empty StrinRef if /// there isn't one. StringRef getNameOfUniquePrimaryInputFile() const; bool isInputPrimary(StringRef file) const; unsigned numberOfPrimaryInputsEndingWith(const char *extension) const; // Multi-facet readers // If we have exactly one input filename, and its extension is "bc" or "ll", // treat the input as LLVM_IR. bool shouldTreatAsLLVM() const; bool shouldTreatAsSIL() const; bool areAllNonPrimariesSIB() const; /// \return true for error bool verifyInputs(DiagnosticEngine &diags, bool treatAsSIL, bool isREPLRequested, bool isNoneRequested) const; // Changing inputs public: void clearInputs(); void addInput(const InputFile &input); void addInputFile(StringRef file, llvm::MemoryBuffer *buffer = nullptr); void addPrimaryInputFile(StringRef file, llvm::MemoryBuffer *buffer = nullptr); }; } // namespace swift #endif /* SWIFT_FRONTEND_FRONTENDINPUTS_H */