Home | History | Annotate | Download | only in executable
      1 package annotations.tests.executable;
      2 
      3 /*>>>
      4 import org.checkerframework.checker.nullness.qual.NonNull;
      5 import org.checkerframework.checker.tainting.qual.Tainted;
      6 */
      7 
      8 import java.io.*;
      9 import java.util.*;
     10 
     11 import annotations.*;
     12 import annotations.el.*;
     13 import annotations.io.*;
     14 
     15 /**
     16  * Prints information about Tainted and NonNull annotations on a given class.
     17  * Invoke as:
     18  * <pre>
     19  * java Example <i>input.jaif</i> <i>ClassToProcess</i> <i>output.jaif</i>
     20  * </pre>
     21  */
     22 public class Example {
     23   public static void main(String [] args) {
     24     AScene scene;
     25 
     26     if (! new File(args[0]).exists()) {
     27       try {
     28         throw new Error(String.format("Cannot find file %s in directory %s",
     29                                     args[0], new File(".").getCanonicalPath()));
     30       } catch (IOException e) {
     31         throw new Error("This can't happen: ", e);
     32       }
     33     }
     34 
     35     // System.out.println("Reading in " + args[0]);
     36     try {
     37       scene = new AScene();
     38       IndexFileParser.parseFile(args[0], scene);
     39     } catch (IOException e) {
     40       e.printStackTrace(System.err);
     41       return;
     42     }
     43 
     44     System.out.println("Processing class " + args[1]);
     45     // Get a handle on the class
     46     AClass clazz1 = scene.classes.get(args[1]);
     47     if (clazz1 == null) {
     48       System.out.println("Class " + args[1] + " is not mentioned in annotation file " + args[0]);
     49       return;
     50     }
     51     AClass clazz = (AClass) clazz1;
     52 
     53     for (Map.Entry<String, AMethod> me : clazz.methods.entrySet()) {
     54       AMethod method = me.getValue();
     55 
     56       Annotation rro = method.receiver.type.lookup("Tainted");
     57       if (rro == null) {
     58         System.out.println("Method " + me.getKey()
     59             + " might modify the receiver");
     60       } else {
     61         System.out.println("Method " + me.getKey()
     62             + " must not modify the receiver");
     63       }
     64 
     65       ATypeElement paramType1 = method.parameters.vivify(0).type;
     66       Annotation p1nn = paramType1.lookup("NonNull");
     67       if (p1nn == null) {
     68         System.out.println("Annotating type of first parameter of "
     69             + me.getKey() + " nonnull");
     70 
     71         paramType1.tlAnnotationsHere.add(Annotations.aNonNull);
     72       }
     73     }
     74 
     75     // System.out.println("Writing out " + args[2]);
     76     try {
     77       IndexFileWriter.write(scene, new FileWriter(args[2]));
     78     } catch (IOException e) {
     79       e.printStackTrace(System.err);
     80       return;
     81     } catch (DefException e) {
     82       e.printStackTrace(System.err);
     83       return;
     84     }
     85 
     86     System.out.println("Success.");
     87   }
     88 }
     89