package com.cedricziel.idea.typo3.psi;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.parser.PhpElementTypes;
import com.jetbrains.php.lang.psi.elements.ClassReference;
import com.jetbrains.php.lang.psi.elements.MethodReference;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
public class PhpElementsUtil {
public static boolean isMethodWithFirstStringOrFieldReference(PsiElement psiElement, String... methodName) {
if (!PlatformPatterns
.psiElement(PhpElementTypes.METHOD_REFERENCE)
.withChild(PlatformPatterns
.psiElement(PhpElementTypes.PARAMETER_LIST)
.withFirstChild(PlatformPatterns.or(
PlatformPatterns.psiElement(PhpElementTypes.STRING),
PlatformPatterns.psiElement(PhpElementTypes.FIELD_REFERENCE),
PlatformPatterns.psiElement(PhpElementTypes.CLASS_CONSTANT_REFERENCE)
))
).accepts(psiElement)) {
return false;
}
// cant we move it up to PlatformPatterns? withName condition dont looks working
String methodRefName = ((MethodReference) psiElement).getName();
return null != methodRefName && Arrays.asList(methodName).contains(methodRefName);
}
public static boolean extendsClass(PhpClass subject, PhpClass extendedClass) {
List<ClassReference> classReferences = allExtendedClasses(subject)
.stream()
.map(e -> (ClassReference) e.getReference())
.collect(Collectors.toList());
return classReferences.contains((ClassReference) extendedClass.getReference());
}
public static List<PhpClass> allExtendedClasses(PhpClass phpClass) {
List<PhpClass> classReferences = new ArrayList<>();
PhpIndex index = PhpIndex.getInstance(phpClass.getProject());
List<ClassReference> referenceElements = phpClass.getExtendsList().getReferenceElements();
for (ClassReference reference : referenceElements) {
Collection<PhpClass> classesByFQN = index.getClassesByFQN(reference.getFQN());
for (PhpClass phpClass1 : classesByFQN) {
classReferences.add(phpClass);
classReferences.addAll(allExtendedClasses(phpClass1));
}
}
return classReferences;
}
}