[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / java / java-impl / src / com / intellij / refactoring / extractMethodObject / reflect / ReferenceReflectionAccessorBase.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.refactoring.extractMethodObject.reflect;
3
4 import com.intellij.psi.*;
5 import com.intellij.refactoring.extractMethodObject.ItemToReplaceDescriptor;
6 import org.jetbrains.annotations.NotNull;
7 import org.jetbrains.annotations.Nullable;
8
9 import java.util.ArrayList;
10 import java.util.List;
11
12 /**
13  * @author Vitaliy.Bibaev
14  */
15 public abstract class ReferenceReflectionAccessorBase<T extends ItemToReplaceDescriptor> extends ReflectionAccessorBase<T> {
16   public ReferenceReflectionAccessorBase(@NotNull PsiClass psiClass, @NotNull PsiElementFactory elementFactory) {
17     super(psiClass, elementFactory);
18   }
19
20   @Override
21   protected List<T> findItemsToReplace(@NotNull PsiElement element) {
22     List<T> result = new ArrayList<>();
23     element.accept(new JavaRecursiveElementVisitor() {
24       @Override
25       public void visitReferenceExpression(PsiReferenceExpression expression) {
26         super.visitReferenceExpression(expression);
27         final T descriptor = createDescriptor(expression);
28         if (descriptor != null) {
29           result.add(descriptor);
30         }
31       }
32     });
33
34     return result;
35   }
36
37   @Nullable
38   protected abstract T createDescriptor(@NotNull PsiReferenceExpression expression);
39 }