Skip to content

Commit 68eb0d7

Browse files
committed
[Refactoring] generate both '-dump-text' and dump-rewritten from a single swift-refactor invocation (SR-14587)
1 parent 6d47d32 commit 68eb0d7

File tree

4 files changed

+43
-14
lines changed

4 files changed

+43
-14
lines changed

include/swift/IDE/Utils.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,17 @@ class SourceEditOutputConsumer : public SourceEditConsumer {
544544
void accept(SourceManager &SM, RegionType RegionType, ArrayRef<Replacement> Replacements) override;
545545
};
546546

547+
class DuplicatingSourceEditConsumer : public SourceEditConsumer {
548+
SourceEditConsumer *ConsumerA;
549+
SourceEditConsumer *ConsumerB;
550+
551+
public:
552+
DuplicatingSourceEditConsumer(SourceEditConsumer *ConsumerA,
553+
SourceEditConsumer *ConsumerB);
554+
void accept(SourceManager &SM, RegionType RegionType,
555+
ArrayRef<Replacement> Replacements) override;
556+
};
557+
547558
enum class LabelRangeEndAt: int8_t {
548559
BeforeElemStart,
549560
LabelNameOnly,

lib/IDE/Utils.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,17 @@ accept(SourceManager &SM, RegionType RegionType,
11161116
}
11171117
}
11181118

1119+
swift::ide::DuplicatingSourceEditConsumer::DuplicatingSourceEditConsumer(
1120+
SourceEditConsumer *ConsumerA, SourceEditConsumer *ConsumerB)
1121+
: ConsumerA(ConsumerA), ConsumerB(ConsumerB) {}
1122+
1123+
void swift::ide::DuplicatingSourceEditConsumer::accept(
1124+
SourceManager &SM, RegionType RegionType,
1125+
ArrayRef<Replacement> Replacements) {
1126+
ConsumerA->accept(SM, RegionType, Replacements);
1127+
ConsumerB->accept(SM, RegionType, Replacements);
1128+
}
1129+
11191130
bool swift::ide::isFromClang(const Decl *D) {
11201131
if (getEffectiveClangNode(D))
11211132
return true;

tools/swift-refactor/swift-refactor.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ static llvm::cl::list<std::string>
9898
InputFilenames(llvm::cl::Positional, llvm::cl::desc("[input files...]"),
9999
llvm::cl::ZeroOrMore);
100100

101+
static llvm::cl::opt<std::string>
102+
RewrittenOutputFile("rewritten-output-file",
103+
llvm::cl::desc("Name of the rewritten output file"));
104+
101105
static llvm::cl::opt<std::string>
102106
LineColumnPair("pos", llvm::cl::desc("Line:Column pair or /*label*/"));
103107

@@ -402,14 +406,27 @@ int main(int argc, char *argv[]) {
402406
switch (options::DumpIn) {
403407
case options::DumpType::REWRITTEN:
404408
pConsumer.reset(new SourceEditOutputConsumer(SF->getASTContext().SourceMgr,
405-
BufferID,
406-
llvm::outs()));
409+
BufferID, llvm::outs()));
407410
break;
408411
case options::DumpType::JSON:
409412
pConsumer.reset(new SourceEditJsonConsumer(llvm::outs()));
410413
break;
411414
case options::DumpType::TEXT:
412-
pConsumer.reset(new SourceEditTextConsumer(llvm::outs()));
415+
if (options::RewrittenOutputFile.empty()) {
416+
pConsumer.reset(new SourceEditTextConsumer(llvm::outs()));
417+
} else {
418+
std::error_code EC;
419+
static llvm::raw_fd_ostream FileStream(options::RewrittenOutputFile, EC,
420+
llvm::sys::fs::OF_None);
421+
if (FileStream.has_error() || EC) {
422+
llvm::errs() << "Could not open rewritten output file";
423+
return 1;
424+
}
425+
pConsumer.reset(new DuplicatingSourceEditConsumer(
426+
new SourceEditTextConsumer(llvm::outs()),
427+
new SourceEditOutputConsumer(SF->getASTContext().SourceMgr, BufferID,
428+
FileStream)));
429+
}
413430
break;
414431
}
415432

utils/refactor-check-compiles.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,14 @@ def main():
8585
extra_refactor_args.append('-enable-experimental-concurrency')
8686
extra_frontend_args.append('-enable-experimental-concurrency')
8787

88-
# FIXME: `refactor-check-compiles` should generate both `-dump-text` and
89-
# `dump-rewritten` from a single `swift-refactor` invocation (SR-14587).
9088
dump_text_output = run_cmd([
9189
args.swift_refactor,
9290
'-dump-text',
9391
'-source-filename', args.source_filename,
92+
'-rewritten-output-file', temp_file_path,
9493
'-pos', args.pos
9594
] + extra_refactor_args, desc='producing edit').decode("utf-8")
9695

97-
dump_rewritten_output = run_cmd([
98-
args.swift_refactor,
99-
'-dump-rewritten',
100-
'-source-filename', args.source_filename,
101-
'-pos', args.pos
102-
] + extra_refactor_args, desc='producing rewritten file')
103-
with open(temp_file_path, 'wb') as f:
104-
f.write(dump_rewritten_output)
105-
10696
run_cmd([
10797
args.swift_frontend,
10898
'-typecheck',

0 commit comments

Comments
 (0)