package org.fandev.lang.fan.psi.impl;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiType;
import com.intellij.psi.PsiArrayType;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.psi.infos.CandidateInfo;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* Date: Sep 29, 2009
* Time: 11:30:53 PM
*
* @author Dror Bereznitsky
*/
public class PsiImplUtil {
public static PsiMethod[] mapToMethods(@Nullable final List<CandidateInfo> list) {
if (list == null) {
return PsiMethod.EMPTY_ARRAY;
}
final PsiMethod[] result = new PsiMethod[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = (PsiMethod) list.get(i).getElement();
}
return result;
}
public static boolean isExtendsSignature(final MethodSignature superSignatureCandidate, final MethodSignature subSignature) {
final String name1 = superSignatureCandidate.getName();
final String name2 = subSignature.getName();
if (!name1.equals(name2)) {
return false;
}
final PsiType[] superTypes = superSignatureCandidate.getParameterTypes();
final PsiType[] subTypes = subSignature.getParameterTypes();
if (subTypes.length != superTypes.length) {
return false;
}
for (int i = 0; i < subTypes.length - 1; i++) {
final PsiType superType = TypeConversionUtil.erasure(superTypes[i]);
final PsiType subType = TypeConversionUtil.erasure(subTypes[i]);
if (!superType.isAssignableFrom(subType)) {
return false;
}
}
if (superTypes.length > 0) {
final PsiType lastSuperType = TypeConversionUtil.erasure(superTypes[superTypes.length - 1]);
final PsiType lastSubType = TypeConversionUtil.erasure(subTypes[superTypes.length - 1]);
if (lastSuperType instanceof PsiArrayType && !(lastSubType instanceof PsiArrayType)) {
final PsiType componentType = ((PsiArrayType) lastSuperType).getComponentType();
if (!lastSubType.isConvertibleFrom(componentType)) {
return false;
}
} else {
if (!lastSuperType.isAssignableFrom(lastSubType)){
return false;
}
}
}
return true;
}
}