fix: Make string conversions adhere to zig fmt rules better
This commit is contained in:
parent
bac9a8f8d1
commit
925a020b98
3 changed files with 36 additions and 15 deletions
|
@ -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) {
|
||||||
document.deleteString(scanStart, scanEnd);
|
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);
|
editor.getCaretModel().moveToOffset(caretOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue