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()); val stringRange = document.createRangeMarker(fullRange.getStartOffset(), fullRange.getEndOffset());
stringRange.setGreedyToRight(true); stringRange.setGreedyToRight(true);
document.deleteString(stringRange.getStartOffset(), stringRange.getEndOffset()); 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(); val documentText = document.getCharsSequence();
boolean addSpace = true;
int scanStart = stringRange.getEndOffset(); int scanStart = stringRange.getEndOffset();
stringRange.dispose();
int scanEnd = scanStart; int scanEnd = scanStart;
loop: loop:
while (scanEnd < documentText.length()) { while (scanEnd < documentText.length()) {
switch (documentText.charAt(scanEnd)) { switch (documentText.charAt(scanEnd)) {
case ' ', '\t': case ' ', '\t', '\r', '\n':
break; break;
case ',', ';':
addSpace = false;
default: default:
break loop; break loop;
} }
scanEnd++; scanEnd++;
} }
if (scanEnd > scanStart) { if (scanEnd > scanStart) {
if (addSpace) {
document.replaceString(scanStart, scanEnd, " ");
} else {
document.deleteString(scanStart, scanEnd); 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); editor.getCaretModel().moveToOffset(caretOffset);
} }

View file

@ -83,35 +83,48 @@ public class PsiTextUtil {
boolean insertNewlineAtCaret) { boolean insertNewlineAtCaret) {
val document = editor.getDocument(); val document = editor.getDocument();
ASTNode token = psiAtOffset.getNode(); ASTNode token = psiAtOffset.getNode();
val text = document.getText(); val text = document.getCharsSequence();
TextRange range = token.getTextRange(); TextRange range = token.getTextRange();
val lexer = new FlexAdapter(new ZigStringLexer()); val lexer = new FlexAdapter(new ZigStringLexer());
lexer.start(text, range.getStartOffset(), range.getEndOffset()); lexer.start(text, range.getStartOffset(), range.getEndOffset());
caretOffset = skipStringLiteralEscapes(caretOffset, lexer); caretOffset = skipStringLiteralEscapes(caretOffset, lexer);
caretOffset = MathUtil.clamp(caretOffset, range.getStartOffset() + 1, range.getEndOffset() - 1); caretOffset = MathUtil.clamp(caretOffset, range.getStartOffset() + 1, range.getEndOffset() - 1);
val unescapedPrefix = ZigStringUtil.unescape(text.substring(range.getStartOffset() + 1, caretOffset), false); val unescapedPrefix = ZigStringUtil.unescape(text.subSequence(range.getStartOffset() + 1, caretOffset), false);
val unescapedSuffix = ZigStringUtil.unescape(text.substring(caretOffset, range.getEndOffset() - 1), false); val unescapedSuffix = ZigStringUtil.unescape(text.subSequence(caretOffset, range.getEndOffset() - 1), false);
val stringRange = document.createRangeMarker(range.getStartOffset(), range.getEndOffset()); val stringRange = document.createRangeMarker(range.getStartOffset(), range.getEndOffset());
stringRange.setGreedyToRight(true); stringRange.setGreedyToRight(true);
val lineNumber = document.getLineNumber(caretOffset); val lineNumber = document.getLineNumber(caretOffset);
val lineOffset = document.getLineStartOffset(lineNumber); val lineOffset = document.getLineStartOffset(lineNumber);
val indent = stringRange.getStartOffset() - lineOffset; 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.deleteString(stringRange.getStartOffset(), stringRange.getEndOffset());
document.insertString(stringRange.getStartOffset(), document.insertString(stringRange.getStartOffset(),
ZigStringUtil.prefixWithTextBlockEscape(indent, ZigStringUtil.prefixWithTextBlockEscape(newLine ? lineIndent + 4 : lineIndent,
"\\\\", "\\\\",
insertNewlineAtCaret ? unescapedPrefix + "\n" : unescapedPrefix, insertNewlineAtCaret ? unescapedPrefix + "\n" : unescapedPrefix,
false, newLine,
true)); true));
caretOffset = stringRange.getEndOffset(); caretOffset = stringRange.getEndOffset();
document.insertString(caretOffset, document.insertString(caretOffset,
ZigStringUtil.prefixWithTextBlockEscape(indent, ZigStringUtil.prefixWithTextBlockEscape(newLine ? lineIndent + 4 : lineIndent,
"\\\\", "\\\\",
unescapedSuffix, unescapedSuffix,
false, false,
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(); stringRange.dispose();
editor.getCaretModel().moveToOffset(caretOffset); editor.getCaretModel().moveToOffset(caretOffset);
} }

View file

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