Merge pull request #72310 from rintaro/ifconfigregisons-per-clause

[SourceKit] Use recorded #if regions in 'active-regions' request
This commit is contained in:
Rintaro Ishizaki
2024-03-15 06:22:51 +09:00
committed by GitHub
7 changed files with 188 additions and 127 deletions

View File

@@ -2652,36 +2652,6 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
// SwiftLangSupport::findActiveRegionsInFile
//===----------------------------------------------------------------------===//
namespace {
class IfConfigScanner : public SourceEntityWalker {
unsigned BufferID = -1;
SmallVectorImpl<IfConfigInfo> &Infos;
bool Cancelled = false;
public:
explicit IfConfigScanner(unsigned BufferID,
SmallVectorImpl<IfConfigInfo> &Infos)
: BufferID(BufferID), Infos(Infos) {}
private:
bool walkToDeclPre(Decl *D, CharSourceRange Range) override {
if (Cancelled)
return false;
if (auto *IfDecl = dyn_cast<IfConfigDecl>(D)) {
for (auto &Clause : IfDecl->getClauses()) {
unsigned Offset = D->getASTContext().SourceMgr.getLocOffsetInBuffer(
Clause.Loc, BufferID);
Infos.emplace_back(Offset, Clause.isActive);
}
}
return true;
}
};
} // end anonymous namespace
void SwiftLangSupport::findActiveRegionsInFile(
StringRef PrimaryFilePath, StringRef InputBufferName,
ArrayRef<const char *> Args, SourceKitCancellationToken CancellationToken,
@@ -2717,16 +2687,25 @@ void SwiftLangSupport::findActiveRegionsInFile(
return;
}
SmallVector<IfConfigInfo> Configs;
IfConfigScanner Scanner(*SF->getBufferID(), Configs);
Scanner.walk(SF);
auto &SM = SF->getASTContext().SourceMgr;
auto BufferID = *SF->getBufferID();
// Sort by offset so nested decls are reported
// in source order (not tree order).
llvm::sort(Configs,
[](const IfConfigInfo &LHS, const IfConfigInfo &RHS) -> bool {
return LHS.Offset < RHS.Offset;
});
SmallVector<IfConfigInfo> Configs;
for (auto &range : SF->getIfConfigClauseRanges()) {
bool isActive = false;
switch (range.getKind()) {
case IfConfigClauseRangeInfo::ActiveClause:
isActive = true;
break;
case IfConfigClauseRangeInfo::InactiveClause:
isActive = false;
break;
case IfConfigClauseRangeInfo::EndDirective:
continue;
}
auto offset = SM.getLocOffsetInBuffer(range.getStartLoc(), BufferID);
Configs.emplace_back(offset, isActive);
}
ActiveRegionsInfo Info;
Info.Configs = Configs;
Receiver(RequestResult<ActiveRegionsInfo>::fromResult(Info));