private void runHighlightVisitorsForInjected(
     @NotNull PsiFile injectedPsi,
     @NotNull final HighlightInfoHolder holder,
     @NotNull final ProgressIndicator progress) {
   HighlightVisitor[] visitors = getHighlightVisitors();
   try {
     HighlightVisitor[] filtered = filterVisitors(visitors, injectedPsi);
     final List<PsiElement> elements =
         CollectHighlightsUtil.getElementsInRange(injectedPsi, 0, injectedPsi.getTextLength());
     for (final HighlightVisitor visitor : filtered) {
       visitor.analyze(
           injectedPsi,
           true,
           holder,
           new Runnable() {
             @Override
             public void run() {
               for (PsiElement element : elements) {
                 progress.checkCanceled();
                 visitor.visit(element);
               }
             }
           });
     }
   } finally {
     incVisitorUsageCount(-1);
   }
 }
 @NotNull
 private HighlightVisitor[] getHighlightVisitors() {
   int oldCount = incVisitorUsageCount(1);
   HighlightVisitor[] highlightVisitors = createHighlightVisitors();
   if (oldCount != 0) {
     HighlightVisitor[] clones = new HighlightVisitor[highlightVisitors.length];
     for (int i = 0; i < highlightVisitors.length; i++) {
       HighlightVisitor highlightVisitor = highlightVisitors[i];
       clones[i] = highlightVisitor.clone();
     }
     highlightVisitors = clones;
   }
   return highlightVisitors;
 }
  private static HighlightVisitor[] filterVisitors(
      HighlightVisitor[] highlightVisitors, final PsiFile file) {
    final List<HighlightVisitor> visitors =
        new ArrayList<HighlightVisitor>(highlightVisitors.length);
    List<HighlightVisitor> list = Arrays.asList(highlightVisitors);
    for (HighlightVisitor visitor :
        DumbService.getInstance(file.getProject()).filterByDumbAwareness(list)) {
      if (visitor.suitableForFile(file)) visitors.add(visitor);
    }
    LOG.assertTrue(!visitors.isEmpty(), list);

    HighlightVisitor[] visitorArray = visitors.toArray(new HighlightVisitor[visitors.size()]);
    Arrays.sort(visitorArray, VISITOR_ORDER_COMPARATOR);
    return visitorArray;
  }
 @Override
 public int compare(final HighlightVisitor o1, final HighlightVisitor o2) {
   return o1.order() - o2.order();
 }