syntax: local variable assignment always cast
authorJean Privat <jean@pryen.org>
Mon, 22 Jun 2009 18:53:02 +0000 (14:53 -0400)
committerJean Privat <jean@pryen.org>
Wed, 24 Jun 2009 19:48:18 +0000 (15:48 -0400)
example:
  var a: A
  a = new B
  a.only_B_stuff # OK since the casted type of a is now B

Signed-off-by: Jean Privat <jean@pryen.org>

src/syntax/typing.nit
tests/test_id.nit
tests/test_isa.nit

index ec0a2f4..5525907 100644 (file)
@@ -587,8 +587,8 @@ redef class AVarAssignExpr
                var btype = v.base_variable_ctx.stype(variable)
                if not v.check_conform_expr(n_value, btype) then return
 
-               # Bypasse cast if then current type does not match
-               if not n_value.stype < t then v.variable_ctx.stype(variable) = btype
+               # Always cast
+               v.variable_ctx.stype(variable) = n_value.stype
 
                _is_typed = true
        end
@@ -634,8 +634,8 @@ redef class AVarReassignExpr
                var btype = v.base_variable_ctx.stype(variable)
                if not v.check_conform(n_value, t2, btype) then return
 
-               # Bypasse cast if then current type does not match
-               if not t2 < t then v.variable_ctx.stype(variable) = btype
+               # Always cast
+               v.variable_ctx.stype(variable) = t2
 
                _is_typed = true
        end
index 5207fc1..3b20c87 100644 (file)
@@ -20,7 +20,7 @@ class C
        init do end
 end
 
-var an: Object
+
 var c = new C
 var i = 5
 var a = [c]
@@ -32,30 +32,30 @@ var id4: Int
 
 id1 = c.object_id
 print(c.object_id == id1)
-an = c
-print(an.object_id == id1)
+var an1: Object = c
+print(an1.object_id == id1)
 print((new C).object_id != id1)
 printn('\n')
 
 id2 = i.object_id
 print(id1 != id2)
 print(i.object_id == id2)
-an = i
-print(an.object_id == id2)
+var an2: Object = i
+print(an2.object_id == id2)
 print(5.object_id == id2)
 printn('\n')
 
 id3 = a.object_id
 print(id1 != id3 and id2 != id3)
 print(a.object_id == id3)
-an = a
-print(an.object_id == id3)
+var an3: Object = a
+print(an3.object_id == id3)
 print([c].object_id != id3)
 printn('\n')
 
 id4 = s.object_id
 print(id1 != id4 and id2 != id4 and id3 != id4)
 print(s.object_id == id4)
-an = s
-print(an.object_id == id4)
+var an4: Object = s
+print(an4.object_id == id4)
 print("Bonjour".object_id != id4)
index 318a945..ab3ba79 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-var a : Object
+
 print("int:")
-a = 5
-print(a isa Int)
-print(not a isa String)
-print(not a isa AbstractArray[Char])
-print(not a isa Iterator[Int])
-print(a isa Discrete)
-print(a isa Object)
+var a1: Object = 5
+print(a1 isa Int)
+print(not a1 isa String)
+print(not a1 isa AbstractArray[Char])
+print(not a1 isa Iterator[Int])
+print(a1 isa Discrete)
+print(a1 isa Object)
 
 print("string:")
-a = "Bonjour"
-print(not a isa Int)
-print(a isa String)
-print(a isa AbstractArrayRead[Char])
-print(not a isa Iterator[Int])
-print(not a isa Discrete)
-print(a isa Object)
+var a2: Object = "Bonjour"
+print(not a2 isa Int)
+print(a2 isa String)
+print(a2 isa AbstractArrayRead[Char])
+print(not a2 isa Iterator[Int])
+print(not a2 isa Discrete)
+print(a2 isa Object)
 
 print("null:")
-a = null
-print(a isa Int)
-print(a isa String)
-print(a isa AbstractArray[Char])
-print(a isa Iterator[Int])
-print(a isa Discrete)
-print(a isa Object)
+var a3: Object = null
+print(a3 isa Int)
+print(a3 isa String)
+print(a3 isa AbstractArray[Char])
+print(a3 isa Iterator[Int])
+print(a3 isa Discrete)
+print(a3 isa Object)