Commit 95c58f2
committed
compiler: add variable type annotations and flow-sensitive type checks
Rugo now catches more type mistakes at compile time, before you run
your program.
Variable type annotations
You can now annotate local variables, the same way you already annotate
function parameters and return types:
name : string = "alice"
count : int = 0
The annotation sticks for the rest of the scope. If you later try to
assign a value of the wrong type, the compiler tells you:
count = "oops"
# error: cannot assign string value to variable 'count' declared as int
Use `: any` when you genuinely want a variable to hold different types:
value : any = 42
value = "now a string" # ok
Smarter checks across branches and reassignments
The compiler now follows the type of each variable through `if`,
`case`, `while` and `for`, so it can flag bad calls and returns even
when the offending value flows through a variable:
def greet(name : string)
puts "hi #{name}"
end
x = 42
greet(x)
# error: cannot pass int value as argument 1 to 'greet'
# (parameter 'name' declared as string)
Return statements get the same treatment:
def lookup(id : int) : string
if id < 0
return id # error: cannot return int value from
# function declared returning string
end
"ok"
end
When a variable could hold one of several types depending on which
branch ran, Rugo unifies them and only complains if every possible
type would be wrong. This keeps real code quiet while still catching
genuine mistakes.
Notes
- Existing programs continue to compile and run unchanged; annotations
are opt-in.
- Error messages name the variable or parameter, the declared type,
and the actual type, and point at the offending line.
- Documentation updated in docs/language.md.1 parent ee5d5f4 commit 95c58f2
18 files changed
Lines changed: 2390 additions & 503 deletions
File tree
- ast
- compiler
- docs
- parser
- preprocess
- rats/core
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
283 | 283 | | |
284 | 284 | | |
285 | 285 | | |
286 | | - | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
287 | 290 | | |
288 | 291 | | |
289 | 292 | | |
290 | 293 | | |
291 | 294 | | |
| 295 | + | |
292 | 296 | | |
293 | 297 | | |
294 | 298 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1107 | 1107 | | |
1108 | 1108 | | |
1109 | 1109 | | |
1110 | | - | |
| 1110 | + | |
1111 | 1111 | | |
1112 | 1112 | | |
1113 | 1113 | | |
1114 | 1114 | | |
1115 | 1115 | | |
| 1116 | + | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
| 1122 | + | |
| 1123 | + | |
| 1124 | + | |
| 1125 | + | |
| 1126 | + | |
1116 | 1127 | | |
1117 | 1128 | | |
1118 | 1129 | | |
1119 | 1130 | | |
1120 | 1131 | | |
1121 | 1132 | | |
1122 | | - | |
| 1133 | + | |
| 1134 | + | |
1123 | 1135 | | |
1124 | | - | |
| 1136 | + | |
| 1137 | + | |
| 1138 | + | |
| 1139 | + | |
1125 | 1140 | | |
1126 | 1141 | | |
1127 | 1142 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | | - | |
| 30 | + | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
35 | 36 | | |
36 | | - | |
| 37 | + | |
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
42 | 46 | | |
43 | | - | |
| 47 | + | |
44 | 48 | | |
45 | 49 | | |
46 | 50 | | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
47 | 67 | | |
| 68 | + | |
48 | 69 | | |
49 | | - | |
| 70 | + | |
50 | 71 | | |
51 | 72 | | |
52 | 73 | | |
53 | 74 | | |
| 75 | + | |
54 | 76 | | |
55 | | - | |
| 77 | + | |
56 | 78 | | |
57 | 79 | | |
58 | 80 | | |
59 | 81 | | |
60 | 82 | | |
61 | | - | |
| 83 | + | |
62 | 84 | | |
63 | 85 | | |
64 | 86 | | |
65 | 87 | | |
66 | 88 | | |
67 | | - | |
| 89 | + | |
68 | 90 | | |
69 | 91 | | |
70 | 92 | | |
71 | 93 | | |
72 | 94 | | |
73 | | - | |
| 95 | + | |
74 | 96 | | |
75 | 97 | | |
76 | 98 | | |
77 | 99 | | |
78 | 100 | | |
79 | | - | |
| 101 | + | |
80 | 102 | | |
81 | 103 | | |
82 | 104 | | |
83 | 105 | | |
84 | 106 | | |
85 | | - | |
| 107 | + | |
86 | 108 | | |
87 | 109 | | |
88 | 110 | | |
| |||
105 | 127 | | |
106 | 128 | | |
107 | 129 | | |
| 130 | + | |
108 | 131 | | |
109 | | - | |
| 132 | + | |
110 | 133 | | |
111 | 134 | | |
112 | 135 | | |
| |||
0 commit comments