boolean (PsiParameter parameter, PsiReferenceExpression expr, PsiElement parent) { if (PsiUtil.isAccessedForWriting(expr)) return true; if (parent instanceof PsiBinaryExpression binOp) { PsiExpression opposite = null; final PsiExpression lOperand = binOp.getLOperand(); final PsiExpression rOperand = binOp.getROperand(); if (lOperand == expr) { opposite = rOperand; } else if (rOperand == expr) { opposite = lOperand; } if (opposite != null && opposite.getType() == PsiTypes.nullType()) { if (DfaPsiUtil.isAssertionEffectively(binOp, binOp.getOperationTokenType() == JavaTokenType.NE)) { registerNotNullAnnotation(parameter); return true; } registerNullableAnnotation(parameter); return true; } } else if (parent instanceof PsiInstanceOfExpression) { return true; } else if (parent instanceof PsiReferenceExpression ref) { final PsiExpression qualifierExpression = ref.getQualifierExpression(); if (qualifierExpression == expr) { registerNotNullAnnotation(parameter); return true; } else { PsiElement exprParent = expr.getParent(); while (exprParent instanceof PsiTypeCastExpression || exprParent instanceof PsiParenthesizedExpression) { if (qualifierExpression == exprParent) { registerNotNullAnnotation(parameter); return true; } exprParent = exprParent.getParent(); } } } else if (parent instanceof PsiAssignmentExpression assignment) { if (assignment.getRExpression() == expr && assignment.getLExpression() instanceof PsiReferenceExpression ref && ref.resolve() instanceof PsiVariable localVar && isNotNull(localVar)) { registerNotNullAnnotation(parameter); return true; } } else if (parent instanceof PsiForeachStatement forEach) { if (forEach.getIteratedValue() == expr) { registerNotNullAnnotation(parameter); return true; } } else if (parent instanceof PsiSwitchStatement switchStatement && switchStatement.getExpression() == expr) { registerNotNullAnnotation(parameter); return true; } final PsiCall call = PsiTreeUtil.getParentOfType(expr, PsiCall.class); if (call != null) { final PsiExpressionList argumentList = call.getArgumentList(); if (argumentList != null) { final PsiExpression[] args = argumentList.getExpressions(); int idx = ArrayUtil.find(args, expr); if (idx >= 0) { final PsiMethod resolvedMethod = call.resolveMethod(); if (resolvedMethod != null) { final PsiParameter[] parameters = resolvedMethod.getParameterList().getParameters(); if (idx < parameters.length) { //not vararg final PsiParameter resolvedToParam = parameters[idx]; if (isNotNull(resolvedToParam) && !resolvedToParam.isVarArgs()) { registerNotNullAnnotation(parameter); return true; } } } } } } return false; }