void (@NotNull PsiTypeCastExpression expression) { super.visitTypeCastExpression(expression); final PsiTypeElement castTypeElement = expression.getCastType(); if (castTypeElement == null) { return; } final PsiType castType = castTypeElement.getType(); if (!(castType instanceof PsiClassType castClassType)) { return; } final PsiExpression operand = expression.getOperand(); if (operand == null) { return; } final PsiType operandType = operand.getType(); if (!(operandType instanceof PsiClassType operandClassType)) { return; } if (!castClassType.isConvertibleFrom(operandClassType)) { // don't warn on red code return; } final PsiClass castClass = castClassType.resolve(); if (castClass == null) { return; } final PsiClass operandClass = operandClassType.resolve(); if (operandClass == null) { return; } String operandClassName = operandClass.getName(); if (operandClassName == null) { return; } ThreeState hasMutualSubclass = InheritanceUtil.existsMutualSubclass(operandClass, castClass, isOnTheFly()); if (hasMutualSubclass == ThreeState.YES) return; if (InstanceOfUtils.findCorrespondingInstanceOf(expression) != null) return; PsiType psiType = TypeConstraint.fromDfType(CommonDataflow.getDfType(operand)).getPsiType(operandClass.getProject()); if (psiType != null && castClassType.isAssignableFrom(psiType)) return; if (hasMutualSubclass == ThreeState.UNSURE) { registerPossibleProblem(castTypeElement); } else { registerError(castTypeElement, castClass.isInterface(), operandClassName); } }