Type annotations required on functions

This commit is contained in:
Andrey Breslav
2011-06-15 21:21:19 +04:00
parent 317877d67a
commit 8786c6a667
20 changed files with 62 additions and 58 deletions
@@ -576,6 +576,7 @@ public class JetControlFlowProcessor {
IElementType operationType = expression.getOperationSign().getReferencedNameElementType(); IElementType operationType = expression.getOperationSign().getReferencedNameElementType();
if (operationType == JetTokens.COLON || operationType == JetTokens.AS_KEYWORD || operationType == JetTokens.AS_SAFE) { if (operationType == JetTokens.COLON || operationType == JetTokens.AS_KEYWORD || operationType == JetTokens.AS_SAFE) {
value(expression.getLeft(), false, false); value(expression.getLeft(), false, false);
builder.read(expression);
} }
else { else {
visitJetElement(expression); visitJetElement(expression);
@@ -187,6 +187,9 @@ public class ClassDescriptorResolver {
if (returnTypeRef != null) { if (returnTypeRef != null) {
returnType = typeResolver.resolveType(innerScope, returnTypeRef); returnType = typeResolver.resolveType(innerScope, returnTypeRef);
} }
else if (function.hasBlockBody()) {
returnType = JetStandardClasses.getUnitType();
}
else { else {
final JetExpression bodyExpression = function.getBodyExpression(); final JetExpression bodyExpression = function.getBodyExpression();
if (bodyExpression != null) { if (bodyExpression != null) {
@@ -1,4 +1,4 @@
<error>fun none()</error> fun none()
fun unitEmptyInfer() {} fun unitEmptyInfer() {}
fun unitEmpty() : Unit {} fun unitEmpty() : Unit {}
@@ -12,7 +12,7 @@ fun unitShortNull() : Unit = null
fun intEmpty() : Int <error>{}</error> fun intEmpty() : Int <error>{}</error>
fun intShortInfer() = 1 fun intShortInfer() = 1
fun intShort() : Int = 1 fun intShort() : Int = 1
fun intBlockInfer() {1} //fun intBlockInfer() {1}
fun intBlock() : Int {1} fun intBlock() : Int {1}
fun blockReturnUnitMismatch() : Int {<error>return</error>} fun blockReturnUnitMismatch() : Int {<error>return</error>}
+1 -1
View File
@@ -8,7 +8,7 @@ namespace toplevelObjectDeclarations {
object A : <error>Foo</error> { object A : <error>Foo</error> {
val x : Int = 2 val x : Int = 2
fun test() { fun test() : Int {
return x + foo() return x + foo()
} }
} }
+37 -37
View File
@@ -1,59 +1,59 @@
fun t1() { fun t1() : Int{
return return 0
<error>1</error> <error>1</error>
} }
fun t1a() { fun t1a() : Int {
return
<error>return</error> <error>return</error>
<error>1</error>
}
fun t1b() {
return
<error>return 1</error> <error>return 1</error>
<error>1</error> <error>1</error>
} }
fun t1c() { fun t1b() : Int {
return 1
<error>return 1</error>
<error>1</error>
}
fun t1c() : Int {
return 1 return 1
<error>return</error> <error>return</error>
<error>1</error> <error>1</error>
} }
fun t2() { fun t2() : Int {
if (1 > 2) if (1 > 2)
return return 1
else return else return 1
<error>1</error> <error>1</error>
} }
fun t2a() { fun t2a() : Int {
if (1 > 2) { if (1 > 2) {
return return 1
<error>1</error> <error>1</error>
} else { return } else { return 1
<error>2</error> <error>2</error>
} }
<error>1</error> <error>1</error>
} }
fun t3() { fun t3() : Any {
if (1 > 2) if (1 > 2)
return 2 return 2
else return "" else return ""
<error>1</error> <error>1</error>
} }
fun t4(a : Boolean) { fun t4(a : Boolean) : Int {
do { do {
return return 1
} }
while (<error>a</error>) while (<error>a</error>)
<error>1</error> <error>1</error>
} }
fun t4break(a : Boolean) { fun t4break(a : Boolean) : Int {
do { do {
break break
} }
@@ -61,24 +61,24 @@ fun t4break(a : Boolean) {
1 1
} }
fun t5() { fun t5() : Int {
do { do {
return return 1
<error>2</error> <error>2</error>
} }
while (<error>1 > 2</error>) while (<error>1 > 2</error>)
<error>1</error> <error>1</error>
} }
fun t6() { fun t6() : Int {
while (1 > 2) { while (1 > 2) {
return return 1
<error>2</error> <error>2</error>
} }
1 1
} }
fun t6break() { fun t6break() : Int {
while (1 > 2) { while (1 > 2) {
break break
<error>2</error> <error>2</error>
@@ -86,25 +86,25 @@ fun t6break() {
1 1
} }
fun t7(b : Int) { fun t7(b : Int) : Int {
for (i in 1..b) { for (i in 1..b) {
return return 1
<error>2</error> <error>2</error>
} }
1 1
} }
fun t7break(b : Int) { fun t7break(b : Int) : Int {
for (i in 1..b) { for (i in 1..b) {
return return 1
<error>2</error> <error>2</error>
} }
1 1
} }
fun t7() { fun t7() : Int {
try { try {
return return 1
<error>2</error> <error>2</error>
} }
catch (e : Any) { catch (e : Any) {
@@ -113,13 +113,13 @@ fun t7() {
1 // this is OK, like in Java 1 // this is OK, like in Java
} }
fun t8() { fun t8() : Int {
try { try {
return return 1
<error>2</error> <error>2</error>
} }
catch (e : Any) { catch (e : Any) {
return return 1
<error>2</error> <error>2</error>
} }
<error>1</error> <error>1</error>
@@ -130,12 +130,12 @@ fun blockAndAndMismatch() : Boolean {
<error>true</error> <error>true</error>
} }
fun tf() { fun tf() : Int {
try {<error>return</error>} finally{return} try {<error>return 1</error>} finally{return 1}
<error>1</error> <error>1</error>
} }
fun failtest(a : Int) { fun failtest(a : Int) : Int {
<error>if (fail() || true) { <error>if (fail() || true) {
}</error> }</error>
+1 -1
View File
@@ -1,4 +1,4 @@
fun foo() { fun foo() : Int {
val s = "" val s = ""
val x = 1 val x = 1
when (x) { when (x) {
@@ -8,7 +8,7 @@ class Outer() {
public val foo: InnerBase? = InnerDerived() public val foo: InnerBase? = InnerDerived()
} }
fun box() { fun box() : String {
val o = Outer() val o = Outer()
return if (o.foo === null) "fail" else "OK" return if (o.foo === null) "fail" else "OK"
} }
@@ -6,7 +6,7 @@ class Bar(): Foo {
fun test(): String = xyzzy() fun test(): String = xyzzy()
} }
fun box() { fun box() : String {
val bar = Bar() val bar = Bar()
val f = bar.test() val f = bar.test()
return if (f == "xyzzy") "OK" else "fail" return if (f == "xyzzy") "OK" else "fail"
@@ -13,7 +13,7 @@ class World() {
val foo = Item() val foo = Item()
} }
fun box() { fun box() : String {
val w = World() val w = World()
if (w.items.size() != 1) return "fail" if (w.items.size() != 1) return "fail"
return "OK" return "OK"
+3 -3
View File
@@ -1,16 +1,16 @@
class Outer(val foo: StringBuilder) { class Outer(val foo: StringBuilder) {
class Inner() { class Inner() {
fun len() { fun len() : Int {
return foo.length() return foo.length()
} }
} }
fun test() { fun test() : Inner {
return Inner() return Inner()
} }
} }
fun box(): String { fun box() : String {
val sb = StringBuilder("xyzzy") val sb = StringBuilder("xyzzy")
val o = Outer(sb) val o = Outer(sb)
val i = o.test() val i = o.test()
@@ -2,7 +2,7 @@ class SimpleClass() {
fun foo() = 610 fun foo() = 610
} }
fun test() { fun test() : Int {
val c = SimpleClass() val c = SimpleClass()
return c.foo() return c.foo()
} }
+1 -1
View File
@@ -6,7 +6,7 @@ class Outer() {
public val x = Inner() public val x = Inner()
} }
fun box() { fun box() : String {
val o = Outer() val o = Outer()
return if (o === o.x.outer) "OK" else "fail" return if (o === o.x.outer) "OK" else "fail"
} }
@@ -10,7 +10,7 @@ class Outer() {
public val x = InnerDerived() public val x = InnerDerived()
} }
fun box() { fun box() : String {
val o = Outer() val o = Outer()
return if (o.x.name != "xyzzy") "fail" else "OK" return if (o.x.name != "xyzzy") "fail" else "OK"
} }
@@ -1,5 +1,5 @@
class SimpleClass { class SimpleClass {
fun foo() { fun foo() : Int {
return 0; return 0;
} }
} }
+1 -1
View File
@@ -1,4 +1,4 @@
fun f() { fun f() : String? {
val x = StringBuilder(); val x = StringBuilder();
g(x); g(x);
return x.toString(); return x.toString();
@@ -1,8 +1,8 @@
class Wrapper<T>() { class Wrapper<T>() {
fun castToSelf(wrapper: Any) = wrapper as? Wrapper<T> fun castToSelf(wrapper: Any) : Wrapper<T>? = wrapper as? Wrapper<T>
} }
fun foo() { fun foo() : Wrapper<Int>? {
val wrapper = Wrapper<Int>() val wrapper = Wrapper<Int>()
return wrapper.castToSelf(Wrapper<String>()) return wrapper.castToSelf(Wrapper<String>())
} }
@@ -2,7 +2,7 @@ class Wrapper<T>() {
fun isSameWrapper(wrapper: Any) = wrapper is Wrapper<T> fun isSameWrapper(wrapper: Any) = wrapper is Wrapper<T>
} }
fun foo() { fun foo() : Boolean {
val wrapper = Wrapper<Int>() val wrapper = Wrapper<Int>()
return wrapper.isSameWrapper(Wrapper<String>()) return wrapper.isSameWrapper(Wrapper<String>())
} }
@@ -1,7 +1,7 @@
class Wrapper<T>() { class Wrapper<T>() {
} }
fun foo() { fun foo() : Boolean {
val wrapper = Wrapper<Int>() val wrapper = Wrapper<Int>()
return wrapper is Wrapper<String> return wrapper is Wrapper<String>
} }
@@ -1,7 +1,7 @@
class Point() { class Point() {
} }
fun foo() { fun foo() : typeinfo.TypeInfo<Point> {
val p = Point(); val p = Point();
return typeof(p); return typeof(p);
} }
@@ -261,7 +261,7 @@ public class NamespaceGenTest extends CodegenTestCase {
} }
public void testStringPlusEq() throws Exception { 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()); System.out.println(generateToText());
final Method main = generateFunction(); final Method main = generateFunction();
assertEquals("JarJar", main.invoke(null, "Jar")); assertEquals("JarJar", main.invoke(null, "Jar"));