PsiReference (PsiClass scope, PsiElement element) { final String name = element.getText(); final String[] signature = getSignature(); if (signature == null) { PsiField var = scope.findFieldByName(name, true); if (var != null) { return new MyReference(new PsiElement[]{var}); } } final MethodSignature methodSignature; if (signature != null) { final List<PsiType> types = new ArrayList<>(signature.length); final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(element.getProject()); for (String s : signature) { try { types.add(elementFactory.createTypeFromText(s, element)); } catch (IncorrectOperationException e) { types.add(PsiTypes.nullType()); } } methodSignature = MethodSignatureUtil.createMethodSignature(name, types.toArray(PsiType.createArray(types.size())), PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY, name.equals(scope.getName())); } else { methodSignature = null; } PsiMethod[] methods = findMethods(methodSignature, scope, name, getAllMethods(scope, this)); if (methods.length == 0) return null; return new MyReference(methods) { @Override public void processVariants(@NotNull PsiScopeProcessor processor) { super.processVariants(new DelegatingScopeProcessor(processor) { @Override public boolean execute(@NotNull PsiElement element, @NotNull ResolveState state) { if (element instanceof PsiMethod && name.equals(((PsiMethod)element).getName())) { return super.execute(element, state); } return true; } }); } }; }