From 681d979a8d3042a8bd455daded792352cc276d7a Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 15 Mar 2011 19:43:11 +0300 Subject: [PATCH] Equals --- .../jet/lang/types/JetTypeInferrer.java | 16 +++++++++++----- .../resolve/ResolveOfInfixExpressions.jet | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index fa59443e0c1..65b5f93f25a 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -599,14 +599,20 @@ public class JetTypeInferrer { result = assignmentOperationType; } } - else { - if (counterpartType == null) { - semanticServices.getErrorHandler().unresolvedReference(operationSign); + } + else if (equalsOperations.contains(operationType)) { + JetType equalsType = getTypeForBinaryCall(expression, "equals", scope, true); + if (equalsType != null) { + // TODO : Relax? + TypeConstructor booleanTypeConstructor = semanticServices.getStandardLibrary().getBoolean().getTypeConstructor(); + if (!equalsType.getConstructor().equals(booleanTypeConstructor)) { + semanticServices.getErrorHandler().structuralError(operationSign.getNode(), "'equals' must return Boolean but returns " + equalsType); } else { - result = counterpartType; + result = equalsType; } } - } else { + } + else { semanticServices.getErrorHandler().structuralError(operationSign.getNode(), "Unknown operation"); } } diff --git a/idea/testData/resolve/ResolveOfInfixExpressions.jet b/idea/testData/resolve/ResolveOfInfixExpressions.jet index 7b525f95ee2..c8c2f5a82b8 100644 --- a/idea/testData/resolve/ResolveOfInfixExpressions.jet +++ b/idea/testData/resolve/ResolveOfInfixExpressions.jet @@ -9,6 +9,7 @@ import util.* ~div~fun div(t : String) : Int {} ~mod~fun mod(t : String) : Int {} ~rangeTo~fun rangeTo(t : String) : Int {} + ~==~fun equals(a : Any?) : Boolean {} } ~t~fun <~t.T~T> t(~t.t~t : `t.T`T) : `t.T`T { @@ -26,6 +27,8 @@ import util.* x `div`/ "" x `mod`% "" x `rangeTo`.. "" + x `==`== "" + x `==`!= 1 } ~Foo~class Foo {