# HG changeset patch # User sundar # Date 1287469037 -19800 # Node ID 8bcda461a06a36c8db42b1952839e54f84ff44db # Parent 258e5f06880fb01f80970dce37ab56edb2a16423 6551367: javadoc throws ClassCastException when an @link tries to reference constructor. Reviewed-by: jjg, mcimadamore diff -r 258e5f06880f -r 8bcda461a06a langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java Mon Oct 18 19:14:36 2010 +0100 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java Tue Oct 19 11:47:17 2010 +0530 @@ -850,6 +850,12 @@ String[] paramTypes, Set searched) { //### Note that this search is not necessarily what the compiler would do! + Names names = tsym.name.table.names; + // do not match constructors + if (names.init.contentEquals(methodName)) { + return null; + } + ClassDocImpl cdi; MethodDocImpl mdi; @@ -876,7 +882,6 @@ *---------------------------------*/ // search current class - Names names = tsym.name.table.names; Scope.Entry e = tsym.members().lookup(names.fromString(methodName)); //### Using modifier filter here isn't really correct, diff -r 258e5f06880f -r 8bcda461a06a langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java Mon Oct 18 19:14:36 2010 +0100 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java Tue Oct 19 11:47:17 2010 +0530 @@ -637,6 +637,7 @@ * Should be called only on symbols representing methods. */ public MethodDocImpl getMethodDoc(MethodSymbol meth) { + assert !meth.isConstructor() : "not expecting a constructor symbol"; MethodDocImpl result = (MethodDocImpl)methodMap.get(meth); if (result != null) return result; result = new MethodDocImpl(this, meth); @@ -665,6 +666,7 @@ * Should be called only on symbols representing constructors. */ public ConstructorDocImpl getConstructorDoc(MethodSymbol meth) { + assert meth.isConstructor() : "expecting a constructor symbol"; ConstructorDocImpl result = (ConstructorDocImpl)methodMap.get(meth); if (result != null) return result; result = new ConstructorDocImpl(this, meth); diff -r 258e5f06880f -r 8bcda461a06a langtools/test/tools/javadoc/T6551367.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javadoc/T6551367.java Tue Oct 19 11:47:17 2010 +0530 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2010, 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 6551367 + * @summary javadoc throws ClassCastException when an link tag tries to reference constructor. + * @author A. Sundararajan + * @run main T6551367 T6551367.java + */ + +import com.sun.javadoc.*; +import java.io.File; +import static com.sun.tools.javadoc.Main.execute; + +public class T6551367 extends com.sun.tools.doclets.standard.Standard { + public T6551367() {} + + /** Here, in the javadoc for this method, I try to link to + * {@link # a constructor}. + */ + public static void main(String... args) { + File testSrc = new File(System.getProperty("test.src", ".")); + File destDir = new File(System.getProperty("user.dir", ".")); + for (String file : args) { + File source = new File(testSrc, file); + int rc = execute("javadoc", "T6551367", + T6551367.class.getClassLoader(), + new String[]{source.getPath(), "-d", destDir.getAbsolutePath()}); + if (rc != 0) + throw new Error("unexpected exit from javadoc: " + rc); + } + } +}