PsiReferenceExpression (PsiExpression condition, PsiVariable variable, PsiElement secondDeclaredElement) { final PsiBinaryExpression binaryExpression = tryCast(PsiUtil.skipParenthesizedExprDown(condition), PsiBinaryExpression.class); if (binaryExpression == null) return null; final IElementType tokenType = binaryExpression.getOperationTokenType(); final PsiExpression lhs = PsiUtil.skipParenthesizedExprDown(binaryExpression.getLOperand()); final PsiExpression rhs = PsiUtil.skipParenthesizedExprDown(binaryExpression.getROperand()); if (lhs == null || rhs == null) return null; PsiReferenceExpression referenceExpression; if (tokenType.equals(JavaTokenType.LT)) { if (!ExpressionUtils.isReferenceTo(lhs, variable) || !(rhs instanceof PsiReferenceExpression)) { return null; } referenceExpression = (PsiReferenceExpression)rhs; } else if (tokenType.equals(JavaTokenType.GT)) { if (!ExpressionUtils.isReferenceTo(rhs, variable) || !(lhs instanceof PsiReferenceExpression)) { return null; } referenceExpression = (PsiReferenceExpression)lhs; } else { return null; } if (ExpressionUtils.getArrayFromLengthExpression(referenceExpression) == null) { final PsiElement target = referenceExpression.resolve(); if (secondDeclaredElement != null && !secondDeclaredElement.equals(target)) return null; if (target instanceof PsiVariable maxVariable) { final PsiCodeBlock context = PsiTreeUtil.getParentOfType(maxVariable, PsiCodeBlock.class); if (context == null || VariableAccessUtils.variableIsAssigned(maxVariable, context)) return null; final PsiExpression expression = PsiUtil.skipParenthesizedExprDown(maxVariable.getInitializer()); if (!(expression instanceof PsiReferenceExpression)) return null; referenceExpression = (PsiReferenceExpression)expression; if (ExpressionUtils.getArrayFromLengthExpression(referenceExpression) == null) { return null; } } } else { if (secondDeclaredElement != null) return null; } final PsiExpression qualifierExpression = PsiUtil.skipParenthesizedExprDown(referenceExpression.getQualifierExpression()); if (qualifierExpression instanceof PsiReferenceExpression) { return (PsiReferenceExpression)qualifierExpression; } else if (qualifierExpression instanceof PsiThisExpression || qualifierExpression instanceof PsiSuperExpression || qualifierExpression == null) { return referenceExpression; } else { return null; } }