How do I run a particular inspection?

I want to run a particular inspection and apply a quick fix from it. It shouldn't ask anything from user.

How do I do that?

0
Avatar
Permanently deleted user

I am trying to use OCUnusedGlobalDeclarationInspection

I've tried to use checkFile(PsiFile, InspectionManager, boolean isOnTheFly) but that method is not overriden from LocalInspectionTool and always return null.
I see that the only public method that is declared in this particular Inspection class is buildVisitor, but I can't really understand how to use returned result.

Then I found method `processFile` and it seems to be the thing I need, but it doesn't found anything despite that when I run inspection from the IDE it found that exact problem.
My current code:

OCInspections.UnusedImportStatement inspection = new OCInspections.UnusedImportStatement();
InspectionManager manager = InspectionManager.getInstance(project);

List<ProblemDescriptor> problems = inspection.processFile(psiOutputFile, manager);
System.err.println(problems.size()); //prints 0


I've tried to extend that Inspection to log every item its builder visit:

OCInspections.UnusedImportStatement inspection = new OCInspections.UnusedImportStatement() {      @Nullable      @Override      public UnusedVisitor buildVisitor() {           @NotNull final UnusedVisitor unusedVisitor = super.buildVisitor();           return new UnusedVisitor(){                @Override                public void visitOCElement(OCElement elem) {                     System.err.println("visitOCElement$");                     unusedVisitor.visitOCElement(elem);                }                @Override                public void visitOCFile(OCFile file) {                     System.err.println("visitOCFile$");                     unusedVisitor.visitOCFile(file);                }
//all others visit methods in the same way.
          }
     }


But nothing is visited.

0

Many times the inspections rely on other annotators to run first. It is hard to say since the appCode source isn't available.

Are you trying to run the inspection on a file that is open in the editor?

0
Avatar
Permanently deleted user

No, it could be not open.

Actually I'll found the solution for my particular case(I'll add it a bit later) but If one have a good solution I'll glad to see that:)

0
Avatar
Permanently deleted user

As I said, I'll post a solution.

So what I basicly do: check all references(thats tool for that) and if some reference is not child of us, then we are not unused.

So, essentially you run some Visitor(you may run recursive one, I use a simple one, that for some element runs recoursively[it depends on what you're searching for]) and calls function like that:

     private void removeIfNoReference(OCElement element) { //Could be PsiElement, bit I need more specific one to traverse the tree.           for (PsiReference reference : ReferencesSearch.search(element, searchScope)) {                PsiElement referenceElement = reference.getElement();                if(!isParentFor(element, referenceElement)) {                     return;                }           }           toDelete.add(element);      }

     private static boolean isParentFor(OCElement potentialParent, PsiElement potentialChild) {           while (potentialChild != null) {                //noinspection ObjectEquality                if(potentialChild == potentialParent) {                     return true;                }                potentialChild = potentialChild.getParent();           }           return false;      }

0

you may want to see how com.intellij.codeInspection.actions.CleanupInspectionIntention (Fix all problems) does the same task.

Anna

0

请先登录再写评论。