/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* 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.
*/
/**
* Generate stub source files by removing implementation details from input files.
*
* This is a special purpose stub generator, specific to the needs of generating
* stub files for JDK 7 API that are needed to compile langtools files that depend
* on that API. The stub generator works by removing as much of the API source code
* as possible without affecting the public signature, in order to reduce the
* transitive closure of the API being referenced. The resulting stubs can be
* put on the langtools sourcepath with -implicit:none to compile the langtools
* files that depend on the JDK 7 API.
*
* Usage:
* genstubs -s <outdir> -sourcepath <path> <classnames>
*
* The specified class names are looked up on the sourcepath, and corresponding
* stubs are written to the source output directory.
*
* Classes are parsed into javac ASTs, then processed with a javac TreeTranslator
* to remove implementation details, and written out in the source output directory.
* Documentation comments and annotations are removed. Method bodies are removed
* and methods are marked native. Private and package-private field definitions
* have their initializers replace with 0, 0.0, false, null as appropriate.
*
* An Ant task, Main$Ant is also provided. Files are specified with an implicit
* fileset, using srcdir as a base directory. The set of files to be included
* is specified with an includes attribute or nested <includes> set. However,
* unlike a normal fileset, an empty includes attribute means "no files" instead
* of "all files". The Ant task also accepts "fork=true" and classpath attribute
* or nested <classpath> element to run GenStubs in a separate VM with the specified
* path. This is likely necessary if a JDK 7 parser is required to read the
* JDK 7 input files.
*/
public class GenStubs {
super(message);
}
super(message);
}
}
if (!ok)
}
throw new IllegalArgumentException(arg);
else {
}
}
}
//System.err.println("run: sourcepath:" + sourcepath + " outdir:" + outdir + " classes:" + classes);
if (sourcepath == null)
throw new IllegalArgumentException("sourcepath not set");
throw new IllegalArgumentException("source output dir not set");
try {
error("class not found: " + c);
else
}
}
} catch (IOException e) {
error("IO error " + e, e);
}
return (errors == 0);
}
// System.err.println("Writing " + className + " to " + fo.getName());
try {
} finally {
}
}
if (p.length() > 0)
}
return list;
}
errors++;
}
}
int errors;
}
/**
* compilation units: remove javadoc comments
* -- required, in order to remove @deprecated tags, since we
* (separately) remove all annotations, including @Deprecated
*/
super.visitTopLevel(tree);
}
/**
* methods: remove method bodies, make methods native
*/
}
}
/**
* modifiers: remove annotations
*/
}
/**
* field definitions: replace initializers with 0, 0.0, false etc
* when possible -- i.e. leave public, protected initializers alone
*/
else {
if (t.equals("boolean"))
else if (t.equals("byte"))
else if (t.equals("char"))
else if (t.equals("double"))
else if (t.equals("float"))
else if (t.equals("int"))
else if (t.equals("long"))
else if (t.equals("short"))
else
}
}
}
}
private TreeMaker m;
// ImportCleaner itself doesn't require a filemanager, but instantiating
// a TreeMaker does, indirectly (via ClassReader, sigh)
}
continue;
}
}
}
}
}
}
super.visitSelect(tree);
}
}
//---------- Ant Invocation ------------------------------------------------
private boolean fork;
}
}
public void setFork(boolean v) {
this.fork = v;
}
else
}
}
return classpath.createPath();
}
createClasspath().setRefid(r);
}
super.setIncludes(includes);
}
public void execute() {
return;
// System.err.println("Ant.execute: srcDir " + srcDir);
// System.err.println("Ant.execute: destDir " + destDir);
// System.err.println("Ant.execute: files " + Arrays.asList(files));
return;
}
if (!fork) {
if (!ok)
throw new BuildException("genstubs failed");
} else {
//System.err.println("GenStubs exec " + cmd);
pb.redirectErrorStream(true);
try {
try {
} finally {
}
if (rc != 0)
throw new BuildException("genstubs failed");
} catch (IOException e) {
throw new BuildException("genstubs failed", e);
} catch (InterruptedException e) {
throw new BuildException("genstubs failed", e);
}
}
}
}
}
}
}