[clang-tools-extra] [clangd] use existing function for code locations in the scopify enum tweak (PR #88737)
Julian Schmidt via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 15 06:50:55 PDT 2024
https://github.com/5chmidti created https://github.com/llvm/llvm-project/pull/88737
Clangd already implements some utility functions for converting between
SourceLocations, Positions and Offsets into a buffer.
>From 3ee0dfe6292146d188f7d14f717c1e989c668e1c Mon Sep 17 00:00:00 2001
From: Julian Schmidt <git.julian.schmidt at gmail.com>
Date: Mon, 15 Apr 2024 15:43:07 +0200
Subject: [PATCH] [clangd] use existing function for code locations in the
scopify enum tweak
Clangd already implements some utility functions for converting between
SourceLocations, Positions and Offsets into a buffer.
---
.../clangd/refactor/tweaks/ScopifyEnum.cpp | 38 ++++++-------------
1 file changed, 11 insertions(+), 27 deletions(-)
diff --git a/clang-tools-extra/clangd/refactor/tweaks/ScopifyEnum.cpp b/clang-tools-extra/clangd/refactor/tweaks/ScopifyEnum.cpp
index e36b3249bc7b92..0c51c1b39a8401 100644
--- a/clang-tools-extra/clangd/refactor/tweaks/ScopifyEnum.cpp
+++ b/clang-tools-extra/clangd/refactor/tweaks/ScopifyEnum.cpp
@@ -65,12 +65,10 @@ class ScopifyEnum : public Tweak {
llvm::Error scopifyEnumValues();
llvm::Error scopifyEnumValue(const EnumConstantDecl &CD, StringRef Prefix);
llvm::Expected<StringRef> getContentForFile(StringRef FilePath);
- unsigned getOffsetFromPosition(const Position &Pos, StringRef Content) const;
llvm::Error addReplacementForReference(const ReferencesResult::Reference &Ref,
const MakeReplacement &GetReplacement);
llvm::Error addReplacement(StringRef FilePath, StringRef Content,
const tooling::Replacement &Replacement);
- Position getPosition(const Decl &D) const;
const EnumDecl *D = nullptr;
const Selection *S = nullptr;
@@ -109,7 +107,8 @@ Expected<Tweak::Effect> ScopifyEnum::apply(const Selection &Inputs) {
llvm::Error ScopifyEnum::addClassKeywordToDeclarations() {
for (const auto &Ref :
- findReferences(*S->AST, getPosition(*D), 0, S->Index, false)
+ findReferences(*S->AST, sourceLocToPosition(*SM, D->getBeginLoc()), 0,
+ S->Index, false)
.References) {
if (!(Ref.Attributes & ReferencesResult::Declaration))
continue;
@@ -137,7 +136,8 @@ llvm::Error ScopifyEnum::scopifyEnumValues() {
llvm::Error ScopifyEnum::scopifyEnumValue(const EnumConstantDecl &CD,
StringRef Prefix) {
for (const auto &Ref :
- findReferences(*S->AST, getPosition(CD), 0, S->Index, false)
+ findReferences(*S->AST, sourceLocToPosition(*SM, CD.getBeginLoc()), 0,
+ S->Index, false)
.References) {
if (Ref.Attributes & ReferencesResult::Declaration)
continue;
@@ -187,27 +187,19 @@ llvm::Expected<StringRef> ScopifyEnum::getContentForFile(StringRef FilePath) {
return Content;
}
-unsigned int ScopifyEnum::getOffsetFromPosition(const Position &Pos,
- StringRef Content) const {
- unsigned int Offset = 0;
-
- for (std::size_t LinesRemaining = Pos.line;
- Offset < Content.size() && LinesRemaining;) {
- if (Content[Offset++] == '\n')
- --LinesRemaining;
- }
- return Offset + Pos.character;
-}
-
llvm::Error
ScopifyEnum::addReplacementForReference(const ReferencesResult::Reference &Ref,
const MakeReplacement &GetReplacement) {
StringRef FilePath = Ref.Loc.uri.file();
- auto Content = getContentForFile(FilePath);
+ llvm::Expected<StringRef> Content = getContentForFile(FilePath);
if (!Content)
return Content.takeError();
- unsigned Offset = getOffsetFromPosition(Ref.Loc.range.start, *Content);
- tooling::Replacement Replacement = GetReplacement(FilePath, *Content, Offset);
+ llvm::Expected<size_t> Offset =
+ positionToOffset(*Content, Ref.Loc.range.start);
+ if (!Offset)
+ return Offset.takeError();
+ tooling::Replacement Replacement =
+ GetReplacement(FilePath, *Content, *Offset);
if (Replacement.isApplicable())
return addReplacement(FilePath, *Content, Replacement);
return llvm::Error::success();
@@ -223,13 +215,5 @@ ScopifyEnum::addReplacement(StringRef FilePath, StringRef Content,
return llvm::Error::success();
}
-Position ScopifyEnum::getPosition(const Decl &D) const {
- const SourceLocation Loc = D.getLocation();
- Position Pos;
- Pos.line = SM->getSpellingLineNumber(Loc) - 1;
- Pos.character = SM->getSpellingColumnNumber(Loc) - 1;
- return Pos;
-}
-
} // namespace
} // namespace clang::clangd
More information about the cfe-commits
mailing list