8047183: JDK build fails with sjavac enabled
authorjjg
Thu, 26 Jun 2014 11:31:59 -0700
changeset 25290 72f49068d56c
parent 25289 9573116c764c
child 25291 0fd42e6dfdf6
8047183: JDK build fails with sjavac enabled Reviewed-by: mcimadamore
langtools/src/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java
langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java
langtools/test/tools/sjavac/IgnoreSymbolFile.java
--- a/langtools/src/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java	Thu Jun 26 13:48:58 2014 -0400
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java	Thu Jun 26 11:31:59 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -25,17 +25,21 @@
 
 package com.sun.tools.sjavac.comp;
 
-import com.sun.tools.javac.util.ListBuffer;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.URI;
-import java.util.Set;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.HashMap;
+import java.util.Set;
+
 import javax.tools.*;
 import javax.tools.JavaFileObject.Kind;
 
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.util.BaseFileManager;
+import com.sun.tools.javac.util.ListBuffer;
+
 /**
  * Intercepts reads and writes to the file system to gather
  * information about what artifacts are generated.
@@ -76,6 +80,15 @@
         stdout = pw;
     }
 
+    /**
+     * Set whether or not to use ct.sym as an alternate to rt.jar.
+     */
+    public void setSymbolFileEnabled(boolean b) {
+        if (!(fileManager instanceof JavacFileManager))
+            throw new IllegalStateException();
+        ((JavacFileManager) fileManager).setSymbolFileEnabled(b);
+    }
+
     public Map<String,Set<URI>> getPackageArtifacts() {
         return packageArtifacts;
     }
--- a/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java	Thu Jun 26 13:48:58 2014 -0400
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java	Thu Jun 26 11:31:59 2014 -0700
@@ -44,15 +44,13 @@
 import java.util.concurrent.Future;
 
 import javax.tools.JavaCompiler.CompilationTask;
-import javax.tools.JavaFileManager;
 import javax.tools.JavaFileObject;
 import javax.tools.StandardJavaFileManager;
 
 import com.sun.tools.javac.api.JavacTaskImpl;
-import com.sun.tools.javac.util.BaseFileManager;
 import com.sun.tools.javac.util.Context;
 import com.sun.tools.javac.util.ListBuffer;
-import com.sun.tools.javac.util.Log;
+import com.sun.tools.javac.util.Options;
 import com.sun.tools.javac.util.StringUtils;
 import com.sun.tools.sjavac.comp.AttrWithDeps;
 import com.sun.tools.sjavac.comp.Dependencies;
@@ -320,6 +318,7 @@
 
                     // Do the compilation!
                     CompilationTask task = compiler.getTask(stderr, smartFileManager, null, the_options, null, compilationUnits, context);
+                    smartFileManager.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file"));
                     rc = ((JavacTaskImpl) task).doCall();
 
                     while (numActiveSubTasks()>0) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/sjavac/IgnoreSymbolFile.java	Thu Jun 26 11:31:59 2014 -0700
@@ -0,0 +1,108 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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 8047183
+ * @summary JDK build fails with sjavac enabled
+ */
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+public class IgnoreSymbolFile {
+    public static void main(String... args) throws Exception {
+        if (sjavacAvailable()) {
+            IgnoreSymbolFile test = new IgnoreSymbolFile();
+            test.run();
+        } else {
+            System.err.println("sjavac not available; test skipped");
+        }
+    }
+
+    void run() throws Exception {
+        String body =
+                "package p;\n"
+                + "import sun.reflect.annotation.*;\n"
+                + "class X {\n"
+                + "    ExceptionProxy proxy;"
+                + "}";
+        writeFile("src/p/X.java", body);
+
+        new File("classes").mkdirs();
+
+        String server = "--server:portfile=testserver,background=false";
+        int rc1 = compile(server, "-d", "classes", "-Werror", "src");
+        if (rc1 == 0)
+            error("compilation succeeded unexpectedly");
+
+        int rc2 = compile(server, "-d", "classes", "-Werror", "-XDignore.symbol.file=true", "src");
+        if (rc2 != 0)
+            error("compilation failed unexpectedly: rc=" + rc2);
+
+        if (errors > 0)
+            throw new Exception(errors + " errors occurred");
+    }
+
+    int compile(String... args) throws ReflectiveOperationException {
+        // Use reflection to avoid a compile-time dependency on sjavac Main
+        System.err.println("compile: " + Arrays.toString(args));
+        Class<?> c = Class.forName("com.sun.tools.sjavac.Main");
+        Method m = c.getDeclaredMethod("go", String[].class, PrintStream.class, PrintStream.class);
+        Object sjavac = c.newInstance();
+        int rc = (Integer) m.invoke(sjavac, args, System.err, System.err);
+        System.err.println("rc=" + rc);
+        return rc;
+    }
+
+    void writeFile(String path, String body) throws IOException {
+        File f = new File(path);
+        if (f.getParentFile() != null)
+            f.getParentFile().mkdirs();
+        try (FileWriter w = new FileWriter(f)) {
+            w.write(body);
+        }
+    }
+
+    void error(String msg) {
+        System.err.println("Error: " + msg);
+        errors++;
+    }
+
+    int errors;
+
+    static boolean sjavacAvailable() {
+        try {
+            Class.forName("com.sun.tools.sjavac.Main");
+            return true;
+        } catch (ClassNotFoundException e) {
+            return false;
+        }
+    }
+}