From: Rico Tzschichholz Date: Wed, 17 May 2023 20:34:43 +0000 (+0200) Subject: WIP X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b687d3ecdc85eaec90c4e002f7956f9ba5ed10b1;p=thirdparty%2Fvala.git WIP --- diff --git a/tests/Makefile.am b/tests/Makefile.am index a01040eae..2e6c1f7f0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -841,6 +841,7 @@ TESTS = \ generics/method-to-delegate-incompatible.test \ generics/method-to-delegate-incompatible-2.test \ generics/method-to-delegate-incompatible-3.test \ + generics/multiple-classes-constraints.test \ generics/null-type.vala \ generics/property-gobject-set.vala \ generics/property-int-cast.vala \ diff --git a/tests/generics/multiple-classes-constraints.test b/tests/generics/multiple-classes-constraints.test index 4ca319f41..e1113cd1d 100644 --- a/tests/generics/multiple-classes-constraints.test +++ b/tests/generics/multiple-classes-constraints.test @@ -1,9 +1,13 @@ Invalid Code -class Foo {} -class Fuu {} +class Foo { +} + +class Faz { +} -class Bar where G : Foo, Fuu { +class Bar where G : Foo, Faz { } -void main () {} \ No newline at end of file +void main () { +} diff --git a/vala/valadelegate.vala b/vala/valadelegate.vala index e7ec720a2..348ce5630 100644 --- a/vala/valadelegate.vala +++ b/vala/valadelegate.vala @@ -315,7 +315,9 @@ public class Vala.Delegate : TypeSymbol, Callable, GenericSymbol { } foreach (TypeParameter p in type_parameters) { - p.check (context); + if (!p.check (context)) { + error = true; + } } return_type.check (context); diff --git a/vala/valagenericsymbol.vala b/vala/valagenericsymbol.vala index 8037afaa5..54de02145 100644 --- a/vala/valagenericsymbol.vala +++ b/vala/valagenericsymbol.vala @@ -53,14 +53,4 @@ 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/valamethod.vala b/vala/valamethod.vala index 6a1d686cf..6122e45fe 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -901,6 +901,12 @@ public class Vala.Method : Subroutine, Callable, GenericSymbol { return TraverseStatus.CONTINUE; }); + foreach (TypeParameter p in type_parameters) { + if (!p.check (context)) { + error = true; + } + } + return_type.accept (traverse); var optional_param = false; diff --git a/vala/valaobjecttypesymbol.vala b/vala/valaobjecttypesymbol.vala index 62547ef3b..11735cf11 100644 --- a/vala/valaobjecttypesymbol.vala +++ b/vala/valaobjecttypesymbol.vala @@ -381,15 +381,17 @@ 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"); } + foreach (TypeParameter p in type_parameters) { + if (!p.check (context)) { + error = true; + } + } + return !error; } } diff --git a/vala/valastruct.vala b/vala/valastruct.vala index 52c85dac7..480925177 100644 --- a/vala/valastruct.vala +++ b/vala/valastruct.vala @@ -523,7 +523,9 @@ public class Vala.Struct : TypeSymbol, GenericSymbol { } foreach (TypeParameter p in type_parameters) { - p.check (context); + if (!p.check (context)) { + error = true; + } } foreach (Field f in fields) { diff --git a/vala/valatypeparameter.vala b/vala/valatypeparameter.vala index 4314711b8..4754d35dd 100644 --- a/vala/valatypeparameter.vala +++ b/vala/valatypeparameter.vala @@ -141,17 +141,25 @@ public class Vala.TypeParameter : TypeSymbol { return name == param2.name && parent_symbol == param2.parent_symbol; } - public bool check_constraint () { + public override bool check (CodeContext context) { + if (checked) { + return !error; + } + + checked = true; + 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; + Report.error (source_reference, "a type parameter may only be constrained by a single class type"); + error = true; + break; } class_constraint = true; } } - return true; + + return !error; } }