diff --git a/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 50cb3ec88eb..9564e0018e2 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -520,6 +520,7 @@ public class CallResolver { } private boolean checkValueArgumentTypes(JetScope scope, JetTypeInferrer.Services temporaryServices, Map argumentsToParameters, Flag dirty, Function parameterMap) { + boolean result = true; for (Map.Entry entry : argumentsToParameters.entrySet()) { ValueArgument valueArgument = entry.getKey(); ValueParameterDescriptor valueParameterDescriptor = entry.getValue(); @@ -536,11 +537,11 @@ public class CallResolver { dirty.setValue(true); } else if (!semanticServices.getTypeChecker().isSubtypeOf(type, parameterType)) { - return false; + result = false; } } } - return true; + return result; } public void checkGenericBoundsInAFunctionCall(List jetTypeArguments, List typeArguments, CallableDescriptor functionDescriptor) { diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index e11ec200c06..74d0e4efcc3 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -658,6 +658,15 @@ public class JetTypeInferrer { return resultDataFlowInfo; } + @NotNull + public final JetType safeGetType(@NotNull JetExpression expression, TypeInferenceContext context) { + JetType type = getType(expression, context); + if (type != null) { + return type; + } + return ErrorUtils.createErrorType("Type for " + expression.getText()); + } + @Nullable public final JetType getType(@NotNull JetExpression expression, TypeInferenceContext context) { if (context.trace.get(BindingContext.PROCESSED, expression)) { @@ -2115,9 +2124,9 @@ public class JetTypeInferrer { @Override public JetType visitIsExpression(JetIsExpression expression, TypeInferenceContext contextWithExpectedType) { TypeInferenceContext context = contextWithExpectedType.replaceExpectedType(NO_EXPECTED_TYPE); - JetType knownType = getType(expression.getLeftHandSide(), context.replaceScope(context.scope)); + JetType knownType = safeGetType(expression.getLeftHandSide(), context.replaceScope(context.scope)); JetPattern pattern = expression.getPattern(); - if (pattern != null && knownType != null) { + if (pattern != null) { WritableScopeImpl scopeToExtend = newWritableScopeImpl(context.scope, context.trace).setDebugName("Scope extended in 'is'"); DataFlowInfo newDataFlowInfo = checkPatternType(pattern, knownType, scopeToExtend, context, context.services.getVariableDescriptorFromSimpleName(expression.getLeftHandSide(), context)); patternsToDataFlowInfo.put(pattern, newDataFlowInfo); @@ -2218,10 +2227,7 @@ public class JetTypeInferrer { else if (equalsOperations.contains(operationType)) { String name = "equals"; if (right != null) { - JetType leftType = getType(left, context.replaceScope(context.scope)); - if (leftType == null) { - leftType = ErrorUtils.createErrorType("No type for " + left.getText()); - } + JetType leftType = safeGetType(left, context.replaceScope(context.scope)); OverloadResolutionResult resolutionResult = context.services.callResolver.resolveExactSignature( context.scope, leftType, "equals", Collections.singletonList(JetStandardClasses.getNullableAnyType())); diff --git a/idea/testData/checker/Variance.jet b/idea/testData/checker/Variance.jet index 385dd5579f6..0f27cbc73ff 100644 --- a/idea/testData/checker/Variance.jet +++ b/idea/testData/checker/Variance.jet @@ -1,4 +1,4 @@ -package variance +namespace variance abstract class Consumer {} @@ -32,9 +32,9 @@ fun copy3(from : Array, to : Array) {} fun copy4(from : Array, to : Array) {} fun f(ints: Array, any: Array, numbers: Array) { - copy1(ints, any) + copy1(ints, any) copy2(ints, any) //ok - copy2(ints, numbers) + copy2(ints, numbers) copy3(ints, numbers) copy4(ints, numbers) //ok }