mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Resolve type of objects in the stream after qualifier correctly
This commit is contained in:
+13
-2
@@ -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) {
|
||||
|
||||
+10
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user