fix: Make string conversions adhere to zig fmt rules better

This commit is contained in:
FalsePattern 2024-10-26 21:25:50 +02:00
parent bac9a8f8d1
commit 925a020b98
Signed by: falsepattern
GPG key ID: E930CDEC50C50E23
3 changed files with 36 additions and 15 deletions

View file

@ -54,28 +54,35 @@ public class MakeStringQuoted extends PsiElementBaseIntentionAction implements I
val stringRange = document.createRangeMarker(fullRange.getStartOffset(), fullRange.getEndOffset());
stringRange.setGreedyToRight(true);
document.deleteString(stringRange.getStartOffset(), stringRange.getEndOffset());
document.insertString(stringRange.getEndOffset(), "\"");
document.insertString(stringRange.getEndOffset(), prefixStr);
caretOffset = stringRange.getEndOffset();
document.insertString(stringRange.getEndOffset(), suffixStr);
document.insertString(stringRange.getEndOffset(), "\"");
val documentText = document.getCharsSequence();
boolean addSpace = true;
int scanStart = stringRange.getEndOffset();
stringRange.dispose();
int scanEnd = scanStart;
loop:
while (scanEnd < documentText.length()) {
switch (documentText.charAt(scanEnd)) {
case ' ', '\t':
case ' ', '\t', '\r', '\n':
break;
case ',', ';':
addSpace = false;
default:
break loop;
}
scanEnd++;
}
if (scanEnd > scanStart) {
if (addSpace) {
document.replaceString(scanStart, scanEnd, " ");
} else {
document.deleteString(scanStart, scanEnd);
}
}
document.insertString(stringRange.getEndOffset(), "\"");
document.insertString(stringRange.getEndOffset(), prefixStr);
caretOffset = stringRange.getEndOffset();
document.insertString(stringRange.getEndOffset(), suffixStr);
document.insertString(stringRange.getEndOffset(), "\"");
stringRange.dispose();
editor.getCaretModel().moveToOffset(caretOffset);
}

View file

@ -83,35 +83,48 @@ public class PsiTextUtil {
boolean insertNewlineAtCaret) {
val document = editor.getDocument();
ASTNode token = psiAtOffset.getNode();
val text = document.getText();
val text = document.getCharsSequence();
TextRange range = token.getTextRange();
val lexer = new FlexAdapter(new ZigStringLexer());
lexer.start(text, range.getStartOffset(), range.getEndOffset());
caretOffset = skipStringLiteralEscapes(caretOffset, lexer);
caretOffset = MathUtil.clamp(caretOffset, range.getStartOffset() + 1, range.getEndOffset() - 1);
val unescapedPrefix = ZigStringUtil.unescape(text.substring(range.getStartOffset() + 1, caretOffset), false);
val unescapedSuffix = ZigStringUtil.unescape(text.substring(caretOffset, range.getEndOffset() - 1), false);
val unescapedPrefix = ZigStringUtil.unescape(text.subSequence(range.getStartOffset() + 1, caretOffset), false);
val unescapedSuffix = ZigStringUtil.unescape(text.subSequence(caretOffset, range.getEndOffset() - 1), false);
val stringRange = document.createRangeMarker(range.getStartOffset(), range.getEndOffset());
stringRange.setGreedyToRight(true);
val lineNumber = document.getLineNumber(caretOffset);
val lineOffset = document.getLineStartOffset(lineNumber);
val indent = stringRange.getStartOffset() - lineOffset;
val lineIndent = StringUtil.skipWhitespaceForward(document.getText(new TextRange(lineOffset, stringRange.getStartOffset())), 0);
boolean newLine = indent != lineIndent;
document.deleteString(stringRange.getStartOffset(), stringRange.getEndOffset());
document.insertString(stringRange.getStartOffset(),
ZigStringUtil.prefixWithTextBlockEscape(indent,
ZigStringUtil.prefixWithTextBlockEscape(newLine ? lineIndent + 4 : lineIndent,
"\\\\",
insertNewlineAtCaret ? unescapedPrefix + "\n" : unescapedPrefix,
false,
newLine,
true));
caretOffset = stringRange.getEndOffset();
document.insertString(caretOffset,
ZigStringUtil.prefixWithTextBlockEscape(indent,
ZigStringUtil.prefixWithTextBlockEscape(newLine ? lineIndent + 4 : lineIndent,
"\\\\",
unescapedSuffix,
false,
false));
document.insertString(stringRange.getEndOffset(), "\n" + " ".repeat(indent));
int end = stringRange.getEndOffset();
loop:
while (end < document.getTextLength()) {
switch (text.charAt(end)) {
case ' ', '\t':
break;
default:
break loop;
}
end++;
}
document.replaceString(stringRange.getEndOffset(), end, "\n" + " ".repeat(newLine ? lineIndent : Math.max(lineIndent - 4, 0)));
stringRange.dispose();
editor.getCaretModel().moveToOffset(caretOffset);
}

View file

@ -87,6 +87,7 @@ public class ZigStringUtil {
val parts = Arrays.asList(NL_MATCHER.split(content, -1));
val result = new StringBuilder(content.length() + marker.length() * parts.size() + indentStr.length() * parts.size());
if (indentFirst) {
result.append('\n');
result.append(indentStr);
}
if (prefixFirst) {