private void doBuildFiles(
      List<IBuildParticipant> participants, Collection<IFile> files, IProgressMonitor monitor)
      throws CoreException {
    if (CollectionsUtil.isEmpty(files)) {
      return;
    }

    SubMonitor sub = SubMonitor.convert(monitor, 15 * files.size());
    for (IFile file : files) {
      BuildContext context = new BuildContext(file);
      sub.worked(1);

      IBuildParticipantManager manager = getBuildParticipantManager();
      if (manager == null) {
        return;
      }
      List<IBuildParticipant> filteredParticipants =
          manager.filterParticipants(participants, context.getContentType());
      sub.worked(2);

      buildFile(context, filteredParticipants, sub.newChild(12));

      // stop building if canceled
      if (sub.isCanceled()) {
        break;
      }
    }
    sub.done();
  }
  protected void perfValidate(String filename, int iterations) throws Exception {
    // read in the file
    InputStream in =
        FileLocator.openStream(
            Platform.getBundle(JSCorePlugin.PLUGIN_ID),
            Path.fromPortableString("performance/" + filename),
            false);
    IFile file = project.createFile(filename, IOUtil.read(in));
    RebuildIndexJob job = new RebuildIndexJob(project.getURI());
    job.run(null);

    // Ok now actually validate the thing, the real work
    for (int i = 0; i < iterations; i++) {
      EditorTestHelper.joinBackgroundActivities();

      BuildContext context = new BuildContext(file);
      // Don't measure reading in string...
      context.getContents();

      startMeasuring();
      validator.buildFile(context, null);
      stopMeasuring();
    }
    commitMeasurements();
    assertPerformance();
  }
  private void buildFile(
      BuildContext context, List<IBuildParticipant> participants, IProgressMonitor monitor)
      throws CoreException {
    if (CollectionsUtil.isEmpty(participants)) {
      return;
    }

    SubMonitor sub = SubMonitor.convert(monitor, 2 * participants.size());
    for (IBuildParticipant participant : participants) {
      long startTime = System.nanoTime();
      participant.buildFile(context, sub.newChild(1));
      if (traceParticipantsEnabled) {
        double endTime = ((double) System.nanoTime() - startTime) / 1000000;
        IdeLog.logTrace(
            BuildPathCorePlugin.getDefault(),
            MessageFormat.format(
                "Executed build participant ''{0}'' on ''{1}'' in {2} ms.",
                participant.getName(), context.getURI(), endTime),
            IDebugScopes.BUILDER_PARTICIPANTS); // $NON-NLS-1$
      }

      // stop building if it has been canceled
      if (sub.isCanceled()) {
        break;
      }
    }
    updateMarkers(context, sub.newChild(participants.size()));
    sub.done();
  }
  public void deleteFile(BuildContext context, IProgressMonitor monitor) {
    if (context == null) {
      return;
    }

    context.removeProblems(ICSSConstants.W3C_PROBLEM);
  }
  public void buildFile(BuildContext context, IProgressMonitor monitor) {
    if (context == null) {
      return;
    }

    List<IProblem> problems = new ArrayList<IProblem>();

    String source = context.getContents();
    URI uri = context.getURI();
    String path = uri.toString();

    String report = getReport(source, uri);
    List<String> filters = getFilters();
    processErrorsInReport(report, path, problems, filters);
    processWarningsInReport(report, path, problems, filters);

    context.putProblems(ICSSConstants.W3C_PROBLEM, problems);
  }
  public void buildFile(BuildContext context, IProgressMonitor monitor) {
    String contents = null;
    String uri = context.getName();
    try {
      contents = context.getContents();

      RubyParseState parseState = new RubyParseState(contents, uri, 1, version);
      uri = context.getURI().toString();
      context.getAST(parseState);
    } catch (CoreException e) {
      // ignore, just forcing a parse
    }

    Collection<IProblem> problems = new ArrayList<IProblem>();
    for (IParseError parseError : context.getParseErrors()) {
      int severity = parseError.getSeverity().intValue();
      int line = -1;
      if (contents != null) {
        line = getLineNumber(parseError.getOffset(), contents);
      }
      problems.add(
          new Problem(
              severity,
              parseError.getMessage(),
              parseError.getOffset(),
              parseError.getLength(),
              line,
              uri));
    }
    context.putProblems(IMarker.PROBLEM, problems);
  }
  private void updateMarkers(BuildContext context, IProgressMonitor monitor) {
    final IFile file = context.getFile();
    final Map<String, Collection<IProblem>> itemsByType = context.getProblems();
    if (CollectionsUtil.isEmpty(itemsByType)) {
      return;
    }
    // Performance fix: schedules the error handling as a single workspace update so that we don't
    // trigger a
    // bunch of resource updated events while problem markers are being added to the file.
    IWorkspaceRunnable runnable =
        new IWorkspaceRunnable() {
          public void run(IProgressMonitor monitor) {
            updateMarkers(file, itemsByType, monitor);
          }
        };

    try {
      ResourcesPlugin.getWorkspace()
          .run(runnable, getMarkerRule(file), IWorkspace.AVOID_UPDATE, monitor);
    } catch (CoreException e) {
      IdeLog.logError(BuildPathCorePlugin.getDefault(), "Error updating markers", e); // $NON-NLS-1$
    }
  }
  protected void perfValidate(String filename, int iterations) throws Exception {
    // read in the file
    URL url =
        FileLocator.find(
            Platform.getBundle(JSCorePlugin.PLUGIN_ID),
            Path.fromPortableString("performance/" + filename),
            null);
    File file = ResourceUtil.resourcePathToFile(url);
    IFileStore fileStore = EFS.getStore(file.toURI());

    // Ok now actually validate the thing, the real work
    for (int i = 0; i < iterations; i++) {
      EditorTestHelper.joinBackgroundActivities();

      // Force a re-parse every time so we're comparing apples to apples for JSLint
      BuildContext context =
          new FileStoreBuildContext(fileStore) {
            @Override
            protected ParseResult parse(
                String contentType, IParseState parseState, WorkingParseResult working)
                throws Exception {
              if (reparseEveryTime()) {
                return new JSParser().parse(parseState);
              }
              return super.parse(contentType, parseState, working);
            }
          };
      // Don't measure reading in string...
      context.getContents();

      startMeasuring();
      validator.buildFile(context, null);
      stopMeasuring();
    }
    commitMeasurements();
    assertPerformance();
  }
  private void removeFiles(
      List<IBuildParticipant> participants,
      Set<IFile> filesToRemoveFromIndex,
      IProgressMonitor monitor)
      throws CoreException {
    if (CollectionsUtil.isEmpty(filesToRemoveFromIndex)) {
      return;
    }

    SubMonitor sub = SubMonitor.convert(monitor, 16 * filesToRemoveFromIndex.size());
    for (IFile file : filesToRemoveFromIndex) {
      BuildContext context = new BuildContext(file);
      sub.worked(1);
      IBuildParticipantManager manager = getBuildParticipantManager();
      if (manager == null) {
        return;
      }
      List<IBuildParticipant> filteredParticipants =
          manager.filterParticipants(participants, context.getContentType());
      sub.worked(5);
      deleteFile(context, filteredParticipants, sub.newChild(10));
    }
    sub.done();
  }
 public void deleteFile(BuildContext context, IProgressMonitor monitor) {
   context.removeProblems(IMarker.PROBLEM);
 }