/* * @test /nodynamiccopyright/ * @bug 7144981 * @summary javac should ignore ignorable characters in input * @modules jdk.compiler * @run main IgnoreIgnorableCharactersInInput */ import com.sun.source.util.JavacTask; import java.io.File; import java.net.URI; import java.util.Arrays; import java.util.Set; import java.util.TreeSet; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; import javax.tools.ToolProvider; public class IgnoreIgnorableCharactersInInput { public static void main(String... args) throws Exception { new IgnoreIgnorableCharactersInInput().run(); } void run() throws Exception { JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); File classesDir = new File(System.getProperty("user.dir"), "classes"); classesDir.mkdirs(); JavaSource[] sources = new JavaSource[]{ new JavaSource("TestOneIgnorableChar", "AA\\u0000BB"), new JavaSource("TestMultipleIgnorableChar", "AA\\u0000\\u0000\\u0000BB")}; JavacTask ct = (JavacTask)comp.getTask(null, null, null, Arrays.asList("-d", classesDir.getPath()), null, Arrays.asList(sources)); try { if (!ct.call()) { throw new AssertionError("Error thrown when compiling test cases"); } } catch (Throwable ex) { throw new AssertionError("Error thrown when compiling test cases"); } check(classesDir, "TestOneIgnorableChar.class", "TestOneIgnorableChar$AABB.class", "TestMultipleIgnorableChar.class", "TestMultipleIgnorableChar$AABB.class"); if (errors > 0) throw new AssertionError("There are some errors in the test check the error output"); } /** * Check that a directory contains the expected files. */ void check(File dir, String... paths) { Set<String> found = new TreeSet<String>(Arrays.asList(dir.list())); Set<String> expect = new TreeSet<String>(Arrays.asList(paths)); if (found.equals(expect)) return; for (String f: found) { if (!expect.contains(f)) error("Unexpected file found: " + f); } for (String e: expect) { if (!found.contains(e)) error("Expected file not found: " + e); } } int errors; void error(String msg) { System.err.println(msg); errors++; } class JavaSource extends SimpleJavaFileObject { String internalSource = "public class #O {public class #I {} }"; public JavaSource(String outerClassName, String innerClassName) { super(URI.create(outerClassName + ".java"), JavaFileObject.Kind.SOURCE); internalSource = internalSource.replace("#O", outerClassName).replace("#I", innerClassName); } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { return internalSource; } } }