private void performAction(String className, String rootDir, final boolean cookObjects)
      throws Exception {
    PsiClass aClass = myJavaFacade.findClass(className, GlobalSearchScope.allScope(myProject));

    assertNotNull("Class " + className + " not found", aClass);

    SystemBuilder b =
        new SystemBuilder(
            myPsiManager.getProject(),
            new Settings() {
              @Override
              public boolean dropObsoleteCasts() {
                return true;
              }

              @Override
              public boolean preserveRawArrays() {
                return false;
              }

              @Override
              public boolean leaveObjectParameterizedTypesRaw() {
                return false;
              }

              @Override
              public boolean exhaustive() {
                return false;
              }

              @Override
              public boolean cookObjects() {
                return cookObjects;
              }

              @Override
              public boolean cookToWildcards() {
                return false;
              }
            });

    final ReductionSystem commonSystem = b.build(aClass);

    // System.out.println("System built:\n" + commonSystem);

    final ReductionSystem[] systems = commonSystem.isolate();

    // System.out.println("Systems isolated:\n" + commonSystem);

    ReductionSystem system = null;

    for (ReductionSystem s : systems) {
      if (s != null && system == null) {
        // System.out.println(s);
        system = s;
      }
    }

    Binding binding = null;

    if (system != null) {
      final ResolverTree tree = new ResolverTree(system);

      tree.resolve();

      binding = tree.getBestSolution();
    }

    String itemRepr =
        system != null ? system.dumpString() : commonSystem.dumpString(); // d.resultString();
    doStuff(rootDir, itemRepr, className + ".items");
    itemRepr =
        system != null
            ? system.dumpResult(binding)
            : commonSystem.dumpString(); // d.resultString();

    doStuff(rootDir, itemRepr, className + ".1.items");
  }
 public BindingFactory(final ReductionSystem system) {
   myBoundVariables = system.getBoundVariables();
   myProject = system.getProject();
   myFactory = system.getVariableFactory();
 }