Rename SmartCastUtils -> SmartCastManager and make it a component
This commit is contained in:
@@ -42,10 +42,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
|||||||
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus.*
|
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils.canBeSmartCast
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils.getSmartCastVariantsExcludingReceiver
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils.isSubTypeBySmartCastIgnoringNullability
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils.recordSmartCastIfNecessary
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionTask
|
import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionTask
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke
|
import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
||||||
@@ -66,7 +63,8 @@ public class CandidateResolver(
|
|||||||
private val genericCandidateResolver: GenericCandidateResolver,
|
private val genericCandidateResolver: GenericCandidateResolver,
|
||||||
private val reflectionTypes: ReflectionTypes,
|
private val reflectionTypes: ReflectionTypes,
|
||||||
private val modifiersChecker: ModifiersChecker,
|
private val modifiersChecker: ModifiersChecker,
|
||||||
private val additionalTypeCheckers: Iterable<AdditionalTypeChecker>
|
private val additionalTypeCheckers: Iterable<AdditionalTypeChecker>,
|
||||||
|
private val smartCastManager: SmartCastManager
|
||||||
){
|
){
|
||||||
|
|
||||||
public fun <D : CallableDescriptor, F : D> performResolutionForCandidateCall(
|
public fun <D : CallableDescriptor, F : D> performResolutionForCandidateCall(
|
||||||
@@ -372,7 +370,7 @@ public class CandidateResolver(
|
|||||||
actualType: JetType,
|
actualType: JetType,
|
||||||
context: ResolutionContext<*>): JetType? {
|
context: ResolutionContext<*>): JetType? {
|
||||||
val receiverToCast = ExpressionReceiver(JetPsiUtil.safeDeparenthesize(expression, false), actualType)
|
val receiverToCast = ExpressionReceiver(JetPsiUtil.safeDeparenthesize(expression, false), actualType)
|
||||||
val variants = getSmartCastVariantsExcludingReceiver(context, receiverToCast)
|
val variants = smartCastManager.getSmartCastVariantsExcludingReceiver(context, receiverToCast)
|
||||||
for (possibleType in variants) {
|
for (possibleType in variants) {
|
||||||
if (JetTypeChecker.DEFAULT.isSubtypeOf(possibleType, expectedType)) {
|
if (JetTypeChecker.DEFAULT.isSubtypeOf(possibleType, expectedType)) {
|
||||||
return possibleType
|
return possibleType
|
||||||
@@ -401,7 +399,7 @@ public class CandidateResolver(
|
|||||||
|
|
||||||
val erasedReceiverType = getErasedReceiverType(receiverParameterDescriptor, candidateDescriptor)
|
val erasedReceiverType = getErasedReceiverType(receiverParameterDescriptor, candidateDescriptor)
|
||||||
|
|
||||||
if (!isSubTypeBySmartCastIgnoringNullability(receiverArgument, erasedReceiverType, this)) {
|
if (!smartCastManager.isSubTypeBySmartCastIgnoringNullability(receiverArgument, erasedReceiverType, this)) {
|
||||||
RECEIVER_TYPE_ERROR
|
RECEIVER_TYPE_ERROR
|
||||||
} else {
|
} else {
|
||||||
SUCCESS
|
SUCCESS
|
||||||
@@ -441,13 +439,13 @@ public class CandidateResolver(
|
|||||||
if (TypeUtils.dependsOnTypeParameters(receiverParameter.getType(), candidateDescriptor.getTypeParameters())) return SUCCESS
|
if (TypeUtils.dependsOnTypeParameters(receiverParameter.getType(), candidateDescriptor.getTypeParameters())) return SUCCESS
|
||||||
|
|
||||||
val safeAccess = isExplicitReceiver && !implicitInvokeCheck && candidateCall.getCall().isExplicitSafeCall()
|
val safeAccess = isExplicitReceiver && !implicitInvokeCheck && candidateCall.getCall().isExplicitSafeCall()
|
||||||
val isSubtypeBySmartCast = isSubTypeBySmartCastIgnoringNullability(
|
val isSubtypeBySmartCast = smartCastManager.isSubTypeBySmartCastIgnoringNullability(
|
||||||
receiverArgument, receiverParameter.getType(), this)
|
receiverArgument, receiverParameter.getType(), this)
|
||||||
if (!isSubtypeBySmartCast) {
|
if (!isSubtypeBySmartCast) {
|
||||||
tracing.wrongReceiverType(trace, receiverParameter, receiverArgument)
|
tracing.wrongReceiverType(trace, receiverParameter, receiverArgument)
|
||||||
return OTHER_ERROR
|
return OTHER_ERROR
|
||||||
}
|
}
|
||||||
if (!recordSmartCastIfNecessary(receiverArgument, receiverParameter.getType(), this, safeAccess)) {
|
if (!smartCastManager.recordSmartCastIfNecessary(receiverArgument, receiverParameter.getType(), this, safeAccess)) {
|
||||||
return OTHER_ERROR
|
return OTHER_ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,7 +453,7 @@ public class CandidateResolver(
|
|||||||
|
|
||||||
val bindingContext = trace.getBindingContext()
|
val bindingContext = trace.getBindingContext()
|
||||||
if (!safeAccess && !receiverParameter.getType().isMarkedNullable() && receiverArgumentType.isMarkedNullable()) {
|
if (!safeAccess && !receiverParameter.getType().isMarkedNullable() && receiverArgumentType.isMarkedNullable()) {
|
||||||
if (!canBeSmartCast(receiverParameter, receiverArgument, this)) {
|
if (!smartCastManager.canBeSmartCast(receiverParameter, receiverArgument, this)) {
|
||||||
tracing.unsafeCall(trace, receiverArgumentType, implicitInvokeCheck)
|
tracing.unsafeCall(trace, receiverArgumentType, implicitInvokeCheck)
|
||||||
return UNSAFE_CALL_ERROR
|
return UNSAFE_CALL_ERROR
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-12
@@ -46,12 +46,13 @@ import java.util.Set;
|
|||||||
import static org.jetbrains.kotlin.diagnostics.Errors.SMARTCAST_IMPOSSIBLE;
|
import static org.jetbrains.kotlin.diagnostics.Errors.SMARTCAST_IMPOSSIBLE;
|
||||||
import static org.jetbrains.kotlin.resolve.BindingContext.SMARTCAST;
|
import static org.jetbrains.kotlin.resolve.BindingContext.SMARTCAST;
|
||||||
|
|
||||||
public class SmartCastUtils {
|
public class SmartCastManager {
|
||||||
|
|
||||||
private SmartCastUtils() {}
|
public SmartCastManager() {
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static List<JetType> getSmartCastVariants(
|
public List<JetType> getSmartCastVariants(
|
||||||
@NotNull ReceiverValue receiverToCast,
|
@NotNull ReceiverValue receiverToCast,
|
||||||
@NotNull ResolutionContext context
|
@NotNull ResolutionContext context
|
||||||
) {
|
) {
|
||||||
@@ -59,7 +60,7 @@ public class SmartCastUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static List<JetType> getSmartCastVariants(
|
public List<JetType> getSmartCastVariants(
|
||||||
@NotNull ReceiverValue receiverToCast,
|
@NotNull ReceiverValue receiverToCast,
|
||||||
@NotNull BindingContext bindingContext,
|
@NotNull BindingContext bindingContext,
|
||||||
@NotNull DeclarationDescriptor containingDeclarationOrModule,
|
@NotNull DeclarationDescriptor containingDeclarationOrModule,
|
||||||
@@ -72,7 +73,7 @@ public class SmartCastUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static List<JetType> getSmartCastVariantsWithLessSpecificExcluded(
|
public List<JetType> getSmartCastVariantsWithLessSpecificExcluded(
|
||||||
@NotNull ReceiverValue receiverToCast,
|
@NotNull ReceiverValue receiverToCast,
|
||||||
@NotNull BindingContext bindingContext,
|
@NotNull BindingContext bindingContext,
|
||||||
@NotNull DeclarationDescriptor containingDeclarationOrModule,
|
@NotNull DeclarationDescriptor containingDeclarationOrModule,
|
||||||
@@ -97,7 +98,7 @@ public class SmartCastUtils {
|
|||||||
* @return variants @param receiverToCast may be cast to according to context dataFlowInfo, receiverToCast itself is NOT included
|
* @return variants @param receiverToCast may be cast to according to context dataFlowInfo, receiverToCast itself is NOT included
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Collection<JetType> getSmartCastVariantsExcludingReceiver(
|
public Collection<JetType> getSmartCastVariantsExcludingReceiver(
|
||||||
@NotNull ResolutionContext context,
|
@NotNull ResolutionContext context,
|
||||||
@NotNull ReceiverValue receiverToCast
|
@NotNull ReceiverValue receiverToCast
|
||||||
) {
|
) {
|
||||||
@@ -111,7 +112,7 @@ public class SmartCastUtils {
|
|||||||
* @return variants @param receiverToCast may be cast to according to @param dataFlowInfo, @param receiverToCast itself is NOT included
|
* @return variants @param receiverToCast may be cast to according to @param dataFlowInfo, @param receiverToCast itself is NOT included
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Collection<JetType> getSmartCastVariantsExcludingReceiver(
|
public Collection<JetType> getSmartCastVariantsExcludingReceiver(
|
||||||
@NotNull BindingContext bindingContext,
|
@NotNull BindingContext bindingContext,
|
||||||
@NotNull DeclarationDescriptor containingDeclarationOrModule,
|
@NotNull DeclarationDescriptor containingDeclarationOrModule,
|
||||||
@NotNull DataFlowInfo dataFlowInfo,
|
@NotNull DataFlowInfo dataFlowInfo,
|
||||||
@@ -131,7 +132,7 @@ public class SmartCastUtils {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isSubTypeBySmartCastIgnoringNullability(
|
public boolean isSubTypeBySmartCastIgnoringNullability(
|
||||||
@NotNull ReceiverValue receiverArgument,
|
@NotNull ReceiverValue receiverArgument,
|
||||||
@NotNull JetType receiverParameterType,
|
@NotNull JetType receiverParameterType,
|
||||||
@NotNull ResolutionContext context
|
@NotNull ResolutionContext context
|
||||||
@@ -141,7 +142,7 @@ public class SmartCastUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static JetType getSmartCastSubType(
|
private JetType getSmartCastSubType(
|
||||||
@NotNull JetType receiverParameterType,
|
@NotNull JetType receiverParameterType,
|
||||||
@NotNull Collection<JetType> smartCastTypes
|
@NotNull Collection<JetType> smartCastTypes
|
||||||
) {
|
) {
|
||||||
@@ -161,7 +162,7 @@ public class SmartCastUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns false when we need smart cast but cannot do it, otherwise true
|
// Returns false when we need smart cast but cannot do it, otherwise true
|
||||||
public static boolean recordSmartCastIfNecessary(
|
public boolean recordSmartCastIfNecessary(
|
||||||
@NotNull ReceiverValue receiver,
|
@NotNull ReceiverValue receiver,
|
||||||
@NotNull JetType receiverParameterType,
|
@NotNull JetType receiverParameterType,
|
||||||
@NotNull ResolutionContext context,
|
@NotNull ResolutionContext context,
|
||||||
@@ -184,7 +185,7 @@ public class SmartCastUtils {
|
|||||||
return recordCastOrError(expression, smartCastSubType, context.trace, dataFlowValue.isPredictable(), true);
|
return recordCastOrError(expression, smartCastSubType, context.trace, dataFlowValue.isPredictable(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean recordCastOrError(
|
public boolean recordCastOrError(
|
||||||
@NotNull JetExpression expression,
|
@NotNull JetExpression expression,
|
||||||
@NotNull JetType type,
|
@NotNull JetType type,
|
||||||
@NotNull BindingTrace trace,
|
@NotNull BindingTrace trace,
|
||||||
@@ -205,7 +206,7 @@ public class SmartCastUtils {
|
|||||||
return canBeCast;
|
return canBeCast;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean canBeSmartCast(
|
public boolean canBeSmartCast(
|
||||||
@NotNull ReceiverParameterDescriptor receiverParameter,
|
@NotNull ReceiverParameterDescriptor receiverParameter,
|
||||||
@NotNull ReceiverValue receiver,
|
@NotNull ReceiverValue receiver,
|
||||||
@NotNull ResolutionContext context) {
|
@NotNull ResolutionContext context) {
|
||||||
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|||||||
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isOrOverridesSynthesized
|
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isOrOverridesSynthesized
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.BOTH_RECEIVERS
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.BOTH_RECEIVERS
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.DISPATCH_RECEIVER
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.DISPATCH_RECEIVER
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.EXTENSION_RECEIVER
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.EXTENSION_RECEIVER
|
||||||
@@ -47,7 +47,10 @@ import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
|||||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
||||||
import org.jetbrains.kotlin.types.isDynamic
|
import org.jetbrains.kotlin.types.isDynamic
|
||||||
|
|
||||||
public class TaskPrioritizer(private val storageManager: StorageManager) {
|
public class TaskPrioritizer(
|
||||||
|
private val storageManager: StorageManager,
|
||||||
|
private val smartCastManager: SmartCastManager
|
||||||
|
) {
|
||||||
|
|
||||||
public fun <D : CallableDescriptor> splitLexicallyLocalDescriptors(
|
public fun <D : CallableDescriptor> splitLexicallyLocalDescriptors(
|
||||||
allDescriptors: Collection<ResolutionCandidate<D>>,
|
allDescriptors: Collection<ResolutionCandidate<D>>,
|
||||||
@@ -130,10 +133,11 @@ public class TaskPrioritizer(private val storageManager: StorageManager) {
|
|||||||
addCandidatesForNoReceiver(implicitReceivers, c)
|
addCandidatesForNoReceiver(implicitReceivers, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ReceiverWithTypes(
|
private inner class ReceiverWithTypes(
|
||||||
val value: ReceiverValue,
|
val value: ReceiverValue,
|
||||||
private val context: ResolutionContext<*>) {
|
private val context: ResolutionContext<*>
|
||||||
val types: Collection<JetType> by lazy { SmartCastUtils.getSmartCastVariants(value, context) }
|
) {
|
||||||
|
val types: Collection<JetType> by lazy { smartCastManager.getSmartCastVariants(value, context) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <D : CallableDescriptor, F : D> addCandidatesForExplicitReceiver(
|
private fun <D : CallableDescriptor, F : D> addCandidatesForExplicitReceiver(
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
|
|||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager;
|
||||||
import org.jetbrains.kotlin.resolve.constants.*;
|
import org.jetbrains.kotlin.resolve.constants.*;
|
||||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
|
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
|
||||||
import org.jetbrains.kotlin.types.JetType;
|
import org.jetbrains.kotlin.types.JetType;
|
||||||
@@ -51,15 +51,18 @@ public class DataFlowAnalyzer {
|
|||||||
private final Iterable<AdditionalTypeChecker> additionalTypeCheckers;
|
private final Iterable<AdditionalTypeChecker> additionalTypeCheckers;
|
||||||
private final ConstantExpressionEvaluator constantExpressionEvaluator;
|
private final ConstantExpressionEvaluator constantExpressionEvaluator;
|
||||||
private final KotlinBuiltIns builtIns;
|
private final KotlinBuiltIns builtIns;
|
||||||
|
private final SmartCastManager smartCastManager;
|
||||||
|
|
||||||
public DataFlowAnalyzer(
|
public DataFlowAnalyzer(
|
||||||
@NotNull Iterable<AdditionalTypeChecker> additionalTypeCheckers,
|
@NotNull Iterable<AdditionalTypeChecker> additionalTypeCheckers,
|
||||||
@NotNull ConstantExpressionEvaluator constantExpressionEvaluator,
|
@NotNull ConstantExpressionEvaluator constantExpressionEvaluator,
|
||||||
@NotNull KotlinBuiltIns builtIns
|
@NotNull KotlinBuiltIns builtIns,
|
||||||
|
@NotNull SmartCastManager smartCastManager
|
||||||
) {
|
) {
|
||||||
this.additionalTypeCheckers = additionalTypeCheckers;
|
this.additionalTypeCheckers = additionalTypeCheckers;
|
||||||
this.constantExpressionEvaluator = constantExpressionEvaluator;
|
this.constantExpressionEvaluator = constantExpressionEvaluator;
|
||||||
this.builtIns = builtIns;
|
this.builtIns = builtIns;
|
||||||
|
this.smartCastManager = smartCastManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -218,7 +221,7 @@ public class DataFlowAnalyzer {
|
|||||||
|
|
||||||
for (JetType possibleType : c.dataFlowInfo.getPossibleTypes(dataFlowValue)) {
|
for (JetType possibleType : c.dataFlowInfo.getPossibleTypes(dataFlowValue)) {
|
||||||
if (JetTypeChecker.DEFAULT.isSubtypeOf(possibleType, c.expectedType)) {
|
if (JetTypeChecker.DEFAULT.isSubtypeOf(possibleType, c.expectedType)) {
|
||||||
SmartCastUtils.recordCastOrError(expression, possibleType, c.trace, dataFlowValue.isPredictable(), false);
|
smartCastManager.recordCastOrError(expression, possibleType, c.trace, dataFlowValue.isPredictable(), false);
|
||||||
return possibleType;
|
return possibleType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.psi.*
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||||
import org.jetbrains.kotlin.resolve.scopes.*
|
import org.jetbrains.kotlin.resolve.scopes.*
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
@@ -108,7 +108,7 @@ public class ReferenceVariantsHelper(
|
|||||||
val dataFlowInfo = context.getDataFlowInfo(expression)
|
val dataFlowInfo = context.getDataFlowInfo(expression)
|
||||||
|
|
||||||
val implicitReceiverTypes = resolutionScope.getImplicitReceiversWithInstance().flatMap {
|
val implicitReceiverTypes = resolutionScope.getImplicitReceiversWithInstance().flatMap {
|
||||||
SmartCastUtils.getSmartCastVariantsWithLessSpecificExcluded(it.value, context, containingDeclaration, dataFlowInfo)
|
SmartCastManager().getSmartCastVariantsWithLessSpecificExcluded(it.value, context, containingDeclaration, dataFlowInfo)
|
||||||
}.toSet()
|
}.toSet()
|
||||||
|
|
||||||
val pair = getExplicitReceiverData(expression)
|
val pair = getExplicitReceiverData(expression)
|
||||||
@@ -127,7 +127,7 @@ public class ReferenceVariantsHelper(
|
|||||||
context.getType(receiverExpression)
|
context.getType(receiverExpression)
|
||||||
if (expressionType != null && !expressionType.isError()) {
|
if (expressionType != null && !expressionType.isError()) {
|
||||||
val receiverValue = ExpressionReceiver(receiverExpression, expressionType)
|
val receiverValue = ExpressionReceiver(receiverExpression, expressionType)
|
||||||
val explicitReceiverTypes = SmartCastUtils.getSmartCastVariantsWithLessSpecificExcluded(receiverValue, context, containingDeclaration, dataFlowInfo)
|
val explicitReceiverTypes = SmartCastManager().getSmartCastVariantsWithLessSpecificExcluded(receiverValue, context, containingDeclaration, dataFlowInfo)
|
||||||
|
|
||||||
descriptors.processAll(implicitReceiverTypes, explicitReceiverTypes, resolutionScope, callType, kindFilter, nameFilter)
|
descriptors.processAll(implicitReceiverTypes, explicitReceiverTypes, resolutionScope, callType, kindFilter, nameFilter)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.psi.JetPsiUtil
|
|||||||
import org.jetbrains.kotlin.psi.JetThisExpression
|
import org.jetbrains.kotlin.psi.JetThisExpression
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
@@ -84,7 +84,7 @@ public fun CallableDescriptor.substituteExtensionIfCallable(
|
|||||||
): Collection<CallableDescriptor> {
|
): Collection<CallableDescriptor> {
|
||||||
if (!receiver.exists()) return listOf()
|
if (!receiver.exists()) return listOf()
|
||||||
|
|
||||||
var types = SmartCastUtils.getSmartCastVariants(receiver, bindingContext, containingDeclarationOrModule, dataFlowInfo)
|
var types = SmartCastManager().getSmartCastVariants(receiver, bindingContext, containingDeclarationOrModule, dataFlowInfo)
|
||||||
return substituteExtensionIfCallable(types, callType)
|
return substituteExtensionIfCallable(types, callType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.prevLeaf
|
import org.jetbrains.kotlin.psi.psiUtil.prevLeaf
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||||
@@ -146,7 +146,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
|
|||||||
var receiverTypes = receiversData.receivers.flatMap { receiverValue ->
|
var receiverTypes = receiversData.receivers.flatMap { receiverValue ->
|
||||||
val dataFlowValue = DataFlowValueFactory.createDataFlowValue(receiverValue, bindingContext, moduleDescriptor)
|
val dataFlowValue = DataFlowValueFactory.createDataFlowValue(receiverValue, bindingContext, moduleDescriptor)
|
||||||
if (dataFlowValue.isPredictable) { // we don't include smart cast receiver types for "unpredictable" receiver value to mark members grayed
|
if (dataFlowValue.isPredictable) { // we don't include smart cast receiver types for "unpredictable" receiver value to mark members grayed
|
||||||
SmartCastUtils.getSmartCastVariantsWithLessSpecificExcluded(receiverValue, bindingContext, moduleDescriptor, dataFlowInfo)
|
SmartCastManager().getSmartCastVariantsWithLessSpecificExcluded(receiverValue, bindingContext, moduleDescriptor, dataFlowInfo)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
listOf(receiverValue.type)
|
listOf(receiverValue.type)
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.resolve.*
|
|||||||
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.LookupMode
|
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.LookupMode
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastUtils
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
@@ -114,7 +114,7 @@ public class KotlinIndicesHelper(
|
|||||||
private fun possibleReceiverTypeNames(receiverValues: Collection<ReceiverValue>, dataFlowInfo: DataFlowInfo, bindingContext: BindingContext): Set<String> {
|
private fun possibleReceiverTypeNames(receiverValues: Collection<ReceiverValue>, dataFlowInfo: DataFlowInfo, bindingContext: BindingContext): Set<String> {
|
||||||
val result = HashSet<String>()
|
val result = HashSet<String>()
|
||||||
for (receiverValue in receiverValues) {
|
for (receiverValue in receiverValues) {
|
||||||
for (type in SmartCastUtils.getSmartCastVariants(receiverValue, bindingContext, moduleDescriptor, dataFlowInfo)) {
|
for (type in SmartCastManager().getSmartCastVariants(receiverValue, bindingContext, moduleDescriptor, dataFlowInfo)) {
|
||||||
result.addTypeNames(type)
|
result.addTypeNames(type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user