private OutputFileObject getFileForOutput( Location location, JavaFileObject.Kind kind, String fileName, @Nullable String className, FileObject sibling) throws IOException { JavaFileObject src = null; if (sibling instanceof JavaFileObject) { final JavaFileObject javaFileObject = (JavaFileObject) sibling; if (javaFileObject.getKind() == JavaFileObject.Kind.SOURCE) { src = javaFileObject; } } File dir = getSingleOutputDirectory(location, src); if (location == StandardLocation.CLASS_OUTPUT) { if (dir == null) { throw new IOException("Output directory is not specified"); } } else if (location == StandardLocation.SOURCE_OUTPUT) { if (dir == null) { dir = getSingleOutputDirectory(StandardLocation.CLASS_OUTPUT, src); if (dir == null) { throw new IOException("Neither class output directory nor source output are specified"); } } } final File file = (dir == null ? new File(fileName).getAbsoluteFile() : new File(dir, fileName)); return new OutputFileObject(myContext, file, kind, className, src); }