improve subtyping (#9614)

# Description

the current subtyping rule needs you to define the record entries in the
same order as declared in the annotation. this pr improves that

now
```nushell
{ name: 'Him', age: 12 } 

# ,

{ age: 100, name: 'It' }

# and

{ name: 'Red', age: 69, height: "5-8" }

# will all match

record<name: string, age: int>

# previously only the first one would match
```

however, something like

```nushell
{ name: 'Her' } # will not


# and

{ name: 'Car', wheels: 5 }
```

EDIT: applied JT's suggestion
This commit is contained in:
mike
2023-07-06 11:25:39 +03:00
committed by GitHub
parent 6c8adac0d9
commit 544c46e0e4
3 changed files with 43 additions and 10 deletions

View File

@@ -59,3 +59,30 @@ fn block_not_first_class_let() -> TestResult {
"Blocks are not support as first-class values",
)
}
#[test]
fn record_subtyping() -> TestResult {
run_test(
"def test [rec: record<name: string, age: int>] { $rec | describe };
test { age: 4, name: 'John' }",
"record<age: int, name: string>",
)
}
#[test]
fn record_subtyping_2() -> TestResult {
run_test(
"def test [rec: record<name: string, age: int>] { $rec | describe };
test { age: 4, name: 'John', height: '5-9' }",
"record<age: int, name: string, height: string>",
)
}
#[test]
fn record_subtyping_3() -> TestResult {
fail_test(
"def test [rec: record<name: string, age: int>] { $rec | describe };
test { name: 'Nu' }",
"expected",
)
}