From 5edfc6e2eb02e644288bd2093ba3b916e2ef2c0c Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 18 Jul 2012 23:00:05 +0400 Subject: [PATCH] 'reportTypeInferenceFailed' moved to tracing --- .../jet/lang/resolve/calls/CallResolver.java | 46 +++++++------------ .../lang/resolve/calls/ResolutionStatus.java | 2 +- .../lang/resolve/calls/ResolutionTask.java | 25 ++++++++++ .../lang/resolve/calls/TracingStrategy.java | 12 +++++ .../tests/regressions/kt1489_1728.kt | 4 +- 5 files changed, 56 insertions(+), 33 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index ef0e8b5db76..84f8a23c4d9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -318,7 +318,7 @@ public class CallResolver { } continue; } - completeTypeInferenceDependentOnExpectedTypeForCall(resolvedCall, context, successful, failed); + completeTypeInferenceDependentOnExpectedTypeForCall(resolvedCall, context, tracing, successful, failed); } if (results.getResultingCalls().size() > 1) { for (ResolvedCallWithTrace call : successful) { @@ -329,16 +329,15 @@ public class CallResolver { } successful.clear(); } - if (tracing == null) { - return results; - } return computeResultAndReportErrors(context.trace, tracing, successful, failed); } private void completeTypeInferenceDependentOnExpectedTypeForCall(ResolvedCallImpl resolvedCall, BasicResolutionContext context, + TracingStrategy tracing, Set> successful, - Set> failed) { + Set> failed + ) { assert resolvedCall.hasUnknownTypeParameters(); D descriptor = resolvedCall.getCandidateDescriptor(); ConstraintsSystem constraintsSystem = resolvedCall.getConstraintsSystem(); @@ -365,8 +364,8 @@ public class CallResolver { if (!constraintsSystem.isSuccessful()) { List argumentTypes = checkValueArgumentTypes(context, resolvedCall, context.trace).argumentTypes; JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null; - reportTypeInferenceFailed(context.trace, context.call, InferenceErrorData.create(descriptor, constraintsSystem, - argumentTypes, receiverType)); + tracing.typeInferenceFailed(context.trace, + InferenceErrorData.create(descriptor, constraintsSystem, argumentTypes, receiverType)); resolvedCall.addStatus(ResolutionStatus.TYPE_INFERENCE_ERROR); failed.add(resolvedCall); return; @@ -380,7 +379,7 @@ public class CallResolver { // Here we type check the arguments with inferred types expected checkValueArgumentTypes(context, resolvedCall, context.trace); - checkBounds(resolvedCall, constraintsSystem, context); + checkBounds(resolvedCall, constraintsSystem, context.trace, tracing); resolvedCall.setHasUnknownTypeParameters(false); if (resolvedCall.getStatus().isSuccess() || resolvedCall.getStatus() == ResolutionStatus.UNKNOWN_STATUS) { resolvedCall.addStatus(ResolutionStatus.SUCCESS); @@ -391,28 +390,15 @@ public class CallResolver { } } - private void reportTypeInferenceFailed(@NotNull BindingTrace trace, @NotNull Call call, @NotNull InferenceErrorData inferenceErrorData) { - assert !inferenceErrorData.constraintsSystem.isSuccessful(); - if (inferenceErrorData.constraintsSystem.hasErrorInConstrainingTypes()) return; - JetExpression calleeExpression = call.getCalleeExpression(); - PsiElement element = calleeExpression != null ? calleeExpression : call.getCallElement(); - 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 void checkBounds(ResolvedCallImpl call, ConstraintsSystem constraintsSystem, BasicResolutionContext context) { + private void checkBounds( + @NotNull ResolvedCallImpl call, + @NotNull ConstraintsSystem constraintsSystem, + @NotNull BindingTrace trace, + @NotNull TracingStrategy tracing + ) { for (TypeParameterDescriptor typeParameter : call.getCandidateDescriptor().getTypeParameters()) { if (!ConstraintsUtil.checkUpperBoundIsSatisfied(constraintsSystem, typeParameter)) { - context.trace.report(Errors.TYPE_INFERENCE_UPPER_BOUND_VIOLATED.on(context.call.getCallElement(), InferenceErrorData - .create(call.getCandidateDescriptor(), constraintsSystem))); + tracing.upperBoundViolated(trace, InferenceErrorData.create(call.getCandidateDescriptor(), constraintsSystem)); } } } @@ -774,8 +760,8 @@ public class CallResolver { ResolutionStatus argumentsStatus = checkingResult.status; List argumentTypes = checkingResult.argumentTypes; JetType receiverType = candidateCall.getReceiverArgument().exists() ? candidateCall.getReceiverArgument().getType() : null; - reportTypeInferenceFailed(context.trace, context.call, InferenceErrorData.create(candidate, - constraintsBuilderWithRightTypeParameters, argumentTypes, receiverType)); + context.tracing.typeInferenceFailed(context.trace, + InferenceErrorData.create(candidate, constraintsBuilderWithRightTypeParameters, argumentTypes, receiverType)); return TYPE_INFERENCE_ERROR.combine(argumentsStatus); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionStatus.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionStatus.java index dc81c7f0d78..060299446ea 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionStatus.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionStatus.java @@ -26,7 +26,7 @@ public enum ResolutionStatus { UNSAFE_CALL_ERROR, OTHER_ERROR, STRONG_ERROR, - TYPE_INFERENCE_ERROR, + TYPE_INFERENCE_ERROR, //todo remove SUCCESS(true); @SuppressWarnings("unchecked") diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java index 5ef4c6677db..ab98e68add0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolutionTask.java @@ -23,9 +23,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; 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.resolve.BindingTrace; 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.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; @@ -229,5 +231,28 @@ public class ResolutionTask extends R public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor) { 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)); + } }; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java index bcb415d8963..bd36a80cac3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TracingStrategy.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.JetExpression; 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.types.JetType; @@ -81,7 +82,14 @@ import java.util.List; @Override 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) {} }; + void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall); void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace resolvedCall); @@ -113,4 +121,8 @@ import java.util.List; void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List functionLiteralArguments); void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor descriptor); + + void typeInferenceFailed(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData); + + void upperBoundViolated(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData); } diff --git a/compiler/testData/diagnostics/tests/regressions/kt1489_1728.kt b/compiler/testData/diagnostics/tests/regressions/kt1489_1728.kt index 1b707dee2d3..c97a10a9c7f 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt1489_1728.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt1489_1728.kt @@ -18,9 +18,9 @@ class C { fun p() : Resource? = null fun bar() { - foo(p()) { + foo(p()) { - } + } } }