KT-287 Infer constructor type arguments
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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<FunctionDescriptor> 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<FunctionDescriptor>(TaskPrioritizer.convertWithImpliedThis(scope, Collections.<ReceiverDescriptor>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<FunctionDescriptor> 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);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
// KT-287 Infer constructor type arguments
|
||||
import java.util.*
|
||||
|
||||
fun attributes() : Map<String, String> = HashMap() // Should be inferred;
|
||||
val attributes : Map<String, String> = HashMap() // Should be inferred;
|
||||
Reference in New Issue
Block a user