void generate()

in processor/src/main/java/org/robolectric/annotation/processing/generator/ShadowProviderGenerator.java [61:198]


  void generate(PrintWriter writer) {
    writer.print("package " + shadowPackage + ";\n");
    for (String name : model.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 " + GEN_CLASS + " implements ShadowProvider {");

    writer.println("  private static final Map<String, String> SHADOW_MAP = new HashMap<>(" + (
        model.getAllShadowTypes().size() + model.getExtraShadowTypes().size()) + ");");
    writer.println();

    writer.println("  static {");
    for (ShadowInfo shadowInfo : model.getAllShadowTypes()) {
      final String shadow = shadowInfo.getShadowBinaryName();
      final String actual = shadowInfo.getActualName();
      if (shadowInfo.getShadowPickerBinaryName() == null) {
        writer.println("    SHADOW_MAP.put(\"" + actual + "\", \"" + shadow + "\");");
      }
    }

    for (Map.Entry<String, String> entry : model.getExtraShadowTypes().entrySet()) {
      final String shadow = entry.getKey();
      final String actual = entry.getValue();
      writer.println("    SHADOW_MAP.put(\"" + actual + "\", \"" + shadow + "\");");
    }

    writer.println("  }");
    writer.println();

    for (ShadowInfo shadowInfo : model.getVisibleShadowTypes()) {
      if (!shadowInfo.actualIsPublic()) {
        continue;
      }

      if (shadowInfo.getShadowPickerBinaryName() != null) {
        continue;
      }

      if (shadowInfo.shadowIsDeprecated()) {
        writer.println("  @Deprecated");
      }
      String paramDefStr = shadowInfo.getParamDefStr();
      final String shadow = shadowInfo.getShadowTypeWithParams();
      writer.println("  public static " + (paramDefStr.isEmpty() ? "" : paramDefStr + " ") + shadow
          + " shadowOf(" + shadowInfo.getActualTypeWithParams() + " actual) {");
      writer.println("    return (" + shadow + ") Shadow.extract(actual);");
      writer.println("  }");
      writer.println();
    }

    // this sucks, kill:
    for (Entry<String, ShadowInfo> entry : model.getShadowPickers().entrySet()) {
      ShadowInfo shadowInfo = entry.getValue();

      if (!shadowInfo.actualIsPublic() || !shadowInfo.isInAndroidSdk()) {
        continue;
      }

      if (shadowInfo.shadowIsDeprecated()) {
        writer.println("  @Deprecated");
      }
      String paramDefStr = shadowInfo.getParamDefStr();
      final String shadow = shadowInfo.getShadowName();
      writer.println("  public static " + (paramDefStr.isEmpty() ? "" : paramDefStr + " ") + shadow
          + " shadowOf(" + shadowInfo.getActualTypeWithParams() + " actual) {");
      writer.println("    return (" + shadow + ") Shadow.extract(actual);");
      writer.println("  }");
      writer.println();
    }

    writer.println("  @Override");
    writer.println("  public void reset() {");
    for (RobolectricModel.ResetterInfo resetterInfo : model.getResetters()) {
      int minSdk = resetterInfo.getMinSdk();
      int maxSdk = resetterInfo.getMaxSdk();
      String ifClause;
      if (minSdk != -1 && maxSdk != -1) {
        ifClause = "if (org.robolectric.RuntimeEnvironment.getApiLevel() >= " + minSdk +
            " && org.robolectric.RuntimeEnvironment.getApiLevel() <= " + maxSdk + ") ";
      } else if (maxSdk != -1) {
        ifClause = "if (org.robolectric.RuntimeEnvironment.getApiLevel() <= " + maxSdk + ") ";
      } else if (minSdk != -1) {
        ifClause = "if (org.robolectric.RuntimeEnvironment.getApiLevel() >= " + minSdk + ") ";
      } else {
        ifClause = "";
      }
      writer.println("    " + ifClause + resetterInfo.getMethodCall());
    }
    writer.println("  }");
    writer.println();

    writer.println("  @Override");
    writer.println("  public Map<String, String> getShadowMap() {");
    writer.println("    return SHADOW_MAP;");
    writer.println("  }");
    writer.println();

    writer.println("  @Override");
    writer.println("  public String[] getProvidedPackageNames() {");
    writer.println("    return new String[] {");
    if (shouldInstrumentPackages) {
      writer.println("      " + Joiner.on(",\n      ").join(model.getShadowedPackages()));
    }
    writer.println("    };");
    writer.println("  }");
    writer.println();

    TreeMap<String, ShadowInfo> shadowPickers = model.getShadowPickers();
    if (!shadowPickers.isEmpty()) {
      writer.println("  private static final Map<String, String> SHADOW_PICKER_MAP = " +
          "new HashMap<>(" + shadowPickers.size() + ");");
      writer.println();

      writer.println("  static {");
      for (Entry<String, ShadowInfo> entry : shadowPickers.entrySet()) {
        ShadowInfo shadowInfo = entry.getValue();
        final String actualBinaryName = shadowInfo.getActualBinaryName();
        final String shadowPickerClassName = shadowInfo.getShadowPickerBinaryName();
        writer.println("    SHADOW_PICKER_MAP.put(\"" + actualBinaryName + "\", " +
            "\"" + shadowPickerClassName + "\");");
      }
      writer.println("  }");
      writer.println();

      writer.println("  @Override");
      writer.println("  public Map<String, String> getShadowPickerMap() {");
      writer.println("    return SHADOW_PICKER_MAP;");
      writer.println("  }");
    }

    writer.println('}');
  }