Moved methods working with calls into appropriate place
This commit is contained in:
@@ -17,26 +17,25 @@
|
|||||||
package org.jetbrains.kotlin.psi.psiUtil
|
package org.jetbrains.kotlin.psi.psiUtil
|
||||||
|
|
||||||
import com.intellij.extapi.psi.StubBasedPsiElementBase
|
import com.intellij.extapi.psi.StubBasedPsiElementBase
|
||||||
import com.intellij.lang.ASTNode
|
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.search.PsiSearchScopeUtil
|
import com.intellij.psi.PsiParameter
|
||||||
import com.intellij.psi.search.SearchScope
|
import com.intellij.psi.PsiParameterList
|
||||||
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import com.intellij.psi.stubs.StubElement
|
import com.intellij.psi.stubs.StubElement
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import org.jetbrains.kotlin.JetNodeTypes
|
import org.jetbrains.kotlin.JetNodeTypes
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
|
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
|
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallTransformer.CallForImplicitInvoke
|
|
||||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
// NOTE: in this file we collect only Kotlin-specific methods working with PSI and not modifying it
|
||||||
|
|
||||||
public fun JetCallElement.getCallNameExpression(): JetSimpleNameExpression? {
|
public fun JetCallElement.getCallNameExpression(): JetSimpleNameExpression? {
|
||||||
val calleeExpression = getCalleeExpression() ?: return null
|
val calleeExpression = getCalleeExpression() ?: return null
|
||||||
|
|
||||||
@@ -253,18 +252,6 @@ public fun JetExpression.getAssignmentByLHS(): JetBinaryExpression? {
|
|||||||
public fun JetExpression.isDotReceiver(): Boolean =
|
public fun JetExpression.isDotReceiver(): Boolean =
|
||||||
(getParent() as? JetDotQualifiedExpression)?.getReceiverExpression() == this
|
(getParent() as? JetDotQualifiedExpression)?.getReceiverExpression() == this
|
||||||
|
|
||||||
public fun Call.isSafeCall(): Boolean {
|
|
||||||
if (this is CallForImplicitInvoke) {
|
|
||||||
//implicit safe 'invoke'
|
|
||||||
if (getOuterCall().isExplicitSafeCall()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return isExplicitSafeCall()
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun Call.isExplicitSafeCall(): Boolean = getCallOperationNode()?.getElementType() == JetTokens.SAFE_ACCESS
|
|
||||||
|
|
||||||
public fun JetStringTemplateExpression.getContentRange(): TextRange {
|
public fun JetStringTemplateExpression.getContentRange(): TextRange {
|
||||||
val start = getNode().getFirstChildNode().getTextLength()
|
val start = getNode().getFirstChildNode().getTextLength()
|
||||||
val lastChild = getNode().getLastChildNode()
|
val lastChild = getNode().getLastChildNode()
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
|||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
|
|
||||||
import org.jetbrains.kotlin.resolve.*;
|
import org.jetbrains.kotlin.resolve.*;
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage;
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.CallResolutionContext;
|
import org.jetbrains.kotlin.resolve.calls.context.CallResolutionContext;
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.CheckValueArgumentsMode;
|
import org.jetbrains.kotlin.resolve.calls.context.CheckValueArgumentsMode;
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
|
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
|
||||||
@@ -283,7 +283,7 @@ public class ArgumentTypeResolver {
|
|||||||
// For an unsafe call, we should not do it,
|
// For an unsafe call, we should not do it,
|
||||||
// otherwise not-null will propagate to successive statements
|
// otherwise not-null will propagate to successive statements
|
||||||
// Sample: x?.foo(x.bar()) // Inside foo call, x is not-nullable
|
// Sample: x?.foo(x.bar()) // Inside foo call, x is not-nullable
|
||||||
if (PsiUtilPackage.isSafeCall(call)) {
|
if (CallUtilPackage.isSafeCall(call)) {
|
||||||
initialDataFlowInfo = initialDataFlowInfo.disequate(receiverDataFlowValue, DataFlowValue.NULL);
|
initialDataFlowInfo = initialDataFlowInfo.disequate(receiverDataFlowValue, DataFlowValue.NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.*;
|
|||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
|
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
|
||||||
import org.jetbrains.kotlin.resolve.*;
|
import org.jetbrains.kotlin.resolve.*;
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage;
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.*;
|
import org.jetbrains.kotlin.resolve.calls.context.*;
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem;
|
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem;
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl;
|
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl;
|
||||||
@@ -637,7 +638,7 @@ public class CandidateResolver {
|
|||||||
D candidateDescriptor = candidateCall.getCandidateDescriptor();
|
D candidateDescriptor = candidateCall.getCandidateDescriptor();
|
||||||
if (TypeUtils.dependsOnTypeParameters(receiverParameter.getType(), candidateDescriptor.getTypeParameters())) return SUCCESS;
|
if (TypeUtils.dependsOnTypeParameters(receiverParameter.getType(), candidateDescriptor.getTypeParameters())) return SUCCESS;
|
||||||
|
|
||||||
boolean safeAccess = isExplicitReceiver && !implicitInvokeCheck && PsiUtilPackage.isExplicitSafeCall(candidateCall.getCall());
|
boolean safeAccess = isExplicitReceiver && !implicitInvokeCheck && CallUtilPackage.isExplicitSafeCall(candidateCall.getCall());
|
||||||
boolean isSubtypeBySmartCast = SmartCastUtils.isSubTypeBySmartCastIgnoringNullability(
|
boolean isSubtypeBySmartCast = SmartCastUtils.isSubTypeBySmartCastIgnoringNullability(
|
||||||
receiverArgument, receiverParameter.getType(), context);
|
receiverArgument, receiverParameter.getType(), context);
|
||||||
if (!isSubtypeBySmartCast) {
|
if (!isSubtypeBySmartCast) {
|
||||||
|
|||||||
+2
-2
@@ -25,9 +25,9 @@ import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor;
|
|||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
|
||||||
import org.jetbrains.kotlin.psi.Call;
|
import org.jetbrains.kotlin.psi.Call;
|
||||||
import org.jetbrains.kotlin.psi.ValueArgument;
|
import org.jetbrains.kotlin.psi.ValueArgument;
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
|
|
||||||
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace;
|
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace;
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallResolverUtil;
|
import org.jetbrains.kotlin.resolve.calls.CallResolverUtil;
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage;
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem;
|
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystem;
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus;
|
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus;
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind;
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind;
|
||||||
@@ -288,7 +288,7 @@ public class ResolvedCallImpl<D extends CallableDescriptor> implements MutableRe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSafeCall() {
|
public boolean isSafeCall() {
|
||||||
return PsiUtilPackage.isSafeCall(call);
|
return CallUtilPackage.isSafeCall(call);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -20,15 +20,16 @@ import com.intellij.psi.util.PsiTreeUtil
|
|||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getTextWithLocation
|
import org.jetbrains.kotlin.psi.psiUtil.getTextWithLocation
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext.CALL
|
import org.jetbrains.kotlin.resolve.BindingContext.CALL
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext.RESOLVED_CALL
|
import org.jetbrains.kotlin.resolve.BindingContext.RESOLVED_CALL
|
||||||
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
|
|
||||||
// resolved call
|
// resolved call
|
||||||
@@ -176,6 +177,18 @@ public fun JetExpression.getFunctionResolvedCallWithAssert(context: BindingConte
|
|||||||
assert(resolvedCall.getResultingDescriptor() is FunctionDescriptor) {
|
assert(resolvedCall.getResultingDescriptor() is FunctionDescriptor) {
|
||||||
"ResolvedCall for this expression must be ResolvedCall<? extends FunctionDescriptor>: ${this.getTextWithLocation()}"
|
"ResolvedCall for this expression must be ResolvedCall<? extends FunctionDescriptor>: ${this.getTextWithLocation()}"
|
||||||
}
|
}
|
||||||
[suppress("UNCHECKED_CAST")]
|
@suppress("UNCHECKED_CAST")
|
||||||
return resolvedCall as ResolvedCall<out FunctionDescriptor>
|
return resolvedCall as ResolvedCall<out FunctionDescriptor>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public fun Call.isSafeCall(): Boolean {
|
||||||
|
if (this is CallTransformer.CallForImplicitInvoke) {
|
||||||
|
//implicit safe 'invoke'
|
||||||
|
if (getOuterCall().isExplicitSafeCall()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isExplicitSafeCall()
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun Call.isExplicitSafeCall(): Boolean = getCallOperationNode()?.getElementType() == JetTokens.SAFE_ACCESS
|
||||||
Reference in New Issue
Block a user