New features, first one is very cool

This commit is contained in:
Vyacheslav Egorov 2022-11-30 23:24:39 +02:00
parent 3836ed344c
commit 3a47529d7c

View file

@ -7,7 +7,50 @@ While the team is busy to bring some bigger things in the future, we have made s
[Cross-posted to the [Roblox Developer Forum](https://devforum.roblox.com/t/luau-recap-november-2022/).] [Cross-posted to the [Roblox Developer Forum](https://devforum.roblox.com/t/luau-recap-november-2022/).]
## Error messages ## Analysis improvements
We have improved tagged union type refinements to only include unhandled type cases in the `else` branch of the `if` statement:
```lua
type Ok<T> = { tag: "ok", value: T }
type Err = { tag: "error", msg: string }
type Result<T> = Ok<T> | Err
function unwrap<T>(r: Result<T>): T?
if r.tag == "ok" then
return r.value
else
-- Luau now understands that 'r' here can only be the 'Err' part
print(r.msg)
return nil
end
end
```
For better inference, we updated definition of `Enum.SomeType:GetEnumItems()` to return `{Enum.SomeType}` instead of common `{EnumItem}` and the return type of `next` function now includes the possibility of key being `nil`.
Finally, if you use `and` operator on non-boolean values, `boolean` type will no longer be added by the type inference:
```lua
local function f1(a: number?)
-- 'x' is still a 'number?' and doesn't become 'boolean | number'
local x = a and 5
end
```
## Error message improvements
We now give an error when built-in types are being redefined:
```lua
type string = number -- Now an error: Redefinition of type 'string'
```
We also had a parse error missing in case you forgot your default type pack parameter value. We accepted the following code silently without raising an issue:
```lua
type Foo<T... = > = nil -- Now an error: Expected type, got '>'
```
Error about function argument count mismatch no longer points at the last argument, but instead at the function in question. Error about function argument count mismatch no longer points at the last argument, but instead at the function in question.
So, instead of: So, instead of:
@ -26,16 +69,6 @@ myfunction(123)
~~~~~~~~~~ ~~~~~~~~~~
``` ```
Parsing now recovers with a more precise error message if you forget a comma in table constructor spanning multiple lines:
```lua
local t = {
a = 1
b = 2 -- Expected ',' after table constructor element
c = 3 -- Expected ',' after table constructor element
}
```
If you iterate over a table value that could also be `nil`, you get a better explanation in the error message: If you iterate over a table value that could also be `nil`, you get a better explanation in the error message:
```lua ```lua
@ -51,15 +84,13 @@ And speaking of confusing, some of you might have seen an error like `Type 'stri
This was caused by Luau having both a primitive type `string` and a table type coming from `string` library. Since the way you can get the type of the `string` library table is by using `typeof(string)`, the updated error message will mirror that and report `Type 'string' could not be converted into 'typeof(string)'`. This was caused by Luau having both a primitive type `string` and a table type coming from `string` library. Since the way you can get the type of the `string` library table is by using `typeof(string)`, the updated error message will mirror that and report `Type 'string' could not be converted into 'typeof(string)'`.
## Analysis improvements
For better inference, we updated definition of `Enum.SomeType:GetEnumItems()` to return `{Enum.SomeType}` instead of common `{EnumItem}` and the return type of `next` function now includes the possibility of key being `nil`. Parsing now recovers with a more precise error message if you forget a comma in table constructor spanning multiple lines:
If you use `and` operator on non-boolean values, `boolean` type will no longer be added by the type inference:
```lua ```lua
local function f1(a: number?) local t = {
-- 'x' is still a 'number?' and doesn't become 'boolean | number' a = 1
local x = a and 5 b = 2 -- Expected ',' after table constructor element
end c = 3 -- Expected ',' after table constructor element
}
``` ```