[SourceKit] Return results from rename using return values instead of consumers

This makes it a lot easier to follow the code.
This commit is contained in:
Alex Hoppen
2023-11-14 14:10:22 -08:00
parent ec267e2c08
commit 899368037c
10 changed files with 196 additions and 218 deletions

View File

@@ -1344,43 +1344,6 @@ void RequestRefactoringEditConsumer::handleDiagnostic(
Impl.DiagConsumer.handleDiagnostic(SM, Info);
}
RequestRenameRangeConsumer::RequestRenameRangeConsumer(
CategorizedRenameRangesReceiver Receiver)
: Receiver(Receiver), OS(ErrBuffer), DiagConsumer(OS) {}
RequestRenameRangeConsumer::~RequestRenameRangeConsumer() {
if (DiagConsumer.didErrorOccur()) {
Receiver(
RequestResult<ArrayRef<CategorizedRenameRanges>>::fromError(OS.str()));
return;
}
Receiver(RequestResult<ArrayRef<CategorizedRenameRanges>>::fromResult(
CategorizedRanges));
}
void RequestRenameRangeConsumer::accept(
SourceManager &SM, RegionType RegionType,
ArrayRef<ide::RenameRangeDetail> Ranges) {
CategorizedRenameRanges Results;
Results.Category = SwiftLangSupport::getUIDForRegionType(RegionType);
for (const auto &R : Ranges) {
SourceKit::RenameRangeDetail Result;
std::tie(Result.StartLine, Result.StartColumn) =
SM.getLineAndColumnInBuffer(R.Range.getStart());
std::tie(Result.EndLine, Result.EndColumn) =
SM.getLineAndColumnInBuffer(R.Range.getEnd());
Result.ArgIndex = R.Index;
Result.Kind = SwiftLangSupport::getUIDForRefactoringRangeKind(R.RangeKind);
Results.Ranges.push_back(std::move(Result));
}
CategorizedRanges.push_back(std::move(Results));
}
void RequestRenameRangeConsumer::handleDiagnostic(SourceManager &SM,
const DiagnosticInfo &Info) {
DiagConsumer.handleDiagnostic(SM, Info);
}
static NameUsage getNameUsage(RenameType Type) {
switch (Type) {
case RenameType::Definition:
@@ -1397,35 +1360,71 @@ static NameUsage getNameUsage(RenameType Type) {
static std::vector<RenameLoc>
getSyntacticRenameLocs(ArrayRef<RenameLocations> RenameLocations);
void SwiftLangSupport::findRenameRanges(
llvm::MemoryBuffer *InputBuf, ArrayRef<RenameLocations> RenameLocations,
ArrayRef<const char *> Args, CategorizedRenameRangesReceiver Receiver) {
/// Translates a vector of \c SyntacticRenameRangeDetails to a vector of
/// \c CategorizedRenameRanges.
static std::vector<CategorizedRenameRanges> getCategorizedRenameRanges(
std::vector<SyntacticRenameRangeDetails> SyntacticRenameRanges,
SourceManager &SM) {
std::vector<CategorizedRenameRanges> Result;
for (SyntacticRenameRangeDetails RangeDetails : SyntacticRenameRanges) {
CategorizedRenameRanges CategorizedRanges;
CategorizedRanges.Category =
SwiftLangSupport::getUIDForRegionType(RangeDetails.Type);
for (const auto &R : RangeDetails.Ranges) {
SourceKit::RenameRangeDetail Result;
std::tie(Result.StartLine, Result.StartColumn) =
SM.getLineAndColumnInBuffer(R.Range.getStart());
std::tie(Result.EndLine, Result.EndColumn) =
SM.getLineAndColumnInBuffer(R.Range.getEnd());
Result.ArgIndex = R.Index;
Result.Kind =
SwiftLangSupport::getUIDForRefactoringRangeKind(R.RangeKind);
CategorizedRanges.Ranges.push_back(std::move(Result));
}
Result.push_back(std::move(CategorizedRanges));
}
return Result;
}
CancellableResult<std::vector<CategorizedRenameRanges>>
SwiftLangSupport::findRenameRanges(llvm::MemoryBuffer *InputBuf,
ArrayRef<RenameLocations> RenameLocations,
ArrayRef<const char *> Args) {
using ResultType = CancellableResult<std::vector<CategorizedRenameRanges>>;
std::string Error;
CompilerInstance ParseCI;
PrintingDiagnosticConsumer PrintDiags;
ParseCI.addDiagnosticConsumer(&PrintDiags);
SourceFile *SF = getSyntacticSourceFile(InputBuf, Args, ParseCI, Error);
if (!SF) {
Receiver(RequestResult<ArrayRef<CategorizedRenameRanges>>::fromError(Error));
return;
return ResultType::failure(Error);
}
auto RenameLocs = getSyntacticRenameLocs(RenameLocations);
RequestRenameRangeConsumer Consumer(Receiver);
swift::ide::findSyntacticRenameRanges(SF, RenameLocs, /*NewName=*/StringRef(),
Consumer, Consumer);
auto SyntacticRenameRanges =
swift::ide::findSyntacticRenameRanges(SF, RenameLocs,
/*NewName=*/StringRef());
SourceManager &SM = SF->getASTContext().SourceMgr;
return SyntacticRenameRanges.map<std::vector<CategorizedRenameRanges>>(
[&SM](auto &SyntacticRenameRanges) {
return getCategorizedRenameRanges(SyntacticRenameRanges, SM);
});
}
void SwiftLangSupport::findLocalRenameRanges(
StringRef Filename, unsigned Line, unsigned Column, unsigned Length,
ArrayRef<const char *> Args, SourceKitCancellationToken CancellationToken,
CategorizedRenameRangesReceiver Receiver) {
using ResultType = CancellableResult<std::vector<CategorizedRenameRanges>>;
std::string Error;
SwiftInvocationRef Invok =
ASTMgr->getTypecheckInvocation(Args, Filename, Error);
if (!Invok) {
LOG_WARN_FUNC("failed to create an ASTInvocation: " << Error);
Receiver(RequestResult<ArrayRef<CategorizedRenameRanges>>::fromError(Error));
Receiver(ResultType::failure(Error));
return;
}
@@ -1441,16 +1440,21 @@ void SwiftLangSupport::findLocalRenameRanges(
void handlePrimaryAST(ASTUnitRef AstUnit) override {
auto &SF = AstUnit->getPrimarySourceFile();
swift::ide::RangeConfig Range{*SF.getBufferID(), Line, Column, Length};
RequestRenameRangeConsumer Consumer(std::move(Receiver));
swift::ide::findLocalRenameRanges(&SF, Range, Consumer, Consumer);
SourceManager &SM = SF.getASTContext().SourceMgr;
auto SyntacticRenameRanges =
swift::ide::findLocalRenameRanges(&SF, Range);
auto Result =
SyntacticRenameRanges.map<std::vector<CategorizedRenameRanges>>(
[&SM](auto &SyntacticRenameRanges) {
return getCategorizedRenameRanges(SyntacticRenameRanges, SM);
});
Receiver(Result);
}
void cancelled() override {
Receiver(RequestResult<ArrayRef<CategorizedRenameRanges>>::cancelled());
}
void cancelled() override { Receiver(ResultType::cancelled()); }
void failed(StringRef Error) override {
Receiver(RequestResult<ArrayRef<CategorizedRenameRanges>>::fromError(Error));
Receiver(ResultType::failure(Error.str()));
}
};