8132446: AsssertionError in ClassSymbol.setAnnotationType

Reviewed-by: jlahoda, darcy
This commit is contained in:
Srikanth Adayapalam 2016-07-04 14:57:33 +05:30
parent d3eaa80bdd
commit 928c417cd8
5 changed files with 111 additions and 1 deletions

View file

@ -1367,6 +1367,10 @@ public abstract class Symbol extends AnnoConstruct implements Element {
t.interfaces_field = null; t.interfaces_field = null;
t.all_interfaces_field = null; t.all_interfaces_field = null;
} }
clearAnnotationMetadata();
}
public void clearAnnotationMetadata() {
metadata = null; metadata = null;
annotationTypeMetadata = AnnotationTypeMetadata.notAnAnnotationType(); annotationTypeMetadata = AnnotationTypeMetadata.notAnAnnotationType();
} }

View file

@ -438,6 +438,7 @@ public class Enter extends JCTree.Visitor {
c.flags_field = chk.checkFlags(tree.pos(), tree.mods.flags, c, tree); c.flags_field = chk.checkFlags(tree.pos(), tree.mods.flags, c, tree);
c.sourcefile = env.toplevel.sourcefile; c.sourcefile = env.toplevel.sourcefile;
c.members_field = WriteableScope.create(c); c.members_field = WriteableScope.create(c);
c.clearAnnotationMetadata();
ClassType ct = (ClassType)c.type; ClassType ct = (ClassType)c.type;
if (owner.kind != PCK && (c.flags_field & STATIC) == 0) { if (owner.kind != PCK && (c.flags_field & STATIC) == 0) {
@ -457,6 +458,7 @@ public class Enter extends JCTree.Visitor {
// Enter type parameters. // Enter type parameters.
ct.typarams_field = classEnter(tree.typarams, localEnv); ct.typarams_field = classEnter(tree.typarams, localEnv);
ct.allparams_field = null;
// install further completer for this type. // install further completer for this type.
c.completer = typeEnter; c.completer = typeEnter;

View file

@ -1506,7 +1506,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
} }
public void visitClassDef(JCClassDecl node) { public void visitClassDef(JCClassDecl node) {
if (node.sym != null) { if (node.sym != null) {
node.sym.reset();
node.sym.completer = new ImplicitCompleter(topLevel); node.sym.completer = new ImplicitCompleter(topLevel);
} }
node.sym = null; node.sym = null;

View file

@ -0,0 +1,66 @@
/*
* 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.io.IOError;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Set;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;
// This processor generates the missing annotation types of the form AutoAnnotation_*
// thereby making sure annotation processing doesn't abort/crash on account of that.
@SupportedAnnotationTypes("*")
public class Processor extends JavacTestingAbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!roundEnv.processingOver()) {
for (Element element : roundEnv.getRootElements()) {
String elementName = element.getSimpleName().toString();
if (elementName.startsWith("AutoAnnotation_")) {
continue;
}
String name = "AutoAnnotation_" + elementName;
JavaFileObject jfo;
try {
jfo = processingEnv.getFiler().createSourceFile(name, element);
} catch (IOException e) {
throw new IOError(e);
}
try (OutputStream os = jfo.openOutputStream()) {
String output = String.format("public @interface %s {}", name);
os.write(output.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
throw new IOError(e);
}
}
}
return false;
}
}

View file

@ -0,0 +1,39 @@
/*
* 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 8132446
* @summary AsssertionError in ClassSymbol.setAnnotationType
* @library /tools/javac/lib
* @modules java.compiler
* jdk.compiler
* @build Processor
* @compile -processor Processor T8132446.java
* @compile -processor Processor T8132446.java
*/
@Deprecated
@AutoAnnotation_T8132446
public class T8132446 {}