diff --git a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLPlainTextImpl.java b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLPlainTextImpl.java index 8bb943348e17..a2fa88c564fb 100644 --- a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLPlainTextImpl.java +++ b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLPlainTextImpl.java @@ -44,14 +44,18 @@ public class YAMLPlainTextImpl extends YAMLScalarImpl implements YAMLScalar { @NotNull @Override - protected String getRangesJoiner(@NotNull CharSequence leftString, @NotNull CharSequence rightString) { - if (leftString.equals("\n") || rightString.equals("\n")) { + protected String getRangesJoiner(@NotNull CharSequence text, @NotNull List contentRanges, int indexBefore) { + if (isNewline(text, contentRanges.get(indexBefore)) || isNewline(text, contentRanges.get(indexBefore + 1))) { return ""; } else { return " "; } } + + private static boolean isNewline(@NotNull CharSequence text, @NotNull TextRange range) { + return range.getLength() == 1 && text.charAt(range.getStartOffset()) == '\n'; + } @Override protected List> getEncodeReplacements(@NotNull CharSequence input) throws IllegalArgumentException { diff --git a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLQuotedTextImpl.java b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLQuotedTextImpl.java index f055bfbe070a..2d2db1ec9909 100644 --- a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLQuotedTextImpl.java +++ b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLQuotedTextImpl.java @@ -65,11 +65,12 @@ public class YAMLQuotedTextImpl extends YAMLScalarImpl implements YAMLQuotedText @NotNull @Override - protected String getRangesJoiner(@NotNull CharSequence leftString, @NotNull CharSequence rightString) { - if (leftString.length() == 0 || !isSingleQuote() && leftString.charAt(leftString.length() - 1) == '\\') { + protected String getRangesJoiner(@NotNull CharSequence text, @NotNull List contentRanges, int indexBefore) { + final TextRange leftRange = contentRanges.get(indexBefore); + if (leftRange.isEmpty() || !isSingleQuote() && text.charAt(leftRange.getEndOffset() - 1) == '\\') { return "\n"; } - else if (rightString.length() == 0) { + else if (contentRanges.get(indexBefore + 1).isEmpty()) { return ""; } else { diff --git a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarImpl.java b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarImpl.java index 6e61089df4b6..54134b8ad200 100644 --- a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarImpl.java +++ b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarImpl.java @@ -27,7 +27,7 @@ public abstract class YAMLScalarImpl extends YAMLValueImpl implements YAMLScalar public abstract List getContentRanges(); @NotNull - protected abstract String getRangesJoiner(@NotNull CharSequence leftString, @NotNull CharSequence rightString); + protected abstract String getRangesJoiner(@NotNull CharSequence text, @NotNull List contentRanges, int indexBefore); protected List> getDecodeReplacements(@NotNull CharSequence input) { return Collections.emptyList(); @@ -44,18 +44,15 @@ public abstract class YAMLScalarImpl extends YAMLValueImpl implements YAMLScalar final List contentRanges = getContentRanges(); final StringBuilder builder = new StringBuilder(); - CharSequence nextString = null; for (int i = 0; i < contentRanges.size(); i++) { final TextRange range = contentRanges.get(i); - final CharSequence curString = i == 0 ? range.subSequence(text) : nextString; - assert curString != null; + final CharSequence curString = range.subSequence(text); builder.append(curString); if (i + 1 != contentRanges.size()) { - nextString = contentRanges.get(i + 1).subSequence(text); - builder.append(getRangesJoiner(curString, nextString)); + builder.append(getRangesJoiner(text, contentRanges, i)); } } return processReplacements(builder, getDecodeReplacements(builder)); @@ -125,17 +122,14 @@ public abstract class YAMLScalarImpl extends YAMLValueImpl implements YAMLScalar final List contentRanges = myHost.getContentRanges(); int currentOffsetInDecoded = 0; - String nextString = null; for (int i = 0; i < contentRanges.size(); i++) { final TextRange range = contentRanges.get(i); - String curString = i == 0 ? range.subSequence(text).toString() : nextString; - assert curString != null; + String curString = range.subSequence(text).toString(); if (i + 1 != contentRanges.size()) { - nextString = contentRanges.get(i + 1).subSequence(text).toString(); - final String joiner = myHost.getRangesJoiner(curString, nextString); + final String joiner = myHost.getRangesJoiner(text, contentRanges, i); curString += joiner; } diff --git a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarListImpl.java b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarListImpl.java index afd51978c52b..9354e692dc7c 100644 --- a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarListImpl.java +++ b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarListImpl.java @@ -36,7 +36,7 @@ public class YAMLScalarListImpl extends YAMLBlockScalarImpl implements YAMLScala @NotNull @Override - protected String getRangesJoiner(@NotNull CharSequence leftString, @NotNull CharSequence rightString) { + protected String getRangesJoiner(@NotNull CharSequence text, @NotNull List contentRanges, int indexBefore) { return "\n"; } diff --git a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarTextImpl.java b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarTextImpl.java index 526bc224b639..0400c893e977 100644 --- a/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarTextImpl.java +++ b/plugins/yaml/src/org/jetbrains/yaml/psi/impl/YAMLScalarTextImpl.java @@ -30,19 +30,28 @@ public class YAMLScalarTextImpl extends YAMLBlockScalarImpl implements YAMLScala @NotNull @Override - protected String getRangesJoiner(@NotNull CharSequence leftString, @NotNull CharSequence rightString) { - if (StringUtil.isEmptyOrSpaces(leftString)) { + protected String getRangesJoiner(@NotNull CharSequence text, @NotNull List contentRanges, int indexBefore) { + final TextRange leftRange = contentRanges.get(indexBefore); + final TextRange rightRange = contentRanges.get(indexBefore + 1); + if (leftRange.isEmpty()) { return "\n"; } - if (StringUtil.startsWithChar(leftString, ' ') || StringUtil.startsWithChar(leftString, '\t') - || StringUtil.startsWithChar(rightString, ' ') || StringUtil.startsWithChar(rightString, '\t')) { + if (startsWithWhitespace(text, leftRange) || startsWithWhitespace(text, rightRange)) { return "\n"; } - if (StringUtil.isEmptyOrSpaces(rightString)) { + if (rightRange.isEmpty()) { return ""; } return " "; } + + private static boolean startsWithWhitespace(@NotNull CharSequence text, @NotNull TextRange range) { + if (range.isEmpty()) { + return false; + } + final char c = text.charAt(range.getStartOffset()); + return c == ' ' || c == '\t'; + } @Override protected List> getEncodeReplacements(@NotNull CharSequence input) throws IllegalArgumentException {