PsiMethod (PsiMethod place, PsiMethod invoked, PsiSubstitutor substitutor) { if (PsiSuperMethodUtil.isSuperMethod(place, invoked)) { return place; } Map<String, PsiType> requiredNames = new HashMap<>(); final PsiParameter[] parameters = place.getParameterList().getParameters(); final PsiParameter[] callParams = invoked.getParameterList().getParameters(); if (callParams.length > parameters.length) { return null; } final boolean checkNames = invoked.isConstructor(); boolean sameTypes = true; for (int i = 0; i < callParams.length; i++) { PsiParameter callParam = callParams[i]; PsiParameter parameter = parameters[i]; requiredNames.put(callParam.getName(), substitutor.substitute(callParam.getType())); if (checkNames && !Objects.equals(parameter.getName(), callParam.getName()) || !Comparing.equal(parameter.getType(), substitutor.substitute(callParam.getType()))) { sameTypes = false; } } if (sameTypes && callParams.length == parameters.length) { return place; } for (PsiParameter parameter : parameters) { PsiType type = requiredNames.remove(parameter.getName()); if (type != null && !parameter.getType().equals(type)) { return null; } } return requiredNames.isEmpty() ? invoked : null; }