From 469f02ef5a1739da0b48d02f7d87adc8cec74de5 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 15 Mar 2011 18:10:17 +0300 Subject: [PATCH] compareTo --- .../jet/lang/types/JetTypeInferrer.java | 20 +++++++++---------- .../resolve/ResolveOfInfixExpressions.jet | 5 ++++- .../jetbrains/jet/resolve/JetResolveTest.java | 1 + 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 94c11712c77..17be3a54bc2 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -567,17 +567,17 @@ public class JetTypeInferrer { result = null; // TODO : This is not an expression, in fact! } else if (comparisonOperations.contains(operationType)) { - JetExpression left = expression.getLeft(); - JetExpression deparenthesized = deparenthesize(left); - if (deparenthesized instanceof JetArrayAccessExpression) { - JetArrayAccessExpression arrayAccessExpression = (JetArrayAccessExpression) deparenthesized; - resolveArrayAccessToLValue(arrayAccessExpression, expression.getRight(), expression.getOperationReference()); + JetType compareToReturnType = getTypeForBinaryCall(expression, "compareTo", scope); + if (compareToReturnType != null) { + TypeConstructor constructor = compareToReturnType.getConstructor(); + JetStandardLibrary standardLibrary = semanticServices.getStandardLibrary(); + TypeConstructor intTypeConstructor = standardLibrary.getInt().getTypeConstructor(); + if (constructor.equals(intTypeConstructor)) { + result = standardLibrary.getBooleanType(); + } else { + semanticServices.getErrorHandler().structuralError(operationSign.getNode(), "compareTo must return Int, but returns " + compareToReturnType); + } } - else { - getType(scope, expression.getRight(), false); - //throw new UnsupportedOperationException(); - } - result = null; // TODO : This is not an expression, in fact! } else { semanticServices.getErrorHandler().structuralError(operationSign.getNode(), "Unknown operation"); } diff --git a/idea/testData/resolve/ResolveOfInfixExpressions.jet b/idea/testData/resolve/ResolveOfInfixExpressions.jet index b0e92bca501..4165b2ff506 100644 --- a/idea/testData/resolve/ResolveOfInfixExpressions.jet +++ b/idea/testData/resolve/ResolveOfInfixExpressions.jet @@ -59,5 +59,8 @@ fun tt(t : T) : T { `inc`++y `dec`--y y`dec`-- - + 1 `std::Int.compareTo(Double)`> 2.0 + 1 `std::Int.compareTo(Double)`< 2.0 + 1 `std::Int.compareTo(Double)`>= 2.0 + 1 `std::Int.compareTo(Double)`<= 2.0 } diff --git a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java index faca5442ed9..f7c68427baa 100644 --- a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java +++ b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java @@ -31,6 +31,7 @@ public class JetResolveTest extends ExtensibleResolveTestCase { nameToDescriptor.put("std::Int.plus(Int)", standardFunction(lib.getInt(), "plus", lib.getIntType())); FunctionDescriptor descriptorForGet = standardFunction(lib.getArray(), Collections.singletonList(new TypeProjection(lib.getIntType())), "get", lib.getIntType()); nameToDescriptor.put("std::Array.get(Int)", descriptorForGet.getOriginal()); + nameToDescriptor.put("std::Int.compareTo(Double)", standardFunction(lib.getInt(), "compareTo", lib.getDoubleType())); @NotNull FunctionDescriptor descriptorForSet = standardFunction(lib.getArray(), Collections.singletonList(new TypeProjection(lib.getIntType())), "set", lib.getIntType(), lib.getIntType()); nameToDescriptor.put("std::Array.set(Int, Int)", descriptorForSet.getOriginal());