示例#1
0
 @Nullable
 private static CommonProblemDescriptor createDescriptor(
     @Nullable RefEntity element,
     @NotNull OfflineProblemDescriptor offlineDescriptor,
     @NotNull InspectionToolWrapper toolWrapper,
     @NotNull InspectionToolPresentation presentation) {
   if (!(toolWrapper instanceof LocalInspectionToolWrapper)) return null;
   final InspectionManager inspectionManager =
       InspectionManager.getInstance(presentation.getContext().getProject());
   final OfflineProblemDescriptor offlineProblemDescriptor = offlineDescriptor;
   if (element instanceof RefElement) {
     final PsiElement psiElement = ((RefElement) element).getElement();
     if (psiElement != null) {
       ProblemDescriptor descriptor =
           ProgressManager.getInstance()
               .runProcess(
                   () ->
                       runLocalTool(
                           psiElement,
                           inspectionManager,
                           offlineProblemDescriptor,
                           (LocalInspectionToolWrapper) toolWrapper),
                   new DaemonProgressIndicator());
       if (descriptor != null) return descriptor;
     }
     return null;
   }
   final List<String> hints = offlineProblemDescriptor.getHints();
   CommonProblemDescriptor descriptor =
       inspectionManager.createProblemDescriptor(
           offlineProblemDescriptor.getDescription(), (QuickFix) null);
   final QuickFix[] quickFixes = getFixes(descriptor, hints, presentation);
   if (quickFixes != null) {
     descriptor =
         inspectionManager.createProblemDescriptor(
             offlineProblemDescriptor.getDescription(), quickFixes);
   }
   return descriptor;
 }
示例#2
0
  private static ProblemDescriptor runLocalTool(
      @NotNull PsiElement psiElement,
      @NotNull InspectionManager inspectionManager,
      @NotNull OfflineProblemDescriptor offlineProblemDescriptor,
      @NotNull LocalInspectionToolWrapper toolWrapper) {
    PsiFile containingFile = psiElement.getContainingFile();
    final ProblemsHolder holder = new ProblemsHolder(inspectionManager, containingFile, false);
    final LocalInspectionTool localTool = toolWrapper.getTool();
    final int startOffset = psiElement.getTextRange().getStartOffset();
    final int endOffset = psiElement.getTextRange().getEndOffset();
    LocalInspectionToolSession session =
        new LocalInspectionToolSession(containingFile, startOffset, endOffset);
    final PsiElementVisitor visitor = localTool.buildVisitor(holder, false, session);
    localTool.inspectionStarted(session, false);
    final PsiElement[] elementsInRange =
        getElementsIntersectingRange(containingFile, startOffset, endOffset);
    for (PsiElement element : elementsInRange) {
      element.accept(visitor);
    }
    localTool.inspectionFinished(session, holder);
    if (holder.hasResults()) {
      final List<ProblemDescriptor> list = holder.getResults();
      final int idx = offlineProblemDescriptor.getProblemIndex();
      int curIdx = 0;
      for (ProblemDescriptor descriptor : list) {
        final PsiNamedElement member = localTool.getProblemElement(descriptor.getPsiElement());
        if (psiElement instanceof PsiFile || member != null && member.equals(psiElement)) {
          if (curIdx == idx) {
            return descriptor;
          }
          curIdx++;
        }
      }
    }

    return null;
  }
示例#3
0
 @Nullable
 private static RefEntity createRefElement(
     OfflineProblemDescriptor descriptor, InspectionToolPresentation presentation) {
   return descriptor.getRefElement(presentation.getContext().getRefManager());
 }