diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
index 92172e76d6e..45a1de09bfd 100644
--- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
+++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
@@ -576,6 +576,7 @@ public class JetControlFlowProcessor {
IElementType operationType = expression.getOperationSign().getReferencedNameElementType();
if (operationType == JetTokens.COLON || operationType == JetTokens.AS_KEYWORD || operationType == JetTokens.AS_SAFE) {
value(expression.getLeft(), false, false);
+ builder.read(expression);
}
else {
visitJetElement(expression);
diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java
index 3fc111e4325..0319a18403c 100644
--- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java
+++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java
@@ -187,6 +187,9 @@ public class ClassDescriptorResolver {
if (returnTypeRef != null) {
returnType = typeResolver.resolveType(innerScope, returnTypeRef);
}
+ else if (function.hasBlockBody()) {
+ returnType = JetStandardClasses.getUnitType();
+ }
else {
final JetExpression bodyExpression = function.getBodyExpression();
if (bodyExpression != null) {
diff --git a/idea/testData/checker/FunctionReturnTypes.jet b/idea/testData/checker/FunctionReturnTypes.jet
index 3de291b3c2d..7f20a2b69e4 100644
--- a/idea/testData/checker/FunctionReturnTypes.jet
+++ b/idea/testData/checker/FunctionReturnTypes.jet
@@ -1,4 +1,4 @@
-fun none()
+fun none()
fun unitEmptyInfer() {}
fun unitEmpty() : Unit {}
@@ -12,7 +12,7 @@ fun unitShortNull() : Unit = null
fun intEmpty() : Int {}
fun intShortInfer() = 1
fun intShort() : Int = 1
-fun intBlockInfer() {1}
+//fun intBlockInfer() {1}
fun intBlock() : Int {1}
fun blockReturnUnitMismatch() : Int {return}
diff --git a/idea/testData/checker/Objects.jet b/idea/testData/checker/Objects.jet
index 4837a57408e..66f21030719 100644
--- a/idea/testData/checker/Objects.jet
+++ b/idea/testData/checker/Objects.jet
@@ -8,7 +8,7 @@ namespace toplevelObjectDeclarations {
object A : Foo {
val x : Int = 2
- fun test() {
+ fun test() : Int {
return x + foo()
}
}
diff --git a/idea/testData/checker/UnreachableCode.jet b/idea/testData/checker/UnreachableCode.jet
index 9b88d958a92..2b6d9731365 100644
--- a/idea/testData/checker/UnreachableCode.jet
+++ b/idea/testData/checker/UnreachableCode.jet
@@ -1,59 +1,59 @@
-fun t1() {
- return
+fun t1() : Int{
+ return 0
1
}
-fun t1a() {
- return
+fun t1a() : Int {
return
- 1
-}
-
-fun t1b() {
- return
return 1
1
}
-fun t1c() {
+fun t1b() : Int {
+ return 1
+ return 1
+ 1
+}
+
+fun t1c() : Int {
return 1
return
1
}
-fun t2() {
+fun t2() : Int {
if (1 > 2)
- return
- else return
+ return 1
+ else return 1
1
}
-fun t2a() {
+fun t2a() : Int {
if (1 > 2) {
- return
+ return 1
1
- } else { return
+ } else { return 1
2
}
1
}
-fun t3() {
+fun t3() : Any {
if (1 > 2)
return 2
else return ""
1
}
-fun t4(a : Boolean) {
+fun t4(a : Boolean) : Int {
do {
- return
+ return 1
}
while (a)
1
}
-fun t4break(a : Boolean) {
+fun t4break(a : Boolean) : Int {
do {
break
}
@@ -61,24 +61,24 @@ fun t4break(a : Boolean) {
1
}
-fun t5() {
+fun t5() : Int {
do {
- return
+ return 1
2
}
while (1 > 2)
1
}
-fun t6() {
+fun t6() : Int {
while (1 > 2) {
- return
+ return 1
2
}
1
}
-fun t6break() {
+fun t6break() : Int {
while (1 > 2) {
break
2
@@ -86,25 +86,25 @@ fun t6break() {
1
}
-fun t7(b : Int) {
+fun t7(b : Int) : Int {
for (i in 1..b) {
- return
+ return 1
2
}
1
}
-fun t7break(b : Int) {
+fun t7break(b : Int) : Int {
for (i in 1..b) {
- return
+ return 1
2
}
1
}
-fun t7() {
+fun t7() : Int {
try {
- return
+ return 1
2
}
catch (e : Any) {
@@ -113,13 +113,13 @@ fun t7() {
1 // this is OK, like in Java
}
-fun t8() {
+fun t8() : Int {
try {
- return
+ return 1
2
}
catch (e : Any) {
- return
+ return 1
2
}
1
@@ -130,12 +130,12 @@ fun blockAndAndMismatch() : Boolean {
true
}
-fun tf() {
- try {return} finally{return}
+fun tf() : Int {
+ try {return 1} finally{return 1}
1
}
-fun failtest(a : Int) {
+fun failtest(a : Int) : Int {
if (fail() || true) {
}
diff --git a/idea/testData/checker/When.jet b/idea/testData/checker/When.jet
index 7e71b08b5b3..34d83e363a5 100644
--- a/idea/testData/checker/When.jet
+++ b/idea/testData/checker/When.jet
@@ -1,4 +1,4 @@
-fun foo() {
+fun foo() : Int {
val s = ""
val x = 1
when (x) {
diff --git a/idea/testData/codegen/classes/inheritedInnerClass.jet b/idea/testData/codegen/classes/inheritedInnerClass.jet
index 1ea358a6ccf..54a7b4bb78c 100644
--- a/idea/testData/codegen/classes/inheritedInnerClass.jet
+++ b/idea/testData/codegen/classes/inheritedInnerClass.jet
@@ -8,7 +8,7 @@ class Outer() {
public val foo: InnerBase? = InnerDerived()
}
-fun box() {
+fun box() : String {
val o = Outer()
return if (o.foo === null) "fail" else "OK"
}
diff --git a/idea/testData/codegen/classes/inheritedMethod.jet b/idea/testData/codegen/classes/inheritedMethod.jet
index 82474b9df72..1005cd31be7 100644
--- a/idea/testData/codegen/classes/inheritedMethod.jet
+++ b/idea/testData/codegen/classes/inheritedMethod.jet
@@ -6,7 +6,7 @@ class Bar(): Foo {
fun test(): String = xyzzy()
}
-fun box() {
+fun box() : String {
val bar = Bar()
val f = bar.test()
return if (f == "xyzzy") "OK" else "fail"
diff --git a/idea/testData/codegen/classes/initializerBlockDImpl.jet b/idea/testData/codegen/classes/initializerBlockDImpl.jet
index 9b8f0af361a..aa3d227c80f 100644
--- a/idea/testData/codegen/classes/initializerBlockDImpl.jet
+++ b/idea/testData/codegen/classes/initializerBlockDImpl.jet
@@ -13,7 +13,7 @@ class World() {
val foo = Item()
}
-fun box() {
+fun box() : String {
val w = World()
if (w.items.size() != 1) return "fail"
return "OK"
diff --git a/idea/testData/codegen/classes/innerClass.jet b/idea/testData/codegen/classes/innerClass.jet
index 6bd9f964929..df43f61e8bc 100644
--- a/idea/testData/codegen/classes/innerClass.jet
+++ b/idea/testData/codegen/classes/innerClass.jet
@@ -1,16 +1,16 @@
class Outer(val foo: StringBuilder) {
class Inner() {
- fun len() {
+ fun len() : Int {
return foo.length()
}
}
- fun test() {
+ fun test() : Inner {
return Inner()
}
}
-fun box(): String {
+fun box() : String {
val sb = StringBuilder("xyzzy")
val o = Outer(sb)
val i = o.test()
diff --git a/idea/testData/codegen/classes/newInstanceDefaultConstructor.jet b/idea/testData/codegen/classes/newInstanceDefaultConstructor.jet
index 0bea20be66b..2e91e8ea973 100644
--- a/idea/testData/codegen/classes/newInstanceDefaultConstructor.jet
+++ b/idea/testData/codegen/classes/newInstanceDefaultConstructor.jet
@@ -2,7 +2,7 @@ class SimpleClass() {
fun foo() = 610
}
-fun test() {
+fun test() : Int {
val c = SimpleClass()
return c.foo()
}
diff --git a/idea/testData/codegen/classes/outerThis.jet b/idea/testData/codegen/classes/outerThis.jet
index 29f8752813b..61642ffa2e2 100644
--- a/idea/testData/codegen/classes/outerThis.jet
+++ b/idea/testData/codegen/classes/outerThis.jet
@@ -6,7 +6,7 @@ class Outer() {
public val x = Inner()
}
-fun box() {
+fun box() : String {
val o = Outer()
return if (o === o.x.outer) "OK" else "fail"
}
diff --git a/idea/testData/codegen/classes/propertyInInitializer.jet b/idea/testData/codegen/classes/propertyInInitializer.jet
index 5d4ff9ce25e..824da2313aa 100644
--- a/idea/testData/codegen/classes/propertyInInitializer.jet
+++ b/idea/testData/codegen/classes/propertyInInitializer.jet
@@ -10,7 +10,7 @@ class Outer() {
public val x = InnerDerived()
}
-fun box() {
+fun box() : String {
val o = Outer()
return if (o.x.name != "xyzzy") "fail" else "OK"
}
diff --git a/idea/testData/codegen/classes/simpleClass.jet b/idea/testData/codegen/classes/simpleClass.jet
index 116684dac3b..e860e6e0e0b 100644
--- a/idea/testData/codegen/classes/simpleClass.jet
+++ b/idea/testData/codegen/classes/simpleClass.jet
@@ -1,5 +1,5 @@
class SimpleClass {
- fun foo() {
+ fun foo() : Int {
return 0;
}
}
diff --git a/idea/testData/codegen/functionCall.jet b/idea/testData/codegen/functionCall.jet
index 678bebfd1ab..6205f16638f 100644
--- a/idea/testData/codegen/functionCall.jet
+++ b/idea/testData/codegen/functionCall.jet
@@ -1,4 +1,4 @@
-fun f() {
+fun f() : String? {
val x = StringBuilder();
g(x);
return x.toString();
diff --git a/idea/testData/codegen/typeInfo/asSafeWithGenerics.jet b/idea/testData/codegen/typeInfo/asSafeWithGenerics.jet
index 2c86f25e8f3..8eec8607d61 100644
--- a/idea/testData/codegen/typeInfo/asSafeWithGenerics.jet
+++ b/idea/testData/codegen/typeInfo/asSafeWithGenerics.jet
@@ -1,8 +1,8 @@
class Wrapper() {
- fun castToSelf(wrapper: Any) = wrapper as? Wrapper
+ fun castToSelf(wrapper: Any) : Wrapper? = wrapper as? Wrapper
}
-fun foo() {
+fun foo() : Wrapper? {
val wrapper = Wrapper()
return wrapper.castToSelf(Wrapper())
}
diff --git a/idea/testData/codegen/typeInfo/isWithGenericParameters.jet b/idea/testData/codegen/typeInfo/isWithGenericParameters.jet
index 3faf3afb821..d40eb6e5540 100644
--- a/idea/testData/codegen/typeInfo/isWithGenericParameters.jet
+++ b/idea/testData/codegen/typeInfo/isWithGenericParameters.jet
@@ -2,7 +2,7 @@ class Wrapper() {
fun isSameWrapper(wrapper: Any) = wrapper is Wrapper
}
-fun foo() {
+fun foo() : Boolean {
val wrapper = Wrapper()
return wrapper.isSameWrapper(Wrapper())
}
diff --git a/idea/testData/codegen/typeInfo/isWithGenerics.jet b/idea/testData/codegen/typeInfo/isWithGenerics.jet
index fa8458f38cf..4481ede1b02 100644
--- a/idea/testData/codegen/typeInfo/isWithGenerics.jet
+++ b/idea/testData/codegen/typeInfo/isWithGenerics.jet
@@ -1,7 +1,7 @@
class Wrapper() {
}
-fun foo() {
+fun foo() : Boolean {
val wrapper = Wrapper()
return wrapper is Wrapper
}
diff --git a/idea/testData/codegen/typeInfo/typeOfOperator.jet b/idea/testData/codegen/typeInfo/typeOfOperator.jet
index b1ba1b372ec..93ee9dd699a 100644
--- a/idea/testData/codegen/typeInfo/typeOfOperator.jet
+++ b/idea/testData/codegen/typeInfo/typeOfOperator.jet
@@ -1,7 +1,7 @@
class Point() {
}
-fun foo() {
+fun foo() : typeinfo.TypeInfo {
val p = Point();
return typeof(p);
}
diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
index b3f4b0353b1..95093596439 100644
--- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
+++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
@@ -261,7 +261,7 @@ public class NamespaceGenTest extends CodegenTestCase {
}
public void testStringPlusEq() throws Exception {
- loadText("fun foo(s: String) { val result = s; result += s; return result; } ");
+ loadText("fun foo(s: String) : String { val result = s; result += s; return result; } ");
System.out.println(generateToText());
final Method main = generateFunction();
assertEquals("JarJar", main.invoke(null, "Jar"));