18bool isIndentedString(llvm::StringRef Src,
19 const nixf::LexerCursorRange &
Range) {
20 size_t Offset =
Range.lCur().offset();
21 if (Offset + 1 >= Src.size())
23 return Src[Offset] ==
'\'' && Src[Offset + 1] ==
'\'';
31std::string escapeForIndentedString(llvm::StringRef S) {
33 Result.reserve(S.size() + S.size() / 8);
35 for (
size_t I = 0; I < S.size(); ++I) {
39 if (C ==
'\'' && I + 1 < S.size() && S[I + 1] ==
'\'') {
46 if (C ==
'$' && I + 1 < S.size() && S[I + 1] ==
'{') {
62std::string buildDoubleQuotedString(
const nixf::InterpolatedParts &Parts,
63 llvm::StringRef Src) {
64 std::string Result =
"\"";
66 for (
const auto &Frag : Parts.
fragments()) {
72 const nixf::Interpolation &Interp = Frag.interpolation();
73 Result += Interp.
src(Src);
85std::string buildIndentedString(
const nixf::InterpolatedParts &Parts,
86 llvm::StringRef Src) {
87 std::string Result =
"''";
89 for (
const auto &Frag : Parts.
fragments()) {
92 Result += escapeForIndentedString(Frag.escaped());
95 const nixf::Interpolation &Interp = Frag.interpolation();
96 Result += Interp.
src(Src);
108 const std::string &FileURI, llvm::StringRef Src,
109 std::vector<lspserver::CodeAction> &Actions) {
111 const nixf::Node *StringNode = PM.
upTo(N, nixf::Node::NK_ExprString);
117 if (PM.
upTo(*StringNode, nixf::Node::NK_AttrName))
123 bool IsIndented = isIndentedString(Src, Str.range());
131 NewText = buildDoubleQuotedString(Str.parts(), Src);
132 Title =
"Convert to double-quoted string";
135 NewText = buildIndentedString(Str.parts(), Src);
136 Title =
"Convert to indented string";
141 toLSPRange(Src, Str.range()), std::move(NewText)));
Convert between LSP and nixf types.
Code action for converting between string literal syntaxes.
Shared utilities for code actions.
const std::vector< InterpolablePart > & fragments() const
std::string_view src(std::string_view Src) const
const Node * upTo(const Node &N, Node::NodeKind Kind) const
Search up until some kind of node is found.
void addRewriteStringAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add rewrite action for string literal syntax conversion.
lspserver::CodeAction createSingleEditAction(const std::string &Title, llvm::StringLiteral Kind, const std::string &FileURI, const lspserver::Range &EditRange, std::string NewText)
Create a CodeAction with a single text edit.
lspserver::Range toLSPRange(llvm::StringRef Code, const nixf::LexerCursorRange &R)
std::string escapeNixString(llvm::StringRef S)
Escape special characters for Nix double-quoted string literals.
static const llvm::StringLiteral REFACTOR_REWRITE_KIND