8151191: javac error when running javadoc on some inner classes
Reviewed-by: jjg
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java
index 047eaa3..c938399 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java
@@ -731,4 +731,13 @@
return diagFactory.fragment(key, file, diag);
}
}
+
+ public static class BadEnclosingMethodAttr extends BadClassFile {
+ private static final long serialVersionUID = 0;
+
+ public BadEnclosingMethodAttr(TypeSymbol sym, JavaFileObject file, JCDiagnostic diag,
+ JCDiagnostic.Factory diagFactory) {
+ super(sym, file, diag, diagFactory);
+ }
+ }
}
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
index c6957ff4..e60e9a9 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
@@ -46,6 +46,7 @@
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
+import com.sun.tools.javac.code.ClassFinder.BadEnclosingMethodAttr;
import com.sun.tools.javac.code.Kinds.Kind;
import com.sun.tools.javac.comp.Annotate.AnnotationTypeMetadata;
import com.sun.tools.javac.code.Scope.WriteableScope;
@@ -764,8 +765,13 @@
return list;
}
for (Symbol sym : members().getSymbols(NON_RECURSIVE)) {
- if (sym != null && (sym.flags() & SYNTHETIC) == 0 && sym.owner == this)
- list = list.prepend(sym);
+ try {
+ if (sym != null && (sym.flags() & SYNTHETIC) == 0 && sym.owner == this) {
+ list = list.prepend(sym);
+ }
+ } catch (BadEnclosingMethodAttr badEnclosingMethod) {
+ // ignore the exception
+ }
}
return list;
}
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java
index 56bca42..9806e85 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java
@@ -274,6 +274,14 @@
diagFactory);
}
+ public ClassFinder.BadEnclosingMethodAttr badEnclosingMethod(Object... args) {
+ return new ClassFinder.BadEnclosingMethodAttr (
+ currentOwner.enclClass(),
+ currentClassFile,
+ diagFactory.fragment("bad.enclosing.method", args),
+ diagFactory);
+ }
+
/************************************************************************
* Buffer Access
***********************************************************************/
@@ -1297,7 +1305,7 @@
MethodSymbol m = findMethod(nt, c.members_field, self.flags());
if (nt != null && m == null)
- throw badClassFile("bad.enclosing.method", self);
+ throw badEnclosingMethod(self);
self.name = simpleBinaryName(self.flatname, c.flatname) ;
self.owner = m != null ? m : c;
diff --git a/langtools/test/tools/javac/T8151191/Anno.java b/langtools/test/tools/javac/T8151191/Anno.java
new file mode 100644
index 0000000..3d267d2
--- /dev/null
+++ b/langtools/test/tools/javac/T8151191/Anno.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+public @interface Anno {}
diff --git a/langtools/test/tools/javac/T8151191/AnnoProcessor.java b/langtools/test/tools/javac/T8151191/AnnoProcessor.java
new file mode 100644
index 0000000..857a0f8
--- /dev/null
+++ b/langtools/test/tools/javac/T8151191/AnnoProcessor.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+import java.util.Set;
+
+import javax.annotation.processing.*;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.*;
+import javax.lang.model.SourceVersion;
+
+@SupportedAnnotationTypes("*")
+public class AnnoProcessor extends AbstractProcessor {
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latest();
+ }
+
+ @Override
+ public boolean process(Set<? extends TypeElement> set, RoundEnvironment re) {
+ for (TypeElement tElement : set) {
+ Element e = tElement.getEnclosingElement();
+ if (e != null) {
+ if (e instanceof PackageElement) {
+ ((PackageElement)e).getEnclosedElements();
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/langtools/test/tools/javac/T8151191/ErrorRunningJavadocOnInnerClasses.java b/langtools/test/tools/javac/T8151191/ErrorRunningJavadocOnInnerClasses.java
new file mode 100644
index 0000000..ebd7a15
--- /dev/null
+++ b/langtools/test/tools/javac/T8151191/ErrorRunningJavadocOnInnerClasses.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, 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 8151191
+ * @summary javac error when running javadoc on some inner classes
+ * @library /tools/javac/lib
+ * @modules java.compiler
+ * jdk.compiler
+ * @build JavacTestingAbstractProcessor
+ * @compile Anno.java AnnoProcessor.java ErrorRunningJavadocOnInnerClasses.java
+ * @compile -processor AnnoProcessor ErrorRunningJavadocOnInnerClasses.java
+ */
+
+@Anno
+public class ErrorRunningJavadocOnInnerClasses {
+ ErrorRunningJavadocOnInnerClasses() {
+ Runnable r = () -> {
+ new Object() {};
+ };
+ }
+}