Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.robolectric.annotation.processing.generator;
  
  
 import java.util.Map;

Generator that creates the "ShadowProvider" implementation for a shadow package.
 
 public class ShadowProviderGenerator extends Generator {
   private final Filer filer;
   private final Messager messager;
   private final RobolectricModel model;
 
   public ShadowProviderGenerator(RobolectricModel modelProcessingEnvironment environment) {
     this. = environment.getMessager();
     this. = environment.getFiler();
     this. = model;
   }
 
   @Override
   public void generate(String shadowPackage) {
     final String shadowClassName = shadowPackage + '.' + ;
     .printMessage(.."Generating output file: " + shadowClassName);
 
     // TODO: Because this was fairly simple to begin with I haven't
     // included a templating engine like Velocity but simply used
     // raw print() statements, in an effort to reduce the number of
     // dependencies that RAP has. However, if it gets too complicated
     // then using Velocity might be a good idea.
     PrintWriter writer = null;
     try {
       JavaFileObject jfo = .createSourceFile(shadowClassName);
       writer = new PrintWriter(jfo.openWriter());
       writer.print("package " + shadowPackage + ";\n");
       for (String name : .getImports()) {
         writer.println("import " + name + ';');
       }
       writer.println();
       writer.println("/**");
       writer.println(" * Shadow mapper. Automatically generated by the Robolectric Annotation Processor.");
       writer.println(" */");
       writer.println("@Generated(\"" + RobolectricProcessor.class.getCanonicalName() + "\")");
       writer.println("@SuppressWarnings({\"unchecked\",\"deprecation\"})");
       writer.println("public class " +  + " implements ShadowProvider {");
       writer.println();
 
       for (Map.Entry<TypeElementTypeElemententry : .getShadowOfMap().entrySet()) {
         final TypeElement actualType = entry.getValue();
         if (!actualType.getModifiers().contains(.)) {
           continue;
         }
         int paramCount = 0;
         StringBuilder paramDef = new StringBuilder("<");
         StringBuilder paramUse = new StringBuilder("<");
         for (TypeParameterElement typeParam : entry.getValue().getTypeParameters()) {
           if (paramCount > 0) {
             paramDef.append(',');
             paramUse.append(',');
           }
           boolean first = true;
           paramDef.append(typeParam);
           paramUse.append(typeParam);
           for (TypeMirror bound : .getExplicitBounds(typeParam)) {
             if (first) {
               paramDef.append(" extends ");
               first = false;
             } else {
               paramDef.append(" & ");
             }
             paramDef.append(.getReferentFor(bound));
           }
           paramCount++;
         }
         String paramDefStr = "";
         String paramUseStr = "";
         if (paramCount > 0) {
           paramDefStr = paramDef.append("> ").toString();
           paramUseStr = paramUse.append('>').toString();
         }
         final String actual = .getReferentFor(actualType) + paramUseStr;
         final String shadow = .getReferentFor(entry.getKey()) + paramUseStr;
         writer.println("  public static " + paramDefStr + shadow + " shadowOf(" + actual + " actual) {");
         writer.println("    return (" + shadow + ") ShadowExtractor.extract(actual);");
         writer.println("  }");
        writer.println();
      }
      writer.println("  public void reset() {");
      for (Map.Entry<TypeElementExecutableElemententry : .getResetters()) {
        writer.println("    " + .getReferentFor(entry.getKey()) + "." + entry.getValue().getSimpleName() + "();");
      }
      writer.println("  }");
      writer.println();
      writer.println("  public String[] getProvidedPackageNames() {");
      writer.println("    return new String[] {" + Joiner.on(",").join(.getShadowedPackages()) + "};");
      writer.println("  }");
      writer.println('}');
    } catch (IOException e) {
      .printMessage(.."Failed to write shadow class file: " + e);
      throw new RuntimeException(e);
    } finally {
      if (writer != null) {
        writer.close();
      }
    }
  }
New to GrepCode? Check out our FAQ X