4910483: Javadoc renders the string ".*\\.pdf" as ".\*\.pdf"
authordlsmith
Wed, 12 Feb 2014 12:31:30 -0700
changeset 23113 5d44044f4f64
parent 23112 4fa26477332d
child 23114 7fe55d6324d5
4910483: Javadoc renders the string ".*\\.pdf" as ".\*\.pdf" Summary: Adjust timing of printing "\\" in the comment scanner Reviewed-by: jjg
langtools/src/share/classes/com/sun/tools/javac/parser/JavadocTokenizer.java
langtools/test/tools/javac/parser/T4910483.java
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavadocTokenizer.java	Mon Feb 10 11:52:52 2014 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavadocTokenizer.java	Wed Feb 12 12:31:30 2014 -0700
@@ -107,6 +107,10 @@
           */
          int pp = 0;
 
+         /** The buffer index of the last double backslash sequence
+          */
+         private int doubleBackslashBp = -1;
+
          DocReader(ScannerFactory fac, char[] input, int inputLength, int startPos) {
              super(fac, input, inputLength);
              this.startPos = startPos;
@@ -149,8 +153,8 @@
              scanChar();
              if (ch == '\\') {
                  if (peekChar() == '\\' && !isUnicode()) {
-                     putChar(ch, false);
                      bp++; col++;
+                     doubleBackslashBp = bp;
                  } else {
                      convertUnicode();
                  }
@@ -204,6 +208,13 @@
              }
              super.putChar(ch, scan);
          }
+
+         /** Whether the ch represents a sequence of two backslashes. */
+         boolean isDoubleBackslash() {
+             return doubleBackslashBp == bp;
+         }
+
+
      }
 
      protected static class JavadocComment extends JavaTokenizer.BasicComment<DocReader> {
@@ -375,6 +386,13 @@
                              // the buffer.
                              comment_reader.putChar('*', false);
                              break;
+                         case '\\':
+                             comment_reader.putChar('\\', false);
+                             // If a double backslash was found, write two
+                             if (comment_reader.isDoubleBackslash()) {
+                                 comment_reader.putChar('\\', false);
+                             }
+                             comment_reader.scanCommentChar();
                          case ' ':
                          case '\t':
                              comment_reader.putChar(comment_reader.ch, false);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/parser/T4910483.java	Wed Feb 12 12:31:30 2014 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug     4910483
+ * @summary javac shouldn't throw NPE while compiling invalid RuntimeInvisibleParameterAnnotations
+ * @run main T4910483
+ */
+
+import java.io.File;
+
+import com.sun.tools.javac.main.JavaCompiler;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.util.Context;
+
+import javax.tools.JavaFileObject;
+
+/**Test comment abc*\\def*/
+public class T4910483 {
+    public static void main(String... args) {
+        JavaCompiler compiler = JavaCompiler.instance(new Context());
+        compiler.keepComments = true;
+
+        String testSrc = System.getProperty("test.src");
+        JavacFileManager fm = new JavacFileManager(new Context(), false, null);
+        JavaFileObject f = fm.getFileForInput(testSrc + File.separatorChar + "T4910483.java");
+
+        JCTree.JCCompilationUnit cu = compiler.parse(f);
+        JCTree classDef = cu.getTypeDecls().head;
+        String commentText = cu.docComments.getCommentText(classDef);
+
+        String expected = "Test comment abc*\\\\def"; // 4 '\' escapes to 2 in a string literal
+        if (!expected.equals(commentText)) {
+            throw new AssertionError("Incorrect comment text: [" + commentText + "], expected [" + expected + "]");
+        }
+    }
+}