Resolve type of objects in the stream after qualifier correctly

This commit is contained in:
Vitaliy.bibaev
2017-08-18 17:19:49 +07:00
parent 671332c101
commit 4500c7261d
2 changed files with 23 additions and 2 deletions
@@ -26,6 +26,7 @@ import com.intellij.debugger.streams.wrapper.impl.*;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.siyeh.ig.psiutils.ClassUtils;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
@@ -48,8 +49,10 @@ public class JavaChainTransformerImpl implements ChainTransformer.Java {
final PsiMethodCallExpression firstCall = streamExpressions.get(0);
final PsiExpression qualifierExpression = firstCall.getMethodExpression().getQualifierExpression();
final GenericType typeAfterQualifier = resolveType(firstCall);
final PsiType qualifierType = qualifierExpression == null ? null : qualifierExpression.getType();
final GenericType typeAfterQualifier = qualifierType == null
? getGenericTypeOfThis(qualifierExpression)
: GenericTypeUtil.fromStreamPsiType(qualifierType);
final QualifierExpressionImpl qualifier =
qualifierExpression == null
? new QualifierExpressionImpl("", TextRange.EMPTY_RANGE, typeAfterQualifier)
@@ -64,6 +67,14 @@ public class JavaChainTransformerImpl implements ChainTransformer.Java {
return new StreamChainImpl(qualifier, intermediateCalls, terminationCall, context);
}
@NotNull
private GenericType getGenericTypeOfThis(PsiExpression expression) {
final PsiClass klass = ClassUtils.getContainingClass(expression);
return klass == null ? GenericType.OBJECT
: GenericTypeUtil.fromPsiClass(klass);
}
@NotNull
private List<IntermediateStreamCall> createIntermediateCalls(@NotNull GenericType producerAfterType,
@NotNull List<PsiMethodCallExpression> expressions) {
@@ -16,6 +16,7 @@
package com.intellij.debugger.streams.trace.impl.handler.type;
import com.intellij.psi.CommonClassNames;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiType;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.TypeConversionUtil;
@@ -43,6 +44,15 @@ public class GenericTypeUtil {
return GenericType.OBJECT;
}
@NotNull
public static GenericType fromPsiClass(@NotNull PsiClass psiClass) {
if (InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_STREAM_INT_STREAM)) return GenericType.INT;
if (InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_STREAM_LONG_STREAM)) return GenericType.LONG;
if (InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_STREAM_DOUBLE_STREAM)) return GenericType.DOUBLE;
return GenericType.OBJECT;
}
@NotNull
public static GenericType fromPsiType(@NotNull PsiType type) {
if (PsiType.VOID.equals(type)) return GenericType.VOID;