PsiType (@NotNull PsiElement element) { final PsiElement parent = PsiUtil.skipParenthesizedExprUp(element.getParent()); if (parent instanceof PsiVariable) { if (PsiUtil.checkSameExpression(element, ((PsiVariable)parent).getInitializer())) { PsiTypeElement typeElement = ((PsiVariable)parent).getTypeElement(); if (typeElement != null && typeElement.isInferredType()) { return null; } return ((PsiVariable)parent).getType(); } } else if (parent instanceof PsiAssignmentExpression) { if (((PsiAssignmentExpression)parent).getOperationSign().getTokenType() == JavaTokenType.EQ && PsiUtil.checkSameExpression(element, ((PsiAssignmentExpression)parent).getRExpression())) { PsiType type = ((PsiAssignmentExpression)parent).getLExpression().getType(); return !PsiTypes.nullType().equals(type) ? type : null; } } else if (parent instanceof PsiReturnStatement) { final PsiElement psiElement = PsiTreeUtil.getParentOfType(parent, PsiLambdaExpression.class, PsiMethod.class); if (psiElement instanceof PsiLambdaExpression) { return null; } else if (psiElement instanceof PsiMethod){ return ((PsiMethod)psiElement).getReturnType(); } } else if (PsiUtil.isCondition(element, parent)) { return PsiTypes.booleanType(); } else if (parent instanceof PsiArrayInitializerExpression) { final PsiElement gParent = parent.getParent(); if (gParent instanceof PsiNewExpression) { final PsiType type = ((PsiNewExpression)gParent).getType(); if (type instanceof PsiArrayType) { return ((PsiArrayType)type).getComponentType(); } } else if (gParent instanceof PsiVariable) { final PsiType type = ((PsiVariable)gParent).getType(); if (type instanceof PsiArrayType) { return ((PsiArrayType)type).getComponentType(); } } else if (gParent instanceof PsiArrayInitializerExpression) { final PsiType expectedTypeByParent = getExpectedTypeByParent(parent); return expectedTypeByParent instanceof PsiArrayType ? ((PsiArrayType)expectedTypeByParent).getComponentType() : null; } } return null; }