mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #12920 from davidungar/Move-input-conversion
Move input conversion
This commit is contained in:
@@ -68,6 +68,8 @@ enum class InputFileKind {
|
||||
|
||||
/// Information about all the inputs to the frontend.
|
||||
class FrontendInputs {
|
||||
friend class ArgsToFrontendInputsConverter;
|
||||
|
||||
private:
|
||||
/// The names of input files to the frontend.
|
||||
std::vector<std::string> InputFilenames;
|
||||
@@ -75,26 +77,28 @@ private:
|
||||
/// Input buffers which may override the file contents of input files.
|
||||
std::vector<llvm::MemoryBuffer *> InputBuffers;
|
||||
|
||||
/// The input for which output should be generated. If not set, output will
|
||||
/// be generated for the whole module.
|
||||
Optional<SelectedInput> PrimaryInput;
|
||||
/// The inputs for which output should be generated. If empty, output will
|
||||
/// be generated for the whole module, in other words, whole-module mode.
|
||||
/// Even if every input file is mentioned here, it is not the same as
|
||||
/// whole-module mode.
|
||||
std::vector<SelectedInput> PrimaryInputs;
|
||||
|
||||
public:
|
||||
// Readers:
|
||||
|
||||
// Input filename readers
|
||||
ArrayRef<std::string> getInputFilenames() const { return InputFilenames; }
|
||||
bool hasInputFilenames() const { return !getInputFilenames().empty(); }
|
||||
bool haveInputFilenames() const { return !getInputFilenames().empty(); }
|
||||
unsigned inputFilenameCount() const { return getInputFilenames().size(); }
|
||||
|
||||
bool hasUniqueInputFilename() const { return inputFilenameCount() == 1; }
|
||||
bool haveUniqueInputFilename() const { return inputFilenameCount() == 1; }
|
||||
const std::string &getFilenameOfFirstInput() const {
|
||||
assert(hasInputFilenames());
|
||||
assert(haveInputFilenames());
|
||||
return getInputFilenames()[0];
|
||||
}
|
||||
|
||||
bool isReadingFromStdin() {
|
||||
return hasUniqueInputFilename() && getFilenameOfFirstInput() == "-";
|
||||
bool isReadingFromStdin() const {
|
||||
return haveUniqueInputFilename() && getFilenameOfFirstInput() == "-";
|
||||
}
|
||||
|
||||
// If we have exactly one input filename, and its extension is "bc" or "ll",
|
||||
@@ -110,21 +114,64 @@ public:
|
||||
|
||||
// Primary input readers
|
||||
|
||||
Optional<SelectedInput> getPrimaryInput() const { return PrimaryInput; }
|
||||
bool hasPrimaryInput() const { return getPrimaryInput().hasValue(); }
|
||||
|
||||
bool isWholeModule() { return !hasPrimaryInput(); }
|
||||
|
||||
bool isPrimaryInputAFileAt(unsigned i) {
|
||||
return hasPrimaryInput() && getPrimaryInput()->isFilename() &&
|
||||
getPrimaryInput()->Index == i;
|
||||
private:
|
||||
void assertMustNotBeMoreThanOnePrimaryInput() const {
|
||||
assert(PrimaryInputs.size() < 2 &&
|
||||
"have not implemented >1 primary input yet");
|
||||
}
|
||||
|
||||
public:
|
||||
ArrayRef<SelectedInput> getPrimaryInputs() const { return PrimaryInputs; }
|
||||
|
||||
unsigned primaryInputCount() const { return getPrimaryInputs().size(); }
|
||||
|
||||
// Primary count readers:
|
||||
|
||||
bool haveUniquePrimaryInput() const { return primaryInputCount() == 1; }
|
||||
|
||||
bool havePrimaryInputs() const { return primaryInputCount() > 0; }
|
||||
|
||||
bool isWholeModule() const { return !havePrimaryInputs(); }
|
||||
|
||||
// Count-dependend readers:
|
||||
|
||||
Optional<SelectedInput> getOptionalPrimaryInput() const {
|
||||
return havePrimaryInputs() ? Optional<SelectedInput>(getPrimaryInputs()[0])
|
||||
: Optional<SelectedInput>();
|
||||
}
|
||||
|
||||
SelectedInput getRequiredUniquePrimaryInput() const {
|
||||
assert(haveUniquePrimaryInput());
|
||||
return getPrimaryInputs()[0];
|
||||
}
|
||||
|
||||
Optional<SelectedInput> getOptionalUniquePrimaryInput() const {
|
||||
return haveUniquePrimaryInput()
|
||||
? Optional<SelectedInput>(getPrimaryInputs()[0])
|
||||
: Optional<SelectedInput>();
|
||||
}
|
||||
|
||||
bool haveAPrimaryInputFile() const {
|
||||
return hasPrimaryInput() && getPrimaryInput()->isFilename();
|
||||
return havePrimaryInputs() && getOptionalPrimaryInput()->isFilename();
|
||||
}
|
||||
|
||||
Optional<StringRef> getOptionalUniquePrimaryInputFilename() const {
|
||||
Optional<SelectedInput> primaryInput = getOptionalUniquePrimaryInput();
|
||||
return (primaryInput && primaryInput->isFilename())
|
||||
? Optional<StringRef>(getInputFilenames()[primaryInput->Index])
|
||||
: Optional<StringRef>();
|
||||
}
|
||||
|
||||
bool isPrimaryInputAFileAt(unsigned i) const {
|
||||
assertMustNotBeMoreThanOnePrimaryInput();
|
||||
if (Optional<SelectedInput> primaryInput = getOptionalPrimaryInput())
|
||||
return primaryInput->isFilename() && primaryInput->Index == i;
|
||||
return false;
|
||||
}
|
||||
|
||||
Optional<unsigned> primaryInputFileIndex() const {
|
||||
return haveAPrimaryInputFile()
|
||||
? Optional<unsigned>(getPrimaryInput()->Index)
|
||||
? Optional<unsigned>(getOptionalPrimaryInput()->Index)
|
||||
: None;
|
||||
}
|
||||
|
||||
@@ -135,9 +182,11 @@ public:
|
||||
return StringRef();
|
||||
}
|
||||
|
||||
public:
|
||||
// Multi-facet readers
|
||||
StringRef baseNameOfOutput(const llvm::opt::ArgList &Args,
|
||||
StringRef ModuleName) const;
|
||||
|
||||
bool shouldTreatAsSIL() const;
|
||||
|
||||
/// Return true for error
|
||||
@@ -158,8 +207,31 @@ public:
|
||||
|
||||
// Primary input writers
|
||||
|
||||
void setPrimaryInput(SelectedInput si) { PrimaryInput = si; }
|
||||
void clearPrimaryInput() { PrimaryInput = 0; }
|
||||
private:
|
||||
std::vector<SelectedInput> &getMutablePrimaryInputs() {
|
||||
assertMustNotBeMoreThanOnePrimaryInput();
|
||||
return PrimaryInputs;
|
||||
}
|
||||
|
||||
public:
|
||||
void clearPrimaryInputs() { getMutablePrimaryInputs().clear(); }
|
||||
|
||||
void setPrimaryInputToFirstFile() {
|
||||
clearPrimaryInputs();
|
||||
addPrimaryInput(SelectedInput(0, SelectedInput::InputKind::Filename));
|
||||
}
|
||||
|
||||
void addPrimaryInput(SelectedInput si) { PrimaryInputs.push_back(si); }
|
||||
|
||||
void setPrimaryInput(SelectedInput si) {
|
||||
clearPrimaryInputs();
|
||||
getMutablePrimaryInputs().push_back(si);
|
||||
}
|
||||
|
||||
void addPrimaryInputFilename(unsigned index) {
|
||||
addPrimaryInput(SelectedInput(index, SelectedInput::InputKind::Filename));
|
||||
}
|
||||
|
||||
void setPrimaryInputForInputFilename(const std::string &inputFilename) {
|
||||
setPrimaryInput(!inputFilename.empty() && inputFilename != "-"
|
||||
? SelectedInput(inputFilenameCount(),
|
||||
@@ -174,12 +246,6 @@ public:
|
||||
InputFilenames.clear();
|
||||
InputBuffers.clear();
|
||||
}
|
||||
|
||||
void setInputFilenamesAndPrimaryInput(DiagnosticEngine &Diags,
|
||||
llvm::opt::ArgList &Args);
|
||||
|
||||
void readInputFileList(DiagnosticEngine &diags, llvm::opt::ArgList &Args,
|
||||
const llvm::opt::Arg *filelistPath);
|
||||
};
|
||||
|
||||
/// Options for controlling the behavior of the frontend.
|
||||
@@ -214,7 +280,7 @@ public:
|
||||
}
|
||||
bool isOutputFileDirectory() const;
|
||||
bool isOutputFilePlainFile() const;
|
||||
bool hasNamedOutputFile() const {
|
||||
bool haveNamedOutputFile() const {
|
||||
return !OutputFilenames.empty() && !isOutputFilenameStdout();
|
||||
}
|
||||
void setOutputFileList(DiagnosticEngine &Diags,
|
||||
@@ -474,7 +540,7 @@ public:
|
||||
|
||||
bool isCompilingExactlyOneSwiftFile() const {
|
||||
return InputKind == InputFileKind::IFK_Swift &&
|
||||
Inputs.hasUniqueInputFilename();
|
||||
Inputs.haveUniqueInputFilename();
|
||||
}
|
||||
|
||||
void setModuleName(DiagnosticEngine &Diags, const llvm::opt::ArgList &Args);
|
||||
|
||||
Reference in New Issue
Block a user