diff --git a/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/psi/impl/JavaChainTransformerImpl.java b/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/psi/impl/JavaChainTransformerImpl.java index 74290e19faaa..9802b436f683 100644 --- a/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/psi/impl/JavaChainTransformerImpl.java +++ b/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/psi/impl/JavaChainTransformerImpl.java @@ -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 createIntermediateCalls(@NotNull GenericType producerAfterType, @NotNull List expressions) { diff --git a/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/trace/impl/handler/type/GenericTypeUtil.java b/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/trace/impl/handler/type/GenericTypeUtil.java index a008a32ca611..d586258c58d2 100644 --- a/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/trace/impl/handler/type/GenericTypeUtil.java +++ b/plugins/stream-debugger/src/main/java/com/intellij/debugger/streams/trace/impl/handler/type/GenericTypeUtil.java @@ -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;