From: Lorenz Wildberg Date: Wed, 17 May 2023 19:27:56 +0000 (+0200) Subject: generics-constraints: add test and improve error message X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe6e331f006fadd371d82c42a6b111dd8e9d7819;p=thirdparty%2Fvala.git generics-constraints: add test and improve error message --- diff --git a/tests/generics/multiple-classes-constraints.test b/tests/generics/multiple-classes-constraints.test new file mode 100644 index 000000000..4ca319f41 --- /dev/null +++ b/tests/generics/multiple-classes-constraints.test @@ -0,0 +1,9 @@ +Invalid Code + +class Foo {} +class Fuu {} + +class Bar where G : Foo, Fuu { +} + +void main () {} \ No newline at end of file diff --git a/vala/valagenericsymbol.vala b/vala/valagenericsymbol.vala index 54de02145..8037afaa5 100644 --- a/vala/valagenericsymbol.vala +++ b/vala/valagenericsymbol.vala @@ -53,4 +53,14 @@ public interface Vala.GenericSymbol : Symbol { * @return index of a type parameter, or -1 */ public abstract int get_type_parameter_index (string name); + + public bool check_constraints () { + bool error = false; + foreach (var parameter in this.get_type_parameters ()) { + if (!parameter.check_constraint ()) { + error = true; + } + } + return !error; + } } diff --git a/vala/valaobjecttypesymbol.vala b/vala/valaobjecttypesymbol.vala index 0ba8c6d70..94dd53cc3 100644 --- a/vala/valaobjecttypesymbol.vala +++ b/vala/valaobjecttypesymbol.vala @@ -381,6 +381,10 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol, GenericSymbol { return !error; } + if (!this.check_constraints ()) { + error = true; + } + if (!external_package && has_attribute ("DBus") && !context.has_package ("gio-2.0")) { error = true; Report.error (source_reference, "gio-2.0 package required for DBus support"); diff --git a/vala/valatypeparameter.vala b/vala/valatypeparameter.vala index e8c6bb61d..bcf383b10 100644 --- a/vala/valatypeparameter.vala +++ b/vala/valatypeparameter.vala @@ -141,6 +141,20 @@ public class Vala.TypeParameter : TypeSymbol { return name == param2.name && parent_symbol == param2.parent_symbol; } + public bool check_constraint () { + bool class_constraint = false; + foreach (var type in get_type_constraints ()) { + if (type.symbol is Class) { + if (class_constraint) { + Report.error (source_reference, "a type parameter can only be constrained with one class type"); + return false; + } + class_constraint = true; + } + } + return true; + } + public override bool check (CodeContext context) { if (checked) { return !error;