public void testJavac() throws Exception { final JavaCompiler jc = ToolProvider.getSystemJavaCompiler(); final StandardJavaFileManager fm = jc.getStandardFileManager( null, Locale.ENGLISH, Charset.forName("UTF-8")); //NOI18N fm.setLocation( StandardLocation.CLASS_PATH, Collections.singleton(FileUtil.archiveOrDirForURL(mvCp.entries().get(0).getURL()))); Iterable<JavaFileObject> res = fm.list( StandardLocation.CLASS_PATH, "", //NOI18N EnumSet.of(JavaFileObject.Kind.CLASS), true); assertEquals(3, StreamSupport.stream(res.spliterator(), false).count()); }
/** Emit a class file for a given class. * @param c The class from which a class file is generated. */ public FileObject write(ClassSymbol c) throws IOException { String className = c.flatName().toString(); FileObject outFile = fileManager.getFileForOutput(StandardLocation.NATIVE_HEADER_OUTPUT, "", className.replaceAll("[.$]", "_") + ".h", null); Writer out = outFile.openWriter(); try { write(out, c); if (verbose) log.printVerbose("wrote.file", outFile); out.close(); out = null; } finally { if (out != null) { // if we are propogating an exception, delete the file out.close(); outFile.delete(); outFile = null; } } return outFile; // may be null if write failed }
void testAPI(String opt, List<String> ref) throws Exception { File identifiers = new File(testSrc, "Identifiers.java"); fm.setLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH, Arrays.asList(pluginJar)); fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File("."))); List<String> options = Arrays.asList(opt); Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(identifiers); System.err.println("test api: " + options + " " + files); Task.Result result = new JavacTask(tb, Task.Mode.API) .fileManager(fm) .options(opt) .files(identifiers.toPath()) .run(Task.Expect.SUCCESS) .writeAll(); String out = result.getOutput(Task.OutputKind.DIRECT); checkOutput(out, ref); }
private boolean identicalFileIsAlreadyGenerated(CharSequence sourceCode) { try { String existingContent = new CharSource() { final String packagePath = !key.packageName.isEmpty() ? (key.packageName.replace('.', '/') + '/') : ""; final String filename = key.relativeName + ".java"; @Override public Reader openStream() throws IOException { return getFiler() .getResource(StandardLocation.SOURCE_OUTPUT, "", packagePath + filename) .openReader(true); } }.read(); if (existingContent.contentEquals(sourceCode)) { // We are ok, for some reason the same file is already generated, // happens in Eclipse for example. return true; } } catch (Exception ignoredAttemptToGetExistingFile) { // we have some other problem, not an existing file } return false; }
@Test public void getLocation_ISA(Path base) throws Exception { Path src1 = base.resolve("src1"); tb.writeJavaFiles(src1.resolve("m1x"), "module m1x { }", "package a; class A { }"); Path src2 = base.resolve("src2"); tb.writeJavaFiles(src2.resolve("m2x").resolve("extra"), "module m2x { }", "package b; class B { }"); Path modules = base.resolve("modules"); tb.createDirectories(modules); String FS = File.separator; String PS = File.pathSeparator; JavaCompiler c = ToolProvider.getSystemJavaCompiler(); try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) { fm.handleOption("--module-source-path", List.of(src1 + PS + src2 + FS + "*" + FS + "extra").iterator()); try { Iterable<? extends Path> paths = fm.getLocationAsPaths(StandardLocation.MODULE_SOURCE_PATH); out.println("result: " + asList(paths)); throw new Exception("expected IllegalStateException not thrown"); } catch (IllegalStateException e) { out.println("Exception thrown, as expected: " + e); } // even if we can't do getLocation for the MODULE_SOURCE_PATH, we should be able // to do getLocation for the modules, which will additionally confirm the option // was effective as intended. Location locn1 = fm.getLocationForModule(StandardLocation.MODULE_SOURCE_PATH, "m1x"); checkLocation(fm.getLocationAsPaths(locn1), List.of(src1.resolve("m1x"))); Location locn2 = fm.getLocationForModule(StandardLocation.MODULE_SOURCE_PATH, "m2x"); checkLocation(fm.getLocationAsPaths(locn2), List.of(src2.resolve("m2x").resolve("extra"))); } }
@Test public void test_simple_interface_no_package() { JavaFileObject[] files = {JavaFileObjects.forResource("InterFaceTestNoPackage.java")}; Compilation c = javac() .withProcessors(new TsGenProcessor()) .compile(files); assertEquals(0, c.errors().size()); // using default packages issues a warning assertEquals(c.diagnostics().asList().stream().filter(x -> x.getKind().equals(Diagnostic.Kind.WARNING)).count(), 1); // module name has to be is unknown assertTrue(c.generatedFile(StandardLocation.SOURCE_OUTPUT, JTSGEN_UNKNOWN, PACKAGE_JSON).isPresent()); assertTrue(c.generatedFile(StandardLocation.SOURCE_OUTPUT, JTSGEN_UNKNOWN, "unknown.d.ts").isPresent()); }
/** * Compile all the java sources in {@code <source>/**} to * {@code <destination>/**}. The destination directory will be created if * it doesn't exist. * * All warnings/errors emitted by the compiler are output to System.out/err. * * @return true if the compilation is successful * * @throws IOException if there is an I/O error scanning the source tree or * creating the destination directory */ public static boolean compile(Path source, Path destination, String ... options) throws IOException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null); List<Path> sources = Files.find(source, Integer.MAX_VALUE, (file, attrs) -> (file.toString().endsWith(".java"))) .collect(Collectors.toList()); Files.createDirectories(destination); jfm.setLocationFromPaths(StandardLocation.CLASS_OUTPUT, Arrays.asList(destination)); List<String> opts = Arrays.asList(options); JavaCompiler.CompilationTask task = compiler.getTask(null, jfm, null, opts, null, jfm.getJavaFileObjectsFromPaths(sources)); return task.call(); }
@Test public void testBasic(Path base) throws IOException { try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) { Location[] locns = { StandardLocation.SOURCE_PATH, StandardLocation.CLASS_PATH, StandardLocation.PLATFORM_CLASS_PATH, }; // set a value Path out = Files.createDirectories(base.resolve("out")); for (Location locn : locns) { checkException("unsupported for location", IllegalArgumentException.class, "location is not an output location or a module-oriented location: " + locn, () -> fm.setLocationForModule(locn, "m", List.of(out))); } } }
int run(JavaCompiler comp, StandardJavaFileManager fm) throws IOException { System.err.println("test: ck:" + ck + " gk:" + gk + " sk:" + sk); File testDir = new File(ck + "-" + gk + "-" + sk); testDir.mkdirs(); fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(testDir)); JavaSource js = new JavaSource(); System.err.println(js.getCharContent(false)); CompilationTask t = comp.getTask(null, fm, null, null, null, Arrays.asList(js)); if (!t.call()) throw new Error("compilation failed"); File testClass = new File(testDir, "Test.class"); String out = javap(testClass); // Extract class sig from first line of Java source String expect = js.source.replaceAll("(?s)^(.* Test[^{]+?) *\\{.*", "$1"); // Extract class sig from line from javap output String found = out.replaceAll("(?s).*\n(.* Test[^{]+?) *\\{.*", "$1"); checkEqual("class signature", expect, found); return errors; }
void compileWithJSR199() throws IOException { String cpath = "C2.jar"; File clientJarFile = new File(cpath); File sourceFileToCompile = new File("C3.java"); javax.tools.JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); try (StandardJavaFileManager stdFileManager = javac.getStandardFileManager(diagnostics, null, null)) { List<File> files = new ArrayList<>(); files.add(clientJarFile); stdFileManager.setLocation(StandardLocation.CLASS_PATH, files); Iterable<? extends JavaFileObject> sourceFiles = stdFileManager.getJavaFileObjects(sourceFileToCompile); if (!javac.getTask(null, stdFileManager, diagnostics, null, null, sourceFiles).call()) { throw new AssertionError("compilation failed"); } } }
@Override @CheckForNull public Location getLocationForModule(Location location, JavaFileObject jfo) throws IOException { if (location != StandardLocation.MODULE_SOURCE_PATH) { throw new IllegalStateException(String.format("Unsupported location: %s", location)); } final FileObject fo = URLMapper.findFileObject(jfo.toUri().toURL()); if (fo != null) { for (ModuleLocation.WithExcludes moduleLocation : sourceModuleLocationsRemovedPatches()) { for (ClassPath.Entry moduleEntry : moduleLocation.getModuleEntries()) { final FileObject root = moduleEntry.getRoot(); if (root != null && FileUtil.isParentOf(root, fo)) { return moduleLocation; } } } } return null; }
@Override @CheckForNull public FileObject getFileForOutput( @NonNull final Location l, @NonNull final String packageName, @NonNull final String relativeName, @NullAllowed final FileObject sibling) throws IOException, UnsupportedOperationException, IllegalArgumentException { checkSingleOwnerThread(); try { JavaFileManager[] fms = cfg.getFileManagers( l == StandardLocation.SOURCE_PATH ? SOURCE_PATH_WRITE : l, null); if (fms.length == 0) { throw new UnsupportedOperationException("No JavaFileManager for location: " + l); //NOI18N } else { return mark( fms[0].getFileForOutput(l, packageName, relativeName, sibling), l); } } finally { clearOwnerThread(); } }
@Override Iterable<DocFile> list(Location location, DocPath path) { Location l = ((location == StandardLocation.SOURCE_PATH) && !fileManager.hasLocation(StandardLocation.SOURCE_PATH)) ? StandardLocation.CLASS_PATH : location; Set<DocFile> files = new LinkedHashSet<>(); for (Path f: fileManager.getLocationAsPaths(l)) { if (Files.isDirectory(f)) { f = f.resolve(path.getPath()); if (Files.exists(f)) files.add(new StandardDocFile(f)); } } return files; }
void runTest(String aJava, String bJava) throws Exception { try (JavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) { ToolBox tb = new ToolBox(); ToolBox.MemoryFileManager memoryFM1 = new ToolBox.MemoryFileManager(fm); new JavacTask(tb).fileManager(memoryFM1) .sources(aJava, bJava) .run(); ToolBox.MemoryFileManager memoryFM2 = new ToolBox.MemoryFileManager(fm); new JavacTask(tb).fileManager(memoryFM2) .sources(bJava, aJava) .run(); Assert.check(Arrays.equals(memoryFM1.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"), memoryFM2.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"))); } }
@Test public void testOutput_nested(Path base) throws IOException { try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) { Location locn = StandardLocation.CLASS_OUTPUT; Path out1 = Files.createDirectories(base.resolve("out1")); fm.setLocationForModule(locn, "m", List.of(out1)); Location m = fm.getLocationForModule(locn, "m"); checkEqual("initial setting", fm.getLocationAsPaths(m), out1); Path out2 = Files.createDirectories(base.resolve("out2")); checkException("create nested module", UnsupportedOperationException.class, "not supported for CLASS_OUTPUT[m]", () -> fm.setLocationForModule(m, "x", List.of(out2))); } }
private void doTestGetFileForInput( final ClassPath cp, final List<? extends Pair<Pair<String,String>,URI>> testCases) throws IOException, URISyntaxException { final CachingArchiveProvider provider = CachingArchiveProvider.getDefault(); final CachingFileManager manager = new CachingFileManager(provider, cp, null, false, true); for (Pair<Pair<String,String>,URI> testCase : testCases) { final Pair<String,String> name = testCase.first(); final URI expectedURI = testCase.second(); FileObject fo = manager.getFileForInput(StandardLocation.CLASS_PATH, name.first(), name.second()); if (expectedURI == null) { assertNull( String.format("Lookup: %s/%s expected: null", name.first(), name.second()), fo); } else { assertEquals( String.format("Lookup: %s/%s expected: %s", name.first(), name.second(), expectedURI), expectedURI, fo.toUri()); } } }
/** * Compile the specified module from the given module sourcepath * * All warnings/errors emitted by the compiler are output to System.out/err. * * @return true if the compilation is successful * * @throws IOException if there is an I/O error scanning the source tree or * creating the destination directory */ public static boolean compileModule(Path source, Path destination, String moduleName, String... options) { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null); try { Files.createDirectories(destination); jfm.setLocationFromPaths(StandardLocation.CLASS_OUTPUT, Arrays.asList(destination)); } catch (IOException e) { throw new UncheckedIOException(e); } Stream<String> opts = Arrays.stream(new String[] { "--module-source-path", source.toString(), "-m", moduleName }); List<String> javacOpts = Stream.concat(opts, Arrays.stream(options)) .collect(Collectors.toList()); JavaCompiler.CompilationTask task = compiler.getTask(null, jfm, null, javacOpts, null, null); return task.call(); }
/** * Compile all the java sources in {@code <source>/**} to * {@code <destination>/**}. The destination directory will be created if * it doesn't exist. * * All warnings/errors emitted by the compiler are output to System.out/err. * * @return true if the compilation is successful * * @throws IOException if there is an I/O error scanning the source tree or * creating the destination directory */ public static boolean compile(Path source, Path destination, String... options) throws IOException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null); List<Path> sources = Files.find(source, Integer.MAX_VALUE, (file, attrs) -> (file.toString().endsWith(".java"))) .collect(Collectors.toList()); Files.createDirectories(destination); jfm.setLocationFromPaths(StandardLocation.CLASS_OUTPUT, Arrays.asList(destination)); List<String> opts = Arrays.asList(options); JavaCompiler.CompilationTask task = compiler.getTask(null, jfm, null, opts, null, jfm.getJavaFileObjectsFromPaths(sources)); return task.call(); }
private void flush(RoundEnvironment roundEnv) { if (!originatingElements.isEmpty()) { try (OutputStream os = processingEnv.getFiler().createResource( StandardLocation.CLASS_OUTPUT, "", "META-INF/.bytecodePatched", originatingElements.toArray(new Element[originatingElements.size()])).openOutputStream()) { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); for (Map.Entry<String, String> exEntry : superclasses.entrySet()) { String api = exEntry.getKey(); String sup = exEntry.getValue(); bw.append("extend.").append(api).append("=").append(sup); bw.newLine(); } bw.flush(); } catch (IOException x) { processingEnv.getMessager().printMessage(Kind.ERROR, x.getMessage()); } } }
public JdkCompiler(){ options = new ArrayList<String>(); options.add("-target"); options.add("1.6"); StandardJavaFileManager manager = compiler.getStandardFileManager(diagnosticCollector, null, null); final ClassLoader loader = Thread.currentThread().getContextClassLoader(); if (loader instanceof URLClassLoader && (! loader.getClass().getName().equals("sun.misc.Launcher$AppClassLoader"))) { try { URLClassLoader urlClassLoader = (URLClassLoader) loader; List<File> files = new ArrayList<File>(); for (URL url : urlClassLoader.getURLs()) { files.add(new File(url.getFile())); } manager.setLocation(StandardLocation.CLASS_PATH, files); } catch (IOException e) { throw new IllegalStateException(e.getMessage(), e); } } classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoaderImpl>() { public ClassLoaderImpl run() { return new ClassLoaderImpl(loader); } }); javaFileManager = new JavaFileManagerImpl(manager, classLoader); }
@Test public void setLocation(Path base) throws Exception { Path src = base.resolve("src"); tb.writeJavaFiles(src.resolve("m1x"), "module m1x { }", "package a; class A { }"); Path modules = base.resolve("modules"); tb.createDirectories(modules); JavaCompiler c = ToolProvider.getSystemJavaCompiler(); try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) { fm.setLocationFromPaths(StandardLocation.MODULE_SOURCE_PATH, List.of(src)); new JavacTask(tb) .options("-XDrawDiagnostics") .fileManager(fm) .outdir(modules) .files(findJavaFiles(src)) .run() .writeAll(); checkFiles(modules.resolve("m1x/module-info.class"), modules.resolve("m1x/a/A.class")); } }
@Test public void test() throws URISyntaxException, MalformedURLException { Compilation compilation = Compiler.javac() .withProcessors(new SyndesisExtensionActionProcessor()) .compile(JavaFileObjects.forSourceString( "test.AnnotatedClassTest", "package test;\n" + "\n" + "@io.syndesis.integration.runtime.api.SyndesisExtensionAction(\n" + " id = \"action-id\",\n" + " name = \"action-name\",\n" + " description = \"action-description\"\n" + ")\n" + "public class AnnotatedClassTest {\n" + "}" ) ); assertTrue(compilation.generatedFile(StandardLocation.SOURCE_OUTPUT, "test/AnnotatedClassTest-action-id.properties").isPresent()); }
private Pair<JavacTask, CompilationUnitTree> findSource(String moduleName, String binaryName) throws IOException { JavaFileObject jfo = fm.getJavaFileForInput(StandardLocation.SOURCE_PATH, binaryName, JavaFileObject.Kind.SOURCE); if (jfo == null) return null; List<JavaFileObject> jfos = Arrays.asList(jfo); JavaFileManager patchFM = moduleName != null ? new PatchModuleFileManager(baseFileManager, jfo, moduleName) : baseFileManager; JavacTaskImpl task = (JavacTaskImpl) compiler.getTask(null, patchFM, d -> {}, null, null, jfos); Iterable<? extends CompilationUnitTree> cuts = task.parse(); task.enter(); return Pair.of(task, cuts.iterator().next()); }
/** * Builds url for a given location, class or internal name * * @param location java file manager location * @param name name * @return URI */ public static URI buildUri(JavaFileManager.Location location, String name) { String extension = ""; String template = location.getName().toLowerCase().replace("_", "") + ":///%s%s"; if (location == StandardLocation.CLASS_OUTPUT) { extension = JavaFileObject.Kind.CLASS.extension; template = CLASS_CODE_URI_TEMPLATE; } else if (location == StandardLocation.SOURCE_OUTPUT) { extension = JavaFileObject.Kind.SOURCE.extension; template = SOURCE_CODE_URI_TEMPLATE; } int dotLastPosition = name.lastIndexOf('.'); if (dotLastPosition != -1) { name = name.replace('.', '/'); } return buildUri(String.format(template, name, extension)); }
protected Class<?> findClassInJarFile(String qualifiedClassName) throws ClassNotFoundException { URI classUri = URIUtil.buildUri(StandardLocation.CLASS_OUTPUT, qualifiedClassName); String internalClassName = classUri.getPath().substring(1); JarFile jarFile = null; try { for (int i = 0; i < jarFiles.size(); i++) { jarFile = jarFiles.get(i); JarEntry jarEntry = jarFile.getJarEntry(internalClassName); if (jarEntry != null) { InputStream inputStream = jarFile.getInputStream(jarEntry); try { byte[] byteCode = new byte[(int) jarEntry.getSize()]; ByteStreams.read(inputStream, byteCode, 0, byteCode.length); return defineClass(qualifiedClassName, byteCode, 0, byteCode.length); } finally { Closeables.closeQuietly(inputStream); } } } } catch (IOException e) { throw new IllegalStateException(String.format("Failed to lookup class %s in jar file %s", qualifiedClassName, jarFile), e); } return null; }
private Location findModule(String moduleName) throws IOException { Location[] locns = { StandardLocation.UPGRADE_MODULE_PATH, StandardLocation.SYSTEM_MODULES, StandardLocation.MODULE_PATH }; for (Location segment: locns) { for (Set<Location> set: fileManager.listLocationsForModules(segment)) { Location result = null; for (Location l: set) { String name = fileManager.inferModuleName(l); if (name.equals(moduleName)) { if (result == null) result = l; else throw new IOException("multiple definitions found for " + moduleName); } } if (result != null) return result; } } return null; }
public static GeneratedFile createGeneratedFile(String description) { String[] fields = description.split(FIELD_SEPARATOR); String typeString = fields[0]; GeneratedFileType type = valueOf(typeString); switch (type) { case SOURCE: return new GeneratedSourceFile(fields[1]); case CLASS: return new GeneratedClassFile(fields[1]); case RESOURCE: Location location = StandardLocation.valueOf(fields[1]); CharSequence pkg = fields[2]; CharSequence relativeName = fields[3]; return new GeneratedResourceFile(location, pkg, relativeName); default: throw new IllegalStateException( String.format( "Unable to parse type %s in generated file description %s", type, description)); } }
public static boolean compile(Path source, Path destination, String... options) throws IOException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); try (StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null)) { List<Path> sources = Files.find(source, Integer.MAX_VALUE, (file, attrs) -> file.toString().endsWith(".java")) .collect(Collectors.toList()); Files.createDirectories(destination); jfm.setLocationFromPaths(StandardLocation.CLASS_OUTPUT, Collections.singleton(destination)); List<String> opts = Arrays.asList(options); JavaCompiler.CompilationTask task = compiler.getTask(null, jfm, null, opts, null, jfm.getJavaFileObjectsFromPaths(sources)); List<String> list = new ArrayList<>(opts); list.addAll(sources.stream() .map(Path::toString) .collect(Collectors.toList())); System.err.println("javac options: " + optionsPrettyPrint(list.toArray(new String[list.size()]))); return task.call(); } }
/** * Creates the table to manage included and excluded elements. * * @param context the context to locate commonly used objects * @param location the location used to locate source files */ ElementsTable(Context context, Map<ToolOption, Object> opts) { this.toolEnv = ToolEnvironment.instance(context); this.syms = Symtab.instance(context); this.names = Names.instance(context); this.fm = toolEnv.fileManager; this.modules = Modules.instance(context); this.opts = opts; this.messager = Messager.instance0(context); this.compiler = JavaCompiler.instance(context); Source source = Source.instance(context); List<Location> locs = new ArrayList<>(); if (modules.multiModuleMode) { locs.add(StandardLocation.MODULE_SOURCE_PATH); } else { if (toolEnv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)) locs.add(StandardLocation.SOURCE_PATH); else locs.add(StandardLocation.CLASS_PATH); } if (source.allowModules() && toolEnv.fileManager.hasLocation(StandardLocation.PATCH_MODULE_PATH)) locs.add(StandardLocation.PATCH_MODULE_PATH); this.locations = Collections.unmodifiableList(locs); getEntry("").excluded = false; accessFilter = new ModifierFilter(opts); xclasses = (boolean)opts.getOrDefault(ToolOption.XCLASSES, false); expandRequires = (AccessKind)opts.get(ToolOption.EXPAND_REQUIRES); }
public void generateFile() throws IOException { FileObject fileObject = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "em.activator.bnd"); try (Writer writer = fileObject.openWriter()) { if (activator != null) { writer.write("Bundle-Activator: " + activator + "\n"); } if (extensionActivator != null) { writer.write("ExtensionBundle-Activator: " + extensionActivator + "\n"); } } }
@Test public void bindingGeneratedView() { JavaFileObject source = JavaFileObjects.forSourceString("test.Test", "" + "package test;\n" + "import butterknife.BindView;\n" + "@PerformGeneration\n" + "public class Test {\n" + " @BindView(1) GeneratedView thing;\n" + "}" ); // w/o the GeneratingProcessor it can't find `class GeneratedView` assertAbout(javaSources()).that(ImmutableList.of(source, TestGeneratingProcessor.ANNOTATION)) .processedWith(new ButterKnifeProcessor()) .failsToCompile() .withErrorContaining("cannot find symbol"); // now the GeneratingProcessor should let it compile assertAbout(javaSources()).that(ImmutableList.of(source, TestGeneratingProcessor.ANNOTATION)) .processedWith(new ButterKnifeProcessor(), new TestGeneratingProcessor("GeneratedView", "package test;", "import android.content.Context;", "import android.view.View;", "public class GeneratedView extends View {", " public GeneratedView(Context context) {", " super(context);", " }", "}" )) .compilesWithoutError() .withNoteContaining("@BindView field with unresolved type (GeneratedView)").and() .withNoteContaining("must elsewhere be generated as a View or interface").and() .and() .generatesFileNamed(StandardLocation.CLASS_OUTPUT, "test", "Test_ViewBinding.class"); }
/** * Determine the location for the module on the module source path * or source output directory which contains a given CompilationUnit. * If the source output directory is unset, the class output directory * will be checked instead. * {@code null} is returned if no such module can be found. * @param tree the compilation unit tree * @return the location for the enclosing module * @throws IOException if there is a problem while searching for the module. */ private Location getModuleLocation(JCCompilationUnit tree) throws IOException { JavaFileObject fo = tree.sourcefile; Location loc = fileManager.getLocationForModule(StandardLocation.MODULE_SOURCE_PATH, fo); if (loc == null) { Location sourceOutput = fileManager.hasLocation(StandardLocation.SOURCE_OUTPUT) ? StandardLocation.SOURCE_OUTPUT : StandardLocation.CLASS_OUTPUT; loc = fileManager.getLocationForModule(sourceOutput, fo); } return loc; }
public void compile(JavaCompiler javaCompiler, Writer out, File sourceDirectory, File outputDirectory, List<File> classpath, DiagnosticListener<? super JavaFileObject> diagnosticListener, String targetVersion ) { targetVersion = targetVersion == null ? "1.6" : targetVersion; StandardJavaFileManager fileManager = javaCompiler.getStandardFileManager(null, null, null); if (outputDirectory != null) { try { fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(outputDirectory)); fileManager.setLocation(StandardLocation.CLASS_PATH, classpath); } catch (IOException e) { throw new RuntimeException("could not set output directory", e); } } Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(findAllSourceFiles(sourceDirectory)); ArrayList<String> options = new ArrayList<String>(); options.add("-source"); options.add(targetVersion); options.add("-target"); options.add(targetVersion); options.add("-encoding"); options.add("UTF8"); options.add("-Xlint:-options"); options.add("-Xlint:unchecked"); if (compilationUnits.iterator().hasNext()) { Boolean success = javaCompiler.getTask(out, fileManager, diagnosticListener, options, null, compilationUnits).call(); assertThat("Compilation was not successful, check stdout for errors", success, is(true)); } }
private void readExistingEntriesInto(Collection<String> services) { try { FileObject existing = getFiler().getResource(StandardLocation.CLASS_OUTPUT, key.packageName, key.relativeName); FluentIterable.from(CharStreams.readLines(existing.openReader(true))) .filter(Predicates.not(Predicates.contains(SERVICE_FILE_COMMENT_LINE))) .copyInto(services); } catch (Exception ex) { // unable to read existing file } }
private void writeLinesFrom(Iterable<String> services) throws IOException { new CharSink() { @Override public Writer openStream() throws IOException { return getFiler() .createResource(StandardLocation.CLASS_OUTPUT, key.packageName, key.relativeName) .openWriter(); } }.writeLines(services, "\n"); }
private String getTemplateText( Filer filer, TypeElement templateType, PackageElement packageElement) throws IOException { CharSequence relativeName = templateType.getSimpleName() + ".generator"; CharSequence packageName = packageElement.getQualifiedName(); List<Exception> suppressed = Lists.newArrayList(); try { return filer.getResource(StandardLocation.SOURCE_PATH, packageName, relativeName) .getCharContent(true) .toString(); } catch (Exception cannotGetFromSourcePath) { suppressed.add(cannotGetFromSourcePath); try { return filer.getResource(StandardLocation.CLASS_OUTPUT, packageName, relativeName) .getCharContent(true) .toString(); } catch (Exception cannotGetFromOutputPath) { suppressed.add(cannotGetFromOutputPath); try { return filer.getResource(StandardLocation.CLASS_PATH, "", packageName.toString().replace('.', '/') + '/' + relativeName) .getCharContent(true) .toString(); } catch (IOException cannotGetFromClasspath) { for (Exception e : suppressed) { cannotGetFromClasspath.addSuppressed(e); } throw cannotGetFromClasspath; } } } }
@SuppressWarnings("serial") private static void matchClassNames(List<String> ret, final String className) throws IOException { String packageName = className.substring(0, className.lastIndexOf('.')); String relativedName = className.substring( className.lastIndexOf('.') + 1, className.length()); String patName = relativedName.replace("*", "(\\w+)"); Pattern pat = Pattern.compile(patName); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaFileManager fm = compiler.getStandardFileManager( new DiagnosticCollector<JavaFileObject>(), null, null); HashSet<JavaFileObject.Kind> kind = new HashSet<JavaFileObject.Kind>() { { add(JavaFileObject.Kind.CLASS); } }; for (JavaFileObject f : fm.list(StandardLocation.PLATFORM_CLASS_PATH, packageName, kind, false)) { String relatived0 = f.getName(); String name0 = relatived0.substring(0, relatived0.length() - ".class".length()); Matcher m = pat.matcher(name0); if (m.matches()) { String name = packageName + '.' + name0; if (!ret.contains(name)) { ret.add(name); } } } }
File createJar() throws IOException { File f = new File("test.jar"); try (JavaFileManager fm = ToolProvider.getSystemJavaCompiler() .getStandardFileManager(null, null, null)) { ToolBox tb = new ToolBox(); new JarTask(tb, f.getPath()) .files(fm, StandardLocation.PLATFORM_CLASS_PATH, "java.lang.*") .run(); } return f; }
public OutputStream openBinary(JPackage pkg, String fileName) throws IOException { StandardLocation loc; if(fileName.endsWith(".java")) { // Annotation Processing doesn't do the proper Unicode escaping on Java source files, // so we can't rely on Filer.createSourceFile. loc = SOURCE_PATH; } else { // put non-Java files directly to the output folder loc = CLASS_PATH; } return filer.createResource(loc, pkg.name(), fileName).openOutputStream(); }
@Override public Location getLocationForModule(Location location, String moduleName) throws IOException { if (location == StandardLocation.PATCH_MODULE_PATH) { return moduleLocations(location).stream() .filter((ml) -> moduleName != null && moduleName.equals(ml.getModuleName())) .findFirst() .orElse(null); } else if (location == StandardLocation.CLASS_OUTPUT) { return moduleLocations(StandardLocation.PATCH_MODULE_PATH).stream() .filter((pl) -> moduleName != null && moduleName.equals(pl.getModuleName())) .findFirst() .map((pl) -> { final List<URL> cacheRoots = pl.getSrc() == null ? Collections.emptyList() : pl.getSrc().getModuleRoots().stream() .map((url) -> { try { return BaseUtilities.toURI(JavaIndex.getClassFolder(url, false, false)).toURL(); } catch (IOException ioe) { LOG.log(Level.WARNING, "Cannot determine the cache URL for: {0}", url); //NOI18N return null; } }) .filter((url) -> url != null) .collect(Collectors.toList()); return cacheRoots.isEmpty() ? null : new PatchLocation( StandardLocation.PATCH_MODULE_PATH, cacheRoots, Collections.emptyList(), pl.getModuleName()); }) .orElse(null); } else { return null; } }