--- a/langtools/test/tools/javac/util/context/T7021650.java Wed Jan 06 10:01:34 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,223 +0,0 @@
-/*
- * Copyright (c) 2011, 2015, 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 7021650
- * @summary Fix Context issues
- * @library /tools/javac/lib
- * @modules jdk.compiler/com.sun.tools.javac.comp
- * jdk.compiler/com.sun.tools.javac.file
- * jdk.compiler/com.sun.tools.javac.main
- * jdk.compiler/com.sun.tools.javac.processing
- * jdk.compiler/com.sun.tools.javac.util
- * @build JavacTestingAbstractProcessor T7021650
- * @run main T7021650
- */
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import javax.annotation.processing.*;
-import javax.lang.model.element.*;
-import javax.tools.*;
-
-import com.sun.tools.javac.comp.Attr;
-import com.sun.tools.javac.file.JavacFileManager;
-import com.sun.tools.javac.main.Main;
-import com.sun.tools.javac.processing.JavacProcessingEnvironment;
-import com.sun.tools.javac.util.Context;
-
-public class T7021650 extends JavacTestingAbstractProcessor {
- public static void main(String... args) throws Exception {
- new T7021650().run();
- }
-
- static File testSrc = new File(System.getProperty("test.src"));
- static final int MAX_ROUNDS = 3;
-
- /**
- * Perform a compilation with custom factories registered in the context,
- * and verify that corresponding objects are created in each round.
- */
- void run() throws Exception {
- Counter myDemoCounter = new Counter();
- Counter myAttrCounter = new Counter();
-
- Context context = new Context();
- // Use a custom file manager which creates classloaders for annotation
- // processors with a sensible delegation parent, so that all instances
- // of test classes come from the same class loader. This is important
- // because the test performs class checks on the instances of classes
- // found in the context for each round or processing.
- context.put(JavaFileManager.class, new Context.Factory<JavaFileManager>() {
- public JavaFileManager make(Context c) {
- return new JavacFileManager(c, true, null) {
- @Override
- protected ClassLoader getClassLoader(URL[] urls) {
- return new URLClassLoader(urls, T7021650.class.getClassLoader());
- }
- };
- }
- });
-
- MyDemo.preRegister(context, myDemoCounter);
- MyAttr.preRegister(context, myAttrCounter);
-
- String[] args = {
- "-d", ".",
- "-processor", T7021650.class.getName(),
- "-XprintRounds",
- new File(testSrc, T7021650.class.getName() + ".java").getPath()
- };
-
- compile(context, args);
-
- // the services should only be created once in the current scheme:
- checkEqual("demoCounter", myDemoCounter.count, 1);
- checkEqual("myAttrCounter", myAttrCounter.count, 1);
- }
-
- void compile(Context context, String... args) throws Exception {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- Main m = new Main("javac", pw);
- Main.Result res = m.compile(args, context);
- pw.close();
- String out = sw.toString();
- if (!out.isEmpty())
- System.err.println(out);
- if (!res.isOK())
- throw new Exception("compilation failed unexpectedly: result=" + res);
- }
-
- void checkEqual(String label, int found, int expect) throws Exception {
- if (found != expect)
- throw new Exception("unexpected value for " + label
- + ": expected " + expect
- + ": found " + found);
- }
-
- //---------------
-
- /*
- * A custom class unknown to javac but nonetheless registered in the context.
- */
- static class Demo {
- Demo(Context c) {
- c.put(Demo.class, this);
- }
-
- static Demo instance(Context context) {
- return context.get(Demo.class);
- }
- }
-
- static class MyDemo extends Demo {
- static void preRegister(Context context, final Counter counter) {
- context.put(Demo.class, new Context.Factory<Demo>() {
- public Demo make(Context c) {
- counter.count++;
- return new MyDemo(c);
- }
- });
- }
-
- MyDemo(Context c) {
- super(c);
- }
- }
-
- /**
- * A custom version of a standard javac component.
- */
- static class MyAttr extends Attr {
- static void preRegister(Context context, final Counter counter) {
- context.put(attrKey, new Context.Factory<Attr>() {
- public Attr make(Context c) {
- counter.count++;
- return new MyAttr(c);
- }
- });
- }
-
- MyAttr(Context c) {
- super(c);
- }
- }
-
- static class Counter {
- int count;
- }
-
- //---------------
-
- int round = 0;
-
- @Override
- public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
- round++;
-
- Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
-
- // verify items in context as expected
- check("Demo", Demo.instance(context), MyDemo.class);
- check("Attr", Attr.instance(context), MyAttr.class);
-
- // For a few rounds, generate new source files, so that we can check whether
- // values in the context are correctly handled in subsequent processing rounds
- if (round <= MAX_ROUNDS) {
- String pkg = "p";
- String currClass = "Gen" + round;
- String curr = pkg + "." + currClass;
- String next = (pkg + ".Gen" + (round + 1));
- StringBuilder text = new StringBuilder();
- text.append("package ").append(pkg).append(";\n");
- text.append("public class ").append(currClass).append(" {\n");
- if (round < MAX_ROUNDS)
- text.append(" ").append(next).append(" x;\n");
- text.append("}\n");
-
- try {
- JavaFileObject fo = filer.createSourceFile(curr);
- Writer out = fo.openWriter();
- try {
- out.write(text.toString());
- } finally {
- out.close();
- }
- } catch (IOException e) {
- throw new Error(e);
- }
- }
-
- return true;
- }
-
- void check(String label, Object o, Class<?> clazz) {
- if (o == null)
- throw new IllegalStateException(label + ": no item found");
- if (!clazz.isAssignableFrom(o.getClass()))
- throw new IllegalStateException(label + ": unexpected class: " + o.getClass());
- }
-}