package de.plushnikov.intellij.plugin.util;
import com.intellij.psi.CommonClassNames;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiCodeBlock;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiTypeParameter;
import com.intellij.psi.PsiTypeParameterList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
/**
* @author Plushnikov Michail
*/
public class PsiMethodUtil {
@NotNull
public static PsiCodeBlock createCodeBlockFromText(@NotNull String blockText, @NotNull PsiElement psiElement) {
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(psiElement.getProject());
return elementFactory.createCodeBlockFromText("{" + blockText + "}", psiElement);
}
@Nullable
public static PsiTypeParameterList createTypeParameterList(@NotNull PsiTypeParameterList psiTypeParameterList) {
PsiTypeParameter[] psiTypeParameters = psiTypeParameterList.getTypeParameters();
if (psiTypeParameters.length > 0) {
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(psiTypeParameterList.getProject());
final StringBuilder builder = new StringBuilder("public <");
for (PsiTypeParameter psiTypeParameter : psiTypeParameters) {
builder.append(psiTypeParameter.getName());
PsiClassType[] superTypes = psiTypeParameter.getExtendsListTypes();
if (superTypes.length > 1 || superTypes.length == 1 && !superTypes[0].equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) {
builder.append(" extends ");
for (PsiClassType type : superTypes) {
if (type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) {
continue;
}
builder.append(type.getCanonicalText()).append('&');
}
builder.deleteCharAt(builder.length() - 1);
}
builder.append(',');
}
builder.deleteCharAt(builder.length() - 1);
builder.append("> void foo(){}");
PsiMethod methodFromText = elementFactory.createMethodFromText(builder.toString(), null);
return methodFromText.getTypeParameterList();
}
return null;
}
public static boolean hasMethodByName(@NotNull Collection<PsiMethod> classMethods, @NotNull String methodName) {
boolean hasMethod = false;
for (PsiMethod classMethod : classMethods) {
if (methodName.equals(classMethod.getName())) {
hasMethod = true;
break;
}
}
return hasMethod;
}
public static boolean hasMethodByName(@NotNull Collection<PsiMethod> classMethods, String... methodNames) {
boolean hasMethod = false;
for (String methodName : methodNames) {
if (hasMethodByName(classMethods, methodName)) {
hasMethod = true;
break;
}
}
return hasMethod;
}
public static boolean hasSimilarMethod(@NotNull Collection<PsiMethod> classMethods, @NotNull String methodName, int methodArgCount) {
for (PsiMethod classMethod : classMethods) {
if (isSimilarMethod(classMethod, methodName, methodArgCount)) {
return true;
}
}
return false;
}
public static boolean isSimilarMethod(@NotNull PsiMethod classMethod, @NotNull String methodName, int methodArgCount) {
boolean equalNames = methodName.equalsIgnoreCase(classMethod.getName());
int parametersCount = classMethod.getParameterList().getParametersCount();
if (classMethod.isVarArgs()) {
parametersCount--;
}
return equalNames && methodArgCount == parametersCount;
}
}