From e01b4da3930adb69d7c646bb0ee7ada050c32c3a Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 22 Apr 2015 11:06:25 +0300 Subject: [PATCH] IDEA-138967 \unnnn notation doesn't work in quick docs --- .../javadoc/JavaDocInfoGenerator.java | 4 ++-- .../codeInsight/javadocIG/escapeValues.html | 2 +- .../codeInsight/javadocIG/escapeValues.java | 2 +- .../codeInsight/javadocIG/unicodeEscapes.html | 3 +++ .../codeInsight/javadocIG/unicodeEscapes.java | 4 ++++ .../javadoc/JavaDocInfoGeneratorTest.java | 4 ++++ .../openapi/util/text/StringUtil.java | 22 +++++++++++++++++++ 7 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html create mode 100644 java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.java diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index 70cbee17e901..b60d77311761 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -1269,7 +1269,7 @@ public class JavaDocInfoGenerator { } } else { - buffer.append(element.getText()); + buffer.append(StringUtil.replaceUnicodeEscapeSequences(element.getText())); } } } @@ -1291,7 +1291,7 @@ public class JavaDocInfoGenerator { text = text.replaceAll("<", LT); text = text.replaceAll(">", GT); - buffer.append(text); + buffer.append(StringUtil.replaceUnicodeEscapeSequences(text)); } private static void generateLinkValue(PsiInlineDocTag tag, StringBuilder buffer, boolean plainLink) { diff --git a/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html b/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html index fb0fd6cfd520..0bce213567ed 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html +++ b/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html @@ -1,3 +1,3 @@
class Pattern
 extends Object
- \W \u03A9 \ No newline at end of file + \W \n \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/escapeValues.java b/java/java-tests/testData/codeInsight/javadocIG/escapeValues.java index 83c0149dee32..2a50cde21085 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/escapeValues.java +++ b/java/java-tests/testData/codeInsight/javadocIG/escapeValues.java @@ -1,5 +1,5 @@ /** - * \W \u03A9 + * \W \n */ class Pattern { } diff --git a/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html new file mode 100644 index 000000000000..d254aebab020 --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html @@ -0,0 +1,3 @@ +
class Test
+extends Object
+ a@b c@d \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.java b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.java new file mode 100644 index 000000000000..950ba15d8ff6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.java @@ -0,0 +1,4 @@ +/** + * a\u0040b {@literal c\u0040d} + */ +class Test {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java index 7bb0de06ebf3..21160772691b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorTest.java @@ -77,6 +77,10 @@ public class JavaDocInfoGeneratorTest extends CodeInsightTestCase { verifyJavaDoc(getTestClass()); } + public void testUnicodeEscapes() throws Exception { + verifyJavaDoc(getTestClass()); + } + public void testEnumValueOf() throws Exception { doTestMethod(); } diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index ebfc3caf7161..93f7166daff4 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -3169,6 +3169,28 @@ public class StringUtil extends StringUtilRt { return false; } + + private static final Pattern UNICODE_CHAR = Pattern.compile("\\\\u[0-9a-eA-E]{4}"); + + public static String replaceUnicodeEscapeSequences(String text) { + if (text == null) return null; + + final Matcher matcher = UNICODE_CHAR.matcher(text); + if (!matcher.find()) return text; // fast path + + matcher.reset(); + int lastEnd = 0; + final StringBuilder sb = new StringBuilder(text.length()); + while (matcher.find()) { + sb.append(text.substring(lastEnd, matcher.start())); + final char c = (char)Integer.parseInt(matcher.group().substring(2), 16); + sb.append(c); + lastEnd = matcher.end(); + } + sb.append(text.substring(lastEnd, text.length())); + return sb.toString(); + } + /** * Expirable CharSequence. Very useful to control external library execution time, * i.e. when java.util.regex.Pattern match goes out of control.