slint/internal/compiler/tests/syntax/lookup/conversion.slint
Olivier Goffart ac8fd60091 Fix regression with empty array
Regression noticed in this line:
3f97d98bff/ui/tabs/downloads.slint (L77)

The following used to work:

```slint
import { Button, VerticalBox } from "std-widgets.slint";
export component Demo {
    in property <[int]> mods;
    VerticalBox {
        alignment: start;
        for xxx in true ? mods : [] : HorizontalLayout { alignment: center; Button { text: "OK!"; } }
    }
}
```

But we fixed array conversion and this caused a regression with empty
array
2023-11-01 11:30:59 +01:00

63 lines
3 KiB
Text

// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
global Glob := {
property <physical_length> len: 45px * 5;
// ^error{Cannot convert between logical and physical length in a global component, because the scale factor is not known}
property <length> logic_len: 45phx * 5;
// ^error{Cannot convert between logical and physical length in a global component, because the scale factor is not known}
property <float> ratio: allowed / 1phx;
// ^error{Cannot convert between logical and physical length in a global component, because the scale factor is not known}
property <length> converted_rem: 2rem;
// ^error{Cannot convert between rem and logical length in a global component, because the default font size is not known}
property <float> should_work: 45px / 8px + (4rem / 2rem);
property <length> allowed: 45px * 5;
property <relative-font-size> rem_allowed: 42rem;
}
export X := Rectangle {
t := Text {
x: "hello";
// ^error{Cannot convert string to length$}
text: 45;
}
Text {
x: t.text;
// ^error{Cannot convert string to length$}
y: 42;
// ^error{Cannot convert float to length. Use an unit, or multiply by 1px to convert explicitly}
text: x;
// ^error{Cannot convert length to string. Divide by 1px to convert to a plain number}
property<int> foo: y;
// ^error{Cannot convert length to int. Divide by 1px to convert to a plain number}
property<duration> bar: foo;
// ^error{Cannot convert int to duration. Use an unit, or multiply by 1ms to convert explicitly}
}
Rectangle {
background: "blue";
// ^error{Cannot convert string to brush$}
property<length> no_matching_parent: 50%;
// ^error{Automatic conversion from percentage to length is only possible for the following properties: width, height, preferred-width, preferred-height}
}
property <{a: string, b: int}> object1: { a: "123", typo: 42};
// ^error{Cannot convert \{ a: string,typo: float,\} to \{ a: string,b: int,\}}
property <[{a: [int]}]> ccc: [{a: []}, {}, {a: ["123"]}, {a: [123]}];
// ^error{Cannot convert string to int} (FIXME: error location)
// ^^error{Cannot convert string to int} (FIXME: duplicated)
property <int> arr1: [];
// ^error{Cannot convert \[void\] to int}
property <{a: int}> arr2: {a: []};
// ^error{Cannot convert \[void\] to int}
property <int> arr3: false ? [] : 45; //(FIXME: error not ideal)
// ^error{Cannot convert float to \[void\]}
// ^^error{Cannot convert void to int}
}