// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.2 OR LicenseRef-Slint-commercial export component Foo { property prop; callback c1; pure callback c2; function f1() { prop = 1; } function f2() -> int { 42 } pure function f3() { f2(); f1(); // ^error{Call of impure function 'f1'} prop /= 5; // ^error{Assignment in a pure context} } public function f4() {} pure function f5() { f1(); // ^error{Call of impure function 'f1'} f2(); // ok, private function auto-detected as pure f3(); f4(); // ^error{Call of impure function 'f4'} c1(); // ^error{Call of impure callback 'c1'} c2(); } protected function f6() {} c1 => { f2() } c2 => { c1(); // ^error{Call of impure callback 'c1'} } property p1: f2(); property p2: { p1 = 42; // ^error{Assignment in a pure context} 42 }; property p3: { pw.show(); // ^error{Call of impure function} fs.focus(); // ^error{Call of impure function} f6(); // ^error{Call of impure function 'f6'} 42 }; pw := PopupWindow {} fs := FocusScope {} callback model() -> [int]; for xx in model() : Rectangle { // ^error{Call of impure callback 'model'} property abc: xx; } } export component Bar { pure callback xc1 <=> f.c1; // ^error{Purity of callbacks 'xc1' and 'f.c1' doesn't match} callback xc2 <=> f.c2; // ^error{Purity of callbacks 'xc2' and 'f.c2' doesn't match} f := Foo { c2 => { self.c1(); // ^error{Call of impure callback 'c1'} } } } export Foo_Legacy := Rectangle { property prop; callback c1; pure callback c2; function f1() { prop = 1; } function f2() -> int { 42 } pure function f3() { f2(); f1(); // ^warning{Call of impure function 'f1'} prop /= 5; // ^warning{Assignment in a pure context} } public function f4() {} pure function f5() { f1(); // ^warning{Call of impure function 'f1'} f2(); // ok, private function auto-detected as pure f3(); f4(); // ^warning{Call of impure function 'f4'} c1(); // ^warning{Call of impure callback 'c1'} c2(); } c1 => { f2() } c2 => { c1(); // ^warning{Call of impure callback 'c1'} } property p1: f2(); property p2: { p1 = 42; // ^warning{Assignment in a pure context} 42 }; property p3: { pw.show(); // ^warning{Call of impure function} fs.focus(); // ^warning{Call of impure function} 42 }; pw := PopupWindow {} fs := FocusScope {} } export Bar_Legacy := Rectangle { pure callback xc1 <=> f.c1; // ^error{Purity of callbacks 'xc1' and 'f.c1' doesn't match} callback xc2 <=> f.c2; // ^error{Purity of callbacks 'xc2' and 'f.c2' doesn't match} f := Foo { c2 => { self.c1(); // ^warning{Call of impure callback 'c1'} } } }