'reportTypeInferenceFailed' moved to tracing

This commit is contained in:
Svetlana Isakova
2012-07-18 23:00:05 +04:00
parent 3f37fe49a8
commit 5edfc6e2eb
5 changed files with 56 additions and 33 deletions
@@ -318,7 +318,7 @@ public class CallResolver {
} }
continue; continue;
} }
completeTypeInferenceDependentOnExpectedTypeForCall(resolvedCall, context, successful, failed); completeTypeInferenceDependentOnExpectedTypeForCall(resolvedCall, context, tracing, successful, failed);
} }
if (results.getResultingCalls().size() > 1) { if (results.getResultingCalls().size() > 1) {
for (ResolvedCallWithTrace<D> call : successful) { for (ResolvedCallWithTrace<D> call : successful) {
@@ -329,16 +329,15 @@ public class CallResolver {
} }
successful.clear(); successful.clear();
} }
if (tracing == null) {
return results;
}
return computeResultAndReportErrors(context.trace, tracing, successful, failed); return computeResultAndReportErrors(context.trace, tracing, successful, failed);
} }
private <D extends CallableDescriptor> void completeTypeInferenceDependentOnExpectedTypeForCall(ResolvedCallImpl<D> resolvedCall, private <D extends CallableDescriptor> void completeTypeInferenceDependentOnExpectedTypeForCall(ResolvedCallImpl<D> resolvedCall,
BasicResolutionContext context, BasicResolutionContext context,
TracingStrategy tracing,
Set<ResolvedCallWithTrace<D>> successful, Set<ResolvedCallWithTrace<D>> successful,
Set<ResolvedCallWithTrace<D>> failed) { Set<ResolvedCallWithTrace<D>> failed
) {
assert resolvedCall.hasUnknownTypeParameters(); assert resolvedCall.hasUnknownTypeParameters();
D descriptor = resolvedCall.getCandidateDescriptor(); D descriptor = resolvedCall.getCandidateDescriptor();
ConstraintsSystem constraintsSystem = resolvedCall.getConstraintsSystem(); ConstraintsSystem constraintsSystem = resolvedCall.getConstraintsSystem();
@@ -365,8 +364,8 @@ public class CallResolver {
if (!constraintsSystem.isSuccessful()) { if (!constraintsSystem.isSuccessful()) {
List<JetType> argumentTypes = checkValueArgumentTypes(context, resolvedCall, context.trace).argumentTypes; List<JetType> argumentTypes = checkValueArgumentTypes(context, resolvedCall, context.trace).argumentTypes;
JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null; JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null;
reportTypeInferenceFailed(context.trace, context.call, InferenceErrorData.create(descriptor, constraintsSystem, tracing.typeInferenceFailed(context.trace,
argumentTypes, receiverType)); InferenceErrorData.create(descriptor, constraintsSystem, argumentTypes, receiverType));
resolvedCall.addStatus(ResolutionStatus.TYPE_INFERENCE_ERROR); resolvedCall.addStatus(ResolutionStatus.TYPE_INFERENCE_ERROR);
failed.add(resolvedCall); failed.add(resolvedCall);
return; return;
@@ -380,7 +379,7 @@ public class CallResolver {
// Here we type check the arguments with inferred types expected // Here we type check the arguments with inferred types expected
checkValueArgumentTypes(context, resolvedCall, context.trace); checkValueArgumentTypes(context, resolvedCall, context.trace);
checkBounds(resolvedCall, constraintsSystem, context); checkBounds(resolvedCall, constraintsSystem, context.trace, tracing);
resolvedCall.setHasUnknownTypeParameters(false); resolvedCall.setHasUnknownTypeParameters(false);
if (resolvedCall.getStatus().isSuccess() || resolvedCall.getStatus() == ResolutionStatus.UNKNOWN_STATUS) { if (resolvedCall.getStatus().isSuccess() || resolvedCall.getStatus() == ResolutionStatus.UNKNOWN_STATUS) {
resolvedCall.addStatus(ResolutionStatus.SUCCESS); resolvedCall.addStatus(ResolutionStatus.SUCCESS);
@@ -391,28 +390,15 @@ public class CallResolver {
} }
} }
private void reportTypeInferenceFailed(@NotNull BindingTrace trace, @NotNull Call call, @NotNull InferenceErrorData inferenceErrorData) { private <D extends CallableDescriptor> void checkBounds(
assert !inferenceErrorData.constraintsSystem.isSuccessful(); @NotNull ResolvedCallImpl<D> call,
if (inferenceErrorData.constraintsSystem.hasErrorInConstrainingTypes()) return; @NotNull ConstraintsSystem constraintsSystem,
JetExpression calleeExpression = call.getCalleeExpression(); @NotNull BindingTrace trace,
PsiElement element = calleeExpression != null ? calleeExpression : call.getCallElement(); @NotNull TracingStrategy tracing
if (inferenceErrorData.constraintsSystem.hasTypeConstructorMismatch()) { ) {
trace.report(TYPE_INFERENCE_TYPE_CONSTRUCTOR_MISMATCH.on(element, inferenceErrorData));
}
else if (inferenceErrorData.constraintsSystem.hasConflictingConstraints()) {
trace.report(TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS.on(element, inferenceErrorData));
}
else {
assert inferenceErrorData.constraintsSystem.hasUnknownParameters();
trace.report(TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER.on(element, inferenceErrorData));
}
}
private <D extends CallableDescriptor> void checkBounds(ResolvedCallImpl<D> call, ConstraintsSystem constraintsSystem, BasicResolutionContext context) {
for (TypeParameterDescriptor typeParameter : call.getCandidateDescriptor().getTypeParameters()) { for (TypeParameterDescriptor typeParameter : call.getCandidateDescriptor().getTypeParameters()) {
if (!ConstraintsUtil.checkUpperBoundIsSatisfied(constraintsSystem, typeParameter)) { if (!ConstraintsUtil.checkUpperBoundIsSatisfied(constraintsSystem, typeParameter)) {
context.trace.report(Errors.TYPE_INFERENCE_UPPER_BOUND_VIOLATED.on(context.call.getCallElement(), InferenceErrorData tracing.upperBoundViolated(trace, InferenceErrorData.create(call.getCandidateDescriptor(), constraintsSystem));
.create(call.getCandidateDescriptor(), constraintsSystem)));
} }
} }
} }
@@ -774,8 +760,8 @@ public class CallResolver {
ResolutionStatus argumentsStatus = checkingResult.status; ResolutionStatus argumentsStatus = checkingResult.status;
List<JetType> argumentTypes = checkingResult.argumentTypes; List<JetType> argumentTypes = checkingResult.argumentTypes;
JetType receiverType = candidateCall.getReceiverArgument().exists() ? candidateCall.getReceiverArgument().getType() : null; JetType receiverType = candidateCall.getReceiverArgument().exists() ? candidateCall.getReceiverArgument().getType() : null;
reportTypeInferenceFailed(context.trace, context.call, InferenceErrorData.create(candidate, context.tracing.typeInferenceFailed(context.trace,
constraintsBuilderWithRightTypeParameters, argumentTypes, receiverType)); InferenceErrorData.create(candidate, constraintsBuilderWithRightTypeParameters, argumentTypes, receiverType));
return TYPE_INFERENCE_ERROR.combine(argumentsStatus); return TYPE_INFERENCE_ERROR.combine(argumentsStatus);
} }
} }
@@ -26,7 +26,7 @@ public enum ResolutionStatus {
UNSAFE_CALL_ERROR, UNSAFE_CALL_ERROR,
OTHER_ERROR, OTHER_ERROR,
STRONG_ERROR, STRONG_ERROR,
TYPE_INFERENCE_ERROR, TYPE_INFERENCE_ERROR, //todo remove
SUCCESS(true); SUCCESS(true);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -23,9 +23,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.inference.InferenceErrorData;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
@@ -229,5 +231,28 @@ public class ResolutionTask<D extends CallableDescriptor, F extends D> extends R
public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor) { public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor) {
trace.report(INVISIBLE_MEMBER.on(call.getCallElement(), descriptor, descriptor.getContainingDeclaration())); trace.report(INVISIBLE_MEMBER.on(call.getCallElement(), descriptor, descriptor.getContainingDeclaration()));
} }
@Override
public void typeInferenceFailed(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData) {
assert !inferenceErrorData.constraintsSystem.isSuccessful();
if (inferenceErrorData.constraintsSystem.hasErrorInConstrainingTypes()) {
return;
}
if (inferenceErrorData.constraintsSystem.hasTypeConstructorMismatch()) {
trace.report(TYPE_INFERENCE_TYPE_CONSTRUCTOR_MISMATCH.on(reference, inferenceErrorData));
}
else if (inferenceErrorData.constraintsSystem.hasConflictingConstraints()) {
trace.report(TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS.on(reference, inferenceErrorData));
}
else {
assert inferenceErrorData.constraintsSystem.hasUnknownParameters();
trace.report(TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER.on(reference, inferenceErrorData));
}
}
@Override
public void upperBoundViolated(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData) {
trace.report(Errors.TYPE_INFERENCE_UPPER_BOUND_VIOLATED.on(reference, inferenceErrorData));
}
}; };
} }
@@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.inference.InferenceErrorData;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -81,7 +82,14 @@ import java.util.List;
@Override @Override
public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor) {} public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor) {}
@Override
public void typeInferenceFailed(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData) {}
@Override
public void upperBoundViolated(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData) {}
}; };
<D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall); <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall);
<D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall); <D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall);
@@ -113,4 +121,8 @@ import java.util.List;
void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List<JetExpression> functionLiteralArguments); void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List<JetExpression> functionLiteralArguments);
void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor); void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor);
void typeInferenceFailed(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData);
void upperBoundViolated(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData);
} }
@@ -18,9 +18,9 @@ class C {
fun p() : Resource? = null fun p() : Resource? = null
fun bar() { fun bar() {
<!TYPE_INFERENCE_UPPER_BOUND_VIOLATED!>foo(p()) { <!TYPE_INFERENCE_UPPER_BOUND_VIOLATED!>foo<!>(p()) {
}<!> }
} }
} }