From 0c492ae0eb0cf6aff212d0de3bfcaf8826a64115 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 9 Nov 2011 21:48:36 +0300 Subject: [PATCH] KT-287 Infer constructor type arguments --- .../jet/lang/resolve/BodyResolver.java | 21 ++++++++++--------- .../jet/lang/resolve/calls/CallResolver.java | 15 +------------ .../CompileTimeConstantResolver.java | 2 +- .../full/regression/kt287.jet | 5 +++++ 4 files changed, 18 insertions(+), 25 deletions(-) create mode 100644 compiler/testData/checkerWithErrorTypes/full/regression/kt287.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index b5f70ccfbe2..b360e44faf3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -484,16 +484,17 @@ public class BodyResolver { private void resolvePropertyInitializer(JetProperty property, PropertyDescriptor propertyDescriptor, JetExpression initializer, JetScope scope) { //JetFlowInformationProvider flowInformationProvider = context.getClassDescriptorResolver().computeFlowData(property, initializer); // TODO : flow JET-15 ExpressionTypingServices typeInferrer = context.getSemanticServices().getTypeInferrerServices(traceForConstructors); - JetType type = typeInferrer.getType(getPropertyDeclarationInnerScope(scope, propertyDescriptor), initializer, NO_EXPECTED_TYPE); - - JetType expectedType = propertyDescriptor.getInType(); - if (expectedType == null) { - expectedType = propertyDescriptor.getOutType(); - } - if (type != null && expectedType != null - && !context.getSemanticServices().getTypeChecker().isSubtypeOf(type, expectedType)) { - context.getTrace().report(TYPE_MISMATCH.on(initializer, expectedType, type)); - } + JetType expectedTypeForInitializer = property.getPropertyTypeRef() != null ? propertyDescriptor.getOutType() : NO_EXPECTED_TYPE; + JetType type = typeInferrer.getType(getPropertyDeclarationInnerScope(scope, propertyDescriptor), initializer, expectedTypeForInitializer); +// +// JetType expectedType = propertyDescriptor.getInType(); +// if (expectedType == null) { +// expectedType = propertyDescriptor.getOutType(); +// } +// if (type != null && expectedType != null +// && !context.getSemanticServices().getTypeChecker().isSubtypeOf(type, expectedType)) { +//// context.getTrace().report(TYPE_MISMATCH.on(initializer, expectedType, type)); +// } } private void resolveFunctionBodies() { 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 741424efbab..6047be04453 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 @@ -52,11 +52,8 @@ public class CallResolver { public VariableDescriptor resolveSimpleProperty( @NotNull BindingTrace trace, @NotNull JetScope scope, -// @NotNull ReceiverDescriptor receiver, -// @NotNull final JetSimpleNameExpression nameExpression, - @NotNull Call call, + @NotNull Call call, @NotNull JetType expectedType) { -// Call call = CallMaker.makePropertyCall(receiver, null, nameExpression); JetExpression calleeExpression = call.getCalleeExpression(); assert calleeExpression instanceof JetSimpleNameExpression; JetSimpleNameExpression nameExpression = (JetSimpleNameExpression) calleeExpression; @@ -116,7 +113,6 @@ public class CallResolver { if (descriptor instanceof ConstructorDescriptor) { Modality modality = ((ConstructorDescriptor) descriptor).getContainingDeclaration().getModality(); if (modality == Modality.ABSTRACT) { -// tracing.reportOverallResolutionError(trace, "Can not create an instance of an abstract class"); tracing.instantiationOfAbstractClass(trace); return false; } @@ -149,14 +145,12 @@ public class CallResolver { ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor; Set constructors = classDescriptor.getConstructors(); if (constructors.isEmpty()) { -// trace.getErrorHandler().genericError(reportAbsenceOn, "This class does not have a constructor"); trace.report(NO_CONSTRUCTOR.on(reportAbsenceOn)); return checkArgumentTypesAndFail(trace, scope, call); } prioritizedTasks.add(new ResolutionTask(TaskPrioritizer.convertWithImpliedThis(scope, Collections.singletonList(NO_RECEIVER), constructors), call, DataFlowInfo.EMPTY)); } else { -// trace.getErrorHandler().genericError(calleeExpression.getNode(), "Not a class"); trace.report(NOT_A_CLASS.on(calleeExpression)); return checkArgumentTypesAndFail(trace, scope, call); } @@ -169,7 +163,6 @@ public class CallResolver { Set constructors = classDescriptor.getConstructors(); if (constructors.isEmpty()) { -// trace.getErrorHandler().genericError(reportAbsenceOn, "This class does not have a constructor"); trace.report(NO_CONSTRUCTOR.on(reportAbsenceOn)); return checkArgumentTypesAndFail(trace, scope, call); } @@ -296,11 +289,9 @@ public class CallResolver { public void wrongNumberOfTypeArguments(@NotNull BindingTrace trace, int expectedTypeArgumentCount) { JetTypeArgumentList typeArgumentList = call.getTypeArgumentList(); if (typeArgumentList != null) { -// trace.getErrorHandler().genericError(typeArgumentList.getNode(), message); trace.report(WRONG_NUMBER_OF_TYPE_ARGUMENTS.on(typeArgumentList, expectedTypeArgumentCount)); } else { -// reportOverallResolutionError(trace, message); trace.report(WRONG_NUMBER_OF_TYPE_ARGUMENTS.on(reference, expectedTypeArgumentCount)); } } @@ -439,8 +430,6 @@ public class CallResolver { } } -// checkReceiverAbsence(candidateCall, tracing, candidate); - // Error is already reported if something is missing ReceiverDescriptor receiverParameter = candidateCall.getReceiverArgument(); ReceiverDescriptor candidateReceiver = candidate.getReceiverParameter(); @@ -453,7 +442,6 @@ public class CallResolver { } ConstraintSystemSolution solution = constraintSystem.solve(); -// solutions.put(candidate, solution); if (solution.isSuccessful()) { D substitute = (D) candidate.substitute(solution.getSubstitutor()); assert substitute != null; @@ -506,7 +494,6 @@ public class CallResolver { } else { candidateCall.setStatus(OTHER_ERROR); -// tracing.reportWrongTypeArguments(temporaryTrace, "Number of type arguments does not match " + DescriptorRenderer.TEXT.render(candidate)); tracing.wrongNumberOfTypeArguments(temporaryTrace, expectedTypeArgumentCount); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java index fb164fda388..526bb6d3db0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/constants/CompileTimeConstantResolver.java @@ -260,7 +260,7 @@ public class CompileTimeConstantResolver { } private boolean noExpectedType(JetType expectedType) { - return expectedType == TypeUtils.NO_EXPECTED_TYPE || JetStandardClasses.isUnit(expectedType); + return expectedType == TypeUtils.NO_EXPECTED_TYPE || JetStandardClasses.isUnit(expectedType) || ErrorUtils.isErrorType(expectedType); } } diff --git a/compiler/testData/checkerWithErrorTypes/full/regression/kt287.jet b/compiler/testData/checkerWithErrorTypes/full/regression/kt287.jet new file mode 100644 index 00000000000..e6f5ff1aeb0 --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/full/regression/kt287.jet @@ -0,0 +1,5 @@ +// KT-287 Infer constructor type arguments +import java.util.* + +fun attributes() : Map = HashMap() // Should be inferred; +val attributes : Map = HashMap() // Should be inferred;