From 8786c6a667002c03b0fa14b26de9cd924ff0cd35 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 15 Jun 2011 21:21:19 +0400 Subject: [PATCH] Type annotations required on functions --- .../jet/lang/cfg/JetControlFlowProcessor.java | 1 + .../lang/resolve/ClassDescriptorResolver.java | 3 + idea/testData/checker/FunctionReturnTypes.jet | 4 +- idea/testData/checker/Objects.jet | 2 +- idea/testData/checker/UnreachableCode.jet | 74 +++++++++---------- idea/testData/checker/When.jet | 2 +- .../codegen/classes/inheritedInnerClass.jet | 2 +- .../codegen/classes/inheritedMethod.jet | 2 +- .../codegen/classes/initializerBlockDImpl.jet | 2 +- idea/testData/codegen/classes/innerClass.jet | 6 +- .../classes/newInstanceDefaultConstructor.jet | 2 +- idea/testData/codegen/classes/outerThis.jet | 2 +- .../codegen/classes/propertyInInitializer.jet | 2 +- idea/testData/codegen/classes/simpleClass.jet | 2 +- idea/testData/codegen/functionCall.jet | 2 +- .../codegen/typeInfo/asSafeWithGenerics.jet | 4 +- .../typeInfo/isWithGenericParameters.jet | 2 +- .../codegen/typeInfo/isWithGenerics.jet | 2 +- .../codegen/typeInfo/typeOfOperator.jet | 2 +- .../jet/codegen/NamespaceGenTest.java | 2 +- 20 files changed, 62 insertions(+), 58 deletions(-) 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"));