mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Merge remote-tracking branch 'origin/master' into master-next
This commit is contained in:
@@ -83,13 +83,15 @@ struct InvocationOptions {
|
||||
// Assert invocation with a primary file. We want to avoid full typechecking
|
||||
// for all files.
|
||||
assert(!this->PrimaryFile.empty());
|
||||
assert(this->Invok.getFrontendOptions().Inputs.hasUniquePrimaryInput() &&
|
||||
assert(this->Invok.getFrontendOptions()
|
||||
.InputsAndOutputs.hasUniquePrimaryInput() &&
|
||||
"Must have exactly one primary input for code completion, etc.");
|
||||
}
|
||||
|
||||
void applyTo(CompilerInvocation &CompInvok) const;
|
||||
void applyToSubstitutingInputs(CompilerInvocation &CompInvok,
|
||||
FrontendInputs &&Inputs) const;
|
||||
void
|
||||
applyToSubstitutingInputs(CompilerInvocation &CompInvok,
|
||||
FrontendInputsAndOutputs &&InputsAndOutputs) const;
|
||||
void profile(llvm::FoldingSetNodeID &ID) const;
|
||||
void raw(std::vector<std::string> &Args, std::string &PrimaryFile) const;
|
||||
|
||||
@@ -135,9 +137,10 @@ void InvocationOptions::applyTo(CompilerInvocation &CompInvok) const {
|
||||
CompInvok = this->Invok;
|
||||
}
|
||||
void InvocationOptions::applyToSubstitutingInputs(
|
||||
CompilerInvocation &CompInvok, FrontendInputs &&inputs) const {
|
||||
CompilerInvocation &CompInvok,
|
||||
FrontendInputsAndOutputs &&inputsAndOutputs) const {
|
||||
CompInvok = this->Invok;
|
||||
CompInvok.getFrontendOptions().Inputs = inputs;
|
||||
CompInvok.getFrontendOptions().InputsAndOutputs = inputsAndOutputs;
|
||||
}
|
||||
|
||||
void InvocationOptions::raw(std::vector<std::string> &Args,
|
||||
@@ -373,11 +376,12 @@ static void setModuleName(CompilerInvocation &Invocation) {
|
||||
|
||||
StringRef Filename = Invocation.getOutputFilename();
|
||||
if (Filename.empty()) {
|
||||
if (!Invocation.getFrontendOptions().Inputs.hasInputs()) {
|
||||
if (!Invocation.getFrontendOptions().InputsAndOutputs.hasInputs()) {
|
||||
Invocation.setModuleName("__main__");
|
||||
return;
|
||||
}
|
||||
Filename = Invocation.getFrontendOptions().Inputs.getFilenameOfFirstInput();
|
||||
Filename = Invocation.getFrontendOptions()
|
||||
.InputsAndOutputs.getFilenameOfFirstInput();
|
||||
}
|
||||
Filename = llvm::sys::path::filename(Filename);
|
||||
StringRef ModuleName = llvm::sys::path::stem(Filename);
|
||||
@@ -409,16 +413,16 @@ static void sanitizeCompilerArgs(ArrayRef<const char *> Args,
|
||||
}
|
||||
}
|
||||
|
||||
static FrontendInputs
|
||||
static FrontendInputsAndOutputs
|
||||
convertFileContentsToInputs(const SmallVectorImpl<FileContent> &contents) {
|
||||
FrontendInputs inputs;
|
||||
FrontendInputsAndOutputs inputsAndOutputs;
|
||||
for (const FileContent &content : contents)
|
||||
inputs.addInput(InputFile(content));
|
||||
return inputs;
|
||||
inputsAndOutputs.addInput(InputFile(content));
|
||||
return inputsAndOutputs;
|
||||
}
|
||||
|
||||
static FrontendInputs
|
||||
resolveSymbolicLinksInInputs(FrontendInputs &inputs,
|
||||
static FrontendInputsAndOutputs
|
||||
resolveSymbolicLinksInInputs(FrontendInputsAndOutputs &inputsAndOutputs,
|
||||
StringRef UnresolvedPrimaryFile,
|
||||
std::string &Error) {
|
||||
unsigned primaryCount = 0;
|
||||
@@ -426,8 +430,8 @@ resolveSymbolicLinksInInputs(FrontendInputs &inputs,
|
||||
SwiftLangSupport::resolvePathSymlinks(UnresolvedPrimaryFile);
|
||||
// FIXME: The frontend should be dealing with symlinks, maybe similar to
|
||||
// clang's FileManager ?
|
||||
FrontendInputs replacementInputs;
|
||||
for (const InputFile &input : inputs.getAllInputs()) {
|
||||
FrontendInputsAndOutputs replacementInputsAndOutputs;
|
||||
for (const InputFile &input : inputsAndOutputs.getAllInputs()) {
|
||||
std::string newFilename =
|
||||
SwiftLangSupport::resolvePathSymlinks(input.file());
|
||||
bool newIsPrimary = input.isPrimary() ||
|
||||
@@ -436,19 +440,19 @@ resolveSymbolicLinksInInputs(FrontendInputs &inputs,
|
||||
++primaryCount;
|
||||
}
|
||||
assert(primaryCount < 2 && "cannot handle multiple primaries");
|
||||
replacementInputs.addInput(
|
||||
replacementInputsAndOutputs.addInput(
|
||||
InputFile(newFilename, newIsPrimary, input.buffer()));
|
||||
}
|
||||
|
||||
if (PrimaryFile.empty() || primaryCount == 1) {
|
||||
return replacementInputs;
|
||||
return replacementInputsAndOutputs;
|
||||
}
|
||||
|
||||
llvm::SmallString<64> Err;
|
||||
llvm::raw_svector_ostream OS(Err);
|
||||
OS << "'" << PrimaryFile << "' is not part of the input files";
|
||||
Error = OS.str();
|
||||
return replacementInputs;
|
||||
return replacementInputsAndOutputs;
|
||||
}
|
||||
|
||||
bool SwiftASTManager::initCompilerInvocation(CompilerInvocation &Invocation,
|
||||
@@ -465,8 +469,10 @@ bool SwiftASTManager::initCompilerInvocation(CompilerInvocation &Invocation,
|
||||
Error = "error when parsing the compiler arguments";
|
||||
return true;
|
||||
}
|
||||
Invocation.getFrontendOptions().Inputs = resolveSymbolicLinksInInputs(
|
||||
Invocation.getFrontendOptions().Inputs, UnresolvedPrimaryFile, Error);
|
||||
Invocation.getFrontendOptions().InputsAndOutputs =
|
||||
resolveSymbolicLinksInInputs(
|
||||
Invocation.getFrontendOptions().InputsAndOutputs,
|
||||
UnresolvedPrimaryFile, Error);
|
||||
if (!Error.empty())
|
||||
return true;
|
||||
|
||||
@@ -707,9 +713,9 @@ bool ASTProducer::shouldRebuild(SwiftASTManager::Implementation &MgrImpl,
|
||||
// Check if the inputs changed.
|
||||
SmallVector<BufferStamp, 8> InputStamps;
|
||||
InputStamps.reserve(
|
||||
Invok.Opts.Invok.getFrontendOptions().Inputs.inputCount());
|
||||
Invok.Opts.Invok.getFrontendOptions().InputsAndOutputs.inputCount());
|
||||
for (const auto &input :
|
||||
Invok.Opts.Invok.getFrontendOptions().Inputs.getAllInputs()) {
|
||||
Invok.Opts.Invok.getFrontendOptions().InputsAndOutputs.getAllInputs()) {
|
||||
StringRef File = input.file();
|
||||
bool FoundSnapshot = false;
|
||||
for (auto &Snap : Snapshots) {
|
||||
@@ -723,7 +729,7 @@ bool ASTProducer::shouldRebuild(SwiftASTManager::Implementation &MgrImpl,
|
||||
InputStamps.push_back(MgrImpl.getBufferStamp(File));
|
||||
}
|
||||
assert(InputStamps.size() ==
|
||||
Invok.Opts.Invok.getFrontendOptions().Inputs.inputCount());
|
||||
Invok.Opts.Invok.getFrontendOptions().InputsAndOutputs.inputCount());
|
||||
if (Stamps != InputStamps)
|
||||
return true;
|
||||
|
||||
@@ -896,7 +902,7 @@ void ASTProducer::findSnapshotAndOpenFiles(
|
||||
SmallVectorImpl<FileContent> &Contents, std::string &Error) const {
|
||||
const InvocationOptions &Opts = InvokRef->Impl.Opts;
|
||||
for (const auto &input :
|
||||
Opts.Invok.getFrontendOptions().Inputs.getAllInputs()) {
|
||||
Opts.Invok.getFrontendOptions().InputsAndOutputs.getAllInputs()) {
|
||||
StringRef File = input.file();
|
||||
bool IsPrimary = input.isPrimary();
|
||||
bool FoundSnapshot = false;
|
||||
@@ -920,5 +926,5 @@ void ASTProducer::findSnapshotAndOpenFiles(
|
||||
Contents.push_back(std::move(Content));
|
||||
}
|
||||
assert(Contents.size() ==
|
||||
Opts.Invok.getFrontendOptions().Inputs.inputCount());
|
||||
Opts.Invok.getFrontendOptions().InputsAndOutputs.inputCount());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user