blob: 0c8853a8b5607031aab85ed0f29e664629cb5b0d [file] [log] [blame]
package annotations.tools;
/*>>>
import org.checkerframework.checker.nullness.qual.*;
*/
import java.io.*;
import annotations.el.AScene;
import annotations.el.DefException;
import annotations.io.IndexFileParser;
import annotations.io.IndexFileWriter;
import annotations.io.JavapParser;
import annotations.io.classfile.ClassFileReader;
import annotations.io.classfile.ClassFileWriter;
import plume.FileIOException;
/** Concatenates multiple descriptions of annotations into a single one. */
public class Anncat {
private static void usage() {
System.err.print(
"anncat, part of the Annotation File Utilities\n" +
"(https://checkerframework.org/annotation-file-utilities/)\n" +
"usage: anncat <inspec>* [ --out <outspec> ], where:\n" +
" <inspec> ::=\n" +
" ( --javap <in.javap> )\n" +
" | ( --index <in.jaif> )\n" +
" | ( --class <in.class> )\n" +
" <outspec> ::=\n" +
" ( --index <out.jaif> )\n" +
" | ( --class [ --overwrite ] <orig.class> [ --to <out.class> ] )\n" +
"If outspec is omitted, default is index file to stdout.\n");
}
private static void usageAssert(boolean b) {
if (!b) {
System.err.println("*** Usage error ***");
usage();
System.exit(3);
}
}
public static void main(String[] args) {
usageAssert(0 < args.length);
if (args[0].equals("--help")) {
usage();
System.exit(0);
}
try {
int idx = 0;
/*@NonNull*/ AScene theScene =
new AScene();
// Read the scene
while (idx < args.length && !args[idx].equals("--out")) {
if (args[idx].equals("--javap")) {
idx++;
usageAssert(idx < args.length);
String infile = args[idx++];
System.out.println("Reading javap file " + infile + "...");
JavapParser.parse(infile, theScene);
System.out.println("Finished.");
} else if (args[idx].equals("--index")) {
idx++;
usageAssert(idx < args.length);
String infile = args[idx++];
System.err.println("Reading index file " + infile + "...");
IndexFileParser.parseFile(infile, theScene);
System.err.println("Finished.");
} else if (args[idx].equals("--class")) {
idx++;
usageAssert(idx < args.length);
String infile = args[idx++];
System.err.println("Reading class file " + infile + "...");
ClassFileReader.read(theScene, infile);
System.err.println("Finished.");
} else {
usageAssert(false);
}
}
// Write the scene
if (idx == args.length) {
System.err.println("Writing index file to standard output...");
IndexFileWriter.write(theScene, new OutputStreamWriter(System.out));
System.err.println("Finished.");
} else {
idx++;
usageAssert(idx < args.length);
if (args[idx].equals("--index")) {
idx++;
usageAssert(idx < args.length);
String outfile = args[idx];
idx++;
usageAssert(idx == args.length);
System.err.println("Writing index file to " + outfile + "...");
IndexFileWriter.write(theScene, new FileWriter(outfile));
System.err.println("Finished.");
} else if (args[idx].equals("--class")) {
idx++;
usageAssert(idx < args.length);
boolean overwrite;
if (args[idx].equals("--overwrite")) {
System.err.println("Overwrite mode enabled.");
overwrite = true;
idx++;
usageAssert(idx < args.length);
} else {
overwrite = false;
}
String origfile = args[idx];
idx++;
if (idx < args.length) {
usageAssert(args[idx].equals("--to"));
idx++;
usageAssert(idx < args.length);
String outfile = args[idx];
idx++;
usageAssert(idx == args.length);
System.err.println("Reading original class file " + origfile);
System.err.println("and writing annotated version to " + outfile + "...");
ClassFileWriter.insert(theScene, new FileInputStream(origfile), new FileOutputStream(outfile), overwrite);
System.err.println("Finished.");
} else {
System.err.println("Rewriting class file " + origfile + " with annotations...");
ClassFileWriter.insert(theScene, origfile, overwrite);
System.err.println("Finished.");
}
} else {
usageAssert(false);
}
}
} catch (FileIOException e) {
e.printStackTrace(System.err);
System.exit(1);
} catch (IOException e) {
e.printStackTrace(System.err);
System.exit(2);
} catch (DefException e) {
e.printStackTrace(System.err);
System.exit(1);
}
System.exit(0);
}
}