diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java index b7198394d41..7b209efca3c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPropertyAccessor.java @@ -57,7 +57,7 @@ public class JetPropertyAccessor extends JetDeclaration implements JetDeclaratio @Override public boolean hasDeclaredReturnType() { - return false; + return true; } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 2b0b2645e6a..0dd4363ef93 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -537,8 +537,8 @@ public class ClassDescriptorResolver { type = typeResolver.resolveType(scope, typeReference); JetType inType = propertyDescriptor.getInType(); if (inType != null) { - if (!semanticServices.getTypeChecker().isSubtypeOf(type, inType)) { - trace.getErrorHandler().genericError(typeReference.getNode(), "Setter parameter type must be a subtype of the type of the property, i.e. " + inType); + if (!semanticServices.getTypeChecker().equalTypes(type, inType)) { + trace.getErrorHandler().genericError(typeReference.getNode(), "Setter parameter type must be equal to the type of the property, i.e. " + inType); } } else { @@ -572,10 +572,14 @@ public class ClassDescriptorResolver { if (getter != null) { List annotations = annotationResolver.resolveAnnotations(scope, getter.getModifierList()); - JetType returnType = null; + JetType outType = propertyDescriptor.getOutType(); + JetType returnType = outType; JetTypeReference returnTypeReference = getter.getReturnTypeReference(); if (returnTypeReference != null) { returnType = typeResolver.resolveType(scope, returnTypeReference); + if (outType != null && !semanticServices.getTypeChecker().equalTypes(returnType, outType)) { + trace.getErrorHandler().genericError(returnTypeReference.getNode(), "Getter return type must be equal to the type of the property, i.e. " + propertyDescriptor.getReturnType()); + } } getterDescriptor = new PropertyGetterDescriptor( diff --git a/idea/testData/checker/regression/kt251.jet b/idea/testData/checker/regression/kt251.jet new file mode 100644 index 00000000000..5a7e562057c --- /dev/null +++ b/idea/testData/checker/regression/kt251.jet @@ -0,0 +1,33 @@ +class A() { + var x: Int = 0 + get() = "s" + set(value: String) { + $x = value + } + val y: Int + get(): String = "s" + val z: Int + get() { + return "s" + } + + var a: Any = 1 + set(v: String) { + $a = v + } + val b: Int + get(): Any = "s" + val c: Int + get() { + return 1 + } + val d = 1 + get() { + return $d + } + val e = 1 + get(): String { + return $e + } + +} \ No newline at end of file