CollectionStream (PsiForeachStatement statement) { PsiExpression iteratedValue = statement.getIteratedValue(); if (iteratedValue == null) return null; PsiType iteratedValueType = iteratedValue.getType(); PsiClass collectionClass = JavaPsiFacade.getInstance(statement.getProject()).findClass(CommonClassNames.JAVA_UTIL_COLLECTION, statement.getResolveScope()); PsiClass iteratorClass = PsiUtil.resolveClassInClassTypeOnly(iteratedValueType); PsiParameter parameter = statement.getIterationParameter(); if (collectionClass == null || !InheritanceUtil.isInheritorOrSelf(iteratorClass, collectionClass, true) || isRawSubstitution(iteratedValueType, collectionClass) || !StreamApiUtil.isSupportedStreamElement(parameter.getType())) { return null; } return new CollectionStream(statement, parameter, iteratedValue); }