Skip to content

Commit b64a3ac

Browse files
authored
Merge pull request #37755 from bnbarham/fix-refactor-check-compiles
[Utils] Make sure to write the rewritten file in refactor-check-compiles
2 parents 94eaed5 + 717a932 commit b64a3ac

File tree

5 files changed

+49
-39
lines changed

5 files changed

+49
-39
lines changed

include/swift/IDE/Utils.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -527,8 +527,7 @@ class SourceEditTextConsumer : public SourceEditConsumer {
527527
llvm::raw_ostream &OS;
528528

529529
public:
530-
SourceEditTextConsumer(llvm::raw_ostream &OS);
531-
530+
SourceEditTextConsumer(llvm::raw_ostream &OS) : OS(OS) {}
532531
void accept(SourceManager &SM, RegionType RegionType,
533532
ArrayRef<Replacement> Replacements) override;
534533
};
@@ -544,13 +543,14 @@ class SourceEditOutputConsumer : public SourceEditConsumer {
544543
void accept(SourceManager &SM, RegionType RegionType, ArrayRef<Replacement> Replacements) override;
545544
};
546545

547-
class DuplicatingSourceEditConsumer : public SourceEditConsumer {
548-
SourceEditConsumer *ConsumerA;
549-
SourceEditConsumer *ConsumerB;
546+
/// Broadcasts `accept` to all `Consumers`
547+
class BroadcastingSourceEditConsumer : public SourceEditConsumer {
548+
ArrayRef<std::unique_ptr<SourceEditConsumer>> Consumers;
550549

551550
public:
552-
DuplicatingSourceEditConsumer(SourceEditConsumer *ConsumerA,
553-
SourceEditConsumer *ConsumerB);
551+
BroadcastingSourceEditConsumer(
552+
ArrayRef<std::unique_ptr<SourceEditConsumer>> Consumers)
553+
: Consumers(Consumers) {}
554554
void accept(SourceManager &SM, RegionType RegionType,
555555
ArrayRef<Replacement> Replacements) override;
556556
};

lib/IDE/Utils.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,9 +1017,6 @@ accept(SourceManager &SM, RegionType Type, ArrayRef<Replacement> Replacements) {
10171017
}
10181018
}
10191019

1020-
swift::ide::SourceEditTextConsumer::
1021-
SourceEditTextConsumer(llvm::raw_ostream &OS) : OS(OS) { }
1022-
10231020
void swift::ide::SourceEditTextConsumer::
10241021
accept(SourceManager &SM, RegionType Type, ArrayRef<Replacement> Replacements) {
10251022
for (const auto &Replacement: Replacements) {
@@ -1116,15 +1113,12 @@ accept(SourceManager &SM, RegionType RegionType,
11161113
}
11171114
}
11181115

1119-
swift::ide::DuplicatingSourceEditConsumer::DuplicatingSourceEditConsumer(
1120-
SourceEditConsumer *ConsumerA, SourceEditConsumer *ConsumerB)
1121-
: ConsumerA(ConsumerA), ConsumerB(ConsumerB) {}
1122-
1123-
void swift::ide::DuplicatingSourceEditConsumer::accept(
1116+
void swift::ide::BroadcastingSourceEditConsumer::accept(
11241117
SourceManager &SM, RegionType RegionType,
11251118
ArrayRef<Replacement> Replacements) {
1126-
ConsumerA->accept(SM, RegionType, Replacements);
1127-
ConsumerB->accept(SM, RegionType, Replacements);
1119+
for (auto &Consumer : Consumers) {
1120+
Consumer->accept(SM, RegionType, Replacements);
1121+
}
11281122
}
11291123

11301124
bool swift::ide::isFromClang(const Decl *D) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %empty-directory(%t)
2+
3+
func simple(completion: () -> Void) { }
4+
func anything() -> Bool { return true }
5+
6+
// RUN: %swift-frontend -typecheck %s
7+
// RUN: not %refactor-check-compiles -convert-to-async -dump-text -source-filename %s -pos=%(line+1):6
8+
func cannotCompile() {
9+
simple {
10+
if anything() {
11+
return
12+
}
13+
}
14+
}

tools/swift-refactor/swift-refactor.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -413,34 +413,36 @@ int main(int argc, char *argv[]) {
413413
RefactoringConfig.Range = Range;
414414
RefactoringConfig.PreferredName = options::NewName;
415415
std::string Error;
416-
std::unique_ptr<SourceEditConsumer> pConsumer;
416+
417+
StringRef RewrittenOutputFile = options::RewrittenOutputFile;
418+
if (RewrittenOutputFile.empty())
419+
RewrittenOutputFile = "-";
420+
std::error_code EC;
421+
llvm::raw_fd_ostream RewriteStream(RewrittenOutputFile, EC);
422+
if (RewriteStream.has_error()) {
423+
llvm::errs() << "Could not open rewritten output file";
424+
return 1;
425+
}
426+
427+
SmallVector<std::unique_ptr<SourceEditConsumer>> Consumers;
428+
if (!options::RewrittenOutputFile.empty() ||
429+
options::DumpIn == options::DumpType::REWRITTEN) {
430+
Consumers.emplace_back(new SourceEditOutputConsumer(
431+
SF->getASTContext().SourceMgr, BufferID, RewriteStream));
432+
}
417433
switch (options::DumpIn) {
418434
case options::DumpType::REWRITTEN:
419-
pConsumer.reset(new SourceEditOutputConsumer(SF->getASTContext().SourceMgr,
420-
BufferID, llvm::outs()));
435+
// Already added
421436
break;
422437
case options::DumpType::JSON:
423-
pConsumer.reset(new SourceEditJsonConsumer(llvm::outs()));
438+
Consumers.emplace_back(new SourceEditJsonConsumer(llvm::outs()));
424439
break;
425440
case options::DumpType::TEXT:
426-
if (options::RewrittenOutputFile.empty()) {
427-
pConsumer.reset(new SourceEditTextConsumer(llvm::outs()));
428-
} else {
429-
std::error_code EC;
430-
static llvm::raw_fd_ostream FileStream(options::RewrittenOutputFile, EC,
431-
llvm::sys::fs::OF_None);
432-
if (FileStream.has_error() || EC) {
433-
llvm::errs() << "Could not open rewritten output file";
434-
return 1;
435-
}
436-
pConsumer.reset(new DuplicatingSourceEditConsumer(
437-
new SourceEditTextConsumer(llvm::outs()),
438-
new SourceEditOutputConsumer(SF->getASTContext().SourceMgr, BufferID,
439-
FileStream)));
440-
}
441+
Consumers.emplace_back(new SourceEditTextConsumer(llvm::outs()));
441442
break;
442443
}
443444

444-
return refactorSwiftModule(CI.getMainModule(), RefactoringConfig, *pConsumer,
445-
PrintDiags);
445+
BroadcastingSourceEditConsumer BroadcastConsumer(Consumers);
446+
return refactorSwiftModule(CI.getMainModule(), RefactoringConfig,
447+
BroadcastConsumer, PrintDiags);
446448
}

utils/refactor-check-compiles.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,14 @@ def main():
9292
'-rewritten-output-file', temp_file_path,
9393
'-pos', args.pos
9494
] + extra_refactor_args, desc='producing edit').decode("utf-8")
95+
sys.stdout.write(dump_text_output)
9596

9697
run_cmd([
9798
args.swift_frontend,
9899
'-typecheck',
99100
temp_file_path,
100101
'-disable-availability-checking'
101102
] + extra_frontend_args, desc='checking that rewritten file compiles')
102-
sys.stdout.write(dump_text_output)
103103

104104

105105
if __name__ == '__main__':

0 commit comments

Comments
 (0)